Skip to main content

Distill raw image pools into optimized, high-diversity reference sets for character model training.

Project description

lookbook

Distill raw image pools into optimized, high-diversity reference sets for training personalized models (character LoRAs, product LoRAs, style LoRAs).

Status: All five v1 phases are shipped. The package can: clean a photo dump (200→20 in <30s, no GPU); run the full embeddings + facility-location workflow with CLIP or DINOv2; curate a person / character LoRA with face detection, ArcFace identity diversity, and pose-bin quotas; serve every verb over HTTP (FastAPI via qh); and expose every verb over MCP (via fastmcp) so an LLM agent can drive curation directly. See misc/docs/lookbook_development_plan.md for the full roadmap and misc/docs/lookbook_design_report.md for the design rationale.

Why

Training a personalized image model needs ~15–30 carefully chosen reference images, where each adds new context — pose, lighting, expression, distance. "Top-K by score" collapses to near-duplicates; this is fundamentally a set-selection problem with diversity as a constraint, not a tiebreaker.

lookbook separates per-image scoring (is this image individually good?) from set-level selection (does this collection cover the concept?), and makes both extensible.

Install

pip install lookbook                  # core: Pillow, numpy, dol, meshed, config2py
pip install lookbook[funnel]          # + cv2 / imagededup for the cheap funnel
pip install lookbook[embed]           # + torch, CLIP, DINOv2, pyiqa, apricot
pip install lookbook[person]          # + InsightFace, head pose, mediapipe
pip install lookbook[http]            # + FastAPI / qh server
pip install lookbook[mcp]             # + fastmcp (Anthropic MCP server)

The base install has no ML dependencies — Phase 1 (cheap funnel) works on a plain laptop. [embed] and beyond pull torch.

Quickstart

CLI:

# Phase 1: clean up a photo dump (drops blurry, dark, duplicate, tiny).
lookbook curate ./photos --k 20 --recipe funnel

# Phase 2: same funnel + DINOv2 embeddings + facility-location selection
# for "diverse but sharp" picks. Downloads ~350MB on first run; subsequent
# runs are fast and cached. Use --recipe diverse_clip for CLIP semantic
# embeddings instead.
lookbook curate ./photos --k 20 --recipe diverse

# Phase 3: full character/person LoRA curation. Detects faces, embeds
# with ArcFace, applies pose-bin quotas, and runs cluster-coverage
# diagnosis. Pulls insightface + sixdrepnet (lazy on first use).
lookbook curate ./photos --k 20 --recipe person

# Same shape with no model downloads (mock backends; useful for tests):
lookbook curate ./photos --k 8 --recipe person_mock

# Phase 4: HTTP server. Every verb is POST /<verb> with a JSON body;
# Swagger UI at /docs.
lookbook serve --port 8000 --host 127.0.0.1
# curl examples:
#   curl -X POST localhost:8000/list_recipes -H 'Content-Type: application/json' -d '{}'
#   curl -X POST localhost:8000/curate_source -H 'Content-Type: application/json' \
#        -d '{"source_path":"/abs/photos","k":20,"recipe":"funnel"}'

# Phase 5: MCP server (stdio transport — for Claude Desktop, Anthropic SDK).
# Each verb is exposed as an MCP tool an agent can call.
lookbook mcp

# See available scorers, embedders, filters, selectors, recipes / profiles:
lookbook list-plugins
lookbook list-recipes

Python:

from lookbook import curate

result = curate(
    "./photos",
    k=20,
    scorer_ids=("resolution", "file_hash", "phash", "blur", "exposure"),
    filter_ids=(
        ("min_resolution", {"min_long_side": 800}),
        "exposure_range",
        "min_blur",
        "no_exact_duplicate",
        "no_near_duplicate",
    ),
    selector_id=("top_k", {"metric_id": "blur"}),
)
print(result.report)        # drop counts attributed to each filter
print([r.image_id for r in result.kept])

Architecture

Five layers; the heavy ML libs live only at the bottom so the upper layers stay laptop-installable.

Interface       (CLI, HTTP via qh, MCP via py2mcp, Python lib)
   ↓
Recipe / facade (lookbook.curate, named recipes, profiles)
   ↓
Orchestration  (lookbook.pipeline, manifest, drop attribution, run records)
   ↓
Plugin layer   (Scorer | Filter | Embedder | Selector — Protocols)
   ↓
Backend        (CLIP, DINOv2, InsightFace, pyiqa, apricot — wrapped, lazy-imported)

The manifestMutableMapping[(image_id, metric_id), Annotation] — is the SSOT. Persistence is pluggable via dol: filesystem (default), SQLite, S3, Mongo, Redis. The default location is the user's app data folder via config2py (~/Library/Application Support/lookbook on macOS).

New scorers/selectors/filters are registered, never subclassed. See the .claude/skills/ directory for developer skills (lookbook-dev, lookbook-add-scorer, lookbook-add-selector, lookbook-storage).

Project layout

lookbook/
  base.py               Protocols + Annotation + Manifest type
  store.py              dol-backed Stores bundle, manifest codec
  _paths.py             config2py-backed default folders
  refs.py               PathImageRef, BytesImageRef, UrlImageRef
  manifest.py           Manifest helpers
  registry.py           Plugin registries
  pipeline.py           Orchestrator (topo-sorted scorers + filters + selector)
  report.py             Drop-attributing Report
  scorers/              random, resolution, file_hash, phash, blur, exposure
                          + person.py: face detection, area, head pose, quality
  embedders/            mock, clip, dinov2, arcface (lazy-imported)
  filters/              min_resolution, min_blur, exposure_range, dedup
                          + person.py: has_face, single_face_only, min_face_*
  selectors/            top_k, facility_location, quota
  profiles/             person.yaml, person_mock.yaml (+ user-edited via config2py)
  diagnose.py           cluster_coverage (set-level diagnosis)
  io/                   ingest, ingest_to_store
  http.py               qh-built FastAPI surface; mk_lookbook_app, serve
  mcp.py                fastmcp-built MCP server; mk_lookbook_mcp, serve
  __main__.py           CLI (argh): curate, list-plugins, list-recipes

.claude/skills/         Claude Code skills for development & agent use
misc/docs/              Design report + development plan
tests/                  pytest, hermetic

Claude Code skills

The .claude/skills/ directory ships nine skills covering both ends of the workflow:

Dev skills (used while building / extending lookbook):

  • lookbook-dev — overall architecture, cross-references between modules
  • lookbook-storage — repository pattern, swapping storage backends
  • lookbook-add-scorer — adding a new per-image metric
  • lookbook-add-selector — adding a new set-selection algorithm
  • lookbook-profile — adding a subject profile (YAML)
  • lookbook-http — HTTP route layout + adding endpoints

Usage skills (for agents driving lookbook to curate):

  • lookbook-curate — the headline workflow
  • lookbook-diagnose — interpreting reports, querying the manifest
  • lookbook-recipe — customizing recipes per-call or via user YAML

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

lookbook-0.0.4.tar.gz (108.4 kB view details)

Uploaded Source

Built Distribution

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

lookbook-0.0.4-py3-none-any.whl (55.7 kB view details)

Uploaded Python 3

File details

Details for the file lookbook-0.0.4.tar.gz.

File metadata

  • Download URL: lookbook-0.0.4.tar.gz
  • Upload date:
  • Size: 108.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for lookbook-0.0.4.tar.gz
Algorithm Hash digest
SHA256 18cd3747dc2b6bbd881ab312b2b25d46dd6f6c64e27ad6e351f7be7f21cd1f0b
MD5 2b30f7fa6b150e1a6b8e396b54dec7e7
BLAKE2b-256 a6b83bd11f9dd3e066062019391e278a1032533d4297d5659d959cef31079666

See more details on using hashes here.

File details

Details for the file lookbook-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: lookbook-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 55.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for lookbook-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 ea649e56d41ccc6382cc2b005d8d2fd30b9a281b88f7e269d5dcf2e9ad98b5e4
MD5 1ce6dd0915ca18214a28db6dea2602db
BLAKE2b-256 7dd06dd340f9b28ee314e836f8ea16755e8798e8cf199ea0fa4c5b86b74a91bc

See more details on using hashes here.

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