IndoorLoc | 室内定位工具库
Multi-dataset, multi-model indoor localization toolkit
Docs · Installation · Quickstart · Datasets · Models · Contributing · Citation
- 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
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]"conda create -n indoorloc python=3.10 pytorch torchvision cpuonly -c pytorch -y
conda activate indoorloc
pip install "indoorloc[full]"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.
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 & evaluateAuto-download datasets · Auto-adapt dimensions · Auto-configure model
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- Dataset catalogue (web): https://qdtiger.github.io/indoorloc/datasets.html
- Algorithm zoo (web): https://qdtiger.github.io/indoorloc/algorithms.html
- Config reference:
indoorloc/configs/README.md
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.
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
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")indoorloc/
├── signals/ # WiFi, BLE, IMU, etc.
├── locations/ # Location classes
├── datasets/ # Verified + pending
├── localizers/ # ML & DL algorithms
├── evaluation/ # Metrics
└── configs/ # YAML configs
| Metric | Description |
|---|---|
| Mean Position Error | Average error (m) |
| Median Position Error | Median error (m) |
| Floor Accuracy | Floor classification |
| Building Accuracy | Building classification |
See CONTRIBUTING.md.
Apache License 2.0
@software{indoorloc,
title = {IndoorLoc: A Unified Framework for Indoor Localization},
year = {2024},
url = {https://github.com/qdtiger/indoorloc}
}