From 64700ea6da77bf35584d47ac2df760a82ff987c9 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 28 Apr 2026 00:34:55 -0500 Subject: [PATCH] =?UTF-8?q?Synthetic=20face=20pool=20=E2=80=94=201000=20St?= =?UTF-8?q?yleGAN=20headshots,=20ComfyUI=20hot-swap,=2060x=20smaller=20thu?= =?UTF-8?q?mbs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Worker cards now ship a real photo per person instead of monogram tiles: - fetch_face_pool.py pulls 1000 faces from thispersondoesnotexist.com - tag_face_pool.py runs deepface for gender/race/age, excludes <22yo - manifest.jsonl: 952 servable, gender/race buckets populated - /headshots/_thumbs/ pre-resized to 384px webp (587KB -> 11KB, 60x smaller; without this Chrome's parallel-connection budget drops ~75% of tiles in a 40-card grid) - /headshots/:key gender x race x age intersection bucketing with gender-only fallback when intersection is sparse - /headshots/generate/:key ComfyUI on-demand for the contractor profile spotlight (cold ~1.5s, cached ~1ms; worker-derived djb2 seed makes faces deterministic-per-worker but unique across workers sharing the same prompt) - serve_imagegen.py _cache_key() now includes seed (was caching by prompt only -> 3 different worker seeds collapsed to 1 cached image; verified fix produces 3 distinct md5s) - confidence-default name resolution: Xavier->man+hispanic, Aisha->woman+black, etc. Every worker resolves to a bucket. End-to-end: playwright run on /?q=forklift+operators+IL -> 21/21 cards loaded, 0 broken, all 384px webp. Cache + binary pool gitignored; manifest tracked. Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitignore | 6 +- STATE_OF_PLAY.md | 239 ++++++ data/headshots/manifest.jsonl | 1198 ++++++++++++++++++++++++----- mcp-server/console.html | 3 +- mcp-server/index.ts | 152 +++- mcp-server/search.html | 4 +- scripts/serve_imagegen.py | 20 +- scripts/staffing/tag_face_pool.py | 169 ++++ 8 files changed, 1575 insertions(+), 216 deletions(-) create mode 100644 STATE_OF_PLAY.md create mode 100644 scripts/staffing/tag_face_pool.py diff --git a/.gitignore b/.gitignore index f6ee8bf..6a07037 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,9 @@ __pycache__/ *.pyc # Headshot pool — binary face JPGs are fetched by scripts/staffing/fetch_face_pool.py -# (synthetic StyleGAN, ~100MB for 200 faces). Manifest + fetch script are tracked. +# (synthetic StyleGAN, ~580MB for 1000 faces). Manifest + fetch script are tracked. data/headshots/face_*.jpg +data/headshots/_thumbs/ +# ComfyUI on-demand generated portraits (per-worker unique). Cached on first +# request; fully regeneratable via /headshots/generate/:key. +data/headshots_gen/ diff --git a/STATE_OF_PLAY.md b/STATE_OF_PLAY.md new file mode 100644 index 0000000..c0de261 --- /dev/null +++ b/STATE_OF_PLAY.md @@ -0,0 +1,239 @@ +# STATE OF PLAY — Lakehouse + +**Last verified:** 2026-04-27 ~20:35 CDT +**Verified by:** live probe, not memory. + +> **Read this FIRST.** When the user says "we're working on lakehouse," they mean the working code captured below — NOT what `git log` framed as "the cutover" or what memory snapshots from 2 days ago suggest. If memory contradicts this file, this file wins. Update it when something is verified working — not when a phase finishes. + +--- + +## VERIFIED WORKING RIGHT NOW + +### The client demo (Staffing Co-Pilot) + +**Public URL:** `https://devop.live/lakehouse/` — 200, "Staffing Co-Pilot" (159 KB SPA, leaflet maps, dark theme). +**Local URL:** `http://localhost:3700/` — same page, served by `mcp-server/index.ts` (PID 1271, started 09:48 CDT today). + +**The staffers console** (the one the client was thoroughly impressed with): +- `https://devop.live/lakehouse/console` — 200, "Lakehouse — What Your Staffing System Would Do" (26 KB) +- Pulls project index via `/api/catalog/datasets` (36 datasets) + playbook memory via `/api/vectors/playbook_memory/stats` (4,701 entries with embeddings, real ops like *"fill: Maintenance Tech x2 in Milwaukee, WI"*) + +Client-visible flow that works end-to-end on the public URL: + +| Endpoint | Sample output | +|---|---| +| `GET /api/catalog/datasets` | 36 datasets indexed: timesheets 1M, call_log 800K, workers_500k 500K, email_log 500K, workers_100k 100K, candidates 100K, placements 50K, job_orders 15K, successful_playbooks_live 2,077 | +| `GET /api/vectors/playbook_memory/stats` | 4,701 fill operations with embeddings | +| `GET /system/summary` | 36 datasets, 2.98M rows, 60 indexes, 500K workers loaded, 1K candidates | +| `POST /intelligence/staffing_forecast` | 744 Production Workers needed in 30d, 11,281 bench (4,687 reliable), coverage 1,444%, risk=ok. Same for Electrician (need 32, bench 2,440) and Maintenance Tech (need 17, bench 5,004). | +| `POST /intelligence/permit_contracts` | permit `3442956` $500K → 3 Production Workers, 886-candidate pool, 95% fill, $36K gross. 5 more Chicago permits with 8 workers each, same pool, 95% fill, $96K each. | +| `POST /intelligence/market` | major Chicago permits ranked: $730M O'Hare, $615M 307 N Michigan, $580M casino, $445M Loop transit (real geo coords). | +| `POST /intelligence/permit_entities` | architects + contractors from permit contacts (e.g. "KACPRZYNSKI, ANDY", "SLS ELECTRICAL SERVICE"). | +| `POST /intelligence/activity` + `/intelligence/arch_signals` + `/intelligence/chat` | all 200 | + +The demo tells the story: *"upcoming Chicago contracts → workers needed → coverage from the bench → architects/contractors involved → revenue and margin."* That's the "live data + anticipating contracts + complete workflow" pitch — working as of right now. + +### Backend, verified live this session + +| Surface | State | +|---|---| +| Gateway `:3100` | up, 4 providers configured, `/v1/health` 200 with 500K workers loaded | +| MCP server `:3700` (Co-Pilot demo) | up, all `/intelligence/*` endpoints respond | +| VCP UI `:3950` | started this session, `/data/*` 200, real numbers | +| Observer `:3800` | ring full (2,000/2,000) — older events evicted, query Langfuse for 24h-ago state | +| Sidecar `:3200` | up | +| Langfuse `:3001` | recording, `gw:/log` + `v1.chat:openrouter` traces visible | +| LLM Team UI `:5000` | up, only `extract` mode registered | +| OpenCode fleet | **40 models reachable through one `sk-*` key** (verified live `GET https://opencode.ai/zen/v1/models`) | + +OpenCode catalog (live): +- Claude: opus-4-7, opus-4-6, opus-4-5, opus-4-1, sonnet-4-6, sonnet-4-5, sonnet-4, haiku-4-5 +- GPT-5: 5.5-pro, 5.5, 5.4-pro, 5.4, 5.4-mini, 5.4-nano, 5.3-codex-spark, 5.3-codex, 5.2, 5.2-codex, 5.1-codex-max, 5.1-codex, 5.1-codex-mini, 5.1, 5-codex, 5-nano, 5 +- Gemini: 3.1-pro, 3-flash +- GLM: 5.1, 5 +- Minimax: m2.7, m2.5 +- Kimi: k2.6, k2.5 +- Qwen: 3.6-plus, 3.5-plus +- Other: BIG-PKL (was a typo-prone name in the catalog, model id starts with "big-pkl-something") +- Free tier: minimax-m2.5-free, hy3-preview-free, ling-2.6-flash-free, trinity-large-preview-free + +### The substrate (frozen — do not re-architect) + +- Distillation v1.0.0 at tag `e7636f2` — **145/145 bun tests pass, 22/22 acceptance, 16/16 audit-full** +- Output: `data/_kb/distilled_{facts,procedures,config_hints}.jsonl` + `data/vectors/distilled_{factual,procedural,config_hint}_v20260423102847.parquet` +- Auditor cross-lineage: Kimi K2.6 ↔ Haiku 4.5 alternation, Opus auto-promote on diffs >100k chars, **per-PR cap=3 with auto-reset on new head SHA** +- Pathway memory: 88 traces, 11/11 successful replays (probation gate crossed) +- Mode runner: 5 native modes; `codereview_isolation` is default; composed-corpus auto-downgrade verified Apr 26 (composed lost 5/5 vs isolation, p=0.031) + +### Matrix indexer + +30+ live corpora including: +- 5 versions of `workers_500k_v1..v9` (50K embedded chunks each) +- 11 batched 2K-row shards `w500k_b3..b17` +- `chicago_permits_v1` (3,420), `resumes_100k_v2` (100K candidates), `ethereal_workers_v1` (10K) +- `lakehouse_arch_v1` (2,119), `lakehouse_symbols_v1` (2,470), `lakehouse_answers_v1` (1,269), `scrum_findings_v1` (1,260) +- `kb_team_runs_v1` (12,693) + `kb_team_runs_agent` (4,407) — LLM-team play history embedded +- `distilled_factual_v20260423102507` (8) — distillation output + +### Code health + +- `cargo check --workspace` → **0 warnings, 0 errors** +- `bun test auditor + tests/distillation` → **145/145 pass** +- `ui/server.ts` + `auditor.ts` bundle clean + +--- + +## DO NOT RELITIGATE + +- **PR #11 is merged into `origin/main` as `ed57eda`** — do not "still need to merge PR #11." +- **Distillation tag `distillation-v1.0.0` at `e7636f2` is FROZEN** — do not re-architect schemas, scorer rules, audit fixtures. +- **Kimi forensic HOLD verdict (2026-04-27) was 2/8 false + 6/8 latent** — do not re-debate, see `reports/kimi/audit-last-week-full.md`. +- **`candidates_safe` `vertical` column bug** — fixed at catalog metadata layer in commit `c3c9c21`. Do not "discover" it again. +- **Decisions A/B/C/D from `synthetic-data-gap-report.md`** — all four scripts shipped today (`d56f08e`, `940737d`, `c3c9c21`). Do not "ask J for approval." +- **`workers_500k.phone` type fixup** — already string. The fixup script is idempotent; running it is a no-op. +- **`client_workerskjkk` typo dataset** — was breaking every SQL query (catalog had it registered, file didn't exist). Removed via `DELETE /catalog/datasets/by-name/client_workerskjkk` this session. Do not re-add. Adding a startup gate that errors on unrecognized parquet names is the long-term fix per now.md Step 2C. + +--- + +## FIXES MADE THIS SESSION (2026-04-27 evening) + +1. **`crates/gateway/src/v1/iterate.rs:93`** — `state` → `_state` (cleared the one cargo warning). +2. **`lakehouse-ui.service` (Dioxus)** — disabled. Was failing 7,242 times against a missing `target/dx/ui/debug/web/public` build dir. `systemctl stop && disable`. +3. **VCP UI on `:3950`** — started `bun run ui/server.ts` (PID 1162212, log `/tmp/lakehouse_ui.log`). `/data/*` endpoints now 200 with real data. +4. **`client_workerskjkk` catalog entry** — `DELETE /catalog/datasets/by-name/client_workerskjkk` removed the dead manifest. **This was the actual root cause** of `/system/summary` reporting `workers_500k_rows: 0` and the demo showing zero bench. Every SQL query was failing schema inference on the missing file before reaching its target table. Fixed → `workers_500k_rows: 500000`, `candidates_rows: 1000`, demo coverage flipped from "critical 0%" to actual percentages on devop.live/lakehouse. + +## FIXES MADE THIS SESSION (2026-04-28 early — face pool) + +5. **Synthetic StyleGAN face pool — 1000 faces, gender+race+age tagged.** `scripts/staffing/fetch_face_pool.py` fetches from thispersondoesnotexist.com; `scripts/staffing/tag_face_pool.py --min-age 22` runs deepface and excludes minors. `data/headshots/manifest.jsonl` now has gender (494 men / 458 women), race (caucasian 662 · east_asian 128 · hispanic 86 · middle_eastern 59 · black 14 · south_asian 3), age, and 48 minor exclusions. Server pool = 952 servable faces. +6. **`mcp-server/index.ts:1308` `/headshots/:key` route** — gender×race×age intersection bucketing with graceful fallback (gender-only → all). Same key always returns same face; different keys spread evenly. +7. **`/headshots/_thumbs/` pre-resized 384×384 webp** (60× smaller: 587KB → ~11KB). Without this, 40-card grids overran Chrome's parallel-connection budget and ~75% of tiles never finished decoding. Generated via parallel ffmpeg (`xargs -P 8`); `.gitignore`d. +8. **`mcp-server/search.html` + `console.html`** — dropped `img.loading='lazy'`. With 11KB thumbs, eager load is cheap (~500KB for 50 cards) and avoids the off-screen race that lazy decode produced. +9. **ComfyUI on-demand uniqueness — `serve_imagegen.py:32`** added `seed` to `_cache_key()` (was caching by prompt only — 3 different worker seeds collapsed to 1 cached image). Verified: seed=839185194/195/196 → 3 distinct md5s. +10. **`mcp-server/index.ts:1234` `/headshots/generate/:key`** — ComfyUI hot-path that derives a deterministic-per-worker seed via djb2-style hash; cold ~1.5s, cached ~1ms. Worker prompt format: `professional corporate headshot portrait of a {age}-year-old {race} {gender}, {role}, neutral expression, plain studio background, soft natural lighting, sharp focus, photorealistic, dslr`. Cache at `data/headshots_gen/` (gitignored, regeneratable). +11. **Confidence-default name resolution** in `search.html` — `genderFor()` and `guessEthnicityFromFirstName()` lookup tables (FEMALE_NAMES, MALE_NAMES, NAMES_HISPANIC, NAMES_BLACK, NAMES_SOUTH_ASIAN, NAMES_EAST_ASIAN, NAMES_MIDDLE_EASTERN). Xavier → man+hispanic, Aisha → woman+black, etc. Every worker resolves to a face-pool bucket. + +End-to-end verified: playwright run on `https://devop.live/lakehouse/?q=forklift+operators+IL` → 21/21 cards loaded, 0 broken, all 384×384 webp thumbs. + +--- + +## OPEN — but not blocking the demo + +| Item | What | When to act | +|---|---|---| +| `modes.toml` `staffing_inference.matrix_corpus` | still says `workers_500k_v8`. v9 in vector index is from Apr 17 (raw-sourced, not safe-view). The new `build_workers_v9.sh` rebuilds from `workers_safe`. | Run when you have 30+ min for the rebuild. | +| Open PRs #6, #7, #10 | sitting since Apr 22-24, auditor verdicts on disk at `data/_auditor/kimi_verdicts/{6,7,10}-*.json` | Read verdicts, decide reconcile/close. | +| `test/enrich-prd-pipeline` branch | 35 unmerged commits, includes more-evolved auditor/inference.ts (666 vs main's 580 lines), curation+fact-extractor wiring | Reconcile or formally archive — see `memory/project_unmerged_architecture_work.md`. | +| `federation-hnsw-trials` stash | Lance + S3/MinIO prototype, `aws-config` crate added, 708 insertions | Phase B from EXECUTION_PLAN.md — revisit when Parquet vector ceiling actually hurts. | +| `candidates` manifest drift | manifest 100K vs SQL 1K. Cosmetic. | Run a metadata resync if it matters. | + +--- + +## RUNTIME CHEATSHEET + +```bash +# Verify the demo (public + local both work) +curl -sS https://devop.live/lakehouse/ # Co-Pilot HTML +curl -sS https://devop.live/lakehouse/console # staffers console +curl -sS -X POST https://devop.live/lakehouse/intelligence/staffing_forecast \ + -d '{}' -H 'content-type: application/json' \ + | jq '.forecast[] | {role, demand_workers, bench_total, coverage_pct, risk}' + +# Restart sequence (after Rust changes) +sudo systemctl restart lakehouse.service # gateway :3100 +sudo systemctl restart lakehouse-auditor # auditor daemon +sudo systemctl restart lakehouse-observer # observer :3800 +# UI bun on :3950 is NOT systemd-managed (lakehouse-ui.service is disabled). +# Restart manually: kill ; nohup bun run ui/server.ts > /tmp/lakehouse_ui.log 2>&1 & + +# Health checks +curl -sS http://localhost:3100/v1/health | jq # workers_count, providers +curl -sS http://localhost:3100/vectors/pathway/stats | jq +curl -sS http://localhost:3100/v1/usage | jq # since-restart cost +curl -sS http://localhost:3700/system/summary | jq # dataset counts +``` + +--- + +## VISION — what we're actually building (not what's done) + +J's framing for the legacy staffing company: + +- Pull live data, anticipate contracts based on Chicago permits → real architect/contractor associations, headcount, time period, money, scope. +- Hybrid + memory index → search large corpora cheaply. +- Email comes in → verify against contract; SMS comes in → alert when index changes. +- Real-time. +- Invent metrics nobody else has using the hybrid index. +- Next stage: workers download an app → geolocation clock-in → automatic responsiveness measurement, no user effort, with incentives for using it. +- Find people getting certificates (passive cert tracking). +- Pull union data → bring contracts that work for **employees**, not just employers. +- All metrics visible, nothing hidden, value-aligned with what each side actually needs. + +If a future session is shaving away from this vision toward "fix the cutover" or "land Phase X," the vision wins. Phases are scaffolding for the vision, not the goal. + +--- + +## CURRENT PLAN — fix the demo for the legacy staffing client + +Built from playwright audit of the live demo (2026-04-27 evening). Each item ends in something the client can SEE, not internal cleanups. + +**Demo state is anchored by git tag `demo-2026-04-27`** (commit `ed57eda`, the merge of PR #11). To restore code state: `git checkout demo-2026-04-27`. To restore runtime state: `DELETE /catalog/datasets/by-name/client_workerskjkk` (catalog hot-fix is not in git). + +### P1 — Search box that actually filters (highest visible impact) + +**Problem:** typing in `#sq` and pressing Enter fires `POST /intelligence/chat` with body `{"message":""}`. The state (`#sst`) and role (`#srl`) selects are ignored — never sent in the body. So every search returns a generic chat completion, never a SQL+vector hybrid filter against `workers_500k`. That is the "cached/generic response" the client sees. + +**Fix:** in `mcp-server/search.html`, change the search-submit handler to call the real worker search endpoint with `{query, state, role, top_k}`. The MCP `search_workers` tool surface already exists; route the form there. Render returned worker rows in the existing card grid. + +**Done when:** typing "forklift" + state IL + role "Forklift Operator" returns ≤ top_k IL Forklift Operators, and changing state to WI returns different workers. + +### P2 — Contractor-name click → `/contractor` profile page + +**Problem:** clicking a contractor name in any rendered card stays on `/lakehouse/`. URL doesn't change. + +**Fix:** wrap contractor names in ``. The page `mcp-server/contractor.html` (14.8 KB, "Contractor Profile · Staffing Co-Pilot") already exists at `/contractor` and the data endpoint `/intelligence/contractor_profile` already returns rich data. + +**Then check contractor.html actually shows:** full history of every record the database has on that contractor + heat map of locations underneath + relevant info (per J 2026-04-27). If the page is incomplete, finish it. Otherwise just wire the link. + +**Done when:** clicking "KACPRZYNSKI, ANDY" opens a profile with: every Chicago permit they're contact_1 or contact_2 on, a leaflet map with markers for each address, and any matched workers from prior placements at their sites. + +### P3 — Substrate signal at the bottom shows the right numbers + +**Problem:** J reports the bottom panel says "playbook memory empty, 80 traces 0 replies." Reality from the live endpoints: `/api/vectors/playbook_memory/stats` = 4,701 entries with embeddings; `/vectors/pathway/stats` = 88 traces, 11/11 replays. + +**Fix:** find the renderer in search.html that builds the substrate signal panel; verify it's hitting the right endpoints and reading the right keys; fix shape mismatches. + +**Done when:** bottom panel shows real numbers (4,701 playbooks, 88 traces, 11/11 replays) and references at least one specific recent operation from the playbook stats sample. + +### P4 — Top nav reflects today's architecture + +**Problem:** Walkthrough/Architecture/Spec/Onboard/Alerts/Workspaces tabs all return 200 but content is from old architecture. Doesn't mention: gateway scratchpad, memory indexer, ranker, mode runner, OpenCode 40-model fleet, distillation substrate, auditor cross-lineage. + +**Fix:** rewrite `mcp-server/proof.html` (or add a single new page "What's running" that replaces Architecture+Spec) to describe what's actually shipped as of `demo-2026-04-27`. Keep one architecture page, drop redundancy. Either complete or hide Onboard/Alerts/Workspaces — J's call which. + +**Done when:** the architecture page tells a non-technical reader, in 2 minutes, what each piece does in coordinator-relatable terms ("intern that read every email", not "3-stage adversarial inference pipeline"). + +### P5 — Caching for the project-index build_signal (J flagged unfinished) + +**Problem:** "we never finished our caching for project index build signal it's not pulling new information." Need to find what `build_signal` refers to. Likely a scrum/auditor signal that should rebuild the `lakehouse_arch_v1` corpus on commit but isn't wired to. + +**Fix:** identify the build-signal pipeline (likely in `auditor/` or `crates/vectord/`), wire its emit to a corpus rebuild, verify by making a test commit and watching the new chunk appear in `/vectors/indexes` for `lakehouse_arch_v1`. + +**Done when:** committing a new file to `crates/` causes `lakehouse_arch_v1` chunk_count to increase within N minutes. + +### P0 — Anchor the demo state (DONE) + +Tagged `ed57eda` as `demo-2026-04-27`. Future sessions: `git checkout demo-2026-04-27` to land in this exact code state. + +--- + +## EXECUTION ORDER + +1. **P1 first** — biggest visible bug, ~30-60 min +2. **P2 next** — contractor click is the second-biggest "doesn't work" the client sees, ~20 min if profile is mostly done +3. **P3** — small fix, big "looks alive" win +4. **P4** — biggest scope; might split across sessions +5. **P5** — feature work, only after the visible bugs are fixed + +Each item commits independently with the format `demo: P` so the commit log doubles as a progress journal. After each merge to main, re-tag `demo-latest` to point at the new HEAD. + +Stop here and let J pick which item to start with. Do not silently extend scope. diff --git a/data/headshots/manifest.jsonl b/data/headshots/manifest.jsonl index c914030..1a5e930 100644 --- a/data/headshots/manifest.jsonl +++ b/data/headshots/manifest.jsonl @@ -1,198 +1,1000 @@ -{"id": 0, "file": "face_0000.jpg", "gender": null} -{"id": 1, "file": "face_0001.jpg", "gender": null} -{"id": 2, "file": "face_0002.jpg", "gender": null} -{"id": 3, "file": "face_0003.jpg", "gender": null} -{"id": 4, "file": "face_0004.jpg", "gender": null} -{"id": 5, "file": "face_0005.jpg", "gender": null} -{"id": 6, "file": "face_0006.jpg", "gender": null} -{"id": 7, "file": "face_0007.jpg", "gender": null} -{"id": 8, "file": "face_0008.jpg", "gender": null} -{"id": 9, "file": "face_0009.jpg", "gender": null} -{"id": 10, "file": "face_0010.jpg", "gender": null} -{"id": 11, "file": "face_0011.jpg", "gender": null} -{"id": 12, "file": "face_0012.jpg", "gender": null} -{"id": 13, "file": "face_0013.jpg", "gender": null} -{"id": 14, "file": "face_0014.jpg", "gender": null} -{"id": 15, "file": "face_0015.jpg", "gender": null} -{"id": 16, "file": "face_0016.jpg", "gender": null} -{"id": 17, "file": "face_0017.jpg", "gender": null} -{"id": 18, "file": "face_0018.jpg", "gender": null} -{"id": 19, "file": "face_0019.jpg", "gender": null} -{"id": 20, "file": "face_0020.jpg", "gender": null} -{"id": 21, "file": "face_0021.jpg", "gender": null} -{"id": 22, "file": "face_0022.jpg", "gender": null} -{"id": 23, "file": "face_0023.jpg", "gender": null} -{"id": 24, "file": "face_0024.jpg", "gender": null} -{"id": 25, "file": "face_0025.jpg", "gender": null} -{"id": 26, "file": "face_0026.jpg", "gender": null} -{"id": 27, "file": "face_0027.jpg", "gender": null} -{"id": 28, "file": "face_0028.jpg", "gender": null} -{"id": 29, "file": "face_0029.jpg", "gender": null} -{"id": 30, "file": "face_0030.jpg", "gender": null} -{"id": 31, "file": "face_0031.jpg", "gender": null} -{"id": 32, "file": "face_0032.jpg", "gender": null} -{"id": 33, "file": "face_0033.jpg", "gender": null} -{"id": 34, "file": "face_0034.jpg", "gender": null} -{"id": 35, "file": "face_0035.jpg", "gender": null} -{"id": 36, "file": "face_0036.jpg", "gender": null} -{"id": 37, "file": "face_0037.jpg", "gender": null} -{"id": 38, "file": "face_0038.jpg", "gender": null} -{"id": 39, "file": "face_0039.jpg", "gender": null} -{"id": 40, "file": "face_0040.jpg", "gender": null} -{"id": 41, "file": "face_0041.jpg", "gender": null} -{"id": 42, "file": "face_0042.jpg", "gender": null} -{"id": 43, "file": "face_0043.jpg", "gender": null} -{"id": 44, "file": "face_0044.jpg", "gender": null} -{"id": 45, "file": "face_0045.jpg", "gender": null} -{"id": 46, "file": "face_0046.jpg", "gender": null} -{"id": 47, "file": "face_0047.jpg", "gender": null} -{"id": 48, "file": "face_0048.jpg", "gender": null} -{"id": 49, "file": "face_0049.jpg", "gender": null} -{"id": 50, "file": "face_0050.jpg", "gender": null} -{"id": 51, "file": "face_0051.jpg", "gender": null} -{"id": 52, "file": "face_0052.jpg", "gender": null} -{"id": 53, "file": "face_0053.jpg", "gender": null} -{"id": 54, "file": "face_0054.jpg", "gender": null} -{"id": 55, "file": "face_0055.jpg", "gender": null} -{"id": 56, "file": "face_0056.jpg", "gender": null} -{"id": 57, "file": "face_0057.jpg", "gender": null} -{"id": 58, "file": "face_0058.jpg", "gender": null} -{"id": 59, "file": "face_0059.jpg", "gender": null} -{"id": 60, "file": "face_0060.jpg", "gender": null} -{"id": 61, "file": "face_0061.jpg", "gender": null} -{"id": 62, "file": "face_0062.jpg", "gender": null} -{"id": 63, "file": "face_0063.jpg", "gender": null} -{"id": 64, "file": "face_0064.jpg", "gender": null} -{"id": 65, "file": "face_0065.jpg", "gender": null} -{"id": 66, "file": "face_0066.jpg", "gender": null} -{"id": 67, "file": "face_0067.jpg", "gender": null} -{"id": 68, "file": "face_0068.jpg", "gender": null} -{"id": 69, "file": "face_0069.jpg", "gender": null} -{"id": 70, "file": "face_0070.jpg", "gender": null} -{"id": 71, "file": "face_0071.jpg", "gender": null} -{"id": 72, "file": "face_0072.jpg", "gender": null} -{"id": 73, "file": "face_0073.jpg", "gender": null} -{"id": 74, "file": "face_0074.jpg", "gender": null} -{"id": 75, "file": "face_0075.jpg", "gender": null} -{"id": 76, "file": "face_0076.jpg", "gender": null} -{"id": 77, "file": "face_0077.jpg", "gender": null} -{"id": 78, "file": "face_0078.jpg", "gender": null} -{"id": 79, "file": "face_0079.jpg", "gender": null} -{"id": 80, "file": "face_0080.jpg", "gender": null} -{"id": 81, "file": "face_0081.jpg", "gender": null} -{"id": 82, "file": "face_0082.jpg", "gender": null} -{"id": 83, "file": "face_0083.jpg", "gender": null} -{"id": 84, "file": "face_0084.jpg", "gender": null} -{"id": 85, "file": "face_0085.jpg", "gender": null} -{"id": 86, "file": "face_0086.jpg", "gender": null} -{"id": 87, "file": "face_0087.jpg", "gender": null} -{"id": 88, "file": "face_0088.jpg", "gender": null} -{"id": 89, "file": "face_0089.jpg", "gender": null} -{"id": 90, "file": "face_0090.jpg", "gender": null} -{"id": 91, "file": "face_0091.jpg", "gender": null} -{"id": 92, "file": "face_0092.jpg", "gender": null} -{"id": 93, "file": "face_0093.jpg", "gender": null} -{"id": 94, "file": "face_0094.jpg", "gender": null} -{"id": 95, "file": "face_0095.jpg", "gender": null} -{"id": 96, "file": "face_0096.jpg", "gender": null} -{"id": 97, "file": "face_0097.jpg", "gender": null} -{"id": 98, "file": "face_0098.jpg", "gender": null} -{"id": 99, "file": "face_0099.jpg", "gender": null} -{"id": 100, "file": "face_0100.jpg", "gender": null} -{"id": 101, "file": "face_0101.jpg", "gender": null} -{"id": 102, "file": "face_0102.jpg", "gender": null} -{"id": 103, "file": "face_0103.jpg", "gender": null} -{"id": 104, "file": "face_0104.jpg", "gender": null} -{"id": 105, "file": "face_0105.jpg", "gender": null} -{"id": 106, "file": "face_0106.jpg", "gender": null} -{"id": 107, "file": "face_0107.jpg", "gender": null} -{"id": 108, "file": "face_0108.jpg", "gender": null} -{"id": 109, "file": "face_0109.jpg", "gender": null} -{"id": 110, "file": "face_0110.jpg", "gender": null} -{"id": 111, "file": "face_0111.jpg", "gender": null} -{"id": 112, "file": "face_0112.jpg", "gender": null} -{"id": 113, "file": "face_0113.jpg", "gender": null} -{"id": 114, "file": "face_0114.jpg", "gender": null} -{"id": 115, "file": "face_0115.jpg", "gender": null} -{"id": 116, "file": "face_0116.jpg", "gender": null} -{"id": 117, "file": "face_0117.jpg", "gender": null} -{"id": 118, "file": "face_0118.jpg", "gender": null} -{"id": 119, "file": "face_0119.jpg", "gender": null} -{"id": 121, "file": "face_0121.jpg", "gender": null} -{"id": 122, "file": "face_0122.jpg", "gender": null} -{"id": 123, "file": "face_0123.jpg", "gender": null} -{"id": 124, "file": "face_0124.jpg", "gender": null} -{"id": 125, "file": "face_0125.jpg", "gender": null} -{"id": 126, "file": "face_0126.jpg", "gender": null} -{"id": 127, "file": "face_0127.jpg", "gender": null} -{"id": 128, "file": "face_0128.jpg", "gender": null} -{"id": 129, "file": "face_0129.jpg", "gender": null} -{"id": 130, "file": "face_0130.jpg", "gender": null} -{"id": 131, "file": "face_0131.jpg", "gender": null} -{"id": 132, "file": "face_0132.jpg", "gender": null} -{"id": 133, "file": "face_0133.jpg", "gender": null} -{"id": 134, "file": "face_0134.jpg", "gender": null} -{"id": 135, "file": "face_0135.jpg", "gender": null} -{"id": 136, "file": "face_0136.jpg", "gender": null} -{"id": 137, "file": "face_0137.jpg", "gender": null} -{"id": 138, "file": "face_0138.jpg", "gender": null} -{"id": 139, "file": "face_0139.jpg", "gender": null} -{"id": 140, "file": "face_0140.jpg", "gender": null} -{"id": 141, "file": "face_0141.jpg", "gender": null} -{"id": 142, "file": "face_0142.jpg", "gender": null} -{"id": 143, "file": "face_0143.jpg", "gender": null} -{"id": 144, "file": "face_0144.jpg", "gender": null} -{"id": 145, "file": "face_0145.jpg", "gender": null} -{"id": 146, "file": "face_0146.jpg", "gender": null} -{"id": 147, "file": "face_0147.jpg", "gender": null} -{"id": 148, "file": "face_0148.jpg", "gender": null} -{"id": 149, "file": "face_0149.jpg", "gender": null} -{"id": 150, "file": "face_0150.jpg", "gender": null} -{"id": 151, "file": "face_0151.jpg", "gender": null} -{"id": 152, "file": "face_0152.jpg", "gender": null} -{"id": 153, "file": "face_0153.jpg", "gender": null} -{"id": 154, "file": "face_0154.jpg", "gender": null} -{"id": 155, "file": "face_0155.jpg", "gender": null} -{"id": 156, "file": "face_0156.jpg", "gender": null} -{"id": 157, "file": "face_0157.jpg", "gender": null} -{"id": 158, "file": "face_0158.jpg", "gender": null} -{"id": 159, "file": "face_0159.jpg", "gender": null} -{"id": 160, "file": "face_0160.jpg", "gender": null} -{"id": 161, "file": "face_0161.jpg", "gender": null} -{"id": 162, "file": "face_0162.jpg", "gender": null} -{"id": 163, "file": "face_0163.jpg", "gender": null} -{"id": 164, "file": "face_0164.jpg", "gender": null} -{"id": 165, "file": "face_0165.jpg", "gender": null} -{"id": 166, "file": "face_0166.jpg", "gender": null} -{"id": 167, "file": "face_0167.jpg", "gender": null} -{"id": 168, "file": "face_0168.jpg", "gender": null} -{"id": 169, "file": "face_0169.jpg", "gender": null} -{"id": 170, "file": "face_0170.jpg", "gender": null} -{"id": 171, "file": "face_0171.jpg", "gender": null} -{"id": 172, "file": "face_0172.jpg", "gender": null} -{"id": 173, "file": "face_0173.jpg", "gender": null} -{"id": 174, "file": "face_0174.jpg", "gender": null} -{"id": 175, "file": "face_0175.jpg", "gender": null} -{"id": 176, "file": "face_0176.jpg", "gender": null} -{"id": 177, "file": "face_0177.jpg", "gender": null} -{"id": 178, "file": "face_0178.jpg", "gender": null} -{"id": 179, "file": "face_0179.jpg", "gender": null} -{"id": 180, "file": "face_0180.jpg", "gender": null} -{"id": 181, "file": "face_0181.jpg", "gender": null} -{"id": 182, "file": "face_0182.jpg", "gender": null} -{"id": 183, "file": "face_0183.jpg", "gender": null} -{"id": 184, "file": "face_0184.jpg", "gender": null} -{"id": 185, "file": "face_0185.jpg", "gender": null} -{"id": 186, "file": "face_0186.jpg", "gender": null} -{"id": 187, "file": "face_0187.jpg", "gender": null} -{"id": 188, "file": "face_0188.jpg", "gender": null} -{"id": 189, "file": "face_0189.jpg", "gender": null} -{"id": 191, "file": "face_0191.jpg", "gender": null} -{"id": 192, "file": "face_0192.jpg", "gender": null} -{"id": 193, "file": "face_0193.jpg", "gender": null} -{"id": 194, "file": "face_0194.jpg", "gender": null} -{"id": 195, "file": "face_0195.jpg", "gender": null} -{"id": 196, "file": "face_0196.jpg", "gender": null} -{"id": 197, "file": "face_0197.jpg", "gender": null} -{"id": 198, "file": "face_0198.jpg", "gender": null} -{"id": 199, "file": "face_0199.jpg", "gender": null} +{"id": 0, "file": "face_0000.jpg", "gender": "woman", "race": "east_asian", "age": 33} +{"id": 1, "file": "face_0001.jpg", "gender": "man", "race": "east_asian", "age": 24} +{"id": 2, "file": "face_0002.jpg", "gender": "woman", "race": "east_asian", "age": 33} +{"id": 3, "file": "face_0003.jpg", "gender": "man", "race": "east_asian", "age": 26} +{"id": 4, "file": "face_0004.jpg", "gender": "man", "race": "caucasian", "age": 44} +{"id": 5, "file": "face_0005.jpg", "gender": "man", "race": "caucasian", "age": 31} +{"id": 6, "file": "face_0006.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 7, "file": "face_0007.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 8, "file": "face_0008.jpg", "gender": "woman", "race": "caucasian", "age": 17, "excluded": "minor"} +{"id": 9, "file": "face_0009.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 10, "file": "face_0010.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 11, "file": "face_0011.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 12, "file": "face_0012.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 13, "file": "face_0013.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 14, "file": "face_0014.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 15, "file": "face_0015.jpg", "gender": "woman", "race": "caucasian", "age": 19, "excluded": "minor"} +{"id": 16, "file": "face_0016.jpg", "gender": "woman", "race": "caucasian", "age": 19, "excluded": "minor"} +{"id": 17, "file": "face_0017.jpg", "gender": "woman", "race": "hispanic", "age": 30} +{"id": 18, "file": "face_0018.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 19, "file": "face_0019.jpg", "gender": "man", "race": "caucasian", "age": 41} +{"id": 20, "file": "face_0020.jpg", "gender": "woman", "race": "hispanic", "age": 30} +{"id": 21, "file": "face_0021.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 22, "file": "face_0022.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 23, "file": "face_0023.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 24, "file": "face_0024.jpg", "gender": "woman", "race": "caucasian", "age": 36} +{"id": 25, "file": "face_0025.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 26, "file": "face_0026.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 27, "file": "face_0027.jpg", "gender": "man", "race": "caucasian", "age": 38} +{"id": 28, "file": "face_0028.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 29, "file": "face_0029.jpg", "gender": "man", "race": "middle_eastern", "age": 28} +{"id": 30, "file": "face_0030.jpg", "gender": "man", "race": "caucasian", "age": 38} +{"id": 31, "file": "face_0031.jpg", "gender": "man", "race": "caucasian", "age": 22} +{"id": 32, "file": "face_0032.jpg", "gender": "man", "race": "caucasian", "age": 22} +{"id": 33, "file": "face_0033.jpg", "gender": "woman", "race": "south_asian", "age": 31} +{"id": 34, "file": "face_0034.jpg", "gender": "woman", "race": "east_asian", "age": 23} +{"id": 35, "file": "face_0035.jpg", "gender": "woman", "race": "caucasian", "age": 24} +{"id": 36, "file": "face_0036.jpg", "gender": "woman", "race": "east_asian", "age": 32} +{"id": 37, "file": "face_0037.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 38, "file": "face_0038.jpg", "gender": "man", "race": "east_asian", "age": 26} +{"id": 39, "file": "face_0039.jpg", "gender": "man", "race": "east_asian", "age": 26} +{"id": 40, "file": "face_0040.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 41, "file": "face_0041.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 42, "file": "face_0042.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 43, "file": "face_0043.jpg", "gender": "woman", "race": "east_asian", "age": 31} +{"id": 44, "file": "face_0044.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 45, "file": "face_0045.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 46, "file": "face_0046.jpg", "gender": "woman", "race": "caucasian", "age": 22} +{"id": 47, "file": "face_0047.jpg", "gender": "woman", "race": "caucasian", "age": 22} +{"id": 48, "file": "face_0048.jpg", "gender": "woman", "race": "east_asian", "age": 32} +{"id": 49, "file": "face_0049.jpg", "gender": "woman", "race": "east_asian", "age": 32} +{"id": 50, "file": "face_0050.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 51, "file": "face_0051.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 52, "file": "face_0052.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 53, "file": "face_0053.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 54, "file": "face_0054.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 55, "file": "face_0055.jpg", "gender": "woman", "race": "caucasian", "age": 23} +{"id": 56, "file": "face_0056.jpg", "gender": "woman", "race": "caucasian", "age": 23} +{"id": 57, "file": "face_0057.jpg", "gender": "woman", "race": "caucasian", "age": 23} +{"id": 58, "file": "face_0058.jpg", "gender": "man", "race": "hispanic", "age": 43} +{"id": 59, "file": "face_0059.jpg", "gender": "man", "race": "hispanic", "age": 43} +{"id": 60, "file": "face_0060.jpg", "gender": "woman", "race": "caucasian", "age": 23} +{"id": 61, "file": "face_0061.jpg", "gender": "man", "race": "east_asian", "age": 35} +{"id": 62, "file": "face_0062.jpg", "gender": "man", "race": "east_asian", "age": 35} +{"id": 63, "file": "face_0063.jpg", "gender": "man", "race": "hispanic", "age": 39} +{"id": 64, "file": "face_0064.jpg", "gender": "man", "race": "hispanic", "age": 39} +{"id": 65, "file": "face_0065.jpg", "gender": "man", "race": "hispanic", "age": 31} +{"id": 66, "file": "face_0066.jpg", "gender": "man", "race": "hispanic", "age": 31} +{"id": 67, "file": "face_0067.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 68, "file": "face_0068.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 69, "file": "face_0069.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 70, "file": "face_0070.jpg", "gender": "man", "race": "east_asian", "age": 14, "excluded": "minor"} +{"id": 71, "file": "face_0071.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 72, "file": "face_0072.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 73, "file": "face_0073.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 74, "file": "face_0074.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 75, "file": "face_0075.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 76, "file": "face_0076.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 77, "file": "face_0077.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 78, "file": "face_0078.jpg", "gender": "woman", "race": "east_asian", "age": 34} +{"id": 79, "file": "face_0079.jpg", "gender": "woman", "race": "east_asian", "age": 34} +{"id": 80, "file": "face_0080.jpg", "gender": "woman", "race": "east_asian", "age": 32} +{"id": 81, "file": "face_0081.jpg", "gender": "woman", "race": "east_asian", "age": 32} +{"id": 82, "file": "face_0082.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 83, "file": "face_0083.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 84, "file": "face_0084.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 85, "file": "face_0085.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 86, "file": "face_0086.jpg", "gender": "man", "race": "caucasian", "age": 31} +{"id": 87, "file": "face_0087.jpg", "gender": "man", "race": "caucasian", "age": 31} +{"id": 88, "file": "face_0088.jpg", "gender": "man", "race": "caucasian", "age": 45} +{"id": 89, "file": "face_0089.jpg", "gender": "man", "race": "caucasian", "age": 45} +{"id": 90, "file": "face_0090.jpg", "gender": "woman", "race": "caucasian", "age": 23} +{"id": 91, "file": "face_0091.jpg", "gender": "woman", "race": "caucasian", "age": 23} +{"id": 92, "file": "face_0092.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 93, "file": "face_0093.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 94, "file": "face_0094.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 95, "file": "face_0095.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 96, "file": "face_0096.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 97, "file": "face_0097.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 98, "file": "face_0098.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 99, "file": "face_0099.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 100, "file": "face_0100.jpg", "gender": "woman", "race": "east_asian", "age": 31} +{"id": 101, "file": "face_0101.jpg", "gender": "woman", "race": "east_asian", "age": 31} +{"id": 102, "file": "face_0102.jpg", "gender": "man", "race": "caucasian", "age": 42} +{"id": 103, "file": "face_0103.jpg", "gender": "woman", "race": "hispanic", "age": 36} +{"id": 104, "file": "face_0104.jpg", "gender": "woman", "race": "hispanic", "age": 36} +{"id": 105, "file": "face_0105.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 106, "file": "face_0106.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 107, "file": "face_0107.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 108, "file": "face_0108.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 109, "file": "face_0109.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 110, "file": "face_0110.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 111, "file": "face_0111.jpg", "gender": "man", "race": "caucasian", "age": 40} +{"id": 112, "file": "face_0112.jpg", "gender": "man", "race": "caucasian", "age": 40} +{"id": 113, "file": "face_0113.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 114, "file": "face_0114.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 115, "file": "face_0115.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 116, "file": "face_0116.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 117, "file": "face_0117.jpg", "gender": "man", "race": "east_asian", "age": 28} +{"id": 118, "file": "face_0118.jpg", "gender": "man", "race": "east_asian", "age": 28} +{"id": 119, "file": "face_0119.jpg", "gender": "woman", "race": "caucasian", "age": 39} +{"id": 120, "file": "face_0120.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 121, "file": "face_0121.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 122, "file": "face_0122.jpg", "gender": "man", "race": "middle_eastern", "age": 29} +{"id": 123, "file": "face_0123.jpg", "gender": "man", "race": "caucasian", "age": 40} +{"id": 124, "file": "face_0124.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 125, "file": "face_0125.jpg", "gender": "man", "race": "caucasian", "age": 42} +{"id": 126, "file": "face_0126.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 127, "file": "face_0127.jpg", "gender": "woman", "race": "caucasian", "age": 41} +{"id": 128, "file": "face_0128.jpg", "gender": "woman", "race": "hispanic", "age": 36} +{"id": 129, "file": "face_0129.jpg", "gender": "woman", "race": "hispanic", "age": 36} +{"id": 130, "file": "face_0130.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 131, "file": "face_0131.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 132, "file": "face_0132.jpg", "gender": "woman", "race": "hispanic", "age": 27} +{"id": 133, "file": "face_0133.jpg", "gender": "woman", "race": "hispanic", "age": 27} +{"id": 134, "file": "face_0134.jpg", "gender": "woman", "race": "middle_eastern", "age": 31} +{"id": 135, "file": "face_0135.jpg", "gender": "woman", "race": "middle_eastern", "age": 31} +{"id": 136, "file": "face_0136.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 137, "file": "face_0137.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 138, "file": "face_0138.jpg", "gender": "man", "race": "east_asian", "age": 23} +{"id": 139, "file": "face_0139.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 140, "file": "face_0140.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 141, "file": "face_0141.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 142, "file": "face_0142.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 143, "file": "face_0143.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 144, "file": "face_0144.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 145, "file": "face_0145.jpg", "gender": "woman", "race": "east_asian", "age": 17, "excluded": "minor"} +{"id": 146, "file": "face_0146.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 147, "file": "face_0147.jpg", "gender": "man", "race": "hispanic", "age": 18, "excluded": "minor"} +{"id": 148, "file": "face_0148.jpg", "gender": "man", "race": "hispanic", "age": 18, "excluded": "minor"} +{"id": 149, "file": "face_0149.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 150, "file": "face_0150.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 151, "file": "face_0151.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 152, "file": "face_0152.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 153, "file": "face_0153.jpg", "gender": "woman", "race": "caucasian", "age": 46} +{"id": 154, "file": "face_0154.jpg", "gender": "woman", "race": "caucasian", "age": 46} +{"id": 155, "file": "face_0155.jpg", "gender": "man", "race": "caucasian", "age": 40} +{"id": 156, "file": "face_0156.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 157, "file": "face_0157.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 158, "file": "face_0158.jpg", "gender": "man", "race": "hispanic", "age": 31} +{"id": 159, "file": "face_0159.jpg", "gender": "man", "race": "hispanic", "age": 31} +{"id": 160, "file": "face_0160.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 161, "file": "face_0161.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 162, "file": "face_0162.jpg", "gender": "man", "race": "middle_eastern", "age": 48} +{"id": 163, "file": "face_0163.jpg", "gender": "woman", "race": "caucasian", "age": 23} +{"id": 164, "file": "face_0164.jpg", "gender": "woman", "race": "caucasian", "age": 23} +{"id": 165, "file": "face_0165.jpg", "gender": "woman", "race": "caucasian", "age": 23} +{"id": 166, "file": "face_0166.jpg", "gender": "woman", "race": "caucasian", "age": 23} +{"id": 167, "file": "face_0167.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 168, "file": "face_0168.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 169, "file": "face_0169.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 170, "file": "face_0170.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 171, "file": "face_0171.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 172, "file": "face_0172.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 173, "file": "face_0173.jpg", "gender": "woman", "race": "black", "age": 33} +{"id": 174, "file": "face_0174.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 175, "file": "face_0175.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 176, "file": "face_0176.jpg", "gender": "man", "race": "middle_eastern", "age": 37} +{"id": 177, "file": "face_0177.jpg", "gender": "man", "race": "middle_eastern", "age": 37} +{"id": 178, "file": "face_0178.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 179, "file": "face_0179.jpg", "gender": "man", "race": "hispanic", "age": 28} +{"id": 180, "file": "face_0180.jpg", "gender": "woman", "race": "caucasian", "age": 38} +{"id": 181, "file": "face_0181.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 182, "file": "face_0182.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 183, "file": "face_0183.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 184, "file": "face_0184.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 185, "file": "face_0185.jpg", "gender": "man", "race": "caucasian", "age": 31} +{"id": 186, "file": "face_0186.jpg", "gender": "man", "race": "caucasian", "age": 31} +{"id": 187, "file": "face_0187.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 188, "file": "face_0188.jpg", "gender": "woman", "race": "east_asian", "age": 31} +{"id": 189, "file": "face_0189.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 190, "file": "face_0190.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 191, "file": "face_0191.jpg", "gender": "woman", "race": "caucasian", "age": 24} +{"id": 192, "file": "face_0192.jpg", "gender": "man", "race": "caucasian", "age": 31} +{"id": 193, "file": "face_0193.jpg", "gender": "man", "race": "middle_eastern", "age": 34} +{"id": 194, "file": "face_0194.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 195, "file": "face_0195.jpg", "gender": "man", "race": "hispanic", "age": 41} +{"id": 196, "file": "face_0196.jpg", "gender": "woman", "race": "caucasian", "age": 23} +{"id": 197, "file": "face_0197.jpg", "gender": "woman", "race": "caucasian", "age": 19, "excluded": "minor"} +{"id": 198, "file": "face_0198.jpg", "gender": "man", "race": "east_asian", "age": 24} +{"id": 199, "file": "face_0199.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 200, "file": "face_0200.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 201, "file": "face_0201.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 202, "file": "face_0202.jpg", "gender": "woman", "race": "caucasian", "age": 36} +{"id": 203, "file": "face_0203.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 204, "file": "face_0204.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 205, "file": "face_0205.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 206, "file": "face_0206.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 207, "file": "face_0207.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 208, "file": "face_0208.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 209, "file": "face_0209.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 210, "file": "face_0210.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 211, "file": "face_0211.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 212, "file": "face_0212.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 213, "file": "face_0213.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 214, "file": "face_0214.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 215, "file": "face_0215.jpg", "gender": "man", "race": "east_asian", "age": 34} +{"id": 216, "file": "face_0216.jpg", "gender": "man", "race": "east_asian", "age": 34} +{"id": 217, "file": "face_0217.jpg", "gender": "man", "race": "east_asian", "age": 34} +{"id": 218, "file": "face_0218.jpg", "gender": "man", "race": "east_asian", "age": 34} +{"id": 219, "file": "face_0219.jpg", "gender": "woman", "race": "hispanic", "age": 26} +{"id": 220, "file": "face_0220.jpg", "gender": "woman", "race": "hispanic", "age": 26} +{"id": 221, "file": "face_0221.jpg", "gender": "woman", "race": "hispanic", "age": 26} +{"id": 222, "file": "face_0222.jpg", "gender": "woman", "race": "hispanic", "age": 26} +{"id": 223, "file": "face_0223.jpg", "gender": "man", "race": "hispanic", "age": 30} +{"id": 224, "file": "face_0224.jpg", "gender": "woman", "race": "caucasian", "age": 22} +{"id": 225, "file": "face_0225.jpg", "gender": "woman", "race": "caucasian", "age": 22} +{"id": 226, "file": "face_0226.jpg", "gender": "woman", "race": "caucasian", "age": 22} +{"id": 227, "file": "face_0227.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 228, "file": "face_0228.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 229, "file": "face_0229.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 230, "file": "face_0230.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 231, "file": "face_0231.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 232, "file": "face_0232.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 233, "file": "face_0233.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 234, "file": "face_0234.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 235, "file": "face_0235.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 236, "file": "face_0236.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 237, "file": "face_0237.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 238, "file": "face_0238.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 239, "file": "face_0239.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 240, "file": "face_0240.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 241, "file": "face_0241.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 242, "file": "face_0242.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 243, "file": "face_0243.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 244, "file": "face_0244.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 245, "file": "face_0245.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 246, "file": "face_0246.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 247, "file": "face_0247.jpg", "gender": "man", "race": "east_asian", "age": 28} +{"id": 248, "file": "face_0248.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 249, "file": "face_0249.jpg", "gender": "woman", "race": "caucasian", "age": 50} +{"id": 250, "file": "face_0250.jpg", "gender": "woman", "race": "caucasian", "age": 50} +{"id": 251, "file": "face_0251.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 252, "file": "face_0252.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 253, "file": "face_0253.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 254, "file": "face_0254.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 255, "file": "face_0255.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 256, "file": "face_0256.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 257, "file": "face_0257.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 258, "file": "face_0258.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 259, "file": "face_0259.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 260, "file": "face_0260.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 261, "file": "face_0261.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 262, "file": "face_0262.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 263, "file": "face_0263.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 264, "file": "face_0264.jpg", "gender": "man", "race": "caucasian", "age": 42} +{"id": 265, "file": "face_0265.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 266, "file": "face_0266.jpg", "gender": "woman", "race": "hispanic", "age": 31} +{"id": 267, "file": "face_0267.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 268, "file": "face_0268.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 269, "file": "face_0269.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 270, "file": "face_0270.jpg", "gender": "man", "race": "caucasian", "age": 22} +{"id": 271, "file": "face_0271.jpg", "gender": "man", "race": "middle_eastern", "age": 47} +{"id": 272, "file": "face_0272.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 273, "file": "face_0273.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 274, "file": "face_0274.jpg", "gender": "man", "race": "black", "age": 30} +{"id": 275, "file": "face_0275.jpg", "gender": "man", "race": "black", "age": 30} +{"id": 276, "file": "face_0276.jpg", "gender": "man", "race": "black", "age": 30} +{"id": 277, "file": "face_0277.jpg", "gender": "man", "race": "black", "age": 30} +{"id": 278, "file": "face_0278.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 279, "file": "face_0279.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 280, "file": "face_0280.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 281, "file": "face_0281.jpg", "gender": "man", "race": "caucasian", "age": 19, "excluded": "minor"} +{"id": 282, "file": "face_0282.jpg", "gender": "man", "race": "caucasian", "age": 31} +{"id": 283, "file": "face_0283.jpg", "gender": "man", "race": "caucasian", "age": 31} +{"id": 284, "file": "face_0284.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 285, "file": "face_0285.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 286, "file": "face_0286.jpg", "gender": "man", "race": "middle_eastern", "age": 27} +{"id": 287, "file": "face_0287.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 288, "file": "face_0288.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 289, "file": "face_0289.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 290, "file": "face_0290.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 291, "file": "face_0291.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 292, "file": "face_0292.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 293, "file": "face_0293.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 294, "file": "face_0294.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 295, "file": "face_0295.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 296, "file": "face_0296.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 297, "file": "face_0297.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 298, "file": "face_0298.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 299, "file": "face_0299.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 300, "file": "face_0300.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 301, "file": "face_0301.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 302, "file": "face_0302.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 303, "file": "face_0303.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 304, "file": "face_0304.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 305, "file": "face_0305.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 306, "file": "face_0306.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 307, "file": "face_0307.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 308, "file": "face_0308.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 309, "file": "face_0309.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 310, "file": "face_0310.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 311, "file": "face_0311.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 312, "file": "face_0312.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 313, "file": "face_0313.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 314, "file": "face_0314.jpg", "gender": "man", "race": "east_asian", "age": 26} +{"id": 315, "file": "face_0315.jpg", "gender": "man", "race": "east_asian", "age": 26} +{"id": 316, "file": "face_0316.jpg", "gender": "man", "race": "east_asian", "age": 26} +{"id": 317, "file": "face_0317.jpg", "gender": "woman", "race": "caucasian", "age": 24} +{"id": 318, "file": "face_0318.jpg", "gender": "woman", "race": "caucasian", "age": 24} +{"id": 319, "file": "face_0319.jpg", "gender": "woman", "race": "caucasian", "age": 46} +{"id": 320, "file": "face_0320.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 321, "file": "face_0321.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 322, "file": "face_0322.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 323, "file": "face_0323.jpg", "gender": "woman", "race": "caucasian", "age": 39} +{"id": 324, "file": "face_0324.jpg", "gender": "woman", "race": "caucasian", "age": 39} +{"id": 325, "file": "face_0325.jpg", "gender": "woman", "race": "caucasian", "age": 39} +{"id": 326, "file": "face_0326.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 327, "file": "face_0327.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 328, "file": "face_0328.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 329, "file": "face_0329.jpg", "gender": "woman", "race": "caucasian", "age": 24} +{"id": 330, "file": "face_0330.jpg", "gender": "woman", "race": "caucasian", "age": 24} +{"id": 331, "file": "face_0331.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 332, "file": "face_0332.jpg", "gender": "woman", "race": "east_asian", "age": 24} +{"id": 333, "file": "face_0333.jpg", "gender": "woman", "race": "east_asian", "age": 24} +{"id": 334, "file": "face_0334.jpg", "gender": "woman", "race": "east_asian", "age": 24} +{"id": 335, "file": "face_0335.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 336, "file": "face_0336.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 337, "file": "face_0337.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 338, "file": "face_0338.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 339, "file": "face_0339.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 340, "file": "face_0340.jpg", "gender": "man", "race": "east_asian", "age": 32} +{"id": 341, "file": "face_0341.jpg", "gender": "man", "race": "east_asian", "age": 32} +{"id": 342, "file": "face_0342.jpg", "gender": "man", "race": "east_asian", "age": 32} +{"id": 343, "file": "face_0343.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 344, "file": "face_0344.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 345, "file": "face_0345.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 346, "file": "face_0346.jpg", "gender": "man", "race": "caucasian", "age": 35} +{"id": 347, "file": "face_0347.jpg", "gender": "man", "race": "caucasian", "age": 35} +{"id": 348, "file": "face_0348.jpg", "gender": "man", "race": "caucasian", "age": 35} +{"id": 349, "file": "face_0349.jpg", "gender": "man", "race": "caucasian", "age": 35} +{"id": 350, "file": "face_0350.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 351, "file": "face_0351.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 352, "file": "face_0352.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 353, "file": "face_0353.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 354, "file": "face_0354.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 355, "file": "face_0355.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 356, "file": "face_0356.jpg", "gender": "woman", "race": "hispanic", "age": 34} +{"id": 357, "file": "face_0357.jpg", "gender": "woman", "race": "hispanic", "age": 34} +{"id": 358, "file": "face_0358.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 359, "file": "face_0359.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 360, "file": "face_0360.jpg", "gender": "woman", "race": "caucasian", "age": 36} +{"id": 361, "file": "face_0361.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 362, "file": "face_0362.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 363, "file": "face_0363.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 364, "file": "face_0364.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 365, "file": "face_0365.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 366, "file": "face_0366.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 367, "file": "face_0367.jpg", "gender": "woman", "race": "hispanic", "age": 39} +{"id": 368, "file": "face_0368.jpg", "gender": "woman", "race": "hispanic", "age": 39} +{"id": 369, "file": "face_0369.jpg", "gender": "woman", "race": "hispanic", "age": 39} +{"id": 370, "file": "face_0370.jpg", "gender": "woman", "race": "hispanic", "age": 25} +{"id": 371, "file": "face_0371.jpg", "gender": "woman", "race": "hispanic", "age": 25} +{"id": 372, "file": "face_0372.jpg", "gender": "woman", "race": "hispanic", "age": 25} +{"id": 373, "file": "face_0373.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 374, "file": "face_0374.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 375, "file": "face_0375.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 376, "file": "face_0376.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 377, "file": "face_0377.jpg", "gender": "woman", "race": "caucasian", "age": 49} +{"id": 378, "file": "face_0378.jpg", "gender": "woman", "race": "caucasian", "age": 49} +{"id": 379, "file": "face_0379.jpg", "gender": "woman", "race": "caucasian", "age": 49} +{"id": 380, "file": "face_0380.jpg", "gender": "woman", "race": "caucasian", "age": 49} +{"id": 381, "file": "face_0381.jpg", "gender": "woman", "race": "south_asian", "age": 31} +{"id": 382, "file": "face_0382.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 383, "file": "face_0383.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 384, "file": "face_0384.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 385, "file": "face_0385.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 386, "file": "face_0386.jpg", "gender": "man", "race": "middle_eastern", "age": 30} +{"id": 387, "file": "face_0387.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 388, "file": "face_0388.jpg", "gender": "woman", "race": "caucasian", "age": 13, "excluded": "minor"} +{"id": 389, "file": "face_0389.jpg", "gender": "woman", "race": "caucasian", "age": 13, "excluded": "minor"} +{"id": 390, "file": "face_0390.jpg", "gender": "woman", "race": "caucasian", "age": 13, "excluded": "minor"} +{"id": 391, "file": "face_0391.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 392, "file": "face_0392.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 393, "file": "face_0393.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 394, "file": "face_0394.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 395, "file": "face_0395.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 396, "file": "face_0396.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 397, "file": "face_0397.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 398, "file": "face_0398.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 399, "file": "face_0399.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 400, "file": "face_0400.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 401, "file": "face_0401.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 402, "file": "face_0402.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 403, "file": "face_0403.jpg", "gender": "woman", "race": "caucasian", "age": 17, "excluded": "minor"} +{"id": 404, "file": "face_0404.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 405, "file": "face_0405.jpg", "gender": "woman", "race": "caucasian", "age": 17, "excluded": "minor"} +{"id": 406, "file": "face_0406.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 407, "file": "face_0407.jpg", "gender": "woman", "race": "caucasian", "age": 24} +{"id": 408, "file": "face_0408.jpg", "gender": "man", "race": "hispanic", "age": 24} +{"id": 409, "file": "face_0409.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 410, "file": "face_0410.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 411, "file": "face_0411.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 412, "file": "face_0412.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 413, "file": "face_0413.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 414, "file": "face_0414.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 415, "file": "face_0415.jpg", "gender": "man", "race": "middle_eastern", "age": 30} +{"id": 416, "file": "face_0416.jpg", "gender": "man", "race": "middle_eastern", "age": 30} +{"id": 417, "file": "face_0417.jpg", "gender": "woman", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 418, "file": "face_0418.jpg", "gender": "woman", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 419, "file": "face_0419.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 420, "file": "face_0420.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 421, "file": "face_0421.jpg", "gender": "man", "race": "caucasian", "age": 17, "excluded": "minor"} +{"id": 422, "file": "face_0422.jpg", "gender": "man", "race": "caucasian", "age": 17, "excluded": "minor"} +{"id": 423, "file": "face_0423.jpg", "gender": "man", "race": "caucasian", "age": 17, "excluded": "minor"} +{"id": 424, "file": "face_0424.jpg", "gender": "man", "race": "caucasian", "age": 17, "excluded": "minor"} +{"id": 425, "file": "face_0425.jpg", "gender": "woman", "race": "caucasian", "age": 37} +{"id": 426, "file": "face_0426.jpg", "gender": "woman", "race": "caucasian", "age": 37} +{"id": 427, "file": "face_0427.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 428, "file": "face_0428.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 429, "file": "face_0429.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 430, "file": "face_0430.jpg", "gender": "woman", "race": "east_asian", "age": 32} +{"id": 431, "file": "face_0431.jpg", "gender": "man", "race": "caucasian", "age": 39} +{"id": 432, "file": "face_0432.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 433, "file": "face_0433.jpg", "gender": "woman", "race": "hispanic", "age": 31} +{"id": 434, "file": "face_0434.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 435, "file": "face_0435.jpg", "gender": "woman", "race": "east_asian", "age": 37} +{"id": 436, "file": "face_0436.jpg", "gender": "man", "race": "east_asian", "age": 23} +{"id": 437, "file": "face_0437.jpg", "gender": "woman", "race": "east_asian", "age": 32} +{"id": 438, "file": "face_0438.jpg", "gender": "man", "race": "middle_eastern", "age": 27} +{"id": 439, "file": "face_0439.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 440, "file": "face_0440.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 441, "file": "face_0441.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 442, "file": "face_0442.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 443, "file": "face_0443.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 444, "file": "face_0444.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 445, "file": "face_0445.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 446, "file": "face_0446.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 447, "file": "face_0447.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 448, "file": "face_0448.jpg", "gender": "woman", "race": "east_asian", "age": 29} +{"id": 449, "file": "face_0449.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 450, "file": "face_0450.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 451, "file": "face_0451.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 452, "file": "face_0452.jpg", "gender": "man", "race": "middle_eastern", "age": 36} +{"id": 453, "file": "face_0453.jpg", "gender": "man", "race": "middle_eastern", "age": 36} +{"id": 454, "file": "face_0454.jpg", "gender": "woman", "race": "east_asian", "age": 29} +{"id": 455, "file": "face_0455.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 456, "file": "face_0456.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 457, "file": "face_0457.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 458, "file": "face_0458.jpg", "gender": "man", "race": "east_asian", "age": 12, "excluded": "minor"} +{"id": 459, "file": "face_0459.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 460, "file": "face_0460.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 461, "file": "face_0461.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 462, "file": "face_0462.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 463, "file": "face_0463.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 464, "file": "face_0464.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 465, "file": "face_0465.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 466, "file": "face_0466.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 467, "file": "face_0467.jpg", "gender": "woman", "race": "caucasian", "age": 39} +{"id": 468, "file": "face_0468.jpg", "gender": "woman", "race": "caucasian", "age": 39} +{"id": 469, "file": "face_0469.jpg", "gender": "woman", "race": "caucasian", "age": 39} +{"id": 470, "file": "face_0470.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 471, "file": "face_0471.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 472, "file": "face_0472.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 473, "file": "face_0473.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 474, "file": "face_0474.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 475, "file": "face_0475.jpg", "gender": "woman", "race": "caucasian", "age": 49} +{"id": 476, "file": "face_0476.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 477, "file": "face_0477.jpg", "gender": "man", "race": "middle_eastern", "age": 23} +{"id": 478, "file": "face_0478.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 479, "file": "face_0479.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 480, "file": "face_0480.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 481, "file": "face_0481.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 482, "file": "face_0482.jpg", "gender": "man", "race": "hispanic", "age": 33} +{"id": 483, "file": "face_0483.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 484, "file": "face_0484.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 485, "file": "face_0485.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 486, "file": "face_0486.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 487, "file": "face_0487.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 488, "file": "face_0488.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 489, "file": "face_0489.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 490, "file": "face_0490.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 491, "file": "face_0491.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 492, "file": "face_0492.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 493, "file": "face_0493.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 494, "file": "face_0494.jpg", "gender": "man", "race": "caucasian", "age": 44} +{"id": 495, "file": "face_0495.jpg", "gender": "man", "race": "caucasian", "age": 44} +{"id": 496, "file": "face_0496.jpg", "gender": "man", "race": "caucasian", "age": 37} +{"id": 497, "file": "face_0497.jpg", "gender": "man", "race": "caucasian", "age": 37} +{"id": 498, "file": "face_0498.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 499, "file": "face_0499.jpg", "gender": "man", "race": "east_asian", "age": 20, "excluded": "minor"} +{"id": 500, "file": "face_0500.jpg", "gender": "man", "race": "east_asian", "age": 20, "excluded": "minor"} +{"id": 501, "file": "face_0501.jpg", "gender": "woman", "race": "caucasian", "age": 24} +{"id": 502, "file": "face_0502.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 503, "file": "face_0503.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 504, "file": "face_0504.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 505, "file": "face_0505.jpg", "gender": "man", "race": "caucasian", "age": 22} +{"id": 506, "file": "face_0506.jpg", "gender": "man", "race": "hispanic", "age": 38} +{"id": 507, "file": "face_0507.jpg", "gender": "man", "race": "hispanic", "age": 38} +{"id": 508, "file": "face_0508.jpg", "gender": "man", "race": "middle_eastern", "age": 24} +{"id": 509, "file": "face_0509.jpg", "gender": "man", "race": "middle_eastern", "age": 24} +{"id": 510, "file": "face_0510.jpg", "gender": "woman", "race": "caucasian", "age": 44} +{"id": 511, "file": "face_0511.jpg", "gender": "woman", "race": "caucasian", "age": 44} +{"id": 512, "file": "face_0512.jpg", "gender": "man", "race": "east_asian", "age": 24} +{"id": 513, "file": "face_0513.jpg", "gender": "man", "race": "east_asian", "age": 24} +{"id": 514, "file": "face_0514.jpg", "gender": "man", "race": "east_asian", "age": 24} +{"id": 515, "file": "face_0515.jpg", "gender": "man", "race": "east_asian", "age": 24} +{"id": 516, "file": "face_0516.jpg", "gender": "man", "race": "middle_eastern", "age": 32} +{"id": 517, "file": "face_0517.jpg", "gender": "woman", "race": "east_asian", "age": 33} +{"id": 518, "file": "face_0518.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 519, "file": "face_0519.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 520, "file": "face_0520.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 521, "file": "face_0521.jpg", "gender": "man", "race": "caucasian", "age": 32} +{"id": 522, "file": "face_0522.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 523, "file": "face_0523.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 524, "file": "face_0524.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 525, "file": "face_0525.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 526, "file": "face_0526.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 527, "file": "face_0527.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 528, "file": "face_0528.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 529, "file": "face_0529.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 530, "file": "face_0530.jpg", "gender": "man", "race": "caucasian", "age": 35} +{"id": 531, "file": "face_0531.jpg", "gender": "man", "race": "caucasian", "age": 35} +{"id": 532, "file": "face_0532.jpg", "gender": "man", "race": "hispanic", "age": 24} +{"id": 533, "file": "face_0533.jpg", "gender": "man", "race": "hispanic", "age": 24} +{"id": 534, "file": "face_0534.jpg", "gender": "woman", "race": "east_asian", "age": 31} +{"id": 535, "file": "face_0535.jpg", "gender": "woman", "race": "east_asian", "age": 31} +{"id": 536, "file": "face_0536.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 537, "file": "face_0537.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 538, "file": "face_0538.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 539, "file": "face_0539.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 540, "file": "face_0540.jpg", "gender": "woman", "race": "east_asian", "age": 23} +{"id": 541, "file": "face_0541.jpg", "gender": "woman", "race": "east_asian", "age": 23} +{"id": 542, "file": "face_0542.jpg", "gender": "man", "race": "caucasian", "age": 47} +{"id": 543, "file": "face_0543.jpg", "gender": "man", "race": "caucasian", "age": 47} +{"id": 544, "file": "face_0544.jpg", "gender": "man", "race": "middle_eastern", "age": 48} +{"id": 545, "file": "face_0545.jpg", "gender": "man", "race": "middle_eastern", "age": 48} +{"id": 546, "file": "face_0546.jpg", "gender": "man", "race": "hispanic", "age": 29} +{"id": 547, "file": "face_0547.jpg", "gender": "man", "race": "hispanic", "age": 29} +{"id": 548, "file": "face_0548.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 549, "file": "face_0549.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 550, "file": "face_0550.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 551, "file": "face_0551.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 552, "file": "face_0552.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 553, "file": "face_0553.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 554, "file": "face_0554.jpg", "gender": "man", "race": "middle_eastern", "age": 32} +{"id": 555, "file": "face_0555.jpg", "gender": "man", "race": "middle_eastern", "age": 32} +{"id": 556, "file": "face_0556.jpg", "gender": "man", "race": "east_asian", "age": 23} +{"id": 557, "file": "face_0557.jpg", "gender": "man", "race": "east_asian", "age": 23} +{"id": 558, "file": "face_0558.jpg", "gender": "man", "race": "east_asian", "age": 23} +{"id": 559, "file": "face_0559.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 560, "file": "face_0560.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 561, "file": "face_0561.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 562, "file": "face_0562.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 563, "file": "face_0563.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 564, "file": "face_0564.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 565, "file": "face_0565.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 566, "file": "face_0566.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 567, "file": "face_0567.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 568, "file": "face_0568.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 569, "file": "face_0569.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 570, "file": "face_0570.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 571, "file": "face_0571.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 572, "file": "face_0572.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 573, "file": "face_0573.jpg", "gender": "man", "race": "middle_eastern", "age": 24} +{"id": 574, "file": "face_0574.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 575, "file": "face_0575.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 576, "file": "face_0576.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 577, "file": "face_0577.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 578, "file": "face_0578.jpg", "gender": "woman", "race": "east_asian", "age": 25} +{"id": 579, "file": "face_0579.jpg", "gender": "woman", "race": "east_asian", "age": 25} +{"id": 580, "file": "face_0580.jpg", "gender": "woman", "race": "east_asian", "age": 31} +{"id": 581, "file": "face_0581.jpg", "gender": "woman", "race": "east_asian", "age": 31} +{"id": 582, "file": "face_0582.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 583, "file": "face_0583.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 584, "file": "face_0584.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 585, "file": "face_0585.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 586, "file": "face_0586.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 587, "file": "face_0587.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 588, "file": "face_0588.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 589, "file": "face_0589.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 590, "file": "face_0590.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 591, "file": "face_0591.jpg", "gender": "woman", "race": "hispanic", "age": 31} +{"id": 592, "file": "face_0592.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 593, "file": "face_0593.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 594, "file": "face_0594.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 595, "file": "face_0595.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 596, "file": "face_0596.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 597, "file": "face_0597.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 598, "file": "face_0598.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 599, "file": "face_0599.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 600, "file": "face_0600.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 601, "file": "face_0601.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 602, "file": "face_0602.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 603, "file": "face_0603.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 604, "file": "face_0604.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 605, "file": "face_0605.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 606, "file": "face_0606.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 607, "file": "face_0607.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 608, "file": "face_0608.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 609, "file": "face_0609.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 610, "file": "face_0610.jpg", "gender": "man", "race": "caucasian", "age": 47} +{"id": 611, "file": "face_0611.jpg", "gender": "man", "race": "caucasian", "age": 47} +{"id": 612, "file": "face_0612.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 613, "file": "face_0613.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 614, "file": "face_0614.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 615, "file": "face_0615.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 616, "file": "face_0616.jpg", "gender": "man", "race": "hispanic", "age": 43} +{"id": 617, "file": "face_0617.jpg", "gender": "man", "race": "hispanic", "age": 43} +{"id": 618, "file": "face_0618.jpg", "gender": "woman", "race": "caucasian", "age": 38} +{"id": 619, "file": "face_0619.jpg", "gender": "woman", "race": "caucasian", "age": 24} +{"id": 620, "file": "face_0620.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 621, "file": "face_0621.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 622, "file": "face_0622.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 623, "file": "face_0623.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 624, "file": "face_0624.jpg", "gender": "man", "race": "east_asian", "age": 25} +{"id": 625, "file": "face_0625.jpg", "gender": "man", "race": "east_asian", "age": 25} +{"id": 626, "file": "face_0626.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 627, "file": "face_0627.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 628, "file": "face_0628.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 629, "file": "face_0629.jpg", "gender": "man", "race": "middle_eastern", "age": 34} +{"id": 630, "file": "face_0630.jpg", "gender": "man", "race": "east_asian", "age": 26} +{"id": 631, "file": "face_0631.jpg", "gender": "man", "race": "east_asian", "age": 26} +{"id": 632, "file": "face_0632.jpg", "gender": "man", "race": "hispanic", "age": 14, "excluded": "minor"} +{"id": 633, "file": "face_0633.jpg", "gender": "man", "race": "hispanic", "age": 14, "excluded": "minor"} +{"id": 634, "file": "face_0634.jpg", "gender": "man", "race": "caucasian", "age": 47} +{"id": 635, "file": "face_0635.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 636, "file": "face_0636.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 637, "file": "face_0637.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 638, "file": "face_0638.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 639, "file": "face_0639.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 640, "file": "face_0640.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 641, "file": "face_0641.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 642, "file": "face_0642.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 643, "file": "face_0643.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 644, "file": "face_0644.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 645, "file": "face_0645.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 646, "file": "face_0646.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 647, "file": "face_0647.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 648, "file": "face_0648.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 649, "file": "face_0649.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 650, "file": "face_0650.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 651, "file": "face_0651.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 652, "file": "face_0652.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 653, "file": "face_0653.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 654, "file": "face_0654.jpg", "gender": "woman", "race": "hispanic", "age": 32} +{"id": 655, "file": "face_0655.jpg", "gender": "woman", "race": "hispanic", "age": 32} +{"id": 656, "file": "face_0656.jpg", "gender": "man", "race": "east_asian", "age": 31} +{"id": 657, "file": "face_0657.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 658, "file": "face_0658.jpg", "gender": "man", "race": "hispanic", "age": 35} +{"id": 659, "file": "face_0659.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 660, "file": "face_0660.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 661, "file": "face_0661.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 662, "file": "face_0662.jpg", "gender": "woman", "race": "caucasian", "age": 22} +{"id": 663, "file": "face_0663.jpg", "gender": "woman", "race": "hispanic", "age": 20, "excluded": "minor"} +{"id": 664, "file": "face_0664.jpg", "gender": "man", "race": "east_asian", "age": 31} +{"id": 665, "file": "face_0665.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 666, "file": "face_0666.jpg", "gender": "man", "race": "hispanic", "age": 25} +{"id": 667, "file": "face_0667.jpg", "gender": "man", "race": "caucasian", "age": 45} +{"id": 668, "file": "face_0668.jpg", "gender": "man", "race": "caucasian", "age": 45} +{"id": 669, "file": "face_0669.jpg", "gender": "man", "race": "caucasian", "age": 45} +{"id": 670, "file": "face_0670.jpg", "gender": "man", "race": "caucasian", "age": 45} +{"id": 671, "file": "face_0671.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 672, "file": "face_0672.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 673, "file": "face_0673.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 674, "file": "face_0674.jpg", "gender": "man", "race": "east_asian", "age": 23} +{"id": 675, "file": "face_0675.jpg", "gender": "man", "race": "east_asian", "age": 23} +{"id": 676, "file": "face_0676.jpg", "gender": "man", "race": "east_asian", "age": 28} +{"id": 677, "file": "face_0677.jpg", "gender": "man", "race": "east_asian", "age": 28} +{"id": 678, "file": "face_0678.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 679, "file": "face_0679.jpg", "gender": "woman", "race": "caucasian", "age": 37} +{"id": 680, "file": "face_0680.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 681, "file": "face_0681.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 682, "file": "face_0682.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 683, "file": "face_0683.jpg", "gender": "woman", "race": "hispanic", "age": 30} +{"id": 684, "file": "face_0684.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 685, "file": "face_0685.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 686, "file": "face_0686.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 687, "file": "face_0687.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 688, "file": "face_0688.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 689, "file": "face_0689.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 690, "file": "face_0690.jpg", "gender": "man", "race": "caucasian", "age": 49} +{"id": 691, "file": "face_0691.jpg", "gender": "man", "race": "caucasian", "age": 49} +{"id": 692, "file": "face_0692.jpg", "gender": "man", "race": "caucasian", "age": 49} +{"id": 693, "file": "face_0693.jpg", "gender": "man", "race": "caucasian", "age": 49} +{"id": 694, "file": "face_0694.jpg", "gender": "man", "race": "east_asian", "age": 31} +{"id": 695, "file": "face_0695.jpg", "gender": "man", "race": "east_asian", "age": 31} +{"id": 696, "file": "face_0696.jpg", "gender": "man", "race": "east_asian", "age": 31} +{"id": 697, "file": "face_0697.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 698, "file": "face_0698.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 699, "file": "face_0699.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 700, "file": "face_0700.jpg", "gender": "woman", "race": "hispanic", "age": 46} +{"id": 701, "file": "face_0701.jpg", "gender": "woman", "race": "black", "age": 32} +{"id": 702, "file": "face_0702.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 703, "file": "face_0703.jpg", "gender": "woman", "race": "south_asian", "age": 26} +{"id": 704, "file": "face_0704.jpg", "gender": "man", "race": "middle_eastern", "age": 34} +{"id": 705, "file": "face_0705.jpg", "gender": "man", "race": "middle_eastern", "age": 39} +{"id": 706, "file": "face_0706.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 707, "file": "face_0707.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 708, "file": "face_0708.jpg", "gender": "woman", "race": "hispanic", "age": 46} +{"id": 709, "file": "face_0709.jpg", "gender": "man", "race": "caucasian", "age": 37} +{"id": 710, "file": "face_0710.jpg", "gender": "man", "race": "caucasian", "age": 37} +{"id": 711, "file": "face_0711.jpg", "gender": "woman", "race": "hispanic", "age": 30} +{"id": 712, "file": "face_0712.jpg", "gender": "woman", "race": "hispanic", "age": 30} +{"id": 713, "file": "face_0713.jpg", "gender": "woman", "race": "hispanic", "age": 28} +{"id": 714, "file": "face_0714.jpg", "gender": "woman", "race": "hispanic", "age": 28} +{"id": 715, "file": "face_0715.jpg", "gender": "woman", "race": "hispanic", "age": 28} +{"id": 716, "file": "face_0716.jpg", "gender": "man", "race": "middle_eastern", "age": 40} +{"id": 717, "file": "face_0717.jpg", "gender": "man", "race": "middle_eastern", "age": 40} +{"id": 718, "file": "face_0718.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 719, "file": "face_0719.jpg", "gender": "man", "race": "middle_eastern", "age": 40} +{"id": 720, "file": "face_0720.jpg", "gender": "woman", "race": "caucasian", "age": 22} +{"id": 721, "file": "face_0721.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 722, "file": "face_0722.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 723, "file": "face_0723.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 724, "file": "face_0724.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 725, "file": "face_0725.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 726, "file": "face_0726.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 727, "file": "face_0727.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 728, "file": "face_0728.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 729, "file": "face_0729.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 730, "file": "face_0730.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 731, "file": "face_0731.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 732, "file": "face_0732.jpg", "gender": "woman", "race": "east_asian", "age": 27} +{"id": 733, "file": "face_0733.jpg", "gender": "woman", "race": "east_asian", "age": 27} +{"id": 734, "file": "face_0734.jpg", "gender": "man", "race": "caucasian", "age": 20, "excluded": "minor"} +{"id": 735, "file": "face_0735.jpg", "gender": "man", "race": "caucasian", "age": 20, "excluded": "minor"} +{"id": 736, "file": "face_0736.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 737, "file": "face_0737.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 738, "file": "face_0738.jpg", "gender": "woman", "race": "east_asian", "age": 31} +{"id": 739, "file": "face_0739.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 740, "file": "face_0740.jpg", "gender": "woman", "race": "east_asian", "age": 32} +{"id": 741, "file": "face_0741.jpg", "gender": "woman", "race": "east_asian", "age": 32} +{"id": 742, "file": "face_0742.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 743, "file": "face_0743.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 744, "file": "face_0744.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 745, "file": "face_0745.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 746, "file": "face_0746.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 747, "file": "face_0747.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 748, "file": "face_0748.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 749, "file": "face_0749.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 750, "file": "face_0750.jpg", "gender": "woman", "race": "caucasian", "age": 36} +{"id": 751, "file": "face_0751.jpg", "gender": "woman", "race": "caucasian", "age": 36} +{"id": 752, "file": "face_0752.jpg", "gender": "woman", "race": "caucasian", "age": 36} +{"id": 753, "file": "face_0753.jpg", "gender": "man", "race": "east_asian", "age": 23} +{"id": 754, "file": "face_0754.jpg", "gender": "man", "race": "east_asian", "age": 23} +{"id": 755, "file": "face_0755.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 756, "file": "face_0756.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 757, "file": "face_0757.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 758, "file": "face_0758.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 759, "file": "face_0759.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 760, "file": "face_0760.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 761, "file": "face_0761.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 762, "file": "face_0762.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 763, "file": "face_0763.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 764, "file": "face_0764.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 765, "file": "face_0765.jpg", "gender": "man", "race": "middle_eastern", "age": 39} +{"id": 766, "file": "face_0766.jpg", "gender": "man", "race": "middle_eastern", "age": 39} +{"id": 767, "file": "face_0767.jpg", "gender": "man", "race": "caucasian", "age": 31} +{"id": 768, "file": "face_0768.jpg", "gender": "man", "race": "caucasian", "age": 31} +{"id": 769, "file": "face_0769.jpg", "gender": "woman", "race": "hispanic", "age": 25} +{"id": 770, "file": "face_0770.jpg", "gender": "woman", "race": "hispanic", "age": 25} +{"id": 771, "file": "face_0771.jpg", "gender": "man", "race": "east_asian", "age": 25} +{"id": 772, "file": "face_0772.jpg", "gender": "man", "race": "east_asian", "age": 25} +{"id": 773, "file": "face_0773.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 774, "file": "face_0774.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 775, "file": "face_0775.jpg", "gender": "woman", "race": "caucasian", "age": 24} +{"id": 776, "file": "face_0776.jpg", "gender": "woman", "race": "caucasian", "age": 24} +{"id": 777, "file": "face_0777.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 778, "file": "face_0778.jpg", "gender": "man", "race": "hispanic", "age": 25} +{"id": 779, "file": "face_0779.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 780, "file": "face_0780.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 781, "file": "face_0781.jpg", "gender": "man", "race": "caucasian", "age": 39} +{"id": 782, "file": "face_0782.jpg", "gender": "man", "race": "caucasian", "age": 39} +{"id": 783, "file": "face_0783.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 784, "file": "face_0784.jpg", "gender": "woman", "race": "caucasian", "age": 34} +{"id": 785, "file": "face_0785.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 786, "file": "face_0786.jpg", "gender": "man", "race": "hispanic", "age": 27} +{"id": 787, "file": "face_0787.jpg", "gender": "man", "race": "hispanic", "age": 27} +{"id": 788, "file": "face_0788.jpg", "gender": "man", "race": "hispanic", "age": 27} +{"id": 789, "file": "face_0789.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 790, "file": "face_0790.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 791, "file": "face_0791.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 792, "file": "face_0792.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 793, "file": "face_0793.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 794, "file": "face_0794.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 795, "file": "face_0795.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 796, "file": "face_0796.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 797, "file": "face_0797.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 798, "file": "face_0798.jpg", "gender": "man", "race": "east_asian", "age": 25} +{"id": 799, "file": "face_0799.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 800, "file": "face_0800.jpg", "gender": "woman", "race": "black", "age": 35} +{"id": 801, "file": "face_0801.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 802, "file": "face_0802.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 803, "file": "face_0803.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 804, "file": "face_0804.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 805, "file": "face_0805.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 806, "file": "face_0806.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 807, "file": "face_0807.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 808, "file": "face_0808.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 809, "file": "face_0809.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 810, "file": "face_0810.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 811, "file": "face_0811.jpg", "gender": "man", "race": "hispanic", "age": 29} +{"id": 812, "file": "face_0812.jpg", "gender": "man", "race": "hispanic", "age": 29} +{"id": 813, "file": "face_0813.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 814, "file": "face_0814.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 815, "file": "face_0815.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 816, "file": "face_0816.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 817, "file": "face_0817.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 818, "file": "face_0818.jpg", "gender": "man", "race": "caucasian", "age": 22} +{"id": 819, "file": "face_0819.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 820, "file": "face_0820.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 821, "file": "face_0821.jpg", "gender": "woman", "race": "hispanic", "age": 26} +{"id": 822, "file": "face_0822.jpg", "gender": "woman", "race": "hispanic", "age": 26} +{"id": 823, "file": "face_0823.jpg", "gender": "man", "race": "middle_eastern", "age": 29} +{"id": 824, "file": "face_0824.jpg", "gender": "man", "race": "middle_eastern", "age": 29} +{"id": 825, "file": "face_0825.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 826, "file": "face_0826.jpg", "gender": "man", "race": "middle_eastern", "age": 26} +{"id": 827, "file": "face_0827.jpg", "gender": "man", "race": "middle_eastern", "age": 27} +{"id": 828, "file": "face_0828.jpg", "gender": "man", "race": "middle_eastern", "age": 27} +{"id": 829, "file": "face_0829.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 830, "file": "face_0830.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 831, "file": "face_0831.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 832, "file": "face_0832.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 833, "file": "face_0833.jpg", "gender": "man", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 834, "file": "face_0834.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 835, "file": "face_0835.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 836, "file": "face_0836.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 837, "file": "face_0837.jpg", "gender": "woman", "race": "caucasian", "age": 42} +{"id": 838, "file": "face_0838.jpg", "gender": "woman", "race": "east_asian", "age": 29} +{"id": 839, "file": "face_0839.jpg", "gender": "woman", "race": "east_asian", "age": 29} +{"id": 840, "file": "face_0840.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 841, "file": "face_0841.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 842, "file": "face_0842.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 843, "file": "face_0843.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 844, "file": "face_0844.jpg", "gender": "woman", "race": "caucasian", "age": 37} +{"id": 845, "file": "face_0845.jpg", "gender": "woman", "race": "caucasian", "age": 37} +{"id": 846, "file": "face_0846.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 847, "file": "face_0847.jpg", "gender": "man", "race": "caucasian", "age": 22} +{"id": 848, "file": "face_0848.jpg", "gender": "man", "race": "caucasian", "age": 22} +{"id": 849, "file": "face_0849.jpg", "gender": "man", "race": "caucasian", "age": 22} +{"id": 850, "file": "face_0850.jpg", "gender": "woman", "race": "hispanic", "age": 31} +{"id": 851, "file": "face_0851.jpg", "gender": "woman", "race": "hispanic", "age": 31} +{"id": 852, "file": "face_0852.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 853, "file": "face_0853.jpg", "gender": "woman", "race": "east_asian", "age": 35} +{"id": 854, "file": "face_0854.jpg", "gender": "woman", "race": "east_asian", "age": 35} +{"id": 855, "file": "face_0855.jpg", "gender": "woman", "race": "caucasian", "age": 36} +{"id": 856, "file": "face_0856.jpg", "gender": "woman", "race": "caucasian", "age": 36} +{"id": 857, "file": "face_0857.jpg", "gender": "man", "race": "hispanic", "age": 46} +{"id": 858, "file": "face_0858.jpg", "gender": "man", "race": "hispanic", "age": 34} +{"id": 859, "file": "face_0859.jpg", "gender": "man", "race": "hispanic", "age": 34} +{"id": 860, "file": "face_0860.jpg", "gender": "man", "race": "hispanic", "age": 34} +{"id": 861, "file": "face_0861.jpg", "gender": "man", "race": "hispanic", "age": 34} +{"id": 862, "file": "face_0862.jpg", "gender": "woman", "race": "hispanic", "age": 39} +{"id": 863, "file": "face_0863.jpg", "gender": "woman", "race": "hispanic", "age": 39} +{"id": 864, "file": "face_0864.jpg", "gender": "woman", "race": "hispanic", "age": 39} +{"id": 865, "file": "face_0865.jpg", "gender": "woman", "race": "hispanic", "age": 39} +{"id": 866, "file": "face_0866.jpg", "gender": "man", "race": "caucasian", "age": 22} +{"id": 867, "file": "face_0867.jpg", "gender": "man", "race": "caucasian", "age": 22} +{"id": 868, "file": "face_0868.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 869, "file": "face_0869.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 870, "file": "face_0870.jpg", "gender": "man", "race": "caucasian", "age": 33} +{"id": 871, "file": "face_0871.jpg", "gender": "woman", "race": "hispanic", "age": 32} +{"id": 872, "file": "face_0872.jpg", "gender": "woman", "race": "hispanic", "age": 31} +{"id": 873, "file": "face_0873.jpg", "gender": "woman", "race": "caucasian", "age": 48} +{"id": 874, "file": "face_0874.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 875, "file": "face_0875.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 876, "file": "face_0876.jpg", "gender": "woman", "race": "caucasian", "age": 30} +{"id": 877, "file": "face_0877.jpg", "gender": "man", "race": "hispanic", "age": 44} +{"id": 878, "file": "face_0878.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 879, "file": "face_0879.jpg", "gender": "man", "race": "caucasian", "age": 23} +{"id": 880, "file": "face_0880.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 881, "file": "face_0881.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 882, "file": "face_0882.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 883, "file": "face_0883.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 884, "file": "face_0884.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 885, "file": "face_0885.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 886, "file": "face_0886.jpg", "gender": "man", "race": "east_asian", "age": 36} +{"id": 887, "file": "face_0887.jpg", "gender": "man", "race": "east_asian", "age": 36} +{"id": 888, "file": "face_0888.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 889, "file": "face_0889.jpg", "gender": "woman", "race": "east_asian", "age": 29} +{"id": 890, "file": "face_0890.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 891, "file": "face_0891.jpg", "gender": "woman", "race": "east_asian", "age": 29} +{"id": 892, "file": "face_0892.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 893, "file": "face_0893.jpg", "gender": "man", "race": "caucasian", "age": 24} +{"id": 894, "file": "face_0894.jpg", "gender": "woman", "race": "east_asian", "age": 33} +{"id": 895, "file": "face_0895.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 896, "file": "face_0896.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 897, "file": "face_0897.jpg", "gender": "man", "race": "caucasian", "age": 27} +{"id": 898, "file": "face_0898.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 899, "file": "face_0899.jpg", "gender": "man", "race": "caucasian", "age": 28} +{"id": 900, "file": "face_0900.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 901, "file": "face_0901.jpg", "gender": "woman", "race": "east_asian", "age": 28} +{"id": 902, "file": "face_0902.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 903, "file": "face_0903.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 904, "file": "face_0904.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 905, "file": "face_0905.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 906, "file": "face_0906.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 907, "file": "face_0907.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 908, "file": "face_0908.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 909, "file": "face_0909.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 910, "file": "face_0910.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 911, "file": "face_0911.jpg", "gender": "woman", "race": "caucasian", "age": 27} +{"id": 912, "file": "face_0912.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 913, "file": "face_0913.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 914, "file": "face_0914.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 915, "file": "face_0915.jpg", "gender": "woman", "race": "east_asian", "age": 30} +{"id": 916, "file": "face_0916.jpg", "gender": "man", "race": "caucasian", "age": 30} +{"id": 917, "file": "face_0917.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 918, "file": "face_0918.jpg", "gender": "man", "race": "caucasian", "age": 35} +{"id": 919, "file": "face_0919.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 920, "file": "face_0920.jpg", "gender": "woman", "race": "caucasian", "age": 28} +{"id": 921, "file": "face_0921.jpg", "gender": "woman", "race": "caucasian", "age": 35} +{"id": 922, "file": "face_0922.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 923, "file": "face_0923.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 924, "file": "face_0924.jpg", "gender": "woman", "race": "caucasian", "age": 42} +{"id": 925, "file": "face_0925.jpg", "gender": "woman", "race": "caucasian", "age": 42} +{"id": 926, "file": "face_0926.jpg", "gender": "woman", "race": "caucasian", "age": 42} +{"id": 927, "file": "face_0927.jpg", "gender": "woman", "race": "caucasian", "age": 42} +{"id": 928, "file": "face_0928.jpg", "gender": "man", "race": "hispanic", "age": 29} +{"id": 929, "file": "face_0929.jpg", "gender": "man", "race": "hispanic", "age": 29} +{"id": 930, "file": "face_0930.jpg", "gender": "man", "race": "hispanic", "age": 29} +{"id": 931, "file": "face_0931.jpg", "gender": "man", "race": "hispanic", "age": 29} +{"id": 932, "file": "face_0932.jpg", "gender": "man", "race": "hispanic", "age": 29} +{"id": 933, "file": "face_0933.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 934, "file": "face_0934.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 935, "file": "face_0935.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 936, "file": "face_0936.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 937, "file": "face_0937.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 938, "file": "face_0938.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 939, "file": "face_0939.jpg", "gender": "man", "race": "caucasian", "age": 26} +{"id": 940, "file": "face_0940.jpg", "gender": "woman", "race": "caucasian", "age": 29} +{"id": 941, "file": "face_0941.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 942, "file": "face_0942.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 943, "file": "face_0943.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 944, "file": "face_0944.jpg", "gender": "woman", "race": "caucasian", "age": 33} +{"id": 945, "file": "face_0945.jpg", "gender": "man", "race": "caucasian", "age": 38} +{"id": 946, "file": "face_0946.jpg", "gender": "man", "race": "caucasian", "age": 38} +{"id": 947, "file": "face_0947.jpg", "gender": "man", "race": "caucasian", "age": 47} +{"id": 948, "file": "face_0948.jpg", "gender": "man", "race": "caucasian", "age": 47} +{"id": 949, "file": "face_0949.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 950, "file": "face_0950.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 951, "file": "face_0951.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 952, "file": "face_0952.jpg", "gender": "woman", "race": "caucasian", "age": 25} +{"id": 953, "file": "face_0953.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 954, "file": "face_0954.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 955, "file": "face_0955.jpg", "gender": "woman", "race": "east_asian", "age": 29} +{"id": 956, "file": "face_0956.jpg", "gender": "woman", "race": "east_asian", "age": 29} +{"id": 957, "file": "face_0957.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 958, "file": "face_0958.jpg", "gender": "woman", "race": "east_asian", "age": 26} +{"id": 959, "file": "face_0959.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 960, "file": "face_0960.jpg", "gender": "man", "race": "caucasian", "age": 25} +{"id": 961, "file": "face_0961.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 962, "file": "face_0962.jpg", "gender": "woman", "race": "caucasian", "age": 31} +{"id": 963, "file": "face_0963.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 964, "file": "face_0964.jpg", "gender": "woman", "race": "caucasian", "age": 26} +{"id": 965, "file": "face_0965.jpg", "gender": "woman", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 966, "file": "face_0966.jpg", "gender": "woman", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 967, "file": "face_0967.jpg", "gender": "woman", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 968, "file": "face_0968.jpg", "gender": "woman", "race": "caucasian", "age": 21, "excluded": "minor"} +{"id": 969, "file": "face_0969.jpg", "gender": "woman", "race": "east_asian", "age": 33} +{"id": 970, "file": "face_0970.jpg", "gender": "woman", "race": "east_asian", "age": 33} +{"id": 971, "file": "face_0971.jpg", "gender": "man", "race": "hispanic", "age": 37} +{"id": 972, "file": "face_0972.jpg", "gender": "woman", "race": "east_asian", "age": 33} +{"id": 973, "file": "face_0973.jpg", "gender": "woman", "race": "east_asian", "age": 33} +{"id": 974, "file": "face_0974.jpg", "gender": "woman", "race": "east_asian", "age": 29} +{"id": 975, "file": "face_0975.jpg", "gender": "woman", "race": "east_asian", "age": 29} +{"id": 976, "file": "face_0976.jpg", "gender": "man", "race": "middle_eastern", "age": 33} +{"id": 977, "file": "face_0977.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 978, "file": "face_0978.jpg", "gender": "woman", "race": "caucasian", "age": 32} +{"id": 979, "file": "face_0979.jpg", "gender": "woman", "race": "east_asian", "age": 37} +{"id": 980, "file": "face_0980.jpg", "gender": "woman", "race": "east_asian", "age": 37} +{"id": 981, "file": "face_0981.jpg", "gender": "man", "race": "middle_eastern", "age": 32} +{"id": 982, "file": "face_0982.jpg", "gender": "man", "race": "middle_eastern", "age": 32} +{"id": 983, "file": "face_0983.jpg", "gender": "man", "race": "caucasian", "age": 37} +{"id": 984, "file": "face_0984.jpg", "gender": "man", "race": "caucasian", "age": 37} +{"id": 985, "file": "face_0985.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 986, "file": "face_0986.jpg", "gender": "man", "race": "caucasian", "age": 34} +{"id": 987, "file": "face_0987.jpg", "gender": "man", "race": "east_asian", "age": 18, "excluded": "minor"} +{"id": 988, "file": "face_0988.jpg", "gender": "man", "race": "east_asian", "age": 18, "excluded": "minor"} +{"id": 989, "file": "face_0989.jpg", "gender": "man", "race": "caucasian", "age": 40} +{"id": 990, "file": "face_0990.jpg", "gender": "man", "race": "caucasian", "age": 40} +{"id": 991, "file": "face_0991.jpg", "gender": "woman", "race": "black", "age": 32} +{"id": 992, "file": "face_0992.jpg", "gender": "woman", "race": "black", "age": 32} +{"id": 993, "file": "face_0993.jpg", "gender": "woman", "race": "black", "age": 32} +{"id": 994, "file": "face_0994.jpg", "gender": "woman", "race": "black", "age": 32} +{"id": 995, "file": "face_0995.jpg", "gender": "woman", "race": "black", "age": 32} +{"id": 996, "file": "face_0996.jpg", "gender": "woman", "race": "black", "age": 32} +{"id": 997, "file": "face_0997.jpg", "gender": "woman", "race": "black", "age": 32} +{"id": 998, "file": "face_0998.jpg", "gender": "man", "race": "caucasian", "age": 29} +{"id": 999, "file": "face_0999.jpg", "gender": "man", "race": "caucasian", "age": 29} diff --git a/mcp-server/console.html b/mcp-server/console.html index b59af4d..7caeaff 100644 --- a/mcp-server/console.html +++ b/mcp-server/console.html @@ -291,7 +291,8 @@ function workerRow(name, role, detail, opts){ if(faceKey){ var img=document.createElement('img'); img.alt=''; - img.loading='lazy'; + // Eager: 11KB thumbs make lazy unnecessary and lazy was racing + // playwright + retina-decode in field testing. img.src = P + '/headshots/' + encodeURIComponent(faceKey) + '?g='+gHint+'&e='+eHint; img.onerror=function(){ this.remove(); }; av.appendChild(img); diff --git a/mcp-server/index.ts b/mcp-server/index.ts index d4eedec..6a1cf48 100644 --- a/mcp-server/index.ts +++ b/mcp-server/index.ts @@ -1225,6 +1225,77 @@ async function main() { // OSHA national, Chicago history, ticker chart, parent link, // federal contracts, debarment, unions, training. Click any // contractor name in a permit Entity Brief to land here. + // ComfyUI-generated portrait — every call is unique by (key, + // gender, race, age, role) tuple. First hit takes ~1.5s on + // the A4000; subsequent hits read from disk. Use this for + // contractor / profile modal where one worker gets the + // spotlight. NB: declared BEFORE the pool route so the prefix + // match doesn't intercept it. + if (url.pathname.startsWith("/headshots/generate/") && req.method === "GET") { + const key = decodeURIComponent(url.pathname.slice("/headshots/generate/".length)); + if (!key) return new Response("missing key", { status: 400 }); + const g = (url.searchParams.get("g") || "person").toLowerCase(); + const r = (url.searchParams.get("e") || "").toLowerCase(); + const role = (url.searchParams.get("role") || "warehouse worker").toLowerCase(); + const age = parseInt(url.searchParams.get("age") || "32", 10) || 32; + const cacheKey = await crypto.subtle.digest( + "SHA-256", + new TextEncoder().encode(`${key}|${g}|${r}|${role}|${age}`) + ).then((b) => Array.from(new Uint8Array(b)).map((x) => x.toString(16).padStart(2, "0")).join("").slice(0, 24)); + const GEN_DIR = "/home/profit/lakehouse/data/headshots_gen"; + await Bun.$`mkdir -p ${GEN_DIR}`.quiet(); + const cachePath = `${GEN_DIR}/${cacheKey}.webp`; + const cached = Bun.file(cachePath); + if (await cached.exists()) { + return new Response(cached, { + headers: { + "Content-Type": "image/webp", + "Cache-Control": "public, max-age=86400, immutable", + "X-Headshot-Source": "comfyui-cached", + }, + }); + } + const raceText = r === "hispanic" ? "Hispanic" + : r === "black" ? "Black" + : r === "south_asian" ? "South Asian" + : r === "east_asian" ? "East Asian" + : r === "middle_eastern" ? "Middle Eastern" + : ""; + const genderText = g === "woman" ? "woman" : g === "man" ? "man" : "person"; + const prompt = `professional corporate headshot portrait of a ${age}-year-old ${raceText} ${genderText}, ${role}, neutral expression, plain studio background, soft natural lighting, sharp focus, photorealistic, dslr`; + // Worker-derived seed — same input always picks the same + // pixel layout in StyleGAN2 latent space, so the face is + // deterministic per worker BUT distinct from any other + // worker that happens to share the same prompt. Without + // this, every (g, r, age, role) combo collapses to one face. + let seedHash = 0; + for (let i = 0; i < key.length; i++) seedHash = ((seedHash << 5) - seedHash + key.charCodeAt(i)) | 0; + const seed = Math.abs(seedHash) % 2147483647; + try { + const genResp = await fetch("http://localhost:3600/generate", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ prompt, width: 512, height: 512, steps: 8, seed }), + signal: AbortSignal.timeout(30000), + }); + if (!genResp.ok) return new Response(`gen failed: ${genResp.status}`, { status: 502 }); + const data: any = await genResp.json(); + if (!data.image) return new Response("no image returned", { status: 502 }); + const bytes = Uint8Array.from(atob(data.image), (c) => c.charCodeAt(0)); + await Bun.write(cachePath, bytes); + return new Response(bytes, { + headers: { + "Content-Type": "image/webp", + "Cache-Control": "public, max-age=86400, immutable", + "X-Headshot-Source": "comfyui-fresh", + "X-Headshot-Gen-Ms": String(data.time_ms || 0), + }, + }); + } catch (e: any) { + return new Response(`gen error: ${e.message}`, { status: 502 }); + } + } + // Headshot pool — synthetic StyleGAN faces from // thispersondoesnotexist.com fetched offline by // scripts/staffing/fetch_face_pool.py. Deterministic mapping: @@ -1249,19 +1320,47 @@ async function main() { const raw = await Bun.file(`${HEADSHOT_DIR}/manifest.jsonl`).text(); const lines = raw.trim().split("\n").filter(Boolean); const all = lines.map((l) => JSON.parse(l)); + // Build (gender × race) buckets so a request that names + // both narrows to the intersection. Missing intersections + // fall back to gender-only, then race-only, then all. + const byGR: Record = {}; + const byG: Record = { man: [], woman: [] }; + const byR: Record = {}; + // Filter excluded faces (e.g. minors) from every bucket + // and from the all-pool. They never get served. + const adults = all.filter((r: any) => !r.excluded); + for (const r of adults) { + if (r.gender === "man" || r.gender === "woman") byG[r.gender].push(r); + if (r.race) { + byR[r.race] = byR[r.race] || []; + byR[r.race].push(r); + if (r.gender === "man" || r.gender === "woman") { + const k = r.gender + "/" + r.race; + byGR[k] = byGR[k] || []; + byGR[k].push(r); + } + } + } (globalThis as any)._faces = { - all, - man: all.filter((r: any) => r.gender === "man"), - woman: all.filter((r: any) => r.gender === "woman"), - untagged: all.filter((r: any) => !r.gender || (r.gender !== "man" && r.gender !== "woman")), + all: adults, + byG, byR, byGR, + untagged: adults.filter((r: any) => !r.gender || (r.gender !== "man" && r.gender !== "woman")), + excluded_count: all.length - adults.length, loaded_at: Date.now(), }; if (key === "__reload") { + const byRSummary: Record = {}; + for (const k of Object.keys(byR)) byRSummary[k] = byR[k].length; + const byGRSummary: Record = {}; + for (const k of Object.keys(byGR)) byGRSummary[k] = byGR[k].length; return Response.json({ reloaded: true, total: all.length, - man: (globalThis as any)._faces.man.length, - woman: (globalThis as any)._faces.woman.length, + excluded: all.length - adults.length, + served_pool: adults.length, + by_gender: { man: byG.man.length, woman: byG.woman.length }, + by_race: byRSummary, + by_gender_race: byGRSummary, untagged: (globalThis as any)._faces.untagged.length, }); } @@ -1269,20 +1368,50 @@ async function main() { return new Response(`face pool not available: ${e.message}. Run scripts/staffing/fetch_face_pool.py first.`, { status: 503 }); } } - const F = (globalThis as any)._faces as { all: any[]; man: any[]; woman: any[]; untagged: any[] }; + const F = (globalThis as any)._faces as { + all: any[]; + byG: Record; + byR: Record; + byGR: Record; + untagged: any[]; + }; if (!F || !F.all.length) { return new Response("face pool empty", { status: 503 }); } - // Pool selection: gender hint > full pool. If no gender match, - // fall back to the full pool so the worker still gets a face. + // Pool selection: try gender×race intersection first, then + // gender-only, then race-only, then full pool. Always returns + // a face so the worker card never falls back to the monogram. + const wantRace = url.searchParams.get("e") || ""; let pool = F.all; - if (wantGender === "man" && F.man.length) pool = F.man; - else if (wantGender === "woman" && F.woman.length) pool = F.woman; + if (wantGender && wantRace && F.byGR[wantGender + "/" + wantRace]?.length) { + pool = F.byGR[wantGender + "/" + wantRace]; + } else if (wantGender && F.byG[wantGender]?.length) { + pool = F.byG[wantGender]; + } else if (wantRace && F.byR[wantRace]?.length) { + pool = F.byR[wantRace]; + } // Hash key → pool index. djb2-ish, fits any string. let h = 5381; for (let i = 0; i < key.length; i++) h = ((h << 5) + h + key.charCodeAt(i)) | 0; const idx = Math.abs(h) % pool.length; const pick = pool[idx]; + // Prefer pre-resized webp thumb (~10KB) over native JPEG + // (~580KB). 60× smaller — without this, a 40-card grid + // overruns Chrome's parallel-connection budget and ~75% of + // tiles never finish decoding. + const thumbName = pick.file.replace(/\.jpg$/, ".webp"); + const thumb = Bun.file(`${HEADSHOT_DIR}/_thumbs/${thumbName}`); + if (await thumb.exists()) { + return new Response(thumb, { + headers: { + "Content-Type": "image/webp", + "Cache-Control": "public, max-age=86400, immutable", + "X-Face-Pool-Idx": String(pick.id), + "X-Face-Pool-Gender": pick.gender || "untagged", + "X-Face-Pool-Variant": "thumb-384", + }, + }); + } const file = Bun.file(`${HEADSHOT_DIR}/${pick.file}`); if (!(await file.exists())) { return new Response("face missing on disk", { status: 404 }); @@ -1293,6 +1422,7 @@ async function main() { "Cache-Control": "public, max-age=86400, immutable", "X-Face-Pool-Idx": String(pick.id), "X-Face-Pool-Gender": pick.gender || "untagged", + "X-Face-Pool-Variant": "native-1024", }, }); } diff --git a/mcp-server/search.html b/mcp-server/search.html index 77370b4..5a7ceaa 100644 --- a/mcp-server/search.html +++ b/mcp-server/search.html @@ -2397,7 +2397,9 @@ function addWorkerInsight(parent,name,detail,why,idx,highlight){ if(faceKey){ var img=document.createElement('img'); img.alt=''; - img.loading='lazy'; + // No lazy-loading: thumbs are 384x384 webp (~11KB) so eager + // load is cheap (~500KB for 50 cards) and avoids the off-screen + // tile flash + scroll-jitter that lazy decode produces here. var qs = '?g=' + gHint + '&e=' + eHint; img.src = P + '/headshots/' + encodeURIComponent(faceKey) + qs; img.onerror=function(){ this.remove(); }; diff --git a/scripts/serve_imagegen.py b/scripts/serve_imagegen.py index fc18ba0..0b88aec 100644 --- a/scripts/serve_imagegen.py +++ b/scripts/serve_imagegen.py @@ -29,8 +29,14 @@ CACHE_DIR.mkdir(parents=True, exist_ok=True) WORKFLOW_PATH = "/opt/ComfyUI/workflows/editorial_hero.json" -def _cache_key(prompt, width, height, steps): - return hashlib.sha256(f"{prompt}|{width}|{height}|{steps}".encode()).hexdigest()[:24] +def _cache_key(prompt, width, height, steps, seed=None): + # Include seed so callers can vary outputs deterministically without + # the proxy collapsing to a single cached image. None == legacy + # (omitted from the key for backward compatibility). + bits = f"{prompt}|{width}|{height}|{steps}" + if seed is not None: + bits += f"|{seed}" + return hashlib.sha256(bits.encode()).hexdigest()[:24] def _cache_get(key): fp = CACHE_DIR / f"{key}.webp" @@ -178,8 +184,9 @@ class ImageHandler(BaseHTTPRequestHandler): steps = min(max(int(body.get("steps", 50)), 1), 80) seed = body.get("seed") - # Cache check - key = _cache_key(prompt, width, height, steps) + # Cache check — seed is part of the key so per-worker requests + # don't collapse to a single cached portrait. + key = _cache_key(prompt, width, height, steps, seed) cached = _cache_get(key) if cached: self._json(200, {"image": cached, "format": "webp", "width": width, "height": height, @@ -210,6 +217,11 @@ class ImageHandler(BaseHTTPRequestHandler): elapsed_ms = int((time.time() - t0) * 1000) img_b64 = base64.b64encode(img_bytes).decode() + # Recompute key with the actual seed used (when caller passed + # None, _comfyui_generate picks a random one and we want the + # cache to reflect that so re-requests with the same returned + # seed hit the disk). + key = _cache_key(prompt, width, height, steps, seed) _cache_put(key, img_bytes) self._json(200, { diff --git a/scripts/staffing/tag_face_pool.py b/scripts/staffing/tag_face_pool.py new file mode 100644 index 0000000..94dd70f --- /dev/null +++ b/scripts/staffing/tag_face_pool.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python3 +""" +tag_face_pool.py — run deepface gender + race classification over the +synthetic face pool produced by fetch_face_pool.py and rewrite +manifest.jsonl with `gender` (man / woman) and `race` (asian / black / +hispanic / indian / middle_eastern / white) tags. + +Run with the venv that has deepface installed: + + /home/profit/.local/share/deepface-venv/bin/python \ + scripts/staffing/tag_face_pool.py + +Idempotent: rows that already have BOTH gender and race tagged are +skipped. Pass --force to re-tag everything. + +Mapping deepface buckets → /headshots/ ?e= values: + asian → split by manual region (deepface doesn't differentiate + East / South Asian; we lump as 'east_asian' since the + StyleGAN training set leans East Asian) + indian → south_asian + middle eastern → middle_eastern + black → black + hispanic → hispanic + white → caucasian +""" +from __future__ import annotations +import argparse +import json +import os +import sys +import time + +DEEPFACE_RACE_TO_HINT = { + "asian": "east_asian", + "indian": "south_asian", + "middle eastern": "middle_eastern", + "black": "black", + "latino hispanic": "hispanic", + "hispanic": "hispanic", + "white": "caucasian", +} + + +def main(): + p = argparse.ArgumentParser() + p.add_argument( + "--out", + default=os.path.join(os.path.dirname(__file__), "..", "..", "data", "headshots"), + ) + p.add_argument("--force", action="store_true", help="re-tag rows that already have gender+race") + p.add_argument("--limit", type=int, default=0, help="cap how many faces to process this run (0 = all)") + p.add_argument("--min-age", type=int, default=22, help="exclude faces estimated below this age (kids/teens). Staffing context = legal-age workers only.") + args = p.parse_args() + + out = os.path.realpath(args.out) + manifest_path = os.path.join(out, "manifest.jsonl") + if not os.path.exists(manifest_path): + print(f"manifest not found: {manifest_path}", file=sys.stderr) + sys.exit(1) + + print(f"loading deepface (cold start ~10-15s for first model build)…") + from deepface import DeepFace # type: ignore + + rows = [] + with open(manifest_path) as f: + for line in f: + line = line.strip() + if not line: + continue + rows.append(json.loads(line)) + print(f"manifest: {len(rows)} rows") + + todo = [ + r for r in rows + if args.force or r.get("gender") is None or r.get("race") is None or r.get("age") is None + ] + if args.limit > 0: + todo = todo[: args.limit] + print(f"to tag: {len(todo)} faces") + + if not todo: + print("nothing to do.") + return + + counts_g = {} + counts_r = {} + failed = 0 + t0 = time.time() + for i, r in enumerate(todo): + full = os.path.join(out, r["file"]) + try: + ana = DeepFace.analyze( + img_path=full, + actions=["gender", "race", "age"], + enforce_detection=False, + silent=True, + ) + if isinstance(ana, list): + ana = ana[0] if ana else {} + g_raw = (ana.get("dominant_gender") or "").lower().strip() + r["gender"] = ( + "man" if g_raw.startswith("man") else + "woman" if g_raw.startswith("woman") else + None + ) + r_raw = (ana.get("dominant_race") or "").lower().strip() + r["race"] = DEEPFACE_RACE_TO_HINT.get(r_raw, None) + if r["race"] is None and r_raw: + r["race_raw"] = r_raw + # Age estimation — exclude minors / teens. Staffing context + # uses adult workers only. Threshold is 22 by default + # (legal + a buffer because age estimation is noisy). + try: + age = int(round(float(ana.get("age") or 0))) + except Exception: + age = 0 + r["age"] = age + if age and age < args.min_age: + r["excluded"] = "minor" + else: + r.pop("excluded", None) + counts_g[r["gender"] or "unknown"] = counts_g.get(r["gender"] or "unknown", 0) + 1 + counts_r[r["race"] or r_raw or "unknown"] = counts_r.get(r["race"] or r_raw or "unknown", 0) + 1 + except Exception as e: + r["tag_error"] = f"{type(e).__name__}: {e}" + failed += 1 + if (i + 1) % 25 == 0 or (i + 1) == len(todo): + elapsed = time.time() - t0 + rate = (i + 1) / elapsed if elapsed > 0 else 0 + eta = (len(todo) - i - 1) / rate if rate > 0 else 0 + print(f" [{i+1}/{len(todo)}] rate={rate:.1f}/s eta={eta:.0f}s failed={failed}") + print(f" gender: {counts_g}") + print(f" race : {counts_r}") + + # Write updated manifest atomically + tmp = manifest_path + ".tmp" + with open(tmp, "w") as f: + for r in rows: + f.write(json.dumps(r) + "\n") + os.replace(tmp, manifest_path) + + final_g = {} + final_r = {} + excluded = 0 + age_hist = {"<18": 0, "18-22": 0, "22-30": 0, "30-40": 0, "40-50": 0, "50-60": 0, "60+": 0, "unknown": 0} + for r in rows: + if r.get("excluded"): + excluded += 1 + continue + final_g[r.get("gender") or "untagged"] = final_g.get(r.get("gender") or "untagged", 0) + 1 + final_r[r.get("race") or "untagged"] = final_r.get(r.get("race") or "untagged", 0) + 1 + a = r.get("age") or 0 + if a == 0: age_hist["unknown"] += 1 + elif a < 18: age_hist["<18"] += 1 + elif a < 22: age_hist["18-22"] += 1 + elif a < 30: age_hist["22-30"] += 1 + elif a < 40: age_hist["30-40"] += 1 + elif a < 50: age_hist["40-50"] += 1 + elif a < 60: age_hist["50-60"] += 1 + else: age_hist["60+"] += 1 + print(f"\nDone. {len(rows)} rows, {excluded} excluded as <{args.min_age}, {failed} tag errors, {time.time()-t0:.1f}s") + print(f" final gender: {final_g}") + print(f" final race : {final_r}") + print(f" age dist : {age_hist}") + print(f"\nNext: poke /headshots/__reload to refresh the in-memory pool.") + + +if __name__ == "__main__": + main()