End-to-end ML curation pipeline: image ingest, preprocess, VLM label, train/predict, and RAG-style chunk/embed/enrich — single CLI, single DuckDB.
Project description
ViT-Curator
End-to-end ML curation pipeline: image ingest → preprocess → VLM label → train/predict → chunk/embed/enrich, plus a live TUI dashboard. Single CLI, single DuckDB.
What it does
ViT-Curator is a single command-line tool that turns a giant pile of messy images into a deduplicated, labeled, searchable knowledge base — and lets you train a custom model to auto-label new images.
download/unzip
→ scan → hash → dedupe → crop/deskew → resize to N presets
→ VLM (Qwen3-VL) labels every image
→ train a fastai ViT/ResNet on the labels
→ predict on new images at low cost
→ chunk / embed / enrich the captions + text
→ Textual TUI watches it all run
Everything lives in one DuckDB file — files, derivatives, labels,
runs, predictions, trained models, chunks, embeddings, and enrichments
all share a single schema with an additive-migration framework.
Installation
uv sync # Core dependencies
uv sync --extra train # + FastAI training
uv sync --extra label # + nvidia-ml-py for GPU monitoring
uv sync --extra tui # + Textual dashboard
uv sync --extra dali # + NVIDIA DALI for GPU decode
uv sync --extra embed # + sentence-transformers for embeddings
uv sync --extra dev # + pytest, ruff, pyright
The CLI entry point is vit-curator (alias up).
Usage
# Run directly via uv (recommended — no venv activation needed)
# 0. Ingest: download URLs, extract archives, sort into a directory layout
vit-curator ingest --dest /data --download urls.txt
# 1-2. Preprocess: scan, hash, dedupe, decode, generate per-preset derivatives
vit-curator preprocess --src /data/sorted --out /data \
--presets "vit-train-256=256,thumb-64=64"
# 1.5. Near-duplicate detection (phash)
vit-curator perceptual-dedupe --src /data/sorted --threshold 8
# 3. VLM labeling against a running vLLM server
vit-curator label --db /data/index.duckdb --server-url http://localhost:8000
# 4-6. Train, evaluate, predict, export
vit-curator train --db /data/index.duckdb --run-id <uuid>
vit-curator evaluate --db /data/index.duckdb --run-id <uuid> --model model.pkl
vit-curator predict --db /data/index.duckdb --model model.pkl --target-run-id <uuid>
vit-curator export-model --model model.pkl --formats onnx,torchscript
# 7. Post-processing (RAG)
vit-curator chunk --db /data/index.duckdb --source predictions --run-id <uuid>
vit-curator embed --db /data/index.duckdb --model sentence-transformers/all-MiniLM-L6-v2
vit-curator enrich --db /data/index.duckdb --server-url http://localhost:9001
# Live Textual TUI dashboard
vit-curator dashboard --db /data/index.duckdb
# YAML config-driven full chain
vit-curator run-all --config pipeline.yaml --dry-run
vit-curator run-all --config pipeline.yaml --stages preprocess,train
Real-world jobs it's good for
- E-commerce cataloging at scale (dedupe, crop, deskew, auto-tag, train a custom classifier).
- Document / archive digitization with skew correction + semantic search over the OCR'd text.
- Dataset curation before a vision-model fine-tune.
- Reverse image search / near-duplicate detection for a content platform.
- RAG from a visual corpus — turn a museum or archive into a queryable knowledge base.
See CHANGELOG.md for the full feature list.
Architecture
src/vit_curator/
├── cli.py # Typer entrypoint — every stage as a subcommand
├── config.py # Frozen dataclasses for all stage configs
├── shared/ # DB schema, hashing, errors, progress, signals
├── ingest/ # Stage 0: download / unarchive / sort
├── preprocess/ # Stages 1-2: scan, hash, dedupe, decode, derivatives, crop/deskew, perceptual dedupe
├── label/ # Stage 3: VLM dispatcher + metrics + scheduler
├── train/ # Stages 4-6: train, evaluate, predict, export
├── post/ # Stage 7: chunk, embed, enrich
└── tui/ # Textual dashboard (5 screens, GPU meter, latency histogram)
Development
uv sync --extra dev
uv run ruff check .
uv run pytest -m "not torch and not fastai and not dali and not nvidia and not slow"
uv run python scripts/benchmark.py # smoke benchmark of all 4 core stages
The default test deselection skips tests that need optional heavy stacks (torch, fastai, DALI, nvidia-ml-py). To run those locally:
VIT_CURATOR_TEST_TORCH=1 uv run pytest
VIT_CURATOR_TEST_FASTAI=1 uv run pytest
VIT_CURATOR_TEST_DALI=1 uv run pytest
VIT_CURATOR_TEST_NVIDIA=1 uv run pytest
License
MIT — see LICENSE.
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 vit_curator-0.3.1.tar.gz.
File metadata
- Download URL: vit_curator-0.3.1.tar.gz
- Upload date:
- Size: 99.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3975fe7741011fed98e50cd3e16d91f78cd84c1faba775f8328a98f36a4d6784
|
|
| MD5 |
7c0b0ac81d1880830d67757efd9a4c44
|
|
| BLAKE2b-256 |
95844f1a4db95420ea25aa10639458d5428b8f3de9d27e4e9f3ff262338f3e31
|
Provenance
The following attestation bundles were made for vit_curator-0.3.1.tar.gz:
Publisher:
pypi-publish.yml on Veedubin/vit-curator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vit_curator-0.3.1.tar.gz -
Subject digest:
3975fe7741011fed98e50cd3e16d91f78cd84c1faba775f8328a98f36a4d6784 - Sigstore transparency entry: 2076821178
- Sigstore integration time:
-
Permalink:
Veedubin/vit-curator@aec00d1bbd2a2f8d7957adc9d13ae46adcdbdf21 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/Veedubin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@aec00d1bbd2a2f8d7957adc9d13ae46adcdbdf21 -
Trigger Event:
push
-
Statement type:
File details
Details for the file vit_curator-0.3.1-py3-none-any.whl.
File metadata
- Download URL: vit_curator-0.3.1-py3-none-any.whl
- Upload date:
- Size: 124.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5abe070d19a74143707e2cd4061453d454f2bba26890214df94dc78133963e70
|
|
| MD5 |
96d10bcf353b4df7eeb2fdc5f69d12bd
|
|
| BLAKE2b-256 |
9410c3cdd5939e105a657357d9bd496c7b135d4229d501a449b4176543e534a6
|
Provenance
The following attestation bundles were made for vit_curator-0.3.1-py3-none-any.whl:
Publisher:
pypi-publish.yml on Veedubin/vit-curator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vit_curator-0.3.1-py3-none-any.whl -
Subject digest:
5abe070d19a74143707e2cd4061453d454f2bba26890214df94dc78133963e70 - Sigstore transparency entry: 2076821441
- Sigstore integration time:
-
Permalink:
Veedubin/vit-curator@aec00d1bbd2a2f8d7957adc9d13ae46adcdbdf21 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/Veedubin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@aec00d1bbd2a2f8d7957adc9d13ae46adcdbdf21 -
Trigger Event:
push
-
Statement type: