🦞 TouchLabel AI
The World's First Sensor-Agnostic Tactile Data Annotation Toolkit
Load any tactile sensor → Annotate visually → Export a unified schema
GelSight · DIGIT · PaXini · Daimon — one tool, one format, all sensors
⚠️ v0.17.0 Breaking Change — Schema V2 Only. The legacy 22-dim
tlabel_v2format has been removed. All data now uses the 14-dim Schema V2 with Compliance Levels (L1-L4). See MIGRATION.md for upgrade instructions.
Tactile data shouldn't be locked inside any single company's format. Just as RGB images don't belong to any camera manufacturer, tactile data deserves a unified "Unicode". That's what TLabel does — defining a universal language for tactile data, and giving it to everyone.
🚀 Quick Start
pip install tlabel
import tlabel
# Load data from any sensor — auto-detected
data = tlabel.load("path/to/your/data")
# Or try built-in demo (30 seconds)
data = tlabel.demo("gelsight")
# Review in Jupyter — interactive annotation panel
data.review()
# Export to unified format
data.export("output.json") # JSON (tlabel_v2 schema)
data.export("output.csv") # CSV
data.export_ftp1("out.zarr") # FTP-1 Zarr (foundation model ready)
CLI Tools
tlabel version # Check version
tlabel list # List all registered adapters
tlabel info gelsight # Adapter details & capabilities
tlabel validate your_data.json # Validate tlabel_v2 schema compliance
🎯 What Does TLabel Do?
Problem: Every tactile sensor outputs different data formats. Switch sensors → rewrite code.
Solution: TLabel defines a unified 22-dimension feature space (tlabel_v2) and provides adapters that translate each sensor's native format into it.
GelSight .pkl ──┐ ┌── JSON (tlabel_v2)
PaXini .h5 ─────┤ TLabel Adapter ├── CSV
Daimon .parquet─┤ ──────────────► ├── FTP-1 Zarr
VTouch .h5 ─────┤ ├── LeRobot
Any format ─────┘ └── ROS2 (stub)
Core Capabilities
| Feature | Description |
|---|---|
| 🔌 9 Built-in Adapters | 7 dataset (file loading) + 2 real-time (SDK/USB) — open for community extensions |
| 🏗️ Open Platform | DataAdapterBase for datasets + SensorAdapterBase for live sensors — anyone can contribute |
| 🛠️ CLI Validation | tlabel validate checks your data against the 22-dim schema |
| 🤖 AI Pre-Annotation | PredictEngine auto-labels contact, slip, and manipulation phases |
| 📈 Data Augmentation | 5 methods (time_warp, noise, crop, scale, dropout), pure numpy, zero extra deps |
| 📤 Multi-Format Export | JSON, CSV, FTP-1 Zarr, LeRobot, RLDS, ROS2 |
| 🌐 Bilingual Panel | Interactive Jupyter annotation panel (中/EN) |
API at a Glance
# Loading
data = tlabel.load(path) # Auto-detect format
data = tlabel.load(path, format="paxini") # Force adapter
# Patching & Annotation
frame = data[0]
frame.patch("contact", 0) # Cascade rules auto-apply
data.batch_patch(10, 50, "slip_event", 1) # Range patch
# AI Pre-Annotation
from tlabel.predict import PredictEngine
engine = PredictEngine()
engine.fit(data) # Learn from partial labels
results = engine.predict(data)
engine.apply(data, results, min_confidence=0.7)
# Augmentation
augmented = tlabel.augment(data, methods=["time_warp", "noise_inject"], seed=42)
📖 Full API Reference → docs/API.md · 22-Dim Schema → docs/annotation-spec.md
📡 Supported Adapters
TLabel provides two types of adapters — loading existing data, or connecting live hardware.
Dataset Adapters — load existing tactile data
Base class:
DataAdapterBase· Input: file paths · Use case: research on public datasets, historical data processing
| Sensor | Type | File Format | Dims | Status |
|---|---|---|---|---|
| GelSight Mini / DIGIT | Vision-based | .pkl |
22 | ✅ Stable |
| Daimon DM-TacClaw | Multimodal | .parquet / dir |
22 | ✅ Stable |
| PaXini PXCap | Force array | .h5 / .hdf5 |
20 | ✅ Stable |
| UniVTAC | Vision-based | .hdf5 |
22 | ✅ Stable |
| TacQuad (AnyTouch) | Multi-sensor | directory | 22 | ✅ Stable |
| VTouch | Vision-based | .h5 |
22 | ✅ Stable |
| YCB-Slide | Vision-based | .npy / dir |
22 | ✅ Stable |
Real-time Sensor Adapters — connect live hardware
Base class:
SensorAdapterBase· Input: SDK / USB / stream · Use case: lab robots, production lines, real-time annotation
| Sensor | Type | Connection | Dims | Status |
|---|---|---|---|---|
| PaXini GEN3 | Force array | SDK (live stream) | 18 | 🆕 New |
| Daimon DM-Tac | Vision-based | USB / .avi / .bag |
22 | 🆕 Skeleton |
Which adapter should I build?
- I have recorded data files → inherit
DataAdapterBase, implement file parsing - I have a physical sensor → inherit
SensorAdapterBase, implement SDK/stream connection - Both share the same export pipeline — once registered,
tlabel.load()works automatically
Vision sensors → full 22 dims. Force-only sensors (PaXini) → 20 dims. No errors, no surprises — just graceful degradation.
# Per-sensor dependencies
pip install tlabel[gelsight] # opencv-python
pip install tlabel[paxini] # h5py
pip install tlabel[daimon] # pyarrow + opencv-python
pip install tlabel[all] # Everything
🆕 What's New
v0.16.0 — Open Platform Architecture
TLabel is now an open, extensible platform:
- 🏗️ Dual-base architecture (
DataAdapterBase/SensorAdapterBase) - 🔌 External adapter registration via
entry_points— third-party packages auto-discovered - 🛠️ CLI tools:
tlabel validate / list / info / version - 📦 Community contribution kit: templates + PR templates + CONTRIBUTING.md
📖 Full changelog → CHANGELOG_current.md
🤝 Contributing
TLabel is an open platform — anyone can extend it with new sensor support.
| Way | Effort | Impact |
|---|---|---|
Submit a PR — use contrib/adapter-template/, inherit from DataAdapterBase or SensorAdapterBase |
~30 min | Your sensor works with the whole ecosystem |
Ship an independent package — use tlabel entry_points for auto-discovery |
~1 hour | No PR needed, fully independent |
| Other — bug fixes, docs, tests, UI improvements | varies | Always welcome |
| Current Ecosystem | Count |
|---|---|
| Built-in adapters | 9 |
| Community adapters | 0 (your name here?) |
📖 Get started → CONTRIBUTING.md · Adapter Template → contrib/adapter-template/
🏆 Benchmark
TLabel-Bench — The first cross-sensor unified tactile annotation benchmark. Same objects, different sensors, one format.
📝 Citing TLabel
@software{tlabel2026,
title = {TLabel: A Sensor-Agnostic Tactile Data Annotation Toolkit},
author = {NiuZhu Tech},
year = {2026},
url = {https://github.com/liesliy/tlabel}
}
📄 License
MIT © NiuZhu Tech
If TLabel saved you from manually labeling tactile data, a ⭐ would make our day!
🤝 Need Help with Tactile Data?
We provide professional tactile data annotation and pipeline services:
- Custom sensor adapter development — integrate your sensor with TLabel in days
- Data pipeline consulting — annotation workflows for grasping, manipulation, slip detection
- Embodied AI tooling — end-to-end data solutions from raw sensor to model-ready datasets
Contact: WeChat wxid_olqx5z6trmtn21 · Email luoxi@touchlabelai.cn
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tlabel-0.17.1.tar.gz.
File metadata
- Download URL: tlabel-0.17.1.tar.gz
- Upload date:
- Size: 290.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
62e399a1020ef39d40dbd1da361369a345b63e8c2afa27f673ae52b3c77b82d0
|
|
| MD5 |
3aabe3157a77f9997978b7682028c591
|
|
| BLAKE2b-256 |
a39ae58b1f4ebf318d4de837389e7cd25fedd6fa2a5923edf99273aa86e4b2be
|
File details
Details for the file tlabel-0.17.1-py3-none-any.whl.
File metadata
- Download URL: tlabel-0.17.1-py3-none-any.whl
- Upload date:
- Size: 313.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a29c27291c7de6f56e45160cd0e20553ec83cdc425dfdea3bcb6e37e0c8ae3f
|
|
| MD5 |
27a43d4700885c1b61f5e13b3fb55f90
|
|
| BLAKE2b-256 |
0959680d471d035f6c699095ed621fbec885e9d1e170b5e4424da91e812d5398
|