Skip to content

qdtiger/indoorloc

Repository files navigation

IndoorLoc | 室内定位工具库
Multi-dataset, multi-model indoor localization toolkit

PyPI CI Docs Python License Stars

Docs · Installation · Quickstart · Datasets · Models · Contributing · Citation

English | 中文


Highlights

  • Unified API for indoor localization across WiFi / BLE / CSI / UWB
  • 12 verified datasets (auto-download when available) + extensible dataset registry
  • Classic ML (scikit-learn) + deep models (PyTorch, timm)
  • OpenMMLab-style YAML configs for reproducible experiments

Installation

GPU (CUDA 11.8)

conda create -n indoorloc python=3.10 pytorch torchvision pytorch-cuda=11.8 -c pytorch -c nvidia -y
conda activate indoorloc
pip install "indoorloc[full]"

CPU-only

conda create -n indoorloc python=3.10 pytorch torchvision cpuonly -c pytorch -y
conda activate indoorloc
pip install "indoorloc[full]"

Verify (optional)

python -c "import indoorloc, torch; print('indoorloc', indoorloc.__version__, '| torch', torch.__version__, '| cuda', torch.cuda.is_available())"

More install options (legacy, optional extras, troubleshooting): docs/installation.md.


Quickstart

Python API (recommended)

import indoorloc as iloc

train, test = iloc.load_dataset("ujindoorloc")            # 12 verified datasets
model = iloc.create_model("resnet18", dataset=train)      # Auto-configure model
results = model.fit(train).evaluate(test)                # Train & evaluate

Auto-download datasets · Auto-adapt dimensions · Auto-configure model

YAML Config + CLI

Config templates live in indoorloc/configs/.

indoorloc-train indoorloc/configs/wifi/resnet18_ujindoorloc.yaml

# Override any parameter
indoorloc-train indoorloc/configs/wifi/resnet18_ujindoorloc.yaml \
  --model.backbone.model_name efficientnet_b0 \
  --train.lr 5e-4 --train.epochs 200
# indoorloc/configs/wifi/resnet18_ujindoorloc.yaml
_base_:
  - ../_base_/models/resnet.yaml

model:
  backbone:
    model_name: resnet18
    pretrained: true
  head:
    num_floors: 5
    num_buildings: 3

train:
  epochs: 100
  lr: 0.001

Documentation

Datasets

Full dataset catalogue (web): https://qdtiger.github.io/indoorloc/datasets.html

  • List available dataset IDs: iloc.list_available_datasets()
  • Load a dataset: train, test = iloc.load_dataset("ujindoorloc")

Verified dataset IDs (12):

  • WiFi: ujindoorloc, sodindoorloc, longtermwifi, tampere, wlanrssi, tuji1
  • BLE: ble_indoor, ibeacon_rssi, ble_rssi_uci
  • CSI: csi_fingerprint, hwild, haloc
Verified datasets (table)
Type Dataset ID Samples
WiFi UJIndoorLoc ujindoorloc 21k
SODIndoorLoc sodindoorloc 24k
LongTermWiFi longtermwifi 104k
Tampere tampere 4.6k
WLANRSSI wlanrssi 2k
TUJI1 tuji1 8.9k
BLE BLEIndoor ble_indoor 44k
iBeaconRSSI ibeacon_rssi 4.7k
BLE RSSI UCI ble_rssi_uci 1.4k
CSI CSI Fingerprint csi_fingerprint 489
HWILD hwild 409k
HALOC haloc 111k
Pending datasets (help wanted)

These datasets have download sources but are not yet integrated:

Dataset Source Notes
OpenCSI Figshare ~2GB, format unverified
CSUIndoorLoc GitHub Format unverified
DICHASUS DaRUS 14 scenarios
ESPARGOS espargos.net 17-86GB
DeepMIMO deepmimo.net Requires pip install DeepMIMO
CSI2Pos TIB Requires login
CSI2TAoA TIB Requires login
MaMIMO CSI IEEE DataPort Requires account
WILDv2 Kaggle Requires Kaggle API

Contribute: help us verify pending datasets! See CONTRIBUTING.md.

Models & Algorithms

Full algorithm zoo (web): https://qdtiger.github.io/indoorloc/algorithms.html

  • List available models: iloc.list_models()
  • Create a model: iloc.create_model("KNNLocalizer", k=5) / iloc.create_model("resnet18", dataset=train)
Algorithm families

Backed by sklearn (30+), timm (700+), lightly (10+), learn2learn (7+), and SKADA (20+).

  • Supervised
    • Traditional ML: k-NN, WKNN, SVM, RF...
    • Deep: MLP, CNN1D, ResNet, ViT...
  • Self-supervised
    • Contrastive: SimCLR, MoCo, NNCLR
    • Non-contrastive: BYOL, SimSiam, VICReg
  • Meta-learning
    • Gradient-based: MAML, FOMAML, Reptile
    • Metric-based: ProtoNet, MatchingNet
  • Transfer
    • Feature: CORAL, TCA
    • Reweight: KMM, KLIEP
    • Deep: DANN, MDD
Advanced usage

Custom model registration

import indoorloc as iloc
from indoorloc.registry import LOCALIZERS
from indoorloc.localizers.base import BaseLocalizer

@LOCALIZERS.register_module()
class MyLocalizer(BaseLocalizer):
    def fit(self, signals, locations, **kwargs):
        self._is_trained = True
        return self

    def predict(self, signal):
        raise NotImplementedError

model = iloc.create_model("MyLocalizer")

Project structure

indoorloc/
├── signals/          # WiFi, BLE, IMU, etc.
├── locations/        # Location classes
├── datasets/         # Verified + pending
├── localizers/       # ML & DL algorithms
├── evaluation/       # Metrics
└── configs/          # YAML configs

Evaluation metrics

Metric Description
Mean Position Error Average error (m)
Median Position Error Median error (m)
Floor Accuracy Floor classification
Building Accuracy Building classification

Contributing

See CONTRIBUTING.md.

License

Apache License 2.0

Citation

@software{indoorloc,
  title = {IndoorLoc: A Unified Framework for Indoor Localization},
  year = {2024},
  url = {https://github.com/qdtiger/indoorloc}
}

Acknowledgements

  • OpenMMLab — Registry and config system
  • timm — 700+ pretrained models

About

室内定位一站式工具库 | Datasets + Models + Unified API

Resources

Contributing

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages