data-label-factory
Anyone asks for a vision model, we build it. Give us a description and
optionally some sample images — the factory gathers data, labels it, verifies
quality, and exports a ready-to-train YOLO dataset.
"I need a stop sign detector"
↓
gather → filter → label → verify → export
(DDG) (VLM) (Falcon) (VLM) (YOLO)
↓
best.pt ← custom YOLO model
Quick Start (3 commands)
1 # 1. Install
2 git clone https://github.com/walter-grace/data-label-factory.git
3 cd data-label-factory
4 pip install .
5
6 # 2. Set your OpenRouter API key (free tier works)
7 export OPENROUTER_API_KEY = sk-or- .. . # get one at https://openrouter.ai/keys
8
9 # 3. Run the full pipeline
10 data_label_factory pipeline \
11 --project projects/stop-signs.yaml \
12 --backend openrouter \
13 --label-backend openrouter \
14 --skip-gather \
15 --limit 50
Output: a YOLO dataset in experiments/latest/yolo_dataset/ with data.yaml, ready for:
yolo detect train model=yolo11n.pt data=experiments/latest/yolo_dataset/data.yaml epochs=50
How it works
The pipeline runs 5 stages automatically:
Stage What it does Default backend Gather Search DDG/Wikimedia/YouTube for images matching your queries DuckDuckGo Filter VLM looks at each image: "Is this a {target}?" YES/NO OpenRouter Gemma 4 Label Detection model draws bounding boxes on YES images Falcon Perception / OpenRouter Verify VLM checks each bbox crop: "Is this actually a {target}?" OpenRouter Gemma 4 Export Convert COCO annotations to YOLO format with train/val split Built-in
Provider Registry (7 backends)
Mix and match per stage — swap any backend without changing your project:
Backend Filter Label Verify Runs on openrouterY Y Y Cloud (Gemma 4, Claude, GPT-4V, Llama, etc.) qwenY - Y Local Mac (Qwen 2.5-VL-3B, 2.5 GB) gemmaY - Y Local Mac via Expert Sniper (Gemma 4 26B, 2.8 GB) falcon- Y - Local Mac via mlx-vlm (Falcon Perception, 2.4 GB) chandraY Y Y Local/GPU (Chandra OCR 2 — documents, text, tables) wilddet3d- Y - CUDA GPU (WildDet3D — 13K+ categories, 3D) flywheelY Y - Local (synthetic data with perfect ground truth)
Best combo for Mac Mini 16 GB:
1 data_label_factory pipeline --project P \
2 --backend gemma --label-backend falcon --verify-backend gemma
3 # Gemma 4 E4B (2 GB, 2.3s/img) + Falcon (2.4 GB, 11s/img) = ~4.5 GB total
Best combo for speed (cloud):
1 data_label_factory pipeline --project P \
2 --backend openrouter --label-backend openrouter
3 # ~1-2s per image, pay-per-token via OpenRouter
Create your own project
Option A: Auto-generate from samples
1 data_label_factory auto --samples ~/my-images/ --description "fire hydrants"
2 # Creates projects/fire-hydrants.yaml automatically
Option B: Write a YAML
1 project_name : fire - hydrants
2 target_object : "fire hydrant"
3 data_root : ~/data - label - factory/fire - hydrants
4
5 buckets :
6 positive/clear_view :
7 queries : [ "red fire hydrant" , "yellow fire hydrant" ]
8 negative/other_objects :
9 queries : [ "mailbox" , "parking meter" ]
10 background/empty :
11 queries : [ "empty city street" ]
12
13 falcon_queries :
14 - "fire hydrant"
15 - "red metal post"
16
17 backends :
18 filter : openrouter
19 label : openrouter
20 verify : openrouter
CLI Commands
1 # Full pipeline (gather + filter + label + verify + YOLO export)
2 data_label_factory pipeline --project P --backend openrouter --label-backend openrouter
3
4 # Individual stages
5 data_label_factory gather --project P --max-per-query 30
6 data_label_factory filter --project P --backend openrouter --limit 20
7 data_label_factory label-v2 --project P --backend openrouter
8 data_label_factory verify --project P --backend openrouter
9 data_label_factory export --experiment latest --output yolo_dataset/
10
11 # Auto-create project from samples
12 data_label_factory auto --samples ~/imgs/ --description "fire hydrants"
13
14 # Benchmark backends or models
15 data_label_factory benchmark --run --project P --backends falcon,openrouter --limit 30
16 data_label_factory benchmark --models --project P --model-list "qwen,google/gemma-4-26b-a4b-it"
17 data_label_factory benchmark --score experiments/latest/
18
19 # Check what's available
20 data_label_factory providers
21 data_label_factory status
22
23 # Generate synthetic training data
24 data_label_factory generate --refs ~/card-pngs/ --output synth_data --scenes 500
25
26 # MCP server for AI agents
27 data_label_factory serve-mcp
Web UI
1 # Start the Python API server
2 python3 -m data_label_factory.serve --port 8400
3
4 # Start the web UI
5 cd web && npm install && PORT = 3030 npm run dev
Route What /labelUpload images, filter + label + ask AI with any backend /pipelineAuto-research: crawl websites → screenshot → label UI elements → train YOLO /canvasReview COCO-labeled datasets with bbox overlay /canvas/liveLive video/webcam tracker with Falcon Perception
Optional: Local backends (Mac Mini)
Falcon Perception (bbox labeling)
1 pip install mlx mlx-vlm
2 python3 falcon_server.py --model ~/models/falcon-perception-mlx --port 8501
3 # Set GEMMA_URL=http://localhost:8501 when running pipeline
Gemma 4 E4B (filter/verify)
1 # Download: huggingface-cli download mlx-community/gemma-4-e4b-it-4bit --local-dir ~/models/gemma4-e4b-4bit
2 # Serve via Expert Sniper or mlx_vlm
Qwen 2.5-VL (filter/verify)
1 pip install mlx-vlm
2 python3 -m mlx_vlm.server --model mlx-community/Qwen2.5-VL-3B-Instruct-4bit --port 8291
Optional: GPU path via RunPod
For large runs (10K+ images):
1 pip install -e ".[runpod]"
2 export RUNPOD_API_KEY = rpa_xxxxxxxxxx
3 python3 -m data_label_factory.runpod pipeline \
4 --project projects/drones.yaml --gpu L40S \
5 --publish-to < you > / < dataset >
Optional: Open-set identification
For "which of N known items am I holding?" (1 image per class, no training):
1 pip install -e ".[identify]"
2 python3 -m data_label_factory.identify index --refs ~/my-cards/ --out my.npz
3 python3 -m data_label_factory.identify serve --index my.npz --refs ~/my-cards/
Proven results
Dataset Images Bboxes Verify rate Quality Stop signs (OpenRouter) 11 43 100% 98% pass Stop signs (Falcon) 11 64 72% 56% pass Drones (Falcon + RunPod) 1,421 15,355 78% —
Credits
Falcon Perception by TII (Apache 2.0)
Gemma 4 by Google DeepMind (Apache 2.0)
Qwen 2.5-VL by Alibaba (Apache 2.0)
MLX by Apple ML Research (MIT)
mlx-vlm by Prince Canuma (MIT)
OpenRouter for cloud model access