TouchLabel AI - Tactile Data Annotation Toolkit
Project description
TouchLabel AI ๐ฆ
Sensor-Agnostic Tactile Data Annotation Toolkit
load โ review โ export ยท Three steps to close the loop
๐ Quick Start
pip install tlabel
import tlabel
# 1๏ธโฃ Load โ auto-detect sensor format
data = tlabel.load("gelsight_force.pkl") # GelSight / DIGIT
data = tlabel.load("paxini_episode.h5") # PaXini
data = tlabel.load("daimon_data/") # Daimon (directory or .parquet)
# 2๏ธโฃ Annotate โ interactive Jupyter panel
data.review() # Chinese UI
data.review(lang="en") # English UI
# 3๏ธโฃ Export
data.export("output.json") # TLabel Format v2 JSON
data.export("output.csv") # CSV flat table
๐ฅ Try with demo data
pip install tlabel
python -c "
import json, urllib.request
from tlabel.core.types import TLabelFrame, TLabelData
url = 'https://raw.githubusercontent.com/liesliy/tlabel/main/examples/data/demo_gelsight.json'
raw = json.loads(urllib.request.urlopen(url).read())
frames = [TLabelFrame(f['frame_idx'], f['timestamp_s'], f['tlabel_v2'], f.get('manipulation_phase','idle'), f.get('confidence',1.0)) for f in raw['frames']]
data = TLabelData(frames, raw['sensor'], raw['episode'], raw['capabilities'])
data.review()
"
๐ก Supported Sensors
| Sensor | Format | Dimensions | Optical Flow | Status |
|---|---|---|---|---|
| GelSight Mini | .pkl |
22 | โ | โ Stable |
| DIGIT | .pkl |
22 | โ | โ Stable |
| Daimon DM-TacClaw | .parquet / dir |
22 (video) / 20 (no video) | โ / โ | โ Stable |
| PaXini PXCap | .h5 / .hdf5 |
20 | โ | โ Stable |
Force-type sensors (PaXini) lack optical images and don't support optical flow features, yielding 20 dimensions. Image-type sensors output all 22 dimensions. Daimon gracefully degrades to 20 dims when no video file is present.
๐ฆ Installation
# Minimal (numpy only)
pip install tlabel
# Per-sensor optional dependencies
pip install tlabel[gelsight] # GelSight / DIGIT โ opencv-python
pip install tlabel[paxini] # PaXini โ h5py
pip install tlabel[daimon] # Daimon โ pyarrow + opencv-python
# Everything
pip install tlabel[all]
๐จ Panel Features
- ๐จ Color-coded timeline: green = contact ยท red = slip ยท gray = no contact
- ๐ธ 22-dim radar chart: full TLabel Format v2 visualization with bilingual labels
- โ๏ธ Frame & batch patching: select a range, modify in one click
- ๐ Cascade rules: setting
contact=0auto-zeroes 7 related fields + resetsmanipulation_phaseโidle - ๐ Bilingual toggle: Chinese / English, one click in the top-right corner
- ๐ค Export: JSON / CSV, auto-detected by file extension
TLabel Format v2 โ 22 Dimensions
Static Features (18-dim)
| # | Key | Description |
|---|---|---|
| 1 | contact |
Binary contact flag |
| 2 | deformation_magnitude |
Surface deformation intensity |
| 3 | force_magnitude |
Normal force magnitude |
| 4 | force_peak |
Peak force in episode window |
| 5 | force_direction |
Force vector angle (ยฐ) |
| 6 | slip_entropy |
Uncertainty of slip detection |
| 7 | slip_event |
Binary slip event flag |
| 8 | texture_energy |
Surface texture frequency energy |
| 9 | edge_density |
Contact edge pixel ratio |
| 10 | contact_area |
Contact region area ratio |
| 11 | centroid_x |
Contact centroid x-position |
| 12 | normal_field_magnitude |
Normal pressure field magnitude |
| 13 | normal_field_variance |
Normal field spatial variance |
| 14 | shear_field_magnitude |
Shear stress magnitude |
| 15 | shear_field_direction |
Shear direction angle (ยฐ) |
| 16 | delta_force_normal |
Frame-to-frame ฮF_normal |
| 17 | delta_force_shear |
Frame-to-frame ฮF_shear |
| 18 | friction_cone_ratio |
Tangential/normal force ratio |
Temporal Features (4-dim, v0.2.0)
| # | Key | Image-type | Force-type | Description |
|---|---|---|---|---|
| 19 | optical_flow_magnitude |
โ | โ | Inter-frame motion magnitude (Farneback) |
| 20 | optical_flow_direction |
โ | โ | Optical flow angle (ยฐ) |
| 21 | temporal_deformation_rate |
โ | โ | Rate of deformation change |
| 22 | contact_transition |
โ | โ | Contact state transition probability |
๐ API Quick Reference
import tlabel
# โโ Loading โโ
data = tlabel.load(path) # Auto-detect sensor format
data = tlabel.load(path, format="gelsight") # Force specific adapter
# โโ Properties โโ
data.num_frames # int โ total frame count
data.duration_s # float โ episode duration
data.sensor_type # str โ sensor identifier
data.dimension_keys # list โ all dimension keys for this sensor
data.modified_count # int โ frames with manual patches
# โโ Frame Access โโ
frame = data[0] # Index access
frame = data.get_frame(42) # By frame_idx
frame.contact # Contact value
frame.slip_event # Slip event value
frame.is_modified # Has patches?
# โโ Patching โโ
frame.patch("contact", 0) # Single frame (cascade=True)
frame.patch("contact", 0, cascade=False) # No cascade
data.batch_patch(10, 50, "contact", 0) # Range patch
# โโ Review & Export โโ
data.review() # Jupyter panel (Chinese)
data.review(lang="en") # English
data.export("output.json") # JSON (TLabel Format v2)
data.export("output.csv") # CSV
Cascade Rules (contact โ 0)
When contact is set to 0, these fields are automatically zeroed:
| Auto-zeroed Field | Condition |
|---|---|
force_magnitude |
always |
force_peak |
always |
slip_event |
always |
delta_force_normal |
always |
delta_force_shear |
always |
contact_area |
always |
contact_transition |
only if value > 0.5 |
manipulation_phase |
โ "idle" (if not already) |
๐ Project Structure
tlabel/
โโโ core/
โ โโโ types.py # TLabelFrame / TLabelData containers
โ โโโ loader.py # Auto-detect & dispatch loading
โ โโโ registry.py # Adapter registry
โโโ adapters/
โ โโโ base.py # BaseAdapter interface
โ โโโ gelsight.py # GelSight Mini / DIGIT
โ โโโ paxini.py # PaXini PXCap
โ โโโ daimon.py # Daimon DM-TacClaw (+ video decoding)
โโโ viewer/
โ โโโ panel.py # Jupyter _repr_html_ renderer
โ โโโ templates.py # HTML + JS + CSS template engine
โโโ export/
โโโ writer.py # JSON / CSV export + NumpyEncoder
๐ค Contributing
We welcome contributions! See CONTRIBUTING.md for guidelines.
Good first issues:
- ๐ Add a new sensor adapter (e.g., SynTouch, XELA)
- ๐ Improve radar chart UI (dark mode, interactive hover)
- ๐ Add more language support (ๆฅๆฌ่ช, ํ๊ตญ์ด)
- ๐งช Add integration tests for edge cases
๐ License
MIT ยฉ Niuzu Tech
Star us โญ if it helps your research!
Project details
Release history Release notifications | RSS feed
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.2.0a4.tar.gz.
File metadata
- Download URL: tlabel-0.2.0a4.tar.gz
- Upload date:
- Size: 42.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
472ae2731f8412b6be5c05b3f25d51ee047a51f999c351dc211d59ceb193d605
|
|
| MD5 |
d37261ea48b07567111661f969271e93
|
|
| BLAKE2b-256 |
f5dcd1896a0d8dae3935f7e5c6a5c09cbdeb61a3f7f3ce862b685332987d777a
|
File details
Details for the file tlabel-0.2.0a4-py3-none-any.whl.
File metadata
- Download URL: tlabel-0.2.0a4-py3-none-any.whl
- Upload date:
- Size: 43.9 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 |
ee2625574eadd4751f7f79dbc941a9ab049135def4ebf62731760ba6058a693b
|
|
| MD5 |
35138f2f4621db30b1f3a3d0b6cd94ae
|
|
| BLAKE2b-256 |
8157c955ad4faa59cb16f82a79e7fe1d79427c4342d05b1f04284328fdd7a153
|