Skip to main content

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.

CI Python 3.11+ License: MIT Code style: ruff

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 filefiles, 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vit_curator-0.3.1.tar.gz (99.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vit_curator-0.3.1-py3-none-any.whl (124.9 kB view details)

Uploaded Python 3

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

Hashes for vit_curator-0.3.1.tar.gz
Algorithm Hash digest
SHA256 3975fe7741011fed98e50cd3e16d91f78cd84c1faba775f8328a98f36a4d6784
MD5 7c0b0ac81d1880830d67757efd9a4c44
BLAKE2b-256 95844f1a4db95420ea25aa10639458d5428b8f3de9d27e4e9f3ff262338f3e31

See more details on using hashes here.

Provenance

The following attestation bundles were made for vit_curator-0.3.1.tar.gz:

Publisher: pypi-publish.yml on Veedubin/vit-curator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for vit_curator-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5abe070d19a74143707e2cd4061453d454f2bba26890214df94dc78133963e70
MD5 96d10bcf353b4df7eeb2fdc5f69d12bd
BLAKE2b-256 9410c3cdd5939e105a657357d9bd496c7b135d4229d501a449b4176543e534a6

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page