referee-hands-s / README.md
itspublu's picture
add cross-video split row (95.6%; 100% real footage)
cafc462 verified
|
Raw
History Blame Contribute Delete
2.44 kB
metadata
license: apache-2.0
library_name: pytorch
pipeline_tag: image-classification
tags:
  - robotics
  - capture-qa
  - hand-detection
  - edge
datasets:
  - lerobot/droid_1.0.1
  - imageomics/KABR
model-index:
  - name: referee-hands-s
    results:
      - task:
          type: image-classification
          name: Hand/gripper visibility (clip-level)
        dataset:
          type: referee-lab/hands-visible
          name: referee-lab/hands-visible
          split: full
        metrics:
          - type: accuracy
            name: Clip accuracy
            value: 0.9778

referee-hands-s

A 1.5M-parameter MobileNetV3-small classifier for hand/gripper visibility in robot-training footage. 96px inputs, sized for microcontroller-class deployment.

Benchmark

97.8% clip accuracy on referee-lab/hands-visible (45-clip public benchmark, robot + wildlife domains) — matching gemma3:27b at 1/18,000th the parameters.

Model Params Accuracy
gemma3:27b 27B 97.8%
referee-hands-s 1.5M 97.8%
referee-hands-s, cross-video split 1.5M 95.6%
qwen2.5vl:32b 32B 74.4%
constant-answer floor 68.9%

The cross-video row keeps every training frame at least 60 seconds away from any test clip on its source stream. Under that separation the model scores 100% on real footage (41/41); its two misses are synthetic drawn-hand control clips outside the training distribution.

Intended use and scope

Version 1 targets fixed-camera and wrist-camera robot workspace footage — the domain it was trained on (DROID, ALOHA-sim, KABR negatives). Human egocentric and general webcam scenes are outside the v1 training distribution; a mixed-domain v2 is in development. Use for capture-pipeline gating in the supported domain.

Usage

import torch
from torchvision import models, transforms
from safetensors.torch import load_file

net = models.mobilenet_v3_small()
net.classifier[3] = torch.nn.Linear(net.classifier[3].in_features, 1)
net.load_state_dict(load_file("model.safetensors"))
net.eval()
tf = transforms.Compose([transforms.Resize((96, 96)), transforms.ToTensor()])
p = torch.sigmoid(net(tf(img).unsqueeze(0)).squeeze())   # P(hand/gripper visible)

Clip-level verdict: sample ~12 frames, yes if max(p) > 0.5.

Training: distilled from gemma3:27b pseudo-labels on CC BY / CC0 / MIT media. Benchmark, gates, and tooling: https://github.com/publu/referee-lab