diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e9289e --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# Datasets — multi-GB, never check in (download via scripts/download_polyvore.sh) +data/ + +# Fashionpedia val split cache for scripts/build_closet_dataset.py +.fashionpedia-cache/ + +# Python +__pycache__/ +*.pyc +.venv/ +venv/ + +# Env / secrets +.env + +# macOS +.DS_Store diff --git a/docs/superpowers/plans/2026-07-17-closet-dataset.md b/docs/superpowers/plans/2026-07-17-closet-dataset.md new file mode 100644 index 0000000..8e77e1e --- /dev/null +++ b/docs/superpowers/plans/2026-07-17-closet-dataset.md @@ -0,0 +1,451 @@ +# Closet Dataset Build Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Build `synthetic-data/closet/` — 100 clothing items (jsonl + 256px JPEG crops) sampled from the Fashionpedia val split. + +**Architecture:** A pure-logic module (`scripts/closet_lib.py`: grouping, filtering, sampling, attribute splitting, naming, synthesis) tested with pytest, plus an I/O script (`scripts/build_closet_dataset.py`) that loads the cached annotations, crops images with Pillow, and writes the dataset with a built-in validation pass. + +**Tech Stack:** Python 3, Pillow, pytest. Data already cached in `.fashionpedia-cache/` (annotations JSON + unzipped val/test images). + +## Global Constraints + +- Seeded RNG: `random.Random(42)` — output must be reproducible run-to-run. +- Output: exactly 100 records in `synthetic-data/closet/items.jsonl`; images `synthetic-data/closet/images/item_001.jpg` … `item_100.jpg`, max side 256px (never upscale), JPEG quality 85. +- Mix targets: 40 tops, 30 bottoms, 30 accessories; shortfall in one bucket fills from others; max 2 items per source photo. +- Min bounding box: 100×100px for tops/bottoms, 60×60px for accessories (accessory boxes are small in Fashionpedia; verified counts support 60px). +- Data reality (verified against `instances_attributes_val2020.json`): accessory instances carry **no attributes**; garment materials come only from attribute supercategories `leather` and `non-textile material type` (there is no denim/cotton/wool in the ontology) — pattern/finish/silhouette/etc. go in `attributes`. +- Category groups by Fashionpedia category id: tops = {0,1,2,3,4,5,9,10,11,12}, bottoms = {6,7,8}, accessories = {13,14,15,17,18,19,21,22,23,24,25,26}. Ids ≥27 (garment parts, closures, decorations) are excluded. + +--- + +### Task 1: Pure selection/synthesis logic (`closet_lib.py`) + +**Files:** +- Create: `scripts/closet_lib.py` +- Create: `tests/test_closet_lib.py` +- Modify: `requirements.txt` (append `pillow` and `pytest`) + +**Interfaces:** +- Produces (used by Task 2): + - `group_for(category_id: int) -> str | None` — "tops" | "bottoms" | "accessories" | None + - `passes_filters(ann: dict) -> bool` — ann is a COCO annotation dict with `category_id`, `bbox` + - `sample_items(annotations: list[dict], rng: random.Random, max_per_image: int = 2) -> list[dict]` — ~100 picked annotations honoring targets/caps + - `split_attributes(attribute_ids: list[int], attr_index: dict[int, dict]) -> tuple[list[str], list[str]]` — (materials, other_attributes), names cleaned of parentheticals + - `make_name(materials: list[str], attributes: list[str], category_name: str) -> str` + - `synthesize(rng: random.Random) -> tuple[str, str]` — (condition, quality_tier) + - Constants: `GROUP_TARGETS`, `MIN_BOX`, `MATERIAL_SUPERCATS` + +- [ ] **Step 1: Install deps and write the failing test** + +```bash +pip install pillow pytest +``` + +Append to `requirements.txt`: + +``` +pillow +pytest +``` + +Create `tests/test_closet_lib.py`: + +```python +import random +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts")) + +from closet_lib import ( + group_for, passes_filters, sample_items, split_attributes, + make_name, synthesize, GROUP_TARGETS, +) + + +def ann(id, category_id, image_id, w, h, attrs=()): + return {"id": id, "category_id": category_id, "image_id": image_id, + "bbox": [0, 0, w, h], "attribute_ids": list(attrs)} + + +def test_group_for(): + assert group_for(6) == "bottoms" # pants + assert group_for(10) == "tops" # dress + assert group_for(24) == "accessories" # bag, wallet + assert group_for(31) is None # sleeve (garment part) + + +def test_passes_filters_thresholds(): + assert passes_filters(ann(1, 6, 1, 100, 100)) # garment at 100px + assert not passes_filters(ann(2, 6, 1, 99, 300)) # garment under 100px + assert passes_filters(ann(3, 24, 1, 60, 60)) # accessory at 60px + assert not passes_filters(ann(4, 24, 1, 59, 200)) # accessory under 60px + assert not passes_filters(ann(5, 31, 1, 500, 500)) # excluded category + + +def test_sample_respects_targets_and_image_cap(): + anns = [] + n = 0 + # 3 candidates per image -> cap of 2/image must bite + for img in range(200): + for _ in range(3): + n += 1 + cid = [6, 0, 24][n % 3] + size = 60 if cid == 24 else 100 + anns.append(ann(n, cid, img, size, size)) + picked = sample_items(anns, random.Random(42)) + assert len(picked) == sum(GROUP_TARGETS.values()) == 100 + from collections import Counter + per_img = Counter(a["image_id"] for a in picked) + assert max(per_img.values()) <= 2 + groups = Counter(group_for(a["category_id"]) for a in picked) + assert groups == GROUP_TARGETS + + +def test_sample_is_deterministic(): + anns = [ann(i, 6, i, 120, 120) for i in range(60)] + a = sample_items(anns, random.Random(42)) + b = sample_items(anns, random.Random(42)) + assert [x["id"] for x in a] == [x["id"] for x in b] + + +def test_sample_fills_shortfall_from_other_groups(): + # only 5 accessories exist; total candidates still >= 100 + anns = [ann(i, 24, 1000 + i, 80, 80) for i in range(5)] + anns += [ann(100 + i, 6, i, 120, 120) for i in range(60)] + anns += [ann(300 + i, 0, 500 + i, 120, 120) for i in range(60)] + picked = sample_items(anns, random.Random(42)) + assert len(picked) == 100 + + +def test_split_attributes(): + attr_index = { + 1: {"name": "suede", "supercategory": "leather"}, + 2: {"name": "plain (pattern)", "supercategory": "textile pattern"}, + 3: {"name": "washed", "supercategory": "textile finishing, manufacturing techniques"}, + 4: {"name": "metal", "supercategory": "non-textile material type"}, + } + materials, attrs = split_attributes([1, 2, 3, 4], attr_index) + assert materials == ["suede", "metal"] + assert attrs == ["plain", "washed"] + + +def test_make_name(): + assert make_name(["suede"], ["washed"], "jacket") == "suede washed jacket" + assert make_name([], [], "bag, wallet") == "bag" + assert make_name([], ["a", "b", "c"], "pants") == "a b pants" # capped at 2 descriptors + + +def test_synthesize_values_and_determinism(): + c, t = synthesize(random.Random(7)) + assert c in {"new", "good", "worn", "needs repair"} + assert t in {"luxury", "mid", "budget"} + assert synthesize(random.Random(7)) == (c, t) +``` + +- [ ] **Step 2: Run tests to verify they fail** + +Run: `python3 -m pytest tests/test_closet_lib.py -q` +Expected: FAIL with `ModuleNotFoundError: No module named 'closet_lib'` + +- [ ] **Step 3: Implement `scripts/closet_lib.py`** + +```python +"""Pure selection/synthesis logic for the closet dataset (no I/O).""" + +TOPS = {0, 1, 2, 3, 4, 5, 9, 10, 11, 12} +BOTTOMS = {6, 7, 8} +ACCESSORIES = {13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26} + +GROUP_TARGETS = {"tops": 40, "bottoms": 30, "accessories": 30} +MIN_BOX = {"tops": 100, "bottoms": 100, "accessories": 60} +MATERIAL_SUPERCATS = {"leather", "non-textile material type"} + +CONDITIONS = ["new", "good", "worn", "needs repair"] +CONDITION_WEIGHTS = [0.20, 0.45, 0.25, 0.10] +TIERS = ["luxury", "mid", "budget"] +TIER_WEIGHTS = [0.20, 0.50, 0.30] + + +def group_for(category_id): + if category_id in TOPS: + return "tops" + if category_id in BOTTOMS: + return "bottoms" + if category_id in ACCESSORIES: + return "accessories" + return None + + +def passes_filters(ann): + group = group_for(ann["category_id"]) + if group is None: + return False + min_side = MIN_BOX[group] + _, _, w, h = ann["bbox"] + return w >= min_side and h >= min_side + + +def sample_items(annotations, rng, max_per_image=2): + buckets = {g: [] for g in GROUP_TARGETS} + for ann in annotations: + if passes_filters(ann): + buckets[group_for(ann["category_id"])].append(ann) + for bucket in buckets.values(): + rng.shuffle(bucket) + + picked, per_image, leftovers = [], {}, [] + + def take(ann): + if per_image.get(ann["image_id"], 0) >= max_per_image: + return False + per_image[ann["image_id"]] = per_image.get(ann["image_id"], 0) + 1 + picked.append(ann) + return True + + for group, target in GROUP_TARGETS.items(): + taken = 0 + for ann in buckets[group]: + if taken < target and take(ann): + taken += 1 + elif taken >= target: + leftovers.append(ann) + + total = sum(GROUP_TARGETS.values()) + rng.shuffle(leftovers) + for ann in leftovers: + if len(picked) >= total: + break + take(ann) + return picked + + +def _clean(name): + return name.split("(")[0].strip() + + +def split_attributes(attribute_ids, attr_index): + materials, attrs = [], [] + for aid in attribute_ids: + attr = attr_index.get(aid) + if attr is None: + continue + target = materials if attr["supercategory"] in MATERIAL_SUPERCATS else attrs + target.append(_clean(attr["name"])) + return materials, attrs + + +def make_name(materials, attributes, category_name): + short_cat = category_name.split(",")[0].strip() + descriptors = (materials + attributes)[:2] + return " ".join(descriptors + [short_cat]) + + +def synthesize(rng): + condition = rng.choices(CONDITIONS, weights=CONDITION_WEIGHTS)[0] + tier = rng.choices(TIERS, weights=TIER_WEIGHTS)[0] + return condition, tier +``` + +- [ ] **Step 4: Run tests to verify they pass** + +Run: `python3 -m pytest tests/test_closet_lib.py -q` +Expected: `9 passed` + +- [ ] **Step 5: Commit** + +```bash +git add scripts/closet_lib.py tests/test_closet_lib.py requirements.txt +git commit -m "feat: closet dataset selection/synthesis logic" +``` + +--- + +### Task 2: Build script (`build_closet_dataset.py`) and dataset generation + +**Files:** +- Create: `scripts/build_closet_dataset.py` +- Create (generated): `synthetic-data/closet/items.jsonl`, `synthetic-data/closet/images/item_*.jpg` + +**Interfaces:** +- Consumes from Task 1: `sample_items(annotations, rng)`, `split_attributes(attribute_ids, attr_index) -> (materials, attrs)`, `make_name(materials, attrs, category_name) -> str`, `synthesize(rng) -> (condition, tier)`, `group_for(category_id)`. +- Produces: the dataset on disk. Acceptance test = the script's own validation pass (no unit tests; it is I/O glue over tested logic, run against real data). + +- [ ] **Step 1: Write `scripts/build_closet_dataset.py`** + +```python +"""Build synthetic-data/closet/ from the cached Fashionpedia val split. + +Prereq: .fashionpedia-cache/ holds instances_attributes_val2020.json and the +unzipped val_test2020 images (URLs in the design doc, +docs/superpowers/specs/2026-07-17-closet-dataset-design.md). +""" +import json +import random +import sys +from collections import Counter +from pathlib import Path + +from PIL import Image + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from closet_lib import group_for, make_name, sample_items, split_attributes, synthesize + +REPO = Path(__file__).resolve().parent.parent +CACHE = REPO / ".fashionpedia-cache" +OUT = REPO / "synthetic-data" / "closet" +SEED = 42 +TARGET_TOTAL = 100 +PAD_FRACTION = 0.10 +MAX_SIDE = 256 +JPEG_QUALITY = 85 + + +def load_data(): + ann_path = CACHE / "instances_attributes_val2020.json" + if not ann_path.exists(): + sys.exit(f"Missing {ann_path} — download the Fashionpedia val annotations first.") + return json.loads(ann_path.read_text()) + + +def index_image_files(): + files = {} + for p in (CACHE / "images").rglob("*.jpg"): + files[p.name] = p + if not files: + sys.exit(f"No images found under {CACHE / 'images'} — unzip val_test2020.zip there.") + return files + + +def crop_item(src_path, bbox, dst_path): + x, y, w, h = bbox + with Image.open(src_path) as im: + im = im.convert("RGB") + pad = PAD_FRACTION * max(w, h) + left = max(0, int(x - pad)) + top = max(0, int(y - pad)) + right = min(im.width, int(x + w + pad)) + bottom = min(im.height, int(y + h + pad)) + crop = im.crop((left, top, right, bottom)) + crop.thumbnail((MAX_SIDE, MAX_SIDE)) # never upscales + crop.save(dst_path, "JPEG", quality=JPEG_QUALITY) + + +def main(): + data = load_data() + files = index_image_files() + attr_index = {a["id"]: a for a in data["attributes"]} + cat_index = {c["id"]: c["name"] for c in data["categories"]} + images = {i["id"]: i for i in data["images"]} + licenses = {l["id"]: l for l in data["licenses"]} + + rng = random.Random(SEED) + picked = sample_items(data["annotations"], rng) + + (OUT / "images").mkdir(parents=True, exist_ok=True) + records, skipped = [], 0 + for ann in picked: + img = images[ann["image_id"]] + src = files.get(img["file_name"]) + if src is None: + skipped += 1 + print(f"skip: {img['file_name']} not in zip (annotation {ann['id']})") + continue + item_id = f"item_{len(records) + 1:03d}" + image_rel = f"images/{item_id}.jpg" + try: + crop_item(src, ann["bbox"], OUT / image_rel) + except OSError as e: + skipped += 1 + print(f"skip: {img['file_name']} unreadable ({e})") + continue + materials, attrs = split_attributes(ann.get("attribute_ids", []), attr_index) + condition, tier = synthesize(rng) + category = cat_index[ann["category_id"]] + lic = licenses.get(img.get("license"), {}) + records.append({ + "id": item_id, + "name": make_name(materials, attrs, category), + "category": category.split(",")[0].strip(), + "group": group_for(ann["category_id"]), + "material": materials, + "attributes": attrs, + "condition": condition, + "quality_tier": tier, + "image": image_rel, + "source": { + "fashionpedia_image_id": ann["image_id"], + "annotation_id": ann["id"], + "license": lic.get("name", "unknown"), + "license_url": lic.get("url", ""), + "original_url": img.get("original_url", ""), + }, + }) + + with open(OUT / "items.jsonl", "w") as f: + for r in records: + f.write(json.dumps(r) + "\n") + + # Validation pass + lines = (OUT / "items.jsonl").read_text().splitlines() + assert all((OUT / json.loads(l)["image"]).exists() for l in lines), "missing image file" + print(f"\nwrote {len(lines)} items, skipped {skipped}") + print("groups:", dict(Counter(json.loads(l)["group"] for l in lines))) + print("categories:", dict(Counter(json.loads(l)["category"] for l in lines))) + print("conditions:", dict(Counter(json.loads(l)["condition"] for l in lines))) + print("tiers:", dict(Counter(json.loads(l)["quality_tier"] for l in lines))) + materials = Counter(m for l in lines for m in json.loads(l)["material"]) + print("materials:", dict(materials)) + if len(lines) < TARGET_TOTAL: + sys.exit(f"FAILED: only {len(lines)}/{TARGET_TOTAL} items written") + print("OK") + + +if __name__ == "__main__": + main() +``` + +- [ ] **Step 2: Run the build** + +Run: `python3 scripts/build_closet_dataset.py` +Expected: `wrote 100 items, skipped 0`, group counts `{'tops': 40, 'bottoms': 30, 'accessories': 30}`, then `OK` (exit 0). If it exits nonzero, the shortfall message says how many were written — investigate skips before rerunning. + +- [ ] **Step 3: Verify dataset size and reproducibility** + +Run: `du -sh synthetic-data/closet && ls synthetic-data/closet/images | wc -l && shasum synthetic-data/closet/items.jsonl && python3 scripts/build_closet_dataset.py >/dev/null && shasum synthetic-data/closet/items.jsonl` +Expected: total well under ~5MB, 100 images, identical checksum after the rerun (reproducible). + +- [ ] **Step 4: Commit script + dataset** + +```bash +git add scripts/build_closet_dataset.py synthetic-data/closet +git commit -m "feat: build 100-item closet dataset from Fashionpedia val split" +``` + +--- + +### Task 3: Spot-check and spec sync + +**Files:** +- Modify: `docs/superpowers/specs/2026-07-17-closet-dataset-design.md` (data-reality amendments) + +**Interfaces:** +- Consumes: the generated dataset from Task 2. +- Produces: verified dataset + spec that matches reality. + +- [ ] **Step 1: Visually spot-check ~5 crops** + +Read 5 spread-out images (e.g. `item_001.jpg`, `item_025.jpg`, `item_050.jpg`, `item_075.jpg`, `item_100.jpg`) with the Read tool and compare each against its jsonl record — the crop should plausibly be the named category. +Expected: crops legible, categories match. If a crop is wrong/garbage, note the annotation id and re-check the crop math before shipping. + +- [ ] **Step 2: Amend the spec's material/selection sections** + +Update the spec: materials come from `leather` + `non-textile material type` supercategories only (no denim/cotton in Fashionpedia); accessories carry no attributes and use a 60×60px minimum box. Keep the rest as written. + +- [ ] **Step 3: Commit** + +```bash +git add docs/superpowers/specs/2026-07-17-closet-dataset-design.md +git commit -m "docs: sync closet dataset spec with Fashionpedia data reality" +``` diff --git a/docs/superpowers/specs/2026-07-17-closet-dataset-design.md b/docs/superpowers/specs/2026-07-17-closet-dataset-design.md new file mode 100644 index 0000000..42fb20b --- /dev/null +++ b/docs/superpowers/specs/2026-07-17-closet-dataset-design.md @@ -0,0 +1,106 @@ +# Closet Dataset Design — ~100 items from Fashionpedia + +**Date:** 2026-07-17 +**Status:** Approved (approach A) + +## Purpose + +Build a small (~100 item) clothing dataset for the clueless memory-agent demo: a +"closet" of individual items (tops, bottoms, accessories) that vary on category, +material, and quality. The agent reasons over structured metadata; small images sit +alongside each item for display in a demo UI (and optional vision calls later). + +## Source + +Fashionpedia validation split: + +- Images: `https://s3.amazonaws.com/ifashionist-dataset/images/val_test2020.zip` (236MB, ~3,200 photos) +- Annotations: `https://s3.amazonaws.com/ifashionist-dataset/annotations/instances_attributes_val2020.json` (14.5MB) + +Annotations are COCO-format with per-garment bounding boxes, 27 apparel categories, +and 294 fine-grained attributes (materials, silhouettes, styles). Individual garments +are cropped out of outfit photos to become closet items. + +Downloads go to `.fashionpedia-cache/` (gitignored); the pipeline never re-downloads +if the files are present. + +## Output + +`synthetic-data/closet/` — committed to the repo (small enough that teammates never +run the pipeline): + +- `items.jsonl` — 100 records, one per line +- `images/item_NNN.jpg` — one crop per item, max side 256px, JPEG quality ~85 (~10–30KB each) + +### Record schema + +```json +{ + "id": "item_001", + "name": "washed straight-leg denim pants", + "category": "pants", + "group": "bottoms", + "material": ["denim"], + "attributes": ["straight-leg", "washed"], + "condition": "good", + "quality_tier": "mid", + "image": "images/item_001.jpg", + "source": {"fashionpedia_image_id": 12345, "annotation_id": 67890, "license": "CC BY 2.0"} +} +``` + +- `category`, `material`, `attributes` come straight from Fashionpedia. `material` + holds attribute names from the `leather` and `non-textile material type` + supercategories — the only material-like supercategories in the ontology (there is + no denim/cotton/wool attribute in Fashionpedia); `attributes` holds the rest + (silhouette, length, neckline, pattern, finish). Negative markers ("no waistline", + "no non-textile material", …) are dropped. Accessory instances carry no attributes + at all in Fashionpedia, so accessories have empty `material`/`attributes` and are + named by bare category. +- `condition` (new | good | worn | needs repair) and `quality_tier` + (luxury | mid | budget) are synthesized with a seeded RNG (fixed seed, weighted + toward a realistic closet mix) so output is reproducible. +- `name` is composed from attributes + category for readability. +- `source.license` carries the Flickr CC license from the image metadata for attribution. + +## Selection rules + +Target mix: ~40 tops (shirt/blouse, top/t-shirt/sweatshirt, sweater, cardigan, +jacket, coat, dress), ~30 bottoms (pants, shorts, skirt), ~30 accessories (bag/wallet, +shoe, glasses, hat, belt, watch, scarf/tie, headband). + +Filters: + +- Bounding box ≥ 100×100px for tops/bottoms; ≥ 60×60px for accessories (accessory + boxes are small — watches/glasses almost never reach 100px) +- At most 2 items per source photo (variety) +- Crops get ~10% padding around the bbox, clamped to image bounds + +If a bucket falls short after filtering, the pipeline reports the shortfall and fills +from the other buckets rather than failing. + +## Pipeline + +One script: `scripts/build_closet_dataset.py` + +1. Verify cache (download annotations + zip if missing, unzip) +2. Index annotations; bucket candidate instances by category group +3. Sample per the mix with a fixed seed +4. Crop/resize with Pillow; write JPEGs +5. Synthesize condition/quality_tier; compose names; write `items.jsonl` +6. Validate: 100 records, every referenced image exists, print counts per + category/group/material + +Errors: skip degenerate bboxes, unreadable images, and annotations whose image file +is missing from the zip; log each skip. Fail loudly (non-zero exit) if the total +falls below 100 after fallbacks. + +## Testing + +The validation pass in step 6 is the acceptance test. Additionally, spot-check ~5 +crops visually and eyeball a few jsonl records for sane names/materials. + +## Out of scope + +Price/value, brands, wear history (user deselected); sending images to the model via +Files API; train-split download (4x+ larger, unnecessary for 100 items). diff --git a/personas/README.md b/personas/README.md new file mode 100644 index 0000000..d18b3f5 --- /dev/null +++ b/personas/README.md @@ -0,0 +1,50 @@ +# Synthetic Personas — Clueless Outfit-Picker Agent + +Synthetic users for the outfit-picker agent (inspired by Cher's closet software in *Clueless*). +Each file is one person's clothing taste — the input the agent learns from, suggests outfits against, +gets feedback from, and updates its knowledge with across sessions. + +## The set + +| Persona | One-liner | +| --- | --- | +| [Carla](./carla.md) | 75, retiree — "coastal grandma," linen and natural colors | +| [Jeff](./jeff.md) | 40, mechanic — durable, functional, doesn't care about fashion | +| [Oscar](./oscar.md) | 15, streetwear — bright colors, Le Fleur brand | +| [Priya](./priya.md) | 32, lawyer — "quiet luxury," neutral capsule wardrobe | +| [Dante](./dante.md) | 28, alt/goth — head-to-toe black, DIY, band tees | +| [Meredith](./meredith.md) | 34, new parent — practical, washable, still wants to feel herself | +| [Rosa](./rosa.md) | 48, plus-size — bold prints, saturated color, maximalist | +| [Kenji](./kenji.md) | 22, techwear/gorpcore — function-forward, muted layers | + +The set spans age (15–75), fashion investment (Jeff's indifference → Rosa's joy), +palette (all-black → maximalist color), and constraint type (durability, budget, comfort, +nursing/practicality, plus-size fit, weatherproofing). Gender is stated explicitly on each +profile: Carla, Priya, Meredith, and Rosa are women (she/her); Oscar and Dante are men +(he/him); Jeff and Kenji are nonbinary (they/them). + +## File format + +Every persona has the same sections, each mapping to a stage of the agent loop: + +- **Style identity / Likes / Dislikes** — what the agent *asks about and saves as knowledge*. +- **Lifestyle / occasions / Constraints** — what it needs to *suggest appropriate outfits* + (budget, climate, comfort, dress codes). +- **Voice** — how the person talks, so simulated conversations sound realistic. +- **Sample outfit reactions** — ✅/⚠️/❌ examples of the *feedback* the user gives, so you can + script or seed the feedback stage. +- **Taste shift** — a change or new context introduced *later*, for a second session to reconcile. + +## The "taste shift" convention (the memory demo) + +This repo's core demo is an agent that gets sharper across sessions by *updating* memory when new +info contradicts old (round1 → round2). Each persona's **Taste shift** is that second-session +signal. The bar isn't "did the agent change its answer" — it's "did the agent update the *nuance* +without clobbering the rest of the profile": + +- Carla wants one warm accent color → *don't* wipe her "no loud colors" rule. +- Jeff needs one dress-up outfit → *don't* conclude he's "into fashion" now. +- Oscar matures his palette → he still wants a pop, now grounded in neutrals. +- Priya adds a signature burgundy → the capsule expands by one accent, philosophy intact. + +A good agent reconciles; a naive one overwrites. diff --git a/personas/carla.md b/personas/carla.md new file mode 100644 index 0000000..d35910e --- /dev/null +++ b/personas/carla.md @@ -0,0 +1,45 @@ +# Persona — Carla + +**One-liner:** 75-year-old retiree, "coastal grandma" — linen, natural colors, unfussy elegance. + +## Bio +- Age 75, woman (she/her), retired librarian. Lives in a beach town; walks on the boardwalk most mornings. +- Dresses for comfort and ease first, but cares about looking "put together, not fussy." +- Shops a few times a year, keeps clothes for a long time, buys quality over quantity. + +## Style identity +- Coastal grandma: relaxed, breezy, layered, natural. +- Wants to look elegant without looking like she "tried too hard." + +## Likes +- **Colors:** ivory, oatmeal, sand, sage, soft white, chambray blue, driftwood grey. +- **Fabrics:** linen, cotton, cashmere, gauze, raw silk. Anything breathable. +- **Silhouettes:** loose and drapey — wide-leg trousers, tunics, oversized cardigans, shirt-dresses. +- **Details:** wooden buttons, straw hats, a good scarf, simple gold jewelry, leather sandals. + +## Dislikes +- Synthetic fabrics (polyester feels "sweaty and cheap" to her). +- Loud prints, neon, logos, anything tight or restrictive. +- Heels — refuses them. Nothing that needs ironing every wear. + +## Lifestyle / occasions she dresses for +- Morning boardwalk walks, coffee with friends, farmers market. +- Occasional dinner out, book club, visits with grandkids. +- One or two "nice" events a year (a wedding, a memorial, a gallery opening). + +## Constraints +- **Comfort:** joints ache in cold; layers she can add/remove. No stiff waistbands. +- **Budget:** moderate — will spend on a staple that lasts, balks at trend pieces. +- **Climate:** mild, humid, breezy coast. Cool mornings, warm afternoons. +- **Values:** prefers natural fibers, likes secondhand and "made to last." + +## Voice — how she talks about clothes +Warm, a little wry. "Oh, that's lovely, but I'd swim in it." / "Too scratchy for these old shoulders." / "I don't want to look like I'm off to a nightclub, dear." + +## Sample outfit reactions (feedback the agent should learn from) +- ✅ *Linen wide-leg trousers + oatmeal knit tank + long cardigan + leather sandals* → "Now that's me. Easy." +- ⚠️ *Fitted midi dress in bold floral* → "Pretty on someone, but the print's shouting and it's clingy." +- ❌ *Anything with a heel or a synthetic blend* → hard no, every time. + +## Taste shift (for a later session to reconcile) +After a trip to visit her granddaughter, Carla decides she wants **one bolder accent color** in her wardrobe — a terracotta or coral — "just a scarf or a shirt, nothing crazy." A good agent should update her "no loud colors" note into "no loud colors *except* one warm accent she now enjoys," not overwrite her whole palette. diff --git a/personas/dante.md b/personas/dante.md new file mode 100644 index 0000000..470c4b4 --- /dev/null +++ b/personas/dante.md @@ -0,0 +1,45 @@ +# Persona — Dante + +**One-liner:** 28-year-old alt/goth — head-to-toe black, DIY, band tees, heavy boots. + +## Bio +- Age 28, man (he/him), works at a record store, plays in a band on weekends. +- Style is subcultural identity, built over years. Thrifts and customizes most of it. +- Not chasing trends — chasing a *look* that's been consistent since he was 16. + +## Style identity +- Goth / post-punk / alt. Layered black, silver hardware, a little glam edge. + +## Likes +- **Colors:** black, black, and more black. Occasional oxblood, charcoal, deep purple. +- **Fabrics:** worn denim, leather, mesh, cotton jersey, distressed knits. +- **Silhouettes:** slim-to-fitted on top, layered — vests over tees, harnesses, long coats. +- **Details:** silver rings/chains, studs, safety pins, band patches, DIY distressing. +- **Footwear:** Doc Martens, combat boots, creepers. Non-negotiable. + +## Dislikes +- Bright colors, pastels, preppy or "normie" clothing, anything that reads corporate. +- Being told to "add some color" or "lighten up." +- Pristine/box-fresh looks — he wants lived-in, not new. + +## Lifestyle / occasions he dresses for +- Record store shifts, shows and gigs, hanging at the venue/bar. +- Occasionally a day-job-adjacent thing or family event where he tones it down *slightly* (still black). +- Photoshoots for the band — where he goes fuller-glam. + +## Constraints +- **Budget:** low-to-moderate — thrift + DIY is core to both his ethics and his wallet. +- **Comfort:** boots and layers he can wear all night; nothing too hot on a packed stage. +- **Consistency:** the aesthetic is the point — suggestions must stay inside the subculture. +- **Weather:** layers matter; won't sacrifice the look for a "sensible" jacket. + +## Voice — how he talks about clothes +Dry, particular, subculture-fluent. "That's a bit too Hot Topic." / "Needs to be more worn-in." / "Silver, not gold — always." / "I'll wear color when they bury me." + +## Sample outfit reactions (feedback the agent should learn from) +- ✅ *Distressed black jeans + band tee + leather vest + Docs + silver rings* → "Yeah, that's the fit." +- ⚠️ *All black but too clean/new-looking* → "Too polished. Rough it up." +- ❌ *Any suggestion with a bright accent color* → "Hard pass. Not the vibe." + +## Taste shift (for a later session to reconcile) +Dante lands a **day job with a mild dress code** and needs a couple of "acceptable" outfits that still feel like him — think dark, minimal, boots swapped for black leather shoes, patches removed. He is NOT going preppy. A good agent should build a small "work-safe goth" sub-capsule while leaving his core aesthetic untouched. diff --git a/personas/jeff.md b/personas/jeff.md new file mode 100644 index 0000000..466799c --- /dev/null +++ b/personas/jeff.md @@ -0,0 +1,45 @@ +# Persona — Jeff + +**One-liner:** 40-year-old mechanic — wants durable, functional clothes, doesn't care about fashion. + +## Bio +- Age 40, nonbinary (they/them), works as an auto mechanic. On their feet, hands dirty, all day. +- Views clothes as tools. "Does it work, does it last, can I stop thinking about it." +- Buys the same things repeatedly; replaces only when something wears out. + +## Style identity +- Utilitarian. If it had a name they'd reject the name. "Workwear," under protest. + +## Likes +- **Colors:** dark and forgiving — navy, charcoal, olive, black, faded denim. Hides grease. +- **Fabrics:** heavyweight cotton duck, denim, ripstop, flannel, wool socks. Reinforced anything. +- **Silhouettes:** straight-fit, room to move, nothing that binds when crouching. +- **Details:** deep pockets, triple-stitched seams, sturdy zippers, steel-toe boots. +- **Brands:** trusts Carhartt, Dickies, Red Wing — because they last, not because of the logo. + +## Dislikes +- Anything "delicate," dry-clean-only, light-colored, or that shows dirt. +- Fashion talk. Slim fit. Buttons where a zipper would do. Paying extra for a name. +- Being asked to "express themselves" through an outfit. + +## Lifestyle / occasions they dress for +- 90% of the time: the shop. Same rotation of work pants and tees. +- Occasionally: kid's school events, backyard BBQs, hardware store runs. +- Rarely, and reluctantly: a wedding, a funeral, a "nice" dinner their partner planned. + +## Constraints +- **Durability is everything** — a garment that fails in 6 months is a failure, full stop. +- **Budget:** value-driven. Will pay more up front *if* it clearly lasts longer. +- **Comfort:** must work for kneeling, reaching, sweating. Machine wash, tumble dry, done. +- **Low decision cost:** the fewer choices in the morning, the better. Uniform > variety. + +## Voice — how they talk about clothes +Blunt, minimal. "Fine." / "That'll rip." / "Why does a shirt cost that much." / "It's got pockets, I'll take it." Enthusiasm looks like "yeah, that works." + +## Sample outfit reactions (feedback the agent should learn from) +- ✅ *Carhartt double-knee pants + heavyweight tee + flannel overshirt + work boots* → "Yeah. That's the uniform." +- ⚠️ *Chinos + button-down for the school event* → "If I have to. Nothing white, I'll wreck it." +- ❌ *Slim-fit anything, or a blazer* → "Can't crouch in that. No." + +## Taste shift (for a later session to reconcile) +Jeff's kid is graduating and there's a **semi-formal dinner** they can't dodge. Suddenly they need something dressier than they own — but it has to feel like *them*: no slim fit, dark colors, comfortable, reusable for future funerals/weddings so it's a one-time buy. A good agent should add a narrow "dress-up" exception without deciding Jeff has "gotten into fashion." diff --git a/personas/kenji.md b/personas/kenji.md new file mode 100644 index 0000000..559a592 --- /dev/null +++ b/personas/kenji.md @@ -0,0 +1,45 @@ +# Persona — Kenji + +**One-liner:** 22-year-old techwear / gorpcore fan — function-forward, muted, gadget-y layers. + +## Bio +- Age 22, nonbinary (they/them), CS student and part-time barista who bikes everywhere. +- Obsessed with the intersection of performance gear and design — "form follows function." +- Reads spec sheets like others read fashion blogs: fabric weights, waterproof ratings, pocket layouts. + +## Style identity +- Techwear / gorpcore. Arc'teryx, ACRONYM-adjacent, Salomon, muted technical layers. + +## Likes +- **Colors:** muted and tonal — black, graphite, olive drab, taupe, "urban" greys, a single accent. +- **Fabrics:** Gore-Tex, softshell, ripstop nylon, merino, technical fleece. Weatherproof, breathable. +- **Silhouettes:** layered and functional — shells, cargo/technical pants, cropped or relaxed fits. +- **Details:** taped seams, magnetic/cinch closures, modular pockets, gaiters, trail sneakers. +- **Footwear:** Salomon XT-6, trail runners, chunky technical sneakers. + +## Dislikes +- Purely decorative clothing with no function, delicate fabrics, "fashion for fashion's sake." +- Loud branding (function-brand logos okay, hype logos not), bright non-purposeful color. +- Anything that fails in rain or on a bike. + +## Lifestyle / occasions they dress for +- Commuting by bike in all weather, campus, café shifts, hiking on weekends. +- Occasionally a date or a friend's event where they want "techwear but a bit sharper." +- Almost never anything formal — and dreads when they have to. + +## Constraints +- **Function is the aesthetic:** every piece should justify itself (weatherproof, mobile, packable). +- **Budget:** student — saves for one grail shell, fills the rest with sales/secondhand. +- **Weather:** rides in rain/cold; layering system matters more than any single piece. +- **Mobility:** must work on a bike — no restriction, reflective/dark-friendly. + +## Voice — how they talk about clothes +Spec-driven, understated. "What's the fabric?" / "Does it pack down?" / "Too many logos." / "Clean silhouette, but is it waterproof?" + +## Sample outfit reactions (feedback the agent should learn from) +- ✅ *Black Gore-Tex shell + olive technical pants + merino base + Salomons* → "Functional and clean. That's it." +- ⚠️ *Good fit but a bright red non-technical jacket* → "Color's random and it's not weatherproof. No." +- ❌ *A cotton blazer or dress shoes* → "Useless in rain, can't bike in it. Hard no." + +## Taste shift (for a later session to reconcile) +Kenji is invited to a **semi-formal event** and wants to look sharp *without abandoning* the techwear ethos — think a clean dark technical overshirt, tailored-but-stretch trousers, minimal sneakers. A good agent should find "elevated techwear" rather than push them into a conventional suit they'll hate and never rewear. diff --git a/personas/meredith.md b/personas/meredith.md new file mode 100644 index 0000000..c216c89 --- /dev/null +++ b/personas/meredith.md @@ -0,0 +1,44 @@ +# Persona — Meredith + +**One-liner:** 34-year-old new parent — practical, washable, comfortable, still wants to feel like herself. + +## Bio +- Age 34, woman (she/her), marketing manager on parental leave with a 4-month-old. +- Wardrobe just changed overnight: whatever she wears has to survive spit-up and one-handed dressing. +- Used to enjoy fashion; now wants "5 things that work and make me feel human." + +## Style identity +- Elevated practical. Athleisure-adjacent but pulled-together — not "given up," just efficient. + +## Likes +- **Colors:** soft neutrals + a few cheerful ones — sage, blush, navy, cream, mustard. +- **Fabrics:** stretch cotton, jersey, ribbed knits, French terry. Soft, forgiving, machine-washable. +- **Silhouettes:** relaxed but shaped — nursing-friendly tops, wide leggings, oversized shirts, wrap dresses. +- **Details:** easy nursing access, pockets, no fussy closures, slip-on shoes. + +## Dislikes +- Dry-clean-only, delicate, or restrictive anything. Complicated layering. +- White (won't survive), stiff waistbands, heels, back-zip dresses she can't do alone. +- Feeling frumpy — she'll tolerate practical, not shapeless. + +## Lifestyle / occasions she dresses for +- Home + baby (most of the day): comfort and function above all. +- Walks, pediatrician visits, coffee with other parents, quick errands. +- Occasionally: a work call on video (needs a decent top), a friend's dinner where she wants to feel put-together. + +## Constraints +- **Function first:** nursing access, movement, washability are hard requirements right now. +- **Budget:** moderate; body is still changing, so hesitant to buy "forever" pieces. +- **Energy:** near-zero decision bandwidth — wants grab-and-go combos. +- **Comfort/fit:** postpartum body, wants pieces that flatter without squeezing. + +## Voice — how she talks about clothes +Practical, self-aware, a little tired. "Can I nurse in it?" / "Will it survive the wash?" / "I want to look like a person on this call." / "Comfortable but not a total sack, please." + +## Sample outfit reactions (feedback the agent should learn from) +- ✅ *Ribbed nursing top + wide black leggings + oversized cardigan + slip-on sneakers* → "Comfortable AND I look fine. Sold." +- ⚠️ *Cute wrap dress but back zip* → "Love it, but I can't zip that alone with a baby on my hip." +- ❌ *White anything, or a stiff blazer* → "Not with a newborn. No." + +## Taste shift (for a later session to reconcile) +Meredith is **returning to the office part-time** and needs outfits that bridge nursing-practicality with professional polish — washable blazers, tops that work for pumping, shoes she can walk-commute in. A good agent should layer a "back-to-work" need on top of her comfort/function rules, not assume the baby-practical constraints are gone. diff --git a/personas/oscar.md b/personas/oscar.md new file mode 100644 index 0000000..24a301e --- /dev/null +++ b/personas/oscar.md @@ -0,0 +1,46 @@ +# Persona — Oscar + +**One-liner:** 15-year-old, loves bright colors and streetwear, partial to the Le Fleur brand. + +## Bio +- Age 15, boy (he/him), high schooler. Style is identity — how he shows up matters a lot to him. +- Deep in sneaker/streetwear culture; follows drops, hype, and what his friends rate. +- Budget is limited (allowance + occasional gifts), so pieces are chosen carefully and worn proudly. + +## Style identity +- Bright, expressive streetwear. Golf le Fleur / Tyler-the-Creator adjacent — playful, vintage-preppy-meets-skate, bold color blocking. + +## Likes +- **Colors:** the Le Fleur palette — sunflower yellow, pastel pink, mint, sky blue, tangerine. Wants a *pop*. +- **Fabrics:** cotton fleece, corduroy, terrycloth, canvas. Comfortable, everyday. +- **Silhouettes:** relaxed hoodies, boxy tees, cardigans, wide/loose jeans, cuffed pants. +- **Details:** the flower logo, bold graphics, color-blocked panels, statement socks. +- **Footwear (huge deal):** GOLF le Fleur x Converse, chunky sneakers, colorful low-tops. Kept clean. +- **Brands:** Le Fleur (favorite), Golf Wang, plus thrifted finds he can style loud. + +## Dislikes +- "Basic" or all-black fits. Plain adult-office clothes. Anything that reads "trying to look older/boring." +- Fake/knockoff versions of hype pieces — "he'd rather have one real thing." +- Being told a color is "too much." + +## Lifestyle / occasions he dresses for +- School (where fits get judged by peers), hanging with friends, skate park, sneaker meetups. +- Family stuff where a parent wants him "toned down" (source of friction). +- Occasional dressier events he wants to make *his own* rather than wear a plain suit. + +## Constraints +- **Budget:** tight. One statement piece at a time; loves affordable thrift to fill in around it. +- **Peer context:** cares a lot what looks good *to his friends*, not to adults. +- **Care:** will actually baby a hero sneaker/jacket; less careful with everyday basics. +- **Climate:** four seasons — needs layering that stays colorful in winter. + +## Voice — how he talks about clothes +Enthusiastic, slangy, brand-aware. "That's clean." / "Nah that's mid." / "The colorway is crazy." / "Is it real though?" / "My mom's gonna say it's too bright — perfect." + +## Sample outfit reactions (feedback the agent should learn from) +- ✅ *Sunflower Le Fleur hoodie + wide cream cords + GOLF x Converse + patterned socks* → "Okay that's actually fire." +- ⚠️ *Nice fit but muted/beige on beige* → "It's clean but where's the color? Too safe." +- ❌ *Plain black polo + khakis for family dinner* → "That's not me, I look like a substitute teacher." + +## Taste shift (for a later session to reconcile) +Oscar starts getting into a slightly more **muted, vintage/'earth-tone thrift'** direction he's seeing online — browns, washed olive, cream — while keeping *one* bright anchor per fit. He's not abandoning color, he's maturing the palette. A good agent should notice the nuance (still wants a pop, now willing to ground it in neutrals) rather than flipping him to "likes neutrals now." diff --git a/personas/priya.md b/personas/priya.md new file mode 100644 index 0000000..36ec1ad --- /dev/null +++ b/personas/priya.md @@ -0,0 +1,44 @@ +# Persona — Priya + +**One-liner:** 32-year-old corporate lawyer — "quiet luxury," a tight neutral capsule wardrobe. + +## Bio +- Age 32, woman (she/her), litigation associate at a big firm. Long hours, high-stakes rooms. +- Wants to look expensive and effortless without thinking about it — a uniform of good pieces. +- Believes in a small, curated closet where everything matches everything. + +## Style identity +- Quiet luxury / minimalist capsule. The Row, Toteme, Everlane. No logos, ever. + +## Likes +- **Colors:** neutrals only — black, camel, cream, grey, navy, chocolate brown. +- **Fabrics:** wool, silk, fine cotton, cashmere, good tailoring. Structure and drape. +- **Silhouettes:** clean lines — tailored trousers, blazers, column dresses, crisp shirts. +- **Details:** invisible quality — beautiful buttons, a good lining, a single fine-gold piece. + +## Dislikes +- Logos, loud prints, fast fashion, anything trendy that "dates in a season." +- Fussy embellishment, visible branding, colors that "clash with a courtroom." +- Owning too much — clutter stresses her out. + +## Lifestyle / occasions she dresses for +- Office and court (most days) — needs authority and polish. +- Client dinners, firm events, the occasional gala. +- Weekends: elevated-casual, same neutral palette, softer fabrics. + +## Constraints +- **Budget:** high, but spends deliberately — "buy once, buy well." +- **Time:** near-zero decision time in the morning; the capsule must self-coordinate. +- **Dress code:** conservative professional norms, but she wants personality within them. +- **Travel:** flies often — pieces must pack without wrinkling. + +## Voice — how she talks about clothes +Precise, understated. "Is the tailoring right?" / "Too much going on." / "That'll read cheap on camera." / "I want to disappear into the room, in a good way." + +## Sample outfit reactions (feedback the agent should learn from) +- ✅ *Camel trousers + cream silk shirt + black blazer + pointed flats* → "Yes. Effortless, exactly." +- ⚠️ *Great pieces but three colors + a print* → "One too many ideas. Strip it back." +- ❌ *A logo bag or a trend color (this-season green)* → "No. It'll look dated by fall." + +## Taste shift (for a later session to reconcile) +After a wardrobe rut, Priya wants to introduce **one signature color** (a deep burgundy) as an accent to break the all-neutral monotony — "but it still has to look expensive and intentional." A good agent should treat this as *expanding the capsule by one deliberate accent*, not loosening her whole "neutrals + no trends" philosophy. diff --git a/personas/rosa.md b/personas/rosa.md new file mode 100644 index 0000000..f80dbcd --- /dev/null +++ b/personas/rosa.md @@ -0,0 +1,44 @@ +# Persona — Rosa + +**One-liner:** 48-year-old, plus-size, unapologetically bold — big prints, saturated color, statement everything. + +## Bio +- Age 48, woman (she/her), salon owner. Sees clothes as joy and self-expression, not concealment. +- Body-positive; rejects the "rules" she was told about dressing a plus-size body. +- Loves getting dressed — it's the best part of her morning. + +## Style identity +- Maximalist color-lover. Bold prints, jewel tones, dramatic accessories, vintage flair. + +## Likes +- **Colors:** saturated everything — fuchsia, cobalt, emerald, marigold, red, animal print. +- **Fabrics:** drapey rayon, ponte knit, satin, stretch denim, textured wovens with give. +- **Silhouettes:** wrap dresses, wide-leg jumpsuits, fit-and-flare, statement sleeves, defined waist. +- **Details:** big earrings, bold lip, printed scarves, chunky heels/wedges she can actually walk in. + +## Dislikes +- "Slimming" advice, shapeless "camouflage" clothing, drab beige "flattering" neutrals. +- Being told bold prints "aren't for bigger women." Boxy, sack-like cuts. +- Cheap fabric that clings in the wrong way or pills fast. + +## Lifestyle / occasions she dresses for +- The salon (wants to look like the brand — vibrant, confident, memorable). +- Nights out, dinners, dancing, parties — loves an excuse to dress up. +- Errands and downtime — still colorful, just softer (a bright caftan, printed lounge sets). + +## Constraints +- **Fit:** needs true plus-size cuts that fit bust/hips/waist — no "size up and hope." +- **Budget:** moderate-to-high on statement pieces; she invests in things that photograph well. +- **Comfort:** wants to move and dance; drape and stretch over stiff constriction. +- **Confidence rule:** if it doesn't make her feel powerful, it's out — no "playing it safe." + +## Voice — how she talks about clothes +Bold, joyful, decisive. "More is more, honey." / "Where's the drama?" / "Don't try to shrink me." / "If I'm gonna be seen, I'm gonna be SEEN." + +## Sample outfit reactions (feedback the agent should learn from) +- ✅ *Cobalt wide-leg jumpsuit + big gold earrings + red lip + wedges* → "THAT'S what I'm talking about." +- ⚠️ *Nice fit but muted/neutral palette* → "It's fine but it's boring. Bring the color." +- ❌ *A "slimming" black shift dress* → "Absolutely not. I'm not hiding." + +## Taste shift (for a later session to reconcile) +Rosa has a **daughter's formal wedding** where she's been asked to keep it "elegant/tonal." She wants to honor that AND stay unmistakably herself — think one rich jewel tone, luxe fabric, statement earrings, still a defined waist. A good agent should find the overlap between "elegant/restrained for the event" and her maximalism, not swing her to a plain neutral. diff --git a/requirements.txt b/requirements.txt index 63c9eb2..32ef463 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,5 @@ # 2026-07-22 cutover so cached/offline installs don't fall behind. anthropic>=0.116.0 python-dotenv>=1.0.0 +pillow +pytest diff --git a/samples/README.md b/samples/README.md new file mode 100644 index 0000000..143c9cd --- /dev/null +++ b/samples/README.md @@ -0,0 +1,45 @@ +# Dataset samples + +Small committed slices of each dataset so you can see the shapes and start +building without downloading anything. Regenerate with +`python3 scripts/make_samples.py`; get the full data with +`scripts/download_polyvore.sh --with-images` (goes to git-ignored `data/`). + +## polyvore/ — outfit compatibility (the pairing dataset) + +Full set: 251k items, 68k outfits. Source: [Stylique/Polyvore on HF](https://huggingface.co/datasets/Stylique/Polyvore). + +- `outfits_sample.json` — 3 outfits; each is `{set_id, items: [{item_id, index}]}` +- `items_sample.json` — metadata for those outfits' 15 items, keyed by `item_id`: + `url_name`, `description`, `category_id`, `semantic_category` (tops/bottoms/shoes/bags/…). + Note the dataset's typo: the field is spelled `catgeories`. +- `images/` — the 15 item photos (flat catalog shots, `.jpg`) +- `categories.csv` — full mapping: `category_id, fine-grained name, semantic_category` +- `compatibility_sample.txt` — the compatibility task: `1|0 _ ...` + (1 = human-curated outfit, 0 = negative). Full train has ~17k lines. +- `fill_in_blank_sample.json` — the FITB task: `question` (outfit minus one item), + `answers` (4 candidates), `blank_position` + +Caveat: the mirror claims MIT but licensing is murky (Polyvore shut down in 2018). +Fine for this assignment; don't ship it. + +## fashionpedia/ — per-garment attributes (the metadata schema) + +Full set: 48k images with segmentation masks. Source: [fashionpedia.github.io](https://fashionpedia.github.io/home/Fashionpedia_download.html). + +- `categories.json` — the FULL 46-category garment taxonomy (id, name, supercategory) +- `attributes.json` — the FULL 294-attribute vocabulary (silhouette, pattern, + neckline, fit…) — useful as-is for our outfit-judging schema +- `annotations_sample.json` — 2 CC-licensed images + their 26 garment annotations + (`category_id`, `attribute_ids`, `bbox`, segmentation polygons), COCO format +- `images/` — those 2 photos (from their original Flickr URLs; licenses included + in the sample JSON) + +## sanzo-wada/ — color harmony (this is the ENTIRE dataset, 85 KB) + +Source: [sanzo-wada.dmbk.io](https://sanzo-wada.dmbk.io/) (Sanzo Wada's 1930s +"Dictionary of Color Combinations"). + +- `colors.json` — 157 colors with `hex`, `rgb_array`, `cmyk_array`, and + `combinations` (ids of the 348 curated combination groups a color belongs to). + Two colors sharing a combination id = "goes together" per Wada. diff --git a/samples/fashionpedia/annotations_sample.json b/samples/fashionpedia/annotations_sample.json new file mode 100644 index 0000000..0a0404b --- /dev/null +++ b/samples/fashionpedia/annotations_sample.json @@ -0,0 +1,2195 @@ +{ + "images": [ + { + "id": 13297, + "width": 771, + "height": 1024, + "file_name": "e14733841b04c64e75789a91fbe549b3.jpg", + "license": 3, + "time_captured": "March-August, 2018", + "original_url": "http://farm3.staticflickr.com/2908/33675201796_d5dfe329da_n.jpg", + "isstatic": 1, + "kaggle_id": "e14733841b04c64e75789a91fbe549b3" + }, + { + "id": 18074, + "width": 1024, + "height": 680, + "file_name": "b4f6d9c2696573ff0cfc05070d17b5b6.jpg", + "license": 4, + "time_captured": "March-August, 2018", + "original_url": "http://farm8.staticflickr.com/7676/17948308428_c8ed8dfd4f_n.jpg", + "isstatic": 1, + "kaggle_id": "b4f6d9c2696573ff0cfc05070d17b5b6" + } + ], + "annotations": [ + { + "image_id": 13297, + "category_id": 32, + "attribute_ids": [ + 219 + ], + "segmentation": [ + [ + 462, + 557, + 467, + 590, + 437, + 594, + 393, + 599, + 382, + 598, + 382, + 590, + 377, + 580, + 381, + 577, + 380, + 566, + 410, + 563, + 438, + 558 + ] + ], + "bbox": [ + 377.0, + 557.0, + 90.0, + 42.0 + ], + "area": 2895, + "iscrowd": 0, + "id": 8921 + }, + { + "image_id": 13297, + "category_id": 35, + "attribute_ids": [], + "segmentation": [ + [ + 451, + 571, + 451, + 576, + 441, + 578, + 421, + 582, + 395, + 584, + 390, + 584, + 387, + 588, + 384, + 590, + 382, + 590, + 377, + 580, + 382, + 577, + 385, + 578, + 388, + 579, + 390, + 580, + 400, + 579, + 414, + 578, + 438, + 574 + ] + ], + "bbox": [ + 377.0, + 571.0, + 74.0, + 19.0 + ], + "area": 396, + "iscrowd": 0, + "id": 8922 + }, + { + "image_id": 13297, + "category_id": 32, + "attribute_ids": [ + 219 + ], + "segmentation": [ + [ + 456, + 493, + 460, + 526, + 489, + 528, + 491, + 526, + 495, + 513, + 495, + 512, + 496, + 507, + 497, + 508, + 502, + 495, + 489, + 492, + 469, + 491 + ] + ], + "bbox": [ + 456.0, + 491.0, + 46.0, + 37.0 + ], + "area": 1334, + "iscrowd": 0, + "id": 8923 + }, + { + "image_id": 13297, + "category_id": 35, + "attribute_ids": [], + "segmentation": [ + [ + 495, + 512, + 493, + 512, + 486, + 511, + 486, + 513, + 488, + 516, + 485, + 518, + 480, + 519, + 479, + 517, + 480, + 513, + 476, + 513, + 472, + 512, + 471, + 510, + 472, + 505, + 476, + 505, + 479, + 505, + 481, + 505, + 483, + 507, + 487, + 507, + 493, + 507, + 496, + 507 + ] + ], + "bbox": [ + 471.0, + 505.0, + 25.0, + 14.0 + ], + "area": 189, + "iscrowd": 0, + "id": 8924 + }, + { + "image_id": 13297, + "category_id": 35, + "attribute_ids": [], + "segmentation": [ + [ + 354, + 518, + 354, + 507, + 355, + 498, + 357, + 492, + 358, + 486, + 360, + 480, + 363, + 477, + 366, + 473, + 365, + 473, + 360, + 477, + 357, + 485, + 354, + 496, + 353, + 510, + 353, + 522, + 354, + 523 + ] + ], + "bbox": [ + 353.0, + 473.0, + 13.0, + 49.0 + ], + "area": 61, + "iscrowd": 0, + "id": 8925 + }, + { + "image_id": 13297, + "category_id": 32, + "attribute_ids": [ + 219 + ], + "segmentation": [ + [ + 331, + 545, + 327, + 580, + 321, + 578, + 322, + 571, + 322, + 566, + 322, + 562, + 321, + 560, + 323, + 560, + 325, + 553, + 328, + 545 + ] + ], + "bbox": [ + 321.0, + 545.0, + 10.0, + 35.0 + ], + "area": 195, + "iscrowd": 0, + "id": 8926 + }, + { + "image_id": 13297, + "category_id": 35, + "attribute_ids": [], + "segmentation": [ + [ + 323, + 560, + 324, + 559, + 324, + 562, + 323, + 565, + 322, + 564, + 322, + 562, + 321, + 560 + ] + ], + "bbox": [ + 321.0, + 559.0, + 3.0, + 5.0 + ], + "area": 9, + "iscrowd": 0, + "id": 8927 + }, + { + "image_id": 13297, + "category_id": 32, + "attribute_ids": [ + 223 + ], + "segmentation": [ + [ + 406, + 458, + 401, + 457, + 397, + 462, + 396, + 472, + 396, + 481, + 401, + 478, + 410, + 480, + 418, + 481, + 435, + 459, + 448, + 443, + 453, + 437, + 432, + 441, + 424, + 441, + 414, + 443, + 423, + 449, + 423, + 455, + 406, + 458 + ] + ], + "bbox": [ + 396.0, + 437.0, + 57.0, + 44.0 + ], + "area": 1098, + "iscrowd": 0, + "id": 8928 + }, + { + "image_id": 13297, + "category_id": 23, + "attribute_ids": [], + "segmentation": { + "size": [ + 1024, + 771 + ], + "counts": "jmg<<`o0;G3L4L4L4L4M2M3N3L3N2M2O2L4N2L4M3L3N2I8D;00104K3NN1O1M4N1N2N3M2N2N3M2O1M3O2L3O1M3N2M301O000000001O0001O0O2O001O0O2O1N101O0O2O1O1O1M3N2N2N1O2M3M3K5H8K6J7I6J6L3L4N2M4O00010O01ON2N3L3N3M2N2M4M3M4K4L6HSVW8" + }, + "bbox": [ + 407.0, + 817.0, + 100.0, + 162.0 + ], + "area": 8358, + "iscrowd": 0, + "id": 8929 + }, + { + "image_id": 13297, + "category_id": 23, + "attribute_ids": [], + "segmentation": { + "size": [ + 1024, + 771 + ], + "counts": "Znf;1no02K4O1O2N1O1O2O0O1O1O100O2N1O1000001N1000000O10000O101N100O100O1OZOZQO4fn0HeQO1Zn0NiQO1To0O1OPP>0PPB0O1O100O100O1O10O01O100O1O100O1O1O100O1O1O1O00100O1O1O00100O1O001N101O1O0O2O10O0100O101N1O100O1O100O1O100O2N10O01O1O1O100O1IgNfQOY1[n0hNbQOZ1]n051O2N3M3L3N2N2N3L5_OnPOLXo0JlR\\8" + }, + "bbox": [ + 374.0, + 921.0, + 128.0, + 56.0 + ], + "area": 2422, + "iscrowd": 0, + "id": 8930 + }, + { + "image_id": 13297, + "category_id": 6, + "attribute_ids": [ + 36, + 317, + 295, + 136, + 143, + 304, + 115, + 154, + 230, + 128 + ], + "segmentation": [ + [ + 467, + 478, + 453, + 492, + 442, + 501, + 433, + 514, + 424, + 525, + 413, + 536, + 405, + 543, + 400, + 551, + 393, + 563, + 386, + 563, + 388, + 558, + 393, + 549, + 394, + 544, + 399, + 536, + 395, + 533, + 388, + 545, + 384, + 555, + 379, + 553, + 380, + 544, + 377, + 535, + 376, + 529, + 379, + 527, + 376, + 519, + 381, + 508, + 385, + 502, + 390, + 498, + 396, + 488, + 396, + 481, + 401, + 478, + 410, + 480, + 418, + 481, + 435, + 459, + 448, + 443, + 453, + 437, + 432, + 441, + 424, + 441, + 414, + 443, + 423, + 449, + 423, + 455, + 406, + 458, + 394, + 456, + 395, + 436, + 391, + 437, + 389, + 456, + 379, + 457, + 371, + 457, + 366, + 456, + 371, + 446, + 371, + 444, + 365, + 456, + 361, + 462, + 360, + 465, + 356, + 464, + 353, + 467, + 352, + 480, + 350, + 496, + 350, + 502, + 348, + 504, + 340, + 516, + 337, + 525, + 335, + 531, + 335, + 535, + 331, + 540, + 329, + 542, + 329, + 545, + 328, + 545, + 325, + 553, + 323, + 560, + 321, + 560, + 322, + 562, + 322, + 566, + 322, + 571, + 321, + 578, + 320, + 580, + 320, + 583, + 320, + 587, + 317, + 591, + 315, + 594, + 314, + 598, + 314, + 609, + 315, + 613, + 314, + 616, + 310, + 631, + 307, + 644, + 306, + 654, + 306, + 667, + 307, + 671, + 306, + 675, + 310, + 684, + 314, + 693, + 324, + 710, + 330, + 722, + 335, + 735, + 341, + 747, + 347, + 757, + 350, + 762, + 352, + 763, + 360, + 775, + 373, + 792, + 383, + 804, + 385, + 810, + 390, + 819, + 395, + 826, + 400, + 830, + 404, + 838, + 406, + 842, + 407, + 844, + 411, + 850, + 415, + 856, + 419, + 861, + 421, + 862, + 424, + 862, + 428, + 861, + 427, + 854, + 429, + 844, + 431, + 836, + 444, + 829, + 457, + 823, + 469, + 818, + 451, + 791, + 433, + 762, + 419, + 746, + 410, + 712, + 403, + 698, + 401, + 688, + 400, + 683, + 395, + 673, + 390, + 672, + 388, + 669, + 392, + 661, + 391, + 659, + 396, + 653, + 401, + 649, + 406, + 671, + 407, + 680, + 412, + 690, + 412, + 700, + 411, + 712, + 410, + 711, + 419, + 746, + 433, + 762, + 451, + 791, + 469, + 818, + 477, + 817, + 482, + 816, + 486, + 821, + 496, + 824, + 497, + 806, + 496, + 768, + 494, + 737, + 493, + 714, + 491, + 685, + 489, + 676, + 482, + 653, + 482, + 637, + 482, + 621, + 481, + 607, + 482, + 601, + 482, + 593, + 479, + 581, + 481, + 565, + 482, + 555, + 483, + 550, + 485, + 547, + 487, + 543, + 487, + 539, + 487, + 533, + 489, + 531, + 490, + 528, + 491, + 527, + 495, + 513, + 495, + 512, + 496, + 507, + 497, + 508, + 502, + 495, + 501, + 494, + 505, + 488, + 506, + 484, + 507, + 473, + 507, + 465, + 507, + 459, + 505, + 452, + 504, + 448, + 503, + 445, + 503, + 441, + 495, + 450, + 486, + 460, + 475, + 470 + ], + [ + 480, + 913, + 481, + 905, + 484, + 891, + 485, + 883, + 487, + 877, + 489, + 872, + 494, + 874, + 493, + 881, + 497, + 882, + 498, + 888, + 501, + 896, + 503, + 903, + 500, + 905, + 495, + 908, + 492, + 911, + 486, + 911, + 483, + 914, + 480, + 915 + ] + ], + "bbox": [ + 306.0, + 436.0, + 201.0, + 479.0 + ], + "area": 54152, + "iscrowd": 0, + "id": 8931 + }, + { + "image_id": 13297, + "category_id": 19, + "attribute_ids": [], + "segmentation": [ + [ + 462, + 421, + 458, + 428, + 453, + 437, + 432, + 441, + 424, + 441, + 414, + 443, + 423, + 449, + 423, + 455, + 406, + 458, + 401, + 457, + 394, + 456, + 395, + 436, + 400, + 435, + 416, + 430, + 437, + 425 + ], + [ + 377, + 439, + 372, + 440, + 371, + 446, + 371, + 455, + 371, + 457, + 379, + 457, + 389, + 456, + 391, + 437, + 386, + 440, + 382, + 437, + 380, + 437 + ] + ], + "bbox": [ + 371.0, + 421.0, + 91.0, + 37.0 + ], + "area": 1499, + "iscrowd": 0, + "id": 8932 + }, + { + "image_id": 18074, + "category_id": 13, + "attribute_ids": [], + "segmentation": [ + [ + 430, + 162, + 445, + 156, + 470, + 158, + 472, + 172, + 468, + 176, + 463, + 186, + 455, + 189, + 440, + 189, + 432, + 182, + 426, + 171, + 422, + 172, + 419, + 180, + 412, + 189, + 404, + 192, + 387, + 191, + 383, + 184, + 379, + 179, + 373, + 179, + 374, + 167, + 375, + 162, + 387, + 159, + 402, + 159, + 413, + 160, + 419, + 163 + ] + ], + "bbox": [ + 373.0, + 156.0, + 99.0, + 36.0 + ], + "area": 2512, + "iscrowd": 0, + "id": 2554 + }, + { + "image_id": 18074, + "category_id": 1, + "attribute_ids": [ + 317, + 0, + 115 + ], + "segmentation": [ + [ + 404, + 294, + 417, + 298, + 428, + 298, + 440, + 296, + 448, + 292, + 457, + 285, + 449, + 305, + 447, + 311, + 445, + 318, + 442, + 328, + 438, + 317, + 434, + 316, + 428, + 315, + 423, + 311, + 414, + 304 + ] + ], + "bbox": [ + 405.0, + 285.0, + 52.0, + 42.0 + ], + "area": 701, + "iscrowd": 0, + "id": 2555 + }, + { + "image_id": 18074, + "category_id": 33, + "attribute_ids": [ + 182 + ], + "segmentation": [ + [ + 449, + 305, + 438, + 309, + 423, + 311, + 414, + 304, + 404, + 294, + 417, + 298, + 428, + 298, + 440, + 296, + 448, + 292, + 457, + 285 + ] + ], + "bbox": [ + 405.0, + 285.0, + 52.0, + 26.0 + ], + "area": 501, + "iscrowd": 0, + "id": 2556 + }, + { + "image_id": 18074, + "category_id": 0, + "attribute_ids": [ + 316, + 295, + 136, + 322, + 225, + 147, + 115 + ], + "segmentation": [ + [ + 377, + 304, + 379, + 323, + 379, + 328, + 379, + 351, + 380, + 377, + 382, + 407, + 384, + 435, + 386, + 473, + 383, + 485, + 381, + 484, + 383, + 467, + 380, + 420, + 381, + 497, + 383, + 567, + 383, + 627, + 382, + 679, + 515, + 679, + 523, + 679, + 528, + 670, + 521, + 651, + 520, + 629, + 519, + 604, + 512, + 582, + 511, + 532, + 513, + 515, + 507, + 491, + 507, + 476, + 507, + 460, + 501, + 426, + 497, + 402, + 496, + 375, + 494, + 362, + 489, + 331, + 487, + 310, + 485, + 295, + 485, + 281, + 479, + 272, + 474, + 265, + 469, + 257, + 465, + 253, + 460, + 248, + 459, + 260, + 457, + 276, + 457, + 285, + 449, + 305, + 447, + 311, + 445, + 318, + 442, + 328, + 438, + 317, + 434, + 316, + 428, + 315, + 423, + 311, + 414, + 304, + 404, + 294, + 396, + 286, + 388, + 274, + 383, + 266, + 381, + 260, + 384, + 256, + 388, + 253, + 388, + 240, + 383, + 241, + 379, + 245, + 375, + 252, + 371, + 259, + 368, + 262, + 368, + 271, + 372, + 291 + ] + ], + "bbox": [ + 368.0, + 240.0, + 160.0, + 439.0 + ], + "area": 49045, + "iscrowd": 0, + "id": 2557 + }, + { + "image_id": 18074, + "category_id": 32, + "attribute_ids": [ + 218 + ], + "segmentation": [ + [ + 494, + 362, + 487, + 363, + 478, + 364, + 482, + 421, + 488, + 425, + 502, + 430, + 501, + 426, + 497, + 402, + 496, + 375 + ] + ], + "bbox": [ + 478.0, + 362.0, + 24.0, + 68.0 + ], + "area": 1076, + "iscrowd": 0, + "id": 2558 + }, + { + "image_id": 18074, + "category_id": 28, + "attribute_ids": [ + 163 + ], + "segmentation": [ + [ + 457, + 285, + 452, + 299, + 456, + 308, + 464, + 306, + 470, + 302, + 470, + 298, + 478, + 303, + 485, + 313, + 486, + 306, + 485, + 295, + 485, + 281, + 479, + 272, + 474, + 265, + 469, + 257, + 465, + 253, + 460, + 248, + 459, + 260, + 457, + 276 + ], + [ + 368, + 262, + 368, + 271, + 372, + 291, + 381, + 308, + 392, + 325, + 393, + 329, + 402, + 323, + 414, + 311, + 417, + 307, + 414, + 304, + 404, + 294, + 396, + 286, + 388, + 274, + 383, + 266, + 381, + 260, + 384, + 256, + 388, + 253, + 388, + 240, + 383, + 241, + 379, + 245, + 375, + 252, + 371, + 259, + 368, + 262 + ] + ], + "bbox": [ + 368.0, + 240.0, + 118.0, + 89.0 + ], + "area": 3016, + "iscrowd": 0, + "id": 2559 + }, + { + "image_id": 18074, + "category_id": 35, + "attribute_ids": [], + "segmentation": [ + [ + 504, + 306, + 507, + 305, + 506, + 319, + 503, + 337, + 499, + 351, + 499, + 363, + 499, + 387, + 499, + 403, + 506, + 435, + 511, + 462, + 511, + 476, + 512, + 495, + 516, + 517, + 514, + 534, + 516, + 581, + 522, + 605, + 524, + 630, + 524, + 653, + 532, + 676, + 530, + 677, + 528, + 670, + 521, + 651, + 520, + 629, + 519, + 604, + 512, + 582, + 511, + 532, + 513, + 515, + 507, + 491, + 507, + 476, + 507, + 460, + 502, + 430, + 501, + 426, + 497, + 402, + 496, + 375, + 494, + 362, + 493, + 346, + 496, + 324, + 499, + 304, + 501, + 304 + ] + ], + "bbox": [ + 493.0, + 304.0, + 39.0, + 373.0 + ], + "area": 1476, + "iscrowd": 0, + "id": 2560 + }, + { + "image_id": 18074, + "category_id": 32, + "attribute_ids": [ + 220 + ], + "segmentation": [ + [ + 556, + 506, + 542, + 512, + 528, + 517, + 516, + 517, + 514, + 534, + 516, + 581, + 522, + 605, + 524, + 630, + 529, + 631, + 540, + 630, + 550, + 623, + 557, + 618, + 560, + 606, + 561, + 592, + 558, + 553, + 562, + 541, + 560, + 511 + ] + ], + "bbox": [ + 514.0, + 506.0, + 48.0, + 125.0 + ], + "area": 4839, + "iscrowd": 0, + "id": 2561 + }, + { + "image_id": 18074, + "category_id": 31, + "attribute_ids": [ + 160, + 206 + ], + "segmentation": [ + [ + 544, + 309, + 548, + 334, + 554, + 384, + 555, + 450, + 557, + 468, + 564, + 470, + 570, + 470, + 574, + 475, + 580, + 479, + 592, + 481, + 605, + 478, + 618, + 470, + 644, + 468, + 655, + 470, + 674, + 476, + 678, + 474, + 682, + 463, + 685, + 448, + 689, + 439, + 694, + 439, + 702, + 444, + 703, + 438, + 698, + 432, + 692, + 433, + 679, + 430, + 656, + 425, + 646, + 428, + 631, + 425, + 624, + 425, + 618, + 422, + 593, + 417, + 593, + 414, + 589, + 413, + 585, + 404, + 576, + 383, + 556, + 338 + ] + ], + "bbox": [ + 544.0, + 310.0, + 159.0, + 171.0 + ], + "area": 8410, + "iscrowd": 0, + "id": 2562 + }, + { + "image_id": 18074, + "category_id": 32, + "attribute_ids": [ + 220 + ], + "segmentation": [ + [ + 304, + 561, + 305, + 553, + 383, + 559, + 383, + 567, + 383, + 627, + 382, + 679, + 317, + 679, + 288, + 644, + 274, + 621, + 286, + 600, + 298, + 575 + ] + ], + "bbox": [ + 274.0, + 553.0, + 109.0, + 126.0 + ], + "area": 11119, + "iscrowd": 0, + "id": 2563 + }, + { + "image_id": 18074, + "category_id": 27, + "attribute_ids": [], + "segmentation": [ + [ + 527, + 452, + 521, + 452, + 511, + 304, + 504, + 306, + 494, + 299, + 485, + 281, + 474, + 265, + 469, + 257, + 480, + 262, + 503, + 274, + 513, + 272, + 520, + 278, + 520, + 286, + 515, + 300 + ], + [ + 329, + 279, + 335, + 279, + 350, + 293, + 361, + 311, + 367, + 331, + 374, + 374, + 380, + 420, + 383, + 467, + 381, + 484, + 383, + 485, + 386, + 473, + 384, + 435, + 382, + 407, + 377, + 370, + 371, + 324, + 375, + 325, + 379, + 323, + 377, + 304, + 372, + 291, + 368, + 271, + 368, + 262, + 371, + 259, + 367, + 253, + 352, + 260, + 349, + 265, + 343, + 268, + 332, + 273 + ] + ], + "bbox": [ + 329.0, + 253.0, + 198.0, + 232.0 + ], + "area": 3997, + "iscrowd": 0, + "id": 2564 + }, + { + "image_id": 18074, + "category_id": 4, + "attribute_ids": [ + 317, + 316, + 146, + 29, + 229, + 295, + 136, + 115, + 145 + ], + "segmentation": [ + [ + 503, + 274, + 513, + 272, + 520, + 278, + 520, + 286, + 534, + 294, + 544, + 309, + 556, + 338, + 576, + 383, + 585, + 404, + 589, + 413, + 593, + 414, + 593, + 417, + 618, + 422, + 624, + 425, + 631, + 425, + 646, + 428, + 656, + 425, + 679, + 430, + 692, + 433, + 698, + 432, + 703, + 438, + 702, + 444, + 694, + 439, + 689, + 439, + 685, + 448, + 682, + 463, + 678, + 474, + 674, + 476, + 655, + 470, + 644, + 468, + 618, + 470, + 605, + 478, + 592, + 481, + 580, + 479, + 574, + 475, + 570, + 470, + 564, + 470, + 557, + 468, + 556, + 506, + 560, + 511, + 562, + 541, + 558, + 553, + 561, + 592, + 560, + 606, + 557, + 618, + 559, + 654, + 554, + 663, + 547, + 664, + 541, + 669, + 542, + 673, + 530, + 677, + 528, + 670, + 521, + 651, + 520, + 629, + 519, + 604, + 512, + 582, + 511, + 532, + 513, + 515, + 507, + 491, + 507, + 476, + 507, + 460, + 502, + 430, + 501, + 426, + 497, + 402, + 496, + 375, + 494, + 362, + 489, + 331, + 487, + 310, + 485, + 295, + 485, + 281, + 479, + 272, + 474, + 265, + 469, + 257, + 480, + 262 + ], + [ + 352, + 260, + 367, + 253, + 371, + 259, + 368, + 262, + 368, + 271, + 372, + 291, + 377, + 304, + 379, + 323, + 379, + 328, + 379, + 351, + 380, + 377, + 382, + 407, + 384, + 435, + 386, + 473, + 383, + 485, + 381, + 484, + 383, + 467, + 380, + 420, + 381, + 497, + 383, + 567, + 383, + 627, + 382, + 679, + 235, + 679, + 237, + 672, + 233, + 631, + 231, + 550, + 235, + 516, + 238, + 482, + 250, + 410, + 263, + 361, + 273, + 329, + 284, + 308, + 303, + 291, + 320, + 283, + 329, + 279, + 332, + 273, + 343, + 268, + 349, + 265 + ] + ], + "bbox": [ + 231.0, + 253.0, + 472.0, + 426.0 + ], + "area": 81625, + "iscrowd": 0, + "id": 2565 + }, + { + "image_id": 18074, + "category_id": 31, + "attribute_ids": [ + 160, + 206 + ], + "segmentation": [ + [ + 301, + 308, + 309, + 322, + 312, + 360, + 316, + 426, + 311, + 480, + 304, + 507, + 296, + 534, + 293, + 570, + 288, + 591, + 286, + 600, + 274, + 621, + 288, + 643, + 292, + 679, + 235, + 679, + 237, + 672, + 233, + 631, + 231, + 550, + 235, + 516, + 238, + 482, + 250, + 410, + 263, + 360, + 273, + 329, + 284, + 308 + ] + ], + "bbox": [ + 231.0, + 308.0, + 85.0, + 371.0 + ], + "area": 21325, + "iscrowd": 0, + "id": 2566 + }, + { + "image_id": 18074, + "category_id": 35, + "attribute_ids": [], + "segmentation": [ + [ + 375, + 328, + 378, + 358, + 380, + 377, + 379, + 351, + 379, + 328, + 378, + 325 + ], + [ + 379, + 492, + 381, + 521, + 381, + 497, + 380, + 420, + 378, + 404, + 377, + 472 + ], + [ + 383, + 558, + 383, + 559, + 383, + 567, + 383, + 627, + 382, + 679, + 381, + 679, + 382, + 567 + ] + ], + "bbox": [ + 375.0, + 325.0, + 8.0, + 354.0 + ], + "area": 500, + "iscrowd": 0, + "id": 2567 + } + ], + "licenses": [ + { + "url": "https://creativecommons.org/licenses/by-nc-sa/2.0/", + "id": 3, + "name": "Attribution-NonCommercial-ShareAlike License" + }, + { + "url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", + "id": 4, + "name": "Attribution-NonCommercial-NoDerivatives License" + } + ] +} \ No newline at end of file diff --git a/samples/fashionpedia/attributes.json b/samples/fashionpedia/attributes.json new file mode 100644 index 0000000..82cb19b --- /dev/null +++ b/samples/fashionpedia/attributes.json @@ -0,0 +1,2060 @@ +[ + { + "id": 0, + "name": "classic (t-shirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000002_00" + }, + { + "id": 1, + "name": "polo (shirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000003_00" + }, + { + "id": 2, + "name": "undershirt", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000004_00" + }, + { + "id": 3, + "name": "henley (shirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000005_00" + }, + { + "id": 4, + "name": "ringer (t-shirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000006_00" + }, + { + "id": 5, + "name": "raglan (t-shirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000007_00" + }, + { + "id": 6, + "name": "rugby (shirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000008_00" + }, + { + "id": 7, + "name": "sailor (shirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000009_00" + }, + { + "id": 8, + "name": "crop (top)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000010_00" + }, + { + "id": 9, + "name": "halter (top)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000011_00" + }, + { + "id": 10, + "name": "camisole", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000012_00" + }, + { + "id": 11, + "name": "tank (top)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000013_00" + }, + { + "id": 12, + "name": "peasant (top)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000014_00" + }, + { + "id": 13, + "name": "tube (top)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000015_00" + }, + { + "id": 14, + "name": "tunic (top)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000016_00" + }, + { + "id": 15, + "name": "smock (top)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000017_00" + }, + { + "id": 16, + "name": "hoodie", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000018_00" + }, + { + "id": 17, + "name": "blazer", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000019_00" + }, + { + "id": 18, + "name": "pea (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000020_00" + }, + { + "id": 19, + "name": "puffer (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000021_00" + }, + { + "id": 20, + "name": "biker (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000022_00" + }, + { + "id": 21, + "name": "trucker (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000023_00" + }, + { + "id": 22, + "name": "bomber (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000024_00" + }, + { + "id": 23, + "name": "anorak", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000025_00" + }, + { + "id": 24, + "name": "safari (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000026_00" + }, + { + "id": 25, + "name": "mao (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000027_00" + }, + { + "id": 26, + "name": "nehru (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000028_00" + }, + { + "id": 27, + "name": "norfolk (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000029_00" + }, + { + "id": 28, + "name": "classic military (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000030_00" + }, + { + "id": 29, + "name": "track (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000031_00" + }, + { + "id": 30, + "name": "windbreaker", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000032_00" + }, + { + "id": 31, + "name": "chanel (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000033_00" + }, + { + "id": 32, + "name": "bolero", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000034_00" + }, + { + "id": 33, + "name": "tuxedo (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000035_00" + }, + { + "id": 34, + "name": "varsity (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000036_00" + }, + { + "id": 35, + "name": "crop (jacket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000037_00" + }, + { + "id": 36, + "name": "jeans", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000038_00" + }, + { + "id": 37, + "name": "sweatpants", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000039_00" + }, + { + "id": 38, + "name": "leggings", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000040_00" + }, + { + "id": 39, + "name": "hip-huggers (pants)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000041_00" + }, + { + "id": 40, + "name": "cargo (pants)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000042_00" + }, + { + "id": 41, + "name": "culottes", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000043_00" + }, + { + "id": 42, + "name": "capri (pants)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000044_00" + }, + { + "id": 43, + "name": "harem (pants)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000045_00" + }, + { + "id": 44, + "name": "sailor (pants)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000046_00" + }, + { + "id": 45, + "name": "jodhpur", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000047_00" + }, + { + "id": 46, + "name": "peg (pants)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000048_00" + }, + { + "id": 47, + "name": "camo (pants)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000049_00" + }, + { + "id": 48, + "name": "track (pants)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000050_00" + }, + { + "id": 49, + "name": "crop (pants)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000051_00" + }, + { + "id": 50, + "name": "short (shorts)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000052_00" + }, + { + "id": 51, + "name": "booty (shorts)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000053_00" + }, + { + "id": 52, + "name": "bermuda (shorts)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000054_00" + }, + { + "id": 53, + "name": "cargo (shorts)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000055_00" + }, + { + "id": 54, + "name": "trunks", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000056_00" + }, + { + "id": 55, + "name": "boardshorts", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000057_00" + }, + { + "id": 56, + "name": "skort", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000058_00" + }, + { + "id": 57, + "name": "roll-up (shorts)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000059_00" + }, + { + "id": 58, + "name": "tie-up (shorts)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000060_00" + }, + { + "id": 59, + "name": "culotte (shorts)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000061_00" + }, + { + "id": 60, + "name": "lounge (shorts)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000062_00" + }, + { + "id": 61, + "name": "bloomers", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000063_00" + }, + { + "id": 62, + "name": "tutu (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000064_00" + }, + { + "id": 63, + "name": "kilt", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000065_00" + }, + { + "id": 64, + "name": "wrap (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000066_00" + }, + { + "id": 65, + "name": "skater (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000067_00" + }, + { + "id": 66, + "name": "cargo (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000068_00" + }, + { + "id": 67, + "name": "hobble (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000069_00" + }, + { + "id": 68, + "name": "sheath (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000070_00" + }, + { + "id": 69, + "name": "ball gown (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000071_00" + }, + { + "id": 70, + "name": "gypsy (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000072_00" + }, + { + "id": 71, + "name": "rah-rah (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000073_00" + }, + { + "id": 72, + "name": "prairie (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000074_00" + }, + { + "id": 73, + "name": "flamenco (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000075_00" + }, + { + "id": 74, + "name": "accordion (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000076_00" + }, + { + "id": 75, + "name": "sarong (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000077_00" + }, + { + "id": 76, + "name": "tulip (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000078_00" + }, + { + "id": 77, + "name": "dirndl (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000079_00" + }, + { + "id": 78, + "name": "godet (skirt)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000080_00" + }, + { + "id": 79, + "name": "blanket (coat)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000081_00" + }, + { + "id": 80, + "name": "parka", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000082_00" + }, + { + "id": 81, + "name": "trench (coat)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000083_00" + }, + { + "id": 82, + "name": "pea (coat)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000084_00" + }, + { + "id": 83, + "name": "shearling (coat)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000085_00" + }, + { + "id": 84, + "name": "teddy bear (coat)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000086_00" + }, + { + "id": 85, + "name": "puffer (coat)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000087_00" + }, + { + "id": 86, + "name": "duster (coat)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000088_00" + }, + { + "id": 87, + "name": "raincoat", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000089_00" + }, + { + "id": 88, + "name": "kimono", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000090_00" + }, + { + "id": 89, + "name": "robe", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000091_00" + }, + { + "id": 90, + "name": "dress (coat )", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000092_00" + }, + { + "id": 91, + "name": "duffle (coat)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000093_00" + }, + { + "id": 92, + "name": "wrap (coat)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000094_00" + }, + { + "id": 93, + "name": "military (coat)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000095_00" + }, + { + "id": 94, + "name": "swing (coat)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000096_00" + }, + { + "id": 95, + "name": "halter (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000097_00" + }, + { + "id": 96, + "name": "wrap (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000098_00" + }, + { + "id": 97, + "name": "chemise (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000099_00" + }, + { + "id": 98, + "name": "slip (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000100_00" + }, + { + "id": 99, + "name": "cheongsams", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000101_00" + }, + { + "id": 100, + "name": "jumper (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000102_00" + }, + { + "id": 101, + "name": "shift (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000103_00" + }, + { + "id": 102, + "name": "sheath (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000104_00" + }, + { + "id": 103, + "name": "shirt (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000105_00" + }, + { + "id": 104, + "name": "sundress", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000106_00" + }, + { + "id": 105, + "name": "kaftan", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000107_00" + }, + { + "id": 106, + "name": "bodycon (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000108_00" + }, + { + "id": 107, + "name": "nightgown", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000109_00" + }, + { + "id": 108, + "name": "gown", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000110_00" + }, + { + "id": 109, + "name": "sweater (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000111_00" + }, + { + "id": 110, + "name": "tea (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000112_00" + }, + { + "id": 111, + "name": "blouson (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000113_00" + }, + { + "id": 112, + "name": "tunic (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000114_00" + }, + { + "id": 113, + "name": "skater (dress)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000115_00" + }, + { + "id": 114, + "name": "asymmetrical", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000117_00" + }, + { + "id": 115, + "name": "symmetrical", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000118_00" + }, + { + "id": 116, + "name": "peplum", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000119_00" + }, + { + "id": 117, + "name": "circle", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000120_00" + }, + { + "id": 118, + "name": "flare", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000121_00" + }, + { + "id": 119, + "name": "fit and flare", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000122_00" + }, + { + "id": 120, + "name": "trumpet", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000123_00" + }, + { + "id": 121, + "name": "mermaid", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000124_00" + }, + { + "id": 122, + "name": "balloon", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000125_00" + }, + { + "id": 123, + "name": "bell", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000126_00" + }, + { + "id": 124, + "name": "bell bottom", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000127_00" + }, + { + "id": 125, + "name": "bootcut", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000128_00" + }, + { + "id": 126, + "name": "peg", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000129_00" + }, + { + "id": 127, + "name": "pencil", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000130_00" + }, + { + "id": 128, + "name": "straight", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000131_00" + }, + { + "id": 129, + "name": "a-line", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000132_00" + }, + { + "id": 130, + "name": "tent", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000133_00" + }, + { + "id": 131, + "name": "baggy", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000134_00" + }, + { + "id": 132, + "name": "wide leg", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000135_00" + }, + { + "id": 133, + "name": "high low", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000136_00" + }, + { + "id": 134, + "name": "curved (fit)", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000137_00" + }, + { + "id": 135, + "name": "tight (fit)", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000138_00" + }, + { + "id": 136, + "name": "regular (fit)", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000139_00" + }, + { + "id": 137, + "name": "loose (fit)", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000140_00" + }, + { + "id": 138, + "name": "oversized", + "supercategory": "silhouette", + "level": 1, + "taxonomy_id": "att000141_00" + }, + { + "id": 139, + "name": "empire waistline", + "supercategory": "waistline", + "level": 1, + "taxonomy_id": "att000143_00" + }, + { + "id": 140, + "name": "dropped waistline", + "supercategory": "waistline", + "level": 1, + "taxonomy_id": "att000144_00" + }, + { + "id": 141, + "name": "high waist", + "supercategory": "waistline", + "level": 1, + "taxonomy_id": "att000145_00" + }, + { + "id": 142, + "name": "normal waist", + "supercategory": "waistline", + "level": 1, + "taxonomy_id": "att000146_00" + }, + { + "id": 143, + "name": "low waist", + "supercategory": "waistline", + "level": 1, + "taxonomy_id": "att000147_00" + }, + { + "id": 144, + "name": "basque (wasitline)", + "supercategory": "waistline", + "level": 1, + "taxonomy_id": "att000148_00" + }, + { + "id": 145, + "name": "no waistline", + "supercategory": "waistline", + "level": 1, + "taxonomy_id": "att000149_00" + }, + { + "id": 146, + "name": "above-the-hip (length)", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000151_00" + }, + { + "id": 147, + "name": "hip (length)", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000152_00" + }, + { + "id": 148, + "name": "micro (length)", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000153_00" + }, + { + "id": 149, + "name": "mini (length)", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000154_00" + }, + { + "id": 150, + "name": "above-the-knee (length)", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000155_00" + }, + { + "id": 151, + "name": "knee (length)", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000156_00" + }, + { + "id": 152, + "name": "below the knee (length)", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000157_00" + }, + { + "id": 153, + "name": "midi", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000158_00" + }, + { + "id": 154, + "name": "maxi (length)", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000159_00" + }, + { + "id": 155, + "name": "floor (length)", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000160_00" + }, + { + "id": 156, + "name": "sleeveless", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000161_00" + }, + { + "id": 157, + "name": "short (length)", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000162_00" + }, + { + "id": 158, + "name": "elbow-length", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000163_00" + }, + { + "id": 159, + "name": "three quarter (length)", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000164_00" + }, + { + "id": 160, + "name": "wrist-length", + "supercategory": "length", + "level": 1, + "taxonomy_id": "att000165_00" + }, + { + "id": 161, + "name": "asymmetric (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000166_00" + }, + { + "id": 162, + "name": "regular (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000167_00" + }, + { + "id": 163, + "name": "shirt (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000168_00" + }, + { + "id": 164, + "name": "polo (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000169_00" + }, + { + "id": 165, + "name": "chelsea (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000170_00" + }, + { + "id": 166, + "name": "banded (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000171_00" + }, + { + "id": 167, + "name": "mandarin (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000172_00" + }, + { + "id": 168, + "name": "peter pan (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000173_00" + }, + { + "id": 169, + "name": "bow (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000174_00" + }, + { + "id": 170, + "name": "stand-away (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000175_00" + }, + { + "id": 171, + "name": "jabot (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000176_00" + }, + { + "id": 172, + "name": "sailor (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000177_00" + }, + { + "id": 173, + "name": "oversized (collar)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000178_00" + }, + { + "id": 174, + "name": "notched (lapel)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000179_00" + }, + { + "id": 175, + "name": "peak (lapel)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000180_00" + }, + { + "id": 176, + "name": "shawl (lapel)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000181_00" + }, + { + "id": 177, + "name": "napoleon (lapel)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000182_00" + }, + { + "id": 178, + "name": "oversized (lapel)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000183_00" + }, + { + "id": 179, + "name": "collarless", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000185_00" + }, + { + "id": 180, + "name": "asymmetric (neckline)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000186_00" + }, + { + "id": 181, + "name": "crew (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000187_00" + }, + { + "id": 182, + "name": "round (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000188_00" + }, + { + "id": 183, + "name": "v-neck", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000189_00" + }, + { + "id": 184, + "name": "surplice (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000190_00" + }, + { + "id": 185, + "name": "oval (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000191_00" + }, + { + "id": 186, + "name": "u-neck", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000192_00" + }, + { + "id": 187, + "name": "sweetheart (neckline)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000193_00" + }, + { + "id": 188, + "name": "queen anne (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000194_00" + }, + { + "id": 189, + "name": "boat (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000195_00" + }, + { + "id": 190, + "name": "scoop (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000196_00" + }, + { + "id": 191, + "name": "square (neckline)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000197_00" + }, + { + "id": 192, + "name": "plunging (neckline)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000198_00" + }, + { + "id": 193, + "name": "keyhole (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000199_00" + }, + { + "id": 194, + "name": "halter (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000200_00" + }, + { + "id": 195, + "name": "crossover (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000201_00" + }, + { + "id": 196, + "name": "choker (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000202_00" + }, + { + "id": 197, + "name": "high (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000203_00" + }, + { + "id": 198, + "name": "turtle (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000204_00" + }, + { + "id": 199, + "name": "cowl (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000205_00" + }, + { + "id": 200, + "name": "straight across (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000206_00" + }, + { + "id": 201, + "name": "illusion (neck)", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000207_00" + }, + { + "id": 202, + "name": "off-the-shoulder", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000208_00" + }, + { + "id": 203, + "name": "one shoulder", + "supercategory": "neckline type", + "level": 1, + "taxonomy_id": "att000209_00" + }, + { + "id": 204, + "name": "set-in sleeve", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000210_00" + }, + { + "id": 205, + "name": "dropped-shoulder sleeve", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000211_00" + }, + { + "id": 206, + "name": "raglan (sleeve)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000212_00" + }, + { + "id": 207, + "name": "cap (sleeve)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000213_00" + }, + { + "id": 208, + "name": "tulip (sleeve)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000214_00" + }, + { + "id": 209, + "name": "puff (sleeve)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000215_00" + }, + { + "id": 210, + "name": "bell (sleeve)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000216_00" + }, + { + "id": 211, + "name": "circular flounce (sleeve)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000217_00" + }, + { + "id": 212, + "name": "poet (sleeve)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000218_00" + }, + { + "id": 213, + "name": "dolman (sleeve), batwing (sleeve)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "combo000005" + }, + { + "id": 214, + "name": "bishop (sleeve)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000221_00" + }, + { + "id": 215, + "name": "leg of mutton (sleeve)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000222_00" + }, + { + "id": 216, + "name": "kimono (sleeve)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000223_00" + }, + { + "id": 217, + "name": "cargo (pocket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000224_00" + }, + { + "id": 218, + "name": "patch (pocket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000225_00" + }, + { + "id": 219, + "name": "welt (pocket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000226_00" + }, + { + "id": 220, + "name": "kangaroo (pocket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000227_00" + }, + { + "id": 221, + "name": "seam (pocket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000228_00" + }, + { + "id": 222, + "name": "slash (pocket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000229_00" + }, + { + "id": 223, + "name": "curved (pocket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000230_00" + }, + { + "id": 224, + "name": "flap (pocket)", + "supercategory": "nickname", + "level": 1, + "taxonomy_id": "att000231_00" + }, + { + "id": 225, + "name": "single breasted", + "supercategory": "opening type", + "level": 1, + "taxonomy_id": "att000233_00" + }, + { + "id": 226, + "name": "double breasted", + "supercategory": "opening type", + "level": 1, + "taxonomy_id": "att000234_00" + }, + { + "id": 227, + "name": "lace up", + "supercategory": "opening type", + "level": 1, + "taxonomy_id": "att000235_00" + }, + { + "id": 228, + "name": "wrapping", + "supercategory": "opening type", + "level": 1, + "taxonomy_id": "att000236_00" + }, + { + "id": 229, + "name": "zip-up", + "supercategory": "opening type", + "level": 1, + "taxonomy_id": "att000237_00" + }, + { + "id": 230, + "name": "fly (opening)", + "supercategory": "opening type", + "level": 1, + "taxonomy_id": "att000238_00" + }, + { + "id": 231, + "name": "chained (opening)", + "supercategory": "opening type", + "level": 1, + "taxonomy_id": "att000239_00" + }, + { + "id": 232, + "name": "buckled (opening)", + "supercategory": "opening type", + "level": 1, + "taxonomy_id": "att000240_00" + }, + { + "id": 233, + "name": "toggled (opening)", + "supercategory": "opening type", + "level": 1, + "taxonomy_id": "att000241_00" + }, + { + "id": 234, + "name": "no opening", + "supercategory": "opening type", + "level": 1, + "taxonomy_id": "att000242_00" + }, + { + "id": 281, + "name": "plastic", + "supercategory": "non-textile material type", + "level": 1, + "taxonomy_id": "att000298_00" + }, + { + "id": 282, + "name": "rubber", + "supercategory": "non-textile material type", + "level": 1, + "taxonomy_id": "att000299_00" + }, + { + "id": 283, + "name": "metal", + "supercategory": "non-textile material type", + "level": 1, + "taxonomy_id": "att000300_00" + }, + { + "id": 285, + "name": "feather", + "supercategory": "non-textile material type", + "level": 1, + "taxonomy_id": "att000302_00" + }, + { + "id": 286, + "name": "gem", + "supercategory": "non-textile material type", + "level": 1, + "taxonomy_id": "att000303_00" + }, + { + "id": 287, + "name": "bone", + "supercategory": "non-textile material type", + "level": 1, + "taxonomy_id": "att000304_00" + }, + { + "id": 288, + "name": "ivory", + "supercategory": "non-textile material type", + "level": 1, + "taxonomy_id": "att000305_00" + }, + { + "id": 289, + "name": "fur", + "supercategory": "non-textile material type", + "level": 1, + "taxonomy_id": "att000306_00" + }, + { + "id": 290, + "name": "suede", + "supercategory": "leather", + "level": 2, + "taxonomy_id": "att000308_00" + }, + { + "id": 291, + "name": "shearling", + "supercategory": "leather", + "level": 2, + "taxonomy_id": "att000309_00" + }, + { + "id": 292, + "name": "crocodile", + "supercategory": "leather", + "level": 2, + "taxonomy_id": "att000310_00" + }, + { + "id": 293, + "name": "snakeskin", + "supercategory": "leather", + "level": 2, + "taxonomy_id": "att000311_00" + }, + { + "id": 294, + "name": "wood", + "supercategory": "non-textile material type", + "level": 1, + "taxonomy_id": "att000312_00" + }, + { + "id": 295, + "name": "no non-textile material", + "supercategory": "non-textile material type", + "level": 1, + "taxonomy_id": "att000313_00" + }, + { + "id": 296, + "name": "burnout", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000316_00" + }, + { + "id": 297, + "name": "distressed", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000317_00" + }, + { + "id": 298, + "name": "washed", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000318_00" + }, + { + "id": 299, + "name": "embossed", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000319_00" + }, + { + "id": 300, + "name": "frayed", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000320_00" + }, + { + "id": 301, + "name": "printed", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000321_00" + }, + { + "id": 302, + "name": "ruched", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000322_00" + }, + { + "id": 303, + "name": "quilted", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000323_00" + }, + { + "id": 304, + "name": "pleat", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000324_00" + }, + { + "id": 305, + "name": "gathering", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000325_00" + }, + { + "id": 306, + "name": "smocking", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000326_00" + }, + { + "id": 307, + "name": "tiered", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000327_00" + }, + { + "id": 308, + "name": "cutout", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000328_00" + }, + { + "id": 309, + "name": "slit", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000329_00" + }, + { + "id": 310, + "name": "perforated", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000330_00" + }, + { + "id": 311, + "name": "lining", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000331_00" + }, + { + "id": 312, + "name": "applique(a)", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000332_00" + }, + { + "id": 313, + "name": "bead(a)", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000333_00" + }, + { + "id": 314, + "name": "rivet(a)", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000334_00" + }, + { + "id": 315, + "name": "sequin(a)", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000335_00" + }, + { + "id": 316, + "name": "no special manufacturing technique", + "supercategory": "textile finishing, manufacturing techniques", + "level": 1, + "taxonomy_id": "att000336_00" + }, + { + "id": 317, + "name": "plain (pattern)", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000338_00" + }, + { + "id": 318, + "name": "abstract", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000339_00" + }, + { + "id": 319, + "name": "cartoon", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000340_00" + }, + { + "id": 320, + "name": "letters, numbers", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "combo000009" + }, + { + "id": 321, + "name": "camouflage", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000343_00" + }, + { + "id": 322, + "name": "check", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000344_00" + }, + { + "id": 323, + "name": "dot", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000345_00" + }, + { + "id": 324, + "name": "fair isle", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000346_00" + }, + { + "id": 325, + "name": "floral", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000347_00" + }, + { + "id": 326, + "name": "geometric", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000348_00" + }, + { + "id": 327, + "name": "paisley", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000349_00" + }, + { + "id": 328, + "name": "stripe", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000350_00" + }, + { + "id": 329, + "name": "houndstooth (pattern)", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000351_00" + }, + { + "id": 330, + "name": "herringbone (pattern)", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000352_00" + }, + { + "id": 331, + "name": "chevron", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000353_00" + }, + { + "id": 332, + "name": "argyle", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000354_00" + }, + { + "id": 333, + "name": "leopard", + "supercategory": "animal", + "level": 2, + "taxonomy_id": "att000356_00" + }, + { + "id": 334, + "name": "snakeskin (pattern)", + "supercategory": "animal", + "level": 2, + "taxonomy_id": "att000357_00" + }, + { + "id": 335, + "name": "cheetah", + "supercategory": "animal", + "level": 2, + "taxonomy_id": "att000358_00" + }, + { + "id": 336, + "name": "peacock", + "supercategory": "animal", + "level": 2, + "taxonomy_id": "att000359_00" + }, + { + "id": 337, + "name": "zebra", + "supercategory": "animal", + "level": 2, + "taxonomy_id": "att000360_00" + }, + { + "id": 338, + "name": "giraffe", + "supercategory": "animal", + "level": 2, + "taxonomy_id": "att000361_00" + }, + { + "id": 339, + "name": "toile de jouy", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000362_00" + }, + { + "id": 340, + "name": "plant", + "supercategory": "textile pattern", + "level": 1, + "taxonomy_id": "att000363_00" + } +] \ No newline at end of file diff --git a/samples/fashionpedia/categories.json b/samples/fashionpedia/categories.json new file mode 100644 index 0000000..6ad186b --- /dev/null +++ b/samples/fashionpedia/categories.json @@ -0,0 +1,324 @@ +[ + { + "id": 0, + "name": "shirt, blouse", + "supercategory": "upperbody", + "level": 2, + "taxonomy_id": "combo000000" + }, + { + "id": 1, + "name": "top, t-shirt, sweatshirt", + "supercategory": "upperbody", + "level": 2, + "taxonomy_id": "combo000001" + }, + { + "id": 2, + "name": "sweater", + "supercategory": "upperbody", + "level": 2, + "taxonomy_id": "obj000008_00" + }, + { + "id": 3, + "name": "cardigan", + "supercategory": "upperbody", + "level": 2, + "taxonomy_id": "obj000009_00" + }, + { + "id": 4, + "name": "jacket", + "supercategory": "upperbody", + "level": 2, + "taxonomy_id": "obj000010_00" + }, + { + "id": 5, + "name": "vest", + "supercategory": "upperbody", + "level": 2, + "taxonomy_id": "obj000011_00" + }, + { + "id": 6, + "name": "pants", + "supercategory": "lowerbody", + "level": 2, + "taxonomy_id": "obj000013_00" + }, + { + "id": 7, + "name": "shorts", + "supercategory": "lowerbody", + "level": 2, + "taxonomy_id": "obj000014_00" + }, + { + "id": 8, + "name": "skirt", + "supercategory": "lowerbody", + "level": 2, + "taxonomy_id": "obj000015_00" + }, + { + "id": 9, + "name": "coat", + "supercategory": "wholebody", + "level": 2, + "taxonomy_id": "obj000017_00" + }, + { + "id": 10, + "name": "dress", + "supercategory": "wholebody", + "level": 2, + "taxonomy_id": "obj000018_00" + }, + { + "id": 11, + "name": "jumpsuit", + "supercategory": "wholebody", + "level": 2, + "taxonomy_id": "obj000019_00" + }, + { + "id": 12, + "name": "cape", + "supercategory": "wholebody", + "level": 2, + "taxonomy_id": "obj000020_00" + }, + { + "id": 13, + "name": "glasses", + "supercategory": "head", + "level": 2, + "taxonomy_id": "obj000023_00" + }, + { + "id": 14, + "name": "hat", + "supercategory": "head", + "level": 2, + "taxonomy_id": "obj000025_00" + }, + { + "id": 15, + "name": "headband, head covering, hair accessory", + "supercategory": "head", + "level": 2, + "taxonomy_id": "combo000002" + }, + { + "id": 16, + "name": "tie", + "supercategory": "neck", + "level": 2, + "taxonomy_id": "obj000030_00" + }, + { + "id": 17, + "name": "glove", + "supercategory": "arms and hands", + "level": 2, + "taxonomy_id": "obj000032_00" + }, + { + "id": 18, + "name": "watch", + "supercategory": "arms and hands", + "level": 2, + "taxonomy_id": "obj000033_00" + }, + { + "id": 19, + "name": "belt", + "supercategory": "waist", + "level": 2, + "taxonomy_id": "obj000035_00" + }, + { + "id": 20, + "name": "leg warmer", + "supercategory": "legs and feet", + "level": 2, + "taxonomy_id": "obj000037_00" + }, + { + "id": 21, + "name": "tights, stockings", + "supercategory": "legs and feet", + "level": 2, + "taxonomy_id": "combo000003" + }, + { + "id": 22, + "name": "sock", + "supercategory": "legs and feet", + "level": 2, + "taxonomy_id": "obj000040_00" + }, + { + "id": 23, + "name": "shoe", + "supercategory": "legs and feet", + "level": 2, + "taxonomy_id": "obj000041_00" + }, + { + "id": 24, + "name": "bag, wallet", + "supercategory": "others", + "level": 2, + "taxonomy_id": "combo000004" + }, + { + "id": 25, + "name": "scarf", + "supercategory": "others", + "level": 2, + "taxonomy_id": "obj000045_00" + }, + { + "id": 26, + "name": "umbrella", + "supercategory": "others", + "level": 2, + "taxonomy_id": "obj000046_00" + }, + { + "id": 27, + "name": "hood", + "supercategory": "garment parts", + "level": 2, + "taxonomy_id": "obj000049_00" + }, + { + "id": 28, + "name": "collar", + "supercategory": "garment parts", + "level": 2, + "taxonomy_id": "obj000050_00" + }, + { + "id": 29, + "name": "lapel", + "supercategory": "garment parts", + "level": 2, + "taxonomy_id": "obj000051_00" + }, + { + "id": 30, + "name": "epaulette", + "supercategory": "garment parts", + "level": 2, + "taxonomy_id": "obj000052_00" + }, + { + "id": 31, + "name": "sleeve", + "supercategory": "garment parts", + "level": 2, + "taxonomy_id": "obj000053_00" + }, + { + "id": 32, + "name": "pocket", + "supercategory": "garment parts", + "level": 2, + "taxonomy_id": "obj000055_00" + }, + { + "id": 33, + "name": "neckline", + "supercategory": "garment parts", + "level": 2, + "taxonomy_id": "obj000056_00" + }, + { + "id": 34, + "name": "buckle", + "supercategory": "closures", + "level": 2, + "taxonomy_id": "obj000058_00" + }, + { + "id": 35, + "name": "zipper", + "supercategory": "closures", + "level": 2, + "taxonomy_id": "obj000059_00" + }, + { + "id": 36, + "name": "applique", + "supercategory": "decorations", + "level": 2, + "taxonomy_id": "obj000061_00" + }, + { + "id": 37, + "name": "bead", + "supercategory": "decorations", + "level": 2, + "taxonomy_id": "obj000062_00" + }, + { + "id": 38, + "name": "bow", + "supercategory": "decorations", + "level": 2, + "taxonomy_id": "obj000063_00" + }, + { + "id": 39, + "name": "flower", + "supercategory": "decorations", + "level": 2, + "taxonomy_id": "obj000064_00" + }, + { + "id": 40, + "name": "fringe", + "supercategory": "decorations", + "level": 2, + "taxonomy_id": "obj000065_00" + }, + { + "id": 41, + "name": "ribbon", + "supercategory": "decorations", + "level": 2, + "taxonomy_id": "obj000066_00" + }, + { + "id": 42, + "name": "rivet", + "supercategory": "decorations", + "level": 2, + "taxonomy_id": "obj000067_00" + }, + { + "id": 43, + "name": "ruffle", + "supercategory": "decorations", + "level": 2, + "taxonomy_id": "obj000068_00" + }, + { + "id": 44, + "name": "sequin", + "supercategory": "decorations", + "level": 2, + "taxonomy_id": "obj000069_00" + }, + { + "id": 45, + "name": "tassel", + "supercategory": "decorations", + "level": 2, + "taxonomy_id": "obj000070_00" + } +] \ No newline at end of file diff --git a/samples/fashionpedia/images/b4f6d9c2696573ff0cfc05070d17b5b6.jpg b/samples/fashionpedia/images/b4f6d9c2696573ff0cfc05070d17b5b6.jpg new file mode 100644 index 0000000..fa36376 Binary files /dev/null and b/samples/fashionpedia/images/b4f6d9c2696573ff0cfc05070d17b5b6.jpg differ diff --git a/samples/fashionpedia/images/e14733841b04c64e75789a91fbe549b3.jpg b/samples/fashionpedia/images/e14733841b04c64e75789a91fbe549b3.jpg new file mode 100644 index 0000000..1c95634 Binary files /dev/null and b/samples/fashionpedia/images/e14733841b04c64e75789a91fbe549b3.jpg differ diff --git a/samples/polyvore/categories.csv b/samples/polyvore/categories.csv new file mode 100644 index 0000000..25380ec --- /dev/null +++ b/samples/polyvore/categories.csv @@ -0,0 +1,224 @@ +2,undefined, +3,dress,all-body +4,dress,all-body +5,dress,all-body +6,gown,all-body +7,skirt,bottoms +8,skirt,bottoms +9,skirt,bottoms +9,skirt,bottoms +9,skirt,bottoms +10,long skirt,bottoms +11,sweater,tops +11,sleeveless top,tops +11,shirt,tops +11,sleeveless top,tops +11,top,tops +15,tunic,tops +17,blouse,tops +17,sleeveless top,tops +17,sweater,tops +17,long-sleeve shirt,tops +17,blouse,tops +18,cardigan,outerwear +19,sweater,tops +19,turtleneck sweater,tops +19,turtleneck sweater,tops +21,male T-shirt,tops +21,tshirt,tops +23,jacket/coat,outerwear +24,trench coat,outerwear +24,coat,outerwear +24,coat,outerwear +24,trench coat,outerwear +25,blazer,outerwear +25,jacket,outerwear +25,parka,outerwear +26,vest,tops +27,jeans,bottoms +27,jeans,bottoms +28,pants,bottoms +28,pant,bottoms +28,pant,bottoms +29,shorts,bottoms +29,shorts,bottoms +29,shorts,bottoms +30,set/suit,all-body +31,swimsuit bottom,bottoms +35,backpack,bags +36,tote,bags +36,purse,bags +36,tote,bags +37,purse,bags +37,purse,bags +37,handbag,bags +37,bag,bags +38,clutch,bags +38,clutch,bags +38,clutch,bags +39,purse,bags +40,purse,bags +41,flat sandals,shoes +41,closed shoes,shoes +41,heels,shoes +42,boots,shoes +42,boots,shoes +43,pump,shoes +43,heels,shoes +46,heels,shoes +46,sandals,shoes +46,sandals,shoes +46,heels,shoes +46,sandals,shoes +47,flats,shoes +47,flats,shoes +48,flip-flops,shoes +49,sneakers,shoes +49,sneakers,shoes +49,flats,shoes +50,slippers,shoes +51,gloves,accessories +51,scarf,scarves +52,belt,accessories +53,gloves,accessories +55,straw hat,hats +55,baseball cap,hats +55,beanie,hats +55,hat,hats +55,winter hat,hats +56,tie,accessories +57,sunglasses,accessories +57,sunglasses,sunglasses +58,headband,accessories +59,umbrella,accessories +61,watch,accessories +61,watch,jewellery +62,necklace,jewellery +62,necklace,jewellery +62,necklace,jewellery +64,earrings,jewellery +64,earrings,jewellery +64,earrings,jewellery +65,ring,jewellery +65,ring,jewellery +68,stockings,accessories +69,socks,accessories +104,tank,tops +104,sleeveless top,tops +104,tank,tops +105,scarf,scarves +106,bracelet,jewellery +106,bracelet,jewellery +106,bracelet,jewellery +107,pendant,jewellery +231,pouch,accessories +236,blazer,outerwear +236,blazer,outerwear +237,jeans,bottoms +237,jeans,bottoms +238,jeans,bottoms +239,jeans,bottoms +240,jeans,bottoms +241,pants,bottoms +243,jumpsuit,all-body +244,romper,all-body +245,lingerie top, +246,lingerie bottom, +247,lingerie top, +248,pyjama/slip/chemise,all-body +249,pyjama pants,bottoms +250,kimono,tops +251,hosiery,accessories +252,sports long-sleeve shirt,tops +253,sweatpants,bottoms +254,tennis skirt,bottoms +255,shorts,bottoms +256,track jacket,tops +257,sports bra,tops +258,purse,bags +259,backpack,bags +259,basket bag,bags +259,backpack,bags +260,satchel,bags +261,heels,shoes +261,booties,shoes +262,flat boots,shoes +263,heeled boots,shoes +264,over-the-knee boots,shoes +265,flats,shoes +266,closed shoes,shoes +267,platform shoes,shoes +268,sneakers,shoes +269,suspenders,accessories +270,activity wristband,accessories +272,male shirt,tops +273,male sweater,tops +275,male T-shirt,tops +277,male suit jacket,outerwear +278,male jeans,bottoms +279,male suit pants,bottoms +280,male knee-length shorts,bottoms +281,male suit,all-body +282,male swim shorts,bottoms +283,male boxers, +284,male sweatpants,bottoms +285,male sports shirt/track suit, +286,male sports shirt,tops +287,male track pants,bottoms +288,male sports shorts,bottoms +289,male track jacket,tops +290,messenger bag,bags +291,male shoes,shoes +292,male shoes,shoes +293,male flip-flops,shoes +294,male flip-flops,shoes +295,male loafers,shoes +296,male formal shoes,shoes +297,male sneakers,shoes +298,male sneakers,shoes +299,male accessories,accessories +300,male belt,accessories +301,male gloves,accessories +302,male scarves,accessories +303,male baseball caps,hats +304,male sunglasses,sunglasses +305,male watch,jewellery +306,male suspenders,accessories +307,cufflings,jewellery +309,tank top,tops +310,jeans,bottoms +315,bodie,tops +318,purse,bags +318,handbag,bags +318,purse,bags +332,pants,bottoms +341,male shirt,tops +342,male polos,tops +343,tank top,tops +1605,swimsuit,all-body +1606,one-piece swimsuit,all-body +1607,coverup,outerwear +4452,jeans,bottoms +4454,male shirt,tops +4455,male formal jacket,outerwear +4456,male jacket,outerwear +4457,male vest,outerwear +4458,male pants,bottoms +4459,male pants,bottoms +4460,male socks,accessories +4461,travel bag,bags +4462,laptop bag,bags +4463,wallet,accessories +4464,male shoes,shoes +4465,male slippers,shoes +4466,brooch,jewellery +4467,key chain,accessories +4468,money clip,accessories +4470,bowtie,accessories +4472,smartphone cases/tech items,accessories +4473,umbrella,accessories +4495,sweathirt,tops +4495,sweater,tops +4496,hoodie,tops +4517,swimsuit top,tops +4518,swimsuit bottom,bottoms \ No newline at end of file diff --git a/samples/polyvore/compatibility_sample.txt b/samples/polyvore/compatibility_sample.txt new file mode 100644 index 0000000..4ac48e2 --- /dev/null +++ b/samples/polyvore/compatibility_sample.txt @@ -0,0 +1,10 @@ +1 210750761_1 210750761_2 210750761_3 +1 217602530_1 217602530_2 217602530_3 217602530_4 217602530_5 217602530_6 +1 221884093_1 221884093_2 221884093_3 +1 202131990_1 202131990_2 202131990_3 202131990_4 +1 224733539_1 224733539_2 224733539_3 224733539_4 224733539_5 +0 68998648_2 197242653_4 208581771_4 +0 184932845_1 218234278_2 181508959_3 176107321_4 222910565_5 175481309_7 +0 196722999_1 220414379_2 224933409_4 +0 174223297_2 224360639_3 217908177_4 29250781_7 +0 216283292_1 138523002_2 211314803_3 209781929_2 224917559_3 diff --git a/samples/polyvore/fill_in_blank_sample.json b/samples/polyvore/fill_in_blank_sample.json new file mode 100644 index 0000000..768c246 --- /dev/null +++ b/samples/polyvore/fill_in_blank_sample.json @@ -0,0 +1,31 @@ +[ + { + "question": [ + "210750761_1", + "210750761_2" + ], + "blank_position": 3, + "answers": [ + "210750761_3", + "221049803_5", + "218261368_6", + "223682912_7" + ] + }, + { + "question": [ + "217602530_1", + "217602530_2", + "217602530_3", + "217602530_5", + "217602530_6" + ], + "blank_position": 4, + "answers": [ + "217602530_4", + "205695107_5", + "222555147_5", + "211037623_6" + ] + } +] \ No newline at end of file diff --git a/samples/polyvore/images/165668728.jpg b/samples/polyvore/images/165668728.jpg new file mode 100644 index 0000000..353e303 Binary files /dev/null and b/samples/polyvore/images/165668728.jpg differ diff --git a/samples/polyvore/images/169020872.jpg b/samples/polyvore/images/169020872.jpg new file mode 100644 index 0000000..e913224 Binary files /dev/null and b/samples/polyvore/images/169020872.jpg differ diff --git a/samples/polyvore/images/171568733.jpg b/samples/polyvore/images/171568733.jpg new file mode 100644 index 0000000..568c160 Binary files /dev/null and b/samples/polyvore/images/171568733.jpg differ diff --git a/samples/polyvore/images/175018750.jpg b/samples/polyvore/images/175018750.jpg new file mode 100644 index 0000000..103a22b Binary files /dev/null and b/samples/polyvore/images/175018750.jpg differ diff --git a/samples/polyvore/images/176086342.jpg b/samples/polyvore/images/176086342.jpg new file mode 100644 index 0000000..2beaa92 Binary files /dev/null and b/samples/polyvore/images/176086342.jpg differ diff --git a/samples/polyvore/images/185367365.jpg b/samples/polyvore/images/185367365.jpg new file mode 100644 index 0000000..41cdfa3 Binary files /dev/null and b/samples/polyvore/images/185367365.jpg differ diff --git a/samples/polyvore/images/194628844.jpg b/samples/polyvore/images/194628844.jpg new file mode 100644 index 0000000..cd3a69e Binary files /dev/null and b/samples/polyvore/images/194628844.jpg differ diff --git a/samples/polyvore/images/195213892.jpg b/samples/polyvore/images/195213892.jpg new file mode 100644 index 0000000..b9431af Binary files /dev/null and b/samples/polyvore/images/195213892.jpg differ diff --git a/samples/polyvore/images/196672591.jpg b/samples/polyvore/images/196672591.jpg new file mode 100644 index 0000000..cd53b8f Binary files /dev/null and b/samples/polyvore/images/196672591.jpg differ diff --git a/samples/polyvore/images/201813350.jpg b/samples/polyvore/images/201813350.jpg new file mode 100644 index 0000000..0eed755 Binary files /dev/null and b/samples/polyvore/images/201813350.jpg differ diff --git a/samples/polyvore/images/209892020.jpg b/samples/polyvore/images/209892020.jpg new file mode 100644 index 0000000..8385fa5 Binary files /dev/null and b/samples/polyvore/images/209892020.jpg differ diff --git a/samples/polyvore/images/214249489.jpg b/samples/polyvore/images/214249489.jpg new file mode 100644 index 0000000..9c4b54f Binary files /dev/null and b/samples/polyvore/images/214249489.jpg differ diff --git a/samples/polyvore/images/214249851.jpg b/samples/polyvore/images/214249851.jpg new file mode 100644 index 0000000..58bf8be Binary files /dev/null and b/samples/polyvore/images/214249851.jpg differ diff --git a/samples/polyvore/images/214359927.jpg b/samples/polyvore/images/214359927.jpg new file mode 100644 index 0000000..24dc766 Binary files /dev/null and b/samples/polyvore/images/214359927.jpg differ diff --git a/samples/polyvore/images/214483399.jpg b/samples/polyvore/images/214483399.jpg new file mode 100644 index 0000000..5109fc2 Binary files /dev/null and b/samples/polyvore/images/214483399.jpg differ diff --git a/samples/polyvore/items_sample.json b/samples/polyvore/items_sample.json new file mode 100644 index 0000000..0ad62cc --- /dev/null +++ b/samples/polyvore/items_sample.json @@ -0,0 +1,213 @@ +{ + "201813350": { + "url_name": "prada printed leather clutch", + "description": "", + "catgeories": "", + "title": "", + "related": "", + "category_id": "38", + "semantic_category": "bags" + }, + "195213892": { + "url_name": "vetements black reflector-heel boots", + "description": "Mid-calf buffed leather ankle boots in black. Pointed toe. Zip closure at inner side. Reflector-shaped heel in red and black. Leather sole in tan. Tonal hardware. Tonal stitching. Approx. 3.5 heel.", + "catgeories": [ + "Women's Fashion", + "Boots", + "Ankle Booties", + "Vetements ankle booties" + ], + "title": "Vetements Black Reflector-Heel Boots", + "related": [ + "Black ankle bootie", + "Heeled ankle booties", + "Pointy toe booties", + "Short heel boots" + ], + "category_id": "261", + "semantic_category": "shoes" + }, + "169020872": { + "url_name": "navy blue military style fascinator", + "description": "", + "catgeories": "", + "title": "", + "related": "", + "category_id": "55", + "semantic_category": "hats" + }, + "194628844": { + "url_name": "diane von furstenberg bi-colour silk", + "description": "", + "catgeories": "", + "title": "", + "related": "", + "category_id": "52", + "semantic_category": "accessories" + }, + "196672591": { + "url_name": "hyein seo printed overall", + "description": "", + "catgeories": "", + "title": "", + "related": "", + "category_id": "243", + "semantic_category": "all-body" + }, + "185367365": { + "url_name": "max mara clima coat", + "description": "", + "catgeories": "", + "title": "", + "related": "", + "category_id": "24", + "semantic_category": "outerwear" + }, + "165668728": { + "url_name": "marabelle womens wingtip oxford grey", + "description": "Low heel oxford * Suede or leather upper * Lace-up vamp * Stacked heel * Leather insole and man-made sole * Customer feedback suggests this product runs small, please consider ordering a size up Measurements: Heel height 1\".", + "catgeories": [ + "Women's Fashion", + "Shoes", + "Oxfords" + ], + "title": "Marabelle Women's Wingtip Oxford - Grey, Size 5", + "related": [ + "Wing tip shoes", + "Leather shoes", + "Oxford shoes", + "Grey shoes", + "Laced up shoes", + "Low heel shoes" + ], + "category_id": "266", + "semantic_category": "shoes" + }, + "171568733": { + "url_name": "nach women ladybug earrings", + "description": "", + "catgeories": "", + "title": "", + "related": "", + "category_id": "64", + "semantic_category": "jewellery" + }, + "175018750": { + "url_name": "topshop moto denim cropped tie", + "description": "Look to cropped details to add a seasonal touch to the classic denim shirt. Crafted from pure cotton in a vintage style stripe, this shirt comes detailed with a classic button down placket and cropped tie to the front. We're loving it styled back with loose fit mom jeans and boots to finish the look. 100% Cotton. Machine wash.Model's height is 5' 9\"\"", + "catgeories": [ + "Women's Fashion", + "Clothing", + "Tops", + "Topshop tops" + ], + "title": "TopShop Moto Denim Cropped Tie Shirt", + "related": [ + "Blue shirt", + "Button up shirts", + "Stripe shirt", + "Denim shirts", + "Crop tops", + "Striped button-down shirts" + ], + "category_id": "11", + "semantic_category": "tops" + }, + "176086342": { + "url_name": "ted baker womens white quella", + "description": "Tailored shorts by Ted Baker featuring this seasons Tropical Toucan print with a fold-up cuff style to the hem |", + "catgeories": [ + "Women's Fashion", + "Clothing", + "Shorts", + "Ted Baker shorts" + ], + "title": "Ted Baker Womens White Quella Tropical Toucan Printed Shorts", + "related": [ + "Ted Baker", + "White shorts", + "Print shorts", + "Patterned shorts", + "Cuffed shorts", + "Fold over shorts" + ], + "category_id": "29", + "semantic_category": "bottoms" + }, + "214359927": { + "url_name": "red with black cartoon pendants", + "description": "", + "catgeories": "", + "title": "", + "related": "", + "category_id": "37", + "semantic_category": "bags" + }, + "209892020": { + "url_name": "steve madden nicki booties", + "description": "Standout this summer in NICKI, a fierce new ankle boot with a breezy mesh upper and modern lucite heel. Sheer materials lend sex appeal and sophistication, making for footwear that'll turn the heads of your romantic interest and fellow fashionistas alike! Mesh and PU upper material. Unlined Man-made sole. 4.25 inch heel height. 9.25 inch shaft circumference 5 inch shaft height Functional back zipper Pointed toe Clear lucite heel.", + "catgeories": [ + "Women's Fashion", + "Boots", + "Ankle Booties", + "Steve Madden ankle booties" + ], + "title": "Steve Madden Nicki Booties", + "related": [ + "Steve Madden", + "Black ankle bootie", + "High heel booties" + ], + "category_id": "261", + "semantic_category": "shoes" + }, + "214483399": { + "url_name": "geometric vintage cuff ring set", + "description": "", + "catgeories": "", + "title": "", + "related": "", + "category_id": "65", + "semantic_category": "jewellery" + }, + "214249851": { + "url_name": "bowknot letter shirt", + "description": "Shop for Bowknot Letter T-Shirt WHITE: Tees S at ZAFUL. Only $15.55 and free shipping!", + "catgeories": [ + "Women's Fashion", + "Clothing", + "Tops", + "T-Shirts" + ], + "title": "Bowknot Letter T-Shirt", + "related": [ + "White top", + "T shirts", + "Shirt top", + "Letter shirts", + "Initial shirts" + ], + "category_id": "21", + "semantic_category": "tops" + }, + "214249489": { + "url_name": "ripped cutoffs pu panel denim", + "description": "Shop for Ripped Cutoffs PU Panel Denim Shorts BLACK: Shorts S at ZAFUL. Only $23.99 and free shipping!", + "catgeories": [ + "Women's Fashion", + "Clothing", + "Shorts" + ], + "title": "Ripped Cutoffs PU Panel Denim Shorts Black S", + "related": [ + "Denim shorts", + "Jean shorts", + "Ripped shorts", + "Cutoff shorts", + "Distressed shorts", + "Destroyed shorts" + ], + "category_id": "29", + "semantic_category": "bottoms" + } +} \ No newline at end of file diff --git a/samples/polyvore/outfits_sample.json b/samples/polyvore/outfits_sample.json new file mode 100644 index 0000000..2a742e8 --- /dev/null +++ b/samples/polyvore/outfits_sample.json @@ -0,0 +1,77 @@ +[ + { + "items": [ + { + "item_id": "201813350", + "index": 1 + }, + { + "item_id": "195213892", + "index": 2 + }, + { + "item_id": "169020872", + "index": 3 + }, + { + "item_id": "194628844", + "index": 4 + }, + { + "item_id": "196672591", + "index": 5 + }, + { + "item_id": "185367365", + "index": 6 + } + ], + "set_id": "217602530" + }, + { + "items": [ + { + "item_id": "165668728", + "index": 1 + }, + { + "item_id": "171568733", + "index": 2 + }, + { + "item_id": "175018750", + "index": 3 + }, + { + "item_id": "176086342", + "index": 4 + } + ], + "set_id": "202131990" + }, + { + "items": [ + { + "item_id": "214359927", + "index": 1 + }, + { + "item_id": "209892020", + "index": 2 + }, + { + "item_id": "214483399", + "index": 3 + }, + { + "item_id": "214249851", + "index": 4 + }, + { + "item_id": "214249489", + "index": 5 + } + ], + "set_id": "224733539" + } +] \ No newline at end of file diff --git a/samples/sanzo-wada/colors.json b/samples/sanzo-wada/colors.json new file mode 100644 index 0000000..c374f3e --- /dev/null +++ b/samples/sanzo-wada/colors.json @@ -0,0 +1,4464 @@ +{ + "colors":[ + { + "index":1, + "name":"Hermosa Pink", + "slug":"hermosa-pink", + "cmyk_array":[ + 0, + 30, + 6, + 0 + ], + "cmyk":"C:0 / M:30 / Y:6 / K:0", + "rgb_array":[ + 255, + 179, + 240 + ], + "rgb":"R:255 / G:179 / B:240", + "hex":"#ffb3f0", + "combinations":[ + 176, + 227, + 273 + ], + "use_count":3 + }, + { + "index":2, + "name":"Corinthian Pink", + "slug":"corinthian-pink", + "cmyk_array":[ + 0, + 35, + 15, + 0 + ], + "cmyk":"C:0 / M:35 / Y:15 / K:0", + "rgb_array":[ + 255, + 166, + 217 + ], + "rgb":"R:255 / G:166 / B:217", + "hex":"#ffa6d9", + "combinations":[ + 27, + 43, + 87, + 97, + 128, + 169, + 174, + 206, + 246, + 254, + 264, + 342 + ], + "use_count":12 + }, + { + "index":3, + "name":"Cameo Pink", + "slug":"cameo-pink", + "cmyk_array":[ + 10, + 32, + 19, + 0 + ], + "cmyk":"C:10 / M:32 / Y:19 / K:0", + "rgb_array":[ + 230, + 173, + 207 + ], + "rgb":"R:230 / G:173 / B:207", + "hex":"#e6adcf", + "combinations":[ + 18, + 125, + 308 + ], + "use_count":3 + }, + { + "index":4, + "name":"Fawn", + "slug":"fawn", + "cmyk_array":[ + 18, + 31, + 30, + 0 + ], + "cmyk":"C:18 / M:31 / Y:30 / K:0", + "rgb_array":[ + 209, + 176, + 179 + ], + "rgb":"R:209 / G:176 / B:179", + "hex":"#d1b0b3", + "combinations":[ + 18, + 125, + 308 + ], + "use_count":3 + }, + { + "index":5, + "name":"Light Brown Drab", + "slug":"light-brown-drab", + "cmyk_array":[ + 8, + 30, + 20, + 25 + ], + "cmyk":"C:8 / M:30 / Y:20 / K:25", + "rgb_array":[ + 176, + 134, + 153 + ], + "rgb":"R:176 / G:134 / B:153", + "hex":"#b08699", + "combinations":[ + 35, + 68, + 185, + 191, + 223, + 239, + 244, + 268, + 285, + 321 + ], + "use_count":10 + }, + { + "index":6, + "name":"Coral Red", + "slug":"coral-red", + "cmyk_array":[ + 0, + 55, + 40, + 0 + ], + "cmyk":"C:0 / M:55 / Y:40 / K:0", + "rgb_array":[ + 255, + 115, + 153 + ], + "rgb":"R:255 / G:115 / B:153", + "hex":"#ff7399", + "combinations":[ + 92, + 123, + 320, + 332 + ], + "use_count":4 + }, + { + "index":7, + "name":"Fresh Color", + "slug":"fresh-color", + "cmyk_array":[ + 0, + 53, + 45, + 0 + ], + "cmyk":"C:0 / M:53 / Y:45 / K:0", + "rgb_array":[ + 255, + 120, + 140 + ], + "rgb":"R:255 / G:120 / B:140", + "hex":"#ff788c", + "combinations":[ + 240 + ], + "use_count":1 + }, + { + "index":8, + "name":"Grenadine Pink", + "slug":"grenadine-pink", + "cmyk_array":[ + 0, + 62, + 58, + 0 + ], + "cmyk":"C:0 / M:62 / Y:58 / K:0", + "rgb_array":[ + 255, + 97, + 107 + ], + "rgb":"R:255 / G:97 / B:107", + "hex":"#ff616b", + "combinations":[ + 6, + 21, + 112, + 166, + 193, + 201, + 230, + 300, + 315, + 341 + ], + "use_count":10 + }, + { + "index":9, + "name":"Eosine Pink", + "slug":"eosine-pink", + "cmyk_array":[ + 0, + 63, + 23, + 0 + ], + "cmyk":"C:0 / M:63 / Y:23 / K:0", + "rgb_array":[ + 255, + 94, + 196 + ], + "rgb":"R:255 / G:94 / B:196", + "hex":"#ff5ec4", + "combinations":[ + 34, + 59, + 90, + 108, + 134, + 153, + 197, + 242, + 248, + 276, + 287, + 314, + 327, + 336 + ], + "use_count":14 + }, + { + "index":10, + "name":"Spinel Red", + "slug":"spinel-red", + "cmyk_array":[ + 0, + 70, + 21, + 0 + ], + "cmyk":"C:0 / M:70 / Y:21 / K:0", + "rgb_array":[ + 255, + 77, + 201 + ], + "rgb":"R:255 / G:77 / B:201", + "hex":"#ff4dc9", + "combinations":[ + 14, + 147, + 165, + 184, + 195, + 224, + 277 + ], + "use_count":7 + }, + { + "index":11, + "name":"Old Rose", + "slug":"old-rose", + "cmyk_array":[ + 15, + 70, + 40, + 0 + ], + "cmyk":"C:15 / M:70 / Y:40 / K:0", + "rgb_array":[ + 217, + 77, + 153 + ], + "rgb":"R:217 / G:77 / B:153", + "hex":"#d94d99", + "combinations":[ + 55, + 162, + 260, + 265 + ], + "use_count":4 + }, + { + "index":12, + "name":"Eugenia Red | A", + "slug":"eugenia-red-|-a", + "cmyk_array":[ + 7, + 76, + 60, + 0 + ], + "cmyk":"C:7 / M:76 / Y:60 / K:0", + "rgb_array":[ + 237, + 61, + 102 + ], + "rgb":"R:237 / G:61 / B:102", + "hex":"#ed3d66", + "combinations":[ + 284 + ], + "use_count":1 + }, + { + "index":13, + "name":"Eugenia Red | B", + "slug":"eugenia-red-|-b", + "cmyk_array":[ + 0, + 80, + 50, + 10 + ], + "cmyk":"C:0 / M:80 / Y:50 / K:10", + "rgb_array":[ + 230, + 46, + 115 + ], + "rgb":"R:230 / G:46 / B:115", + "hex":"#e62e73", + "combinations":[ + 17, + 77, + 252, + 262, + 270, + 280, + 282, + 325 + ], + "use_count":8 + }, + { + "index":14, + "name":"Raw Sienna", + "slug":"raw-sienna", + "cmyk_array":[ + 18, + 58, + 100, + 12 + ], + "cmyk":"C:18 / M:58 / Y:100 / K:12", + "rgb_array":[ + 184, + 94, + 0 + ], + "rgb":"R:184 / G:94 / B:0", + "hex":"#b85e00", + "combinations":[ + 3, + 13, + 33, + 70, + 86, + 130, + 131, + 182, + 243, + 247, + 252, + 255, + 268, + 269, + 279, + 293, + 298, + 319, + 327 + ], + "use_count":19 + }, + { + "index":15, + "name":"Vinaceous Tawny", + "slug":"vinaceous-tawny", + "cmyk_array":[ + 17, + 72, + 100, + 6 + ], + "cmyk":"C:17 / M:72 / Y:100 / K:6", + "rgb_array":[ + 199, + 67, + 0 + ], + "rgb":"R:199 / G:67 / B:0", + "hex":"#c74300", + "combinations":[ + 40, + 85, + 244 + ], + "use_count":3 + }, + { + "index":16, + "name":"Jasper Red", + "slug":"jasper-red", + "cmyk_array":[ + 2, + 83, + 100, + 0 + ], + "cmyk":"C:2 / M:83 / Y:100 / K:0", + "rgb_array":[ + 250, + 43, + 0 + ], + "rgb":"R:250 / G:43 / B:0", + "hex":"#fa2b00", + "combinations":[ + 155, + 194, + 216, + 219 + ], + "use_count":4 + }, + { + "index":17, + "name":"Spectrum Red", + "slug":"spectrum-red", + "cmyk_array":[ + 5, + 100, + 100, + 0 + ], + "cmyk":"C:5 / M:100 / Y:100 / K:0", + "rgb_array":[ + 242, + 0, + 0 + ], + "rgb":"R:242 / G:0 / B:0", + "hex":"#f20000", + "combinations":[ + 257, + 266, + 301, + 322 + ], + "use_count":4 + }, + { + "index":18, + "name":"Red Orange", + "slug":"red-orange", + "cmyk_array":[ + 9, + 90, + 100, + 0 + ], + "cmyk":"C:9 / M:90 / Y:100 / K:0", + "rgb_array":[ + 232, + 25, + 0 + ], + "rgb":"R:232 / G:25 / B:0", + "hex":"#e81900", + "combinations":[ + 31, + 164, + 179, + 241, + 264 + ], + "use_count":5 + }, + { + "index":19, + "name":"Etruscan Red", + "slug":"etruscan-red", + "cmyk_array":[ + 16, + 80, + 74, + 6 + ], + "cmyk":"C:16 / M:80 / Y:74 / K:6", + "rgb_array":[ + 201, + 48, + 62 + ], + "rgb":"R:201 / G:48 / B:62", + "hex":"#c9303e", + "combinations":[ + 25, + 47, + 97, + 137, + 152, + 185, + 275 + ], + "use_count":7 + }, + { + "index":20, + "name":"Burnt Sienna", + "slug":"burnt-sienna", + "cmyk_array":[ + 22, + 76, + 100, + 15 + ], + "cmyk":"C:22 / M:76 / Y:100 / K:15", + "rgb_array":[ + 169, + 52, + 0 + ], + "rgb":"R:169 / G:52 / B:0", + "hex":"#a93400", + "combinations":[ + 198, + 242, + 263, + 285, + 286, + 297, + 312, + 333, + 343 + ], + "use_count":9 + }, + { + "index":21, + "name":"Ochre Red", + "slug":"ochre-red", + "cmyk_array":[ + 18, + 73, + 63, + 20 + ], + "cmyk":"C:18 / M:73 / Y:63 / K:20", + "rgb_array":[ + 167, + 55, + 75 + ], + "rgb":"R:167 / G:55 / B:75", + "hex":"#a7374b", + "combinations":[ + 199, + 283 + ], + "use_count":2 + }, + { + "index":22, + "name":"Scarlet", + "slug":"scarlet", + "cmyk_array":[ + 10, + 95, + 72, + 7 + ], + "cmyk":"C:10 / M:95 / Y:72 / K:7", + "rgb_array":[ + 213, + 12, + 66 + ], + "rgb":"R:213 / G:12 / B:66", + "hex":"#d50c42", + "combinations":[ + 136, + 308, + 332 + ], + "use_count":3 + }, + { + "index":23, + "name":"Carmine", + "slug":"carmine", + "cmyk_array":[ + 0, + 100, + 75, + 16 + ], + "cmyk":"C:0 / M:100 / Y:75 / K:16", + "rgb_array":[ + 214, + 0, + 54 + ], + "rgb":"R:214 / G:0 / B:54", + "hex":"#d60036", + "combinations":[ + 39, + 117, + 122, + 154, + 225, + 232, + 307, + 313 + ], + "use_count":8 + }, + { + "index":24, + "name":"Indian Lake", + "slug":"indian-lake", + "cmyk_array":[ + 12, + 89, + 35, + 9 + ], + "cmyk":"C:12 / M:89 / Y:35 / K:9", + "rgb_array":[ + 204, + 26, + 151 + ], + "rgb":"R:204 / G:26 / B:151", + "hex":"#cc1a97", + "combinations":[ + 299, + 331 + ], + "use_count":2 + }, + { + "index":25, + "name":"Rosolanc Purple", + "slug":"rosolanc-purple", + "cmyk_array":[ + 30, + 90, + 33, + 0 + ], + "cmyk":"C:30 / M:90 / Y:33 / K:0", + "rgb_array":[ + 179, + 25, + 171 + ], + "rgb":"R:179 / G:25 / B:171", + "hex":"#b319ab", + "combinations":[ + 48, + 144, + 170, + 204, + 277 + ], + "use_count":5 + }, + { + "index":26, + "name":"Pomegranite Purple", + "slug":"pomegranite-purple", + "cmyk_array":[ + 23, + 100, + 50, + 6 + ], + "cmyk":"C:23 / M:100 / Y:50 / K:6", + "rgb_array":[ + 185, + 0, + 120 + ], + "rgb":"R:185 / G:0 / B:120", + "hex":"#b90078", + "combinations":[ + 220, + 271 + ], + "use_count":2 + }, + { + "index":27, + "name":"Hydrangea Red", + "slug":"hydrangea-red", + "cmyk_array":[ + 38, + 90, + 70, + 0 + ], + "cmyk":"C:38 / M:90 / Y:70 / K:0", + "rgb_array":[ + 158, + 25, + 77 + ], + "rgb":"R:158 / G:25 / B:77", + "hex":"#9e194d", + "combinations":[ + 142 + ], + "use_count":1 + }, + { + "index":28, + "name":"Brick Red", + "slug":"brick-red", + "cmyk_array":[ + 22, + 84, + 100, + 18 + ], + "cmyk":"C:22 / M:84 / Y:100 / K:18", + "rgb_array":[ + 163, + 33, + 0 + ], + "rgb":"R:163 / G:33 / B:0", + "hex":"#a32100", + "combinations":[ + 37, + 108, + 246, + 322, + 328 + ], + "use_count":5 + }, + { + "index":29, + "name":"Carmine Red", + "slug":"carmine-red", + "cmyk_array":[ + 25, + 95, + 80, + 16 + ], + "cmyk":"C:25 / M:95 / Y:80 / K:16", + "rgb_array":[ + 161, + 11, + 43 + ], + "rgb":"R:161 / G:11 / B:43", + "hex":"#a10b2b", + "combinations":[ + 35, + 51, + 104, + 130, + 181, + 200, + 221, + 228, + 233, + 237, + 245 + ], + "use_count":11 + }, + { + "index":30, + "name":"Pompeian Red", + "slug":"pompeian-red", + "cmyk_array":[ + 18, + 97, + 74, + 19 + ], + "cmyk":"C:18 / M:97 / Y:74 / K:19", + "rgb_array":[ + 169, + 6, + 54 + ], + "rgb":"R:169 / G:6 / B:54", + "hex":"#a90636", + "combinations":[ + 30, + 71, + 120, + 212, + 311, + 324 + ], + "use_count":6 + }, + { + "index":31, + "name":"Red", + "slug":"red", + "cmyk_array":[ + 30, + 100, + 70, + 10 + ], + "cmyk":"C:30 / M:100 / Y:70 / K:10", + "rgb_array":[ + 161, + 0, + 69 + ], + "rgb":"R:161 / G:0 / B:69", + "hex":"#a10045", + "combinations":[ + 251, + 261 + ], + "use_count":2 + }, + { + "index":32, + "name":"Brown", + "slug":"brown", + "cmyk_array":[ + 35, + 74, + 90, + 35 + ], + "cmyk":"C:35 / M:74 / Y:90 / K:35", + "rgb_array":[ + 108, + 43, + 17 + ], + "rgb":"R:108 / G:43 / B:17", + "hex":"#6c2b11", + "combinations":[ + 110, + 121, + 145, + 161 + ], + "use_count":4 + }, + { + "index":33, + "name":"Hay's Russet", + "slug":"hay's-russet", + "cmyk_array":[ + 37, + 85, + 87, + 35 + ], + "cmyk":"C:37 / M:85 / Y:87 / K:35", + "rgb_array":[ + 104, + 25, + 22 + ], + "rgb":"R:104 / G:25 / B:22", + "hex":"#681916", + "combinations":[ + 58, + 82, + 95, + 152, + 186, + 231, + 249, + 304, + 314, + 336, + 345 + ], + "use_count":11 + }, + { + "index":34, + "name":"Vandyke Red", + "slug":"vandyke-red", + "cmyk_array":[ + 32, + 95, + 95, + 33 + ], + "cmyk":"C:32 / M:95 / Y:95 / K:33", + "rgb_array":[ + 116, + 9, + 9 + ], + "rgb":"R:116 / G:9 / B:9", + "hex":"#740909", + "combinations":[ + 16, + 133, + 147, + 316, + 335 + ], + "use_count":5 + }, + { + "index":35, + "name":"Pansy Purple", + "slug":"pansy-purple", + "cmyk_array":[ + 34, + 100, + 60, + 34 + ], + "cmyk":"C:34 / M:100 / Y:60 / K:34", + "rgb_array":[ + 111, + 0, + 67 + ], + "rgb":"R:111 / G:0 / B:67", + "hex":"#6f0043", + "combinations":[ + 157, + 273 + ], + "use_count":2 + }, + { + "index":36, + "name":"Pale Burnt Lake", + "slug":"pale-burnt-lake", + "cmyk_array":[ + 25, + 90, + 80, + 40 + ], + "cmyk":"C:25 / M:90 / Y:80 / K:40", + "rgb_array":[ + 115, + 15, + 31 + ], + "rgb":"R:115 / G:15 / B:31", + "hex":"#730f1f", + "combinations":[ + 124, + 171, + 177, + 205, + 217, + 258, + 269, + 283 + ], + "use_count":8 + }, + { + "index":37, + "name":"Violet Red", + "slug":"violet-red", + "cmyk_array":[ + 75, + 100, + 50, + 5 + ], + "cmyk":"C:75 / M:100 / Y:50 / K:5", + "rgb_array":[ + 61, + 0, + 121 + ], + "rgb":"R:61 / G:0 / B:121", + "hex":"#3d0079", + "combinations":[ + 9 + ], + "use_count":1 + }, + { + "index":38, + "name":"Vistoris Lake", + "slug":"vistoris-lake", + "cmyk_array":[ + 40, + 71, + 55, + 40 + ], + "cmyk":"C:40 / M:71 / Y:55 / K:40", + "rgb_array":[ + 92, + 44, + 69 + ], + "rgb":"R:92 / G:44 / B:69", + "hex":"#5c2c45", + "combinations":[ + 63, + 91, + 165, + 226, + 290, + 337 + ], + "use_count":6 + }, + { + "index":39, + "name":"Sulpher Yellow", + "slug":"sulpher-yellow", + "cmyk_array":[ + 4, + 4, + 28, + 0 + ], + "cmyk":"C:4 / M:4 / Y:28 / K:0", + "rgb_array":[ + 245, + 245, + 184 + ], + "rgb":"R:245 / G:245 / B:184", + "hex":"#f5f5b8", + "combinations":[ + 52, + 72, + 80, + 104, + 132, + 135, + 151, + 208, + 246, + 254, + 270, + 294, + 296, + 310, + 315, + 320, + 321, + 326 + ], + "use_count":18 + }, + { + "index":40, + "name":"Pale Lemon Yellow", + "slug":"pale-lemon-yellow", + "cmyk_array":[ + 0, + 4, + 38, + 0 + ], + "cmyk":"C:0 / M:4 / Y:38 / K:0", + "rgb_array":[ + 255, + 245, + 158 + ], + "rgb":"R:255 / G:245 / B:158", + "hex":"#fff59e", + "combinations":[ + 3, + 31, + 60, + 76, + 99, + 109, + 111, + 169, + 185, + 195, + 203, + 228, + 241, + 261, + 272, + 281, + 290, + 292, + 336 + ], + "use_count":19 + }, + { + "index":41, + "name":"Naples Yellow", + "slug":"naples-yellow", + "cmyk_array":[ + 2, + 7, + 44, + 0 + ], + "cmyk":"C:2 / M:7 / Y:44 / K:0", + "rgb_array":[ + 250, + 237, + 143 + ], + "rgb":"R:250 / G:237 / B:143", + "hex":"#faed8f", + "combinations":[ + 14, + 115, + 166, + 193, + 303, + 325 + ], + "use_count":6 + }, + { + "index":42, + "name":"Ivory Buff", + "slug":"ivory-buff", + "cmyk_array":[ + 8, + 15, + 40, + 0 + ], + "cmyk":"C:8 / M:15 / Y:40 / K:0", + "rgb_array":[ + 235, + 217, + 153 + ], + "rgb":"R:235 / G:217 / B:153", + "hex":"#ebd999", + "combinations":[ + 11, + 50, + 94, + 102, + 126, + 178, + 184, + 190, + 209, + 214, + 235, + 243, + 262, + 266, + 301, + 343 + ], + "use_count":16 + }, + { + "index":43, + "name":"Seashell Pink", + "slug":"seashell-pink", + "cmyk_array":[ + 0, + 19, + 23, + 0 + ], + "cmyk":"C:0 / M:19 / Y:23 / K:0", + "rgb_array":[ + 255, + 207, + 196 + ], + "rgb":"R:255 / G:207 / B:196", + "hex":"#ffcfc4", + "combinations":[ + 45, + 84, + 88, + 113, + 150, + 176, + 194, + 276, + 334 + ], + "use_count":9 + }, + { + "index":44, + "name":"Light Pinkish Cinnamon", + "slug":"light-pinkish-cinnamon", + "cmyk_array":[ + 0, + 25, + 40, + 0 + ], + "cmyk":"C:0 / M:25 / Y:40 / K:0", + "rgb_array":[ + 255, + 191, + 153 + ], + "rgb":"R:255 / G:191 / B:153", + "hex":"#ffbf99", + "combinations":[ + 317 + ], + "use_count":1 + }, + { + "index":45, + "name":"Pinkish Cinnamon", + "slug":"pinkish-cinnamon", + "cmyk_array":[ + 5, + 32, + 53, + 0 + ], + "cmyk":"C:5 / M:32 / Y:53 / K:0", + "rgb_array":[ + 242, + 173, + 120 + ], + "rgb":"R:242 / G:173 / B:120", + "hex":"#f2ad78", + "combinations":[ + 78, + 175, + 232, + 258, + 263, + 292, + 305, + 310 + ], + "use_count":8 + }, + { + "index":46, + "name":"Cinnamon Buff", + "slug":"cinnamon-buff", + "cmyk_array":[ + 0, + 25, + 57, + 0 + ], + "cmyk":"C:0 / M:25 / Y:57 / K:0", + "rgb_array":[ + 255, + 191, + 110 + ], + "rgb":"R:255 / G:191 / B:110", + "hex":"#ffbf6e", + "combinations":[ + 23, + 127, + 137, + 180, + 210, + 234, + 246, + 323, + 344 + ], + "use_count":9 + }, + { + "index":47, + "name":"Cream Yellow", + "slug":"cream-yellow", + "cmyk_array":[ + 0, + 28, + 68, + 0 + ], + "cmyk":"C:0 / M:28 / Y:68 / K:0", + "rgb_array":[ + 255, + 184, + 82 + ], + "rgb":"R:255 / G:184 / B:82", + "hex":"#ffb852", + "combinations":[ + 122, + 192, + 215, + 226, + 267, + 278, + 294, + 295, + 300, + 302, + 304, + 311, + 329, + 342 + ], + "use_count":14 + }, + { + "index":48, + "name":"Golden Yellow", + "slug":"golden-yellow", + "cmyk_array":[ + 2, + 42, + 74, + 0 + ], + "cmyk":"C:2 / M:42 / Y:74 / K:0", + "rgb_array":[ + 250, + 148, + 66 + ], + "rgb":"R:250 / G:148 / B:66", + "hex":"#fa9442", + "combinations":[ + 26, + 81, + 132, + 138, + 140, + 179 + ], + "use_count":6 + }, + { + "index":49, + "name":"Vinaceous Cinnamon", + "slug":"vinaceous-cinnamon", + "cmyk_array":[ + 4, + 40, + 42, + 0 + ], + "cmyk":"C:4 / M:40 / Y:42 / K:0", + "rgb_array":[ + 245, + 153, + 148 + ], + "rgb":"R:245 / G:153 / B:148", + "hex":"#f59994", + "combinations":[ + 203, + 205, + 213, + 256, + 260, + 279, + 299 + ], + "use_count":7 + }, + { + "index":50, + "name":"Ochraceous Salmon", + "slug":"ochraceous-salmon", + "cmyk_array":[ + 15, + 38, + 55, + 0 + ], + "cmyk":"C:15 / M:38 / Y:55 / K:0", + "rgb_array":[ + 217, + 158, + 115 + ], + "rgb":"R:217 / G:158 / B:115", + "hex":"#d99e73", + "combinations":[ + 32, + 71, + 121, + 186, + 217, + 220, + 223, + 238, + 296, + 339 + ], + "use_count":10 + }, + { + "index":51, + "name":"Isabella Color", + "slug":"isabella-color", + "cmyk_array":[ + 15, + 28, + 60, + 10 + ], + "cmyk":"C:15 / M:28 / Y:60 / K:10", + "rgb_array":[ + 195, + 165, + 92 + ], + "rgb":"R:195 / G:165 / B:92", + "hex":"#c3a55c", + "combinations":[ + 4, + 12, + 241, + 292 + ], + "use_count":4 + }, + { + "index":52, + "name":"Maple", + "slug":"maple", + "cmyk_array":[ + 5, + 26, + 56, + 20 + ], + "cmyk":"C:5 / M:26 / Y:56 / K:20", + "rgb_array":[ + 194, + 151, + 90 + ], + "rgb":"R:194 / G:151 / B:90", + "hex":"#c2975a", + "combinations":[ + 282 + ], + "use_count":1 + }, + { + "index":53, + "name":"Olive Buff", + "slug":"olive-buff", + "cmyk_array":[ + 16, + 6, + 42, + 12 + ], + "cmyk":"C:16 / M:6 / Y:42 / K:12", + "rgb_array":[ + 188, + 211, + 130 + ], + "rgb":"R:188 / G:211 / B:130", + "hex":"#bcd382", + "combinations":[ + 83, + 175, + 200, + 330, + 348 + ], + "use_count":5 + }, + { + "index":54, + "name":"Ecru", + "slug":"ecru", + "cmyk_array":[ + 20, + 25, + 40, + 6 + ], + "cmyk":"C:20 / M:25 / Y:40 / K:6", + "rgb_array":[ + 192, + 180, + 144 + ], + "rgb":"R:192 / G:180 / B:144", + "hex":"#c0b490", + "combinations":[ + 167, + 249, + 275, + 279, + 292, + 302, + 317, + 327 + ], + "use_count":8 + }, + { + "index":55, + "name":"Yellow", + "slug":"yellow", + "cmyk_array":[ + 0, + 0, + 100, + 0 + ], + "cmyk":"C:0 / M:0 / Y:100 / K:0", + "rgb_array":[ + 255, + 255, + 0 + ], + "rgb":"R:255 / G:255 / B:0", + "hex":"#ffff00", + "combinations":[ + 22, + 62, + 68, + 154, + 240, + 251, + 295, + 313 + ], + "use_count":8 + }, + { + "index":56, + "name":"Lemon Yellow", + "slug":"lemon-yellow", + "cmyk_array":[ + 5, + 0, + 85, + 0 + ], + "cmyk":"C:5 / M:0 / Y:85 / K:0", + "rgb_array":[ + 242, + 255, + 38 + ], + "rgb":"R:242 / G:255 / B:38", + "hex":"#f2ff26", + "combinations":[ + 45, + 123, + 138, + 158, + 168, + 173, + 189, + 210, + 253, + 259, + 289, + 298, + 306, + 317, + 333 + ], + "use_count":15 + }, + { + "index":57, + "name":"Apricot Yellow", + "slug":"apricot-yellow", + "cmyk_array":[ + 0, + 10, + 100, + 0 + ], + "cmyk":"C:0 / M:10 / Y:100 / K:0", + "rgb_array":[ + 255, + 230, + 0 + ], + "rgb":"R:255 / G:230 / B:0", + "hex":"#ffe600", + "combinations":[ + 107, + 129, + 163, + 198, + 213, + 247, + 265, + 284, + 305, + 319 + ], + "use_count":10 + }, + { + "index":58, + "name":"Pyrite Yellow", + "slug":"pyrite-yellow", + "cmyk_array":[ + 23, + 25, + 80, + 0 + ], + "cmyk":"C:23 / M:25 / Y:80 / K:0", + "rgb_array":[ + 196, + 191, + 51 + ], + "rgb":"R:196 / G:191 / B:51", + "hex":"#c4bf33", + "combinations":[ + 239, + 250, + 255, + 287 + ], + "use_count":4 + }, + { + "index":59, + "name":"Olive Ocher", + "slug":"olive-ocher", + "cmyk_array":[ + 18, + 26, + 90, + 0 + ], + "cmyk":"C:18 / M:26 / Y:90 / K:0", + "rgb_array":[ + 209, + 189, + 25 + ], + "rgb":"R:209 / G:189 / B:25", + "hex":"#d1bd19", + "combinations":[ + 66, + 148, + 149, + 156, + 157, + 249, + 278 + ], + "use_count":7 + }, + { + "index":60, + "name":"Yellow Ocher", + "slug":"yellow-ocher", + "cmyk_array":[ + 12, + 28, + 88, + 0 + ], + "cmyk":"C:12 / M:28 / Y:88 / K:0", + "rgb_array":[ + 224, + 184, + 31 + ], + "rgb":"R:224 / G:184 / B:31", + "hex":"#e0b81f", + "combinations":[ + 42, + 96, + 118, + 124, + 126, + 191, + 222, + 325 + ], + "use_count":8 + }, + { + "index":61, + "name":"Orange Yellow", + "slug":"orange-yellow", + "cmyk_array":[ + 0, + 33, + 100, + 0 + ], + "cmyk":"C:0 / M:33 / Y:100 / K:0", + "rgb_array":[ + 255, + 171, + 0 + ], + "rgb":"R:255 / G:171 / B:0", + "hex":"#ffab00", + "combinations":[ + 114, + 148, + 153, + 164, + 170, + 257, + 286, + 338 + ], + "use_count":8 + }, + { + "index":62, + "name":"Yellow Orange", + "slug":"yellow-orange", + "cmyk_array":[ + 0, + 45, + 100, + 0 + ], + "cmyk":"C:0 / M:45 / Y:100 / K:0", + "rgb_array":[ + 255, + 140, + 0 + ], + "rgb":"R:255 / G:140 / B:0", + "hex":"#ff8c00", + "combinations":[ + 22, + 53, + 89, + 151, + 171, + 209, + 222, + 235, + 267, + 288, + 297, + 312, + 319, + 335 + ], + "use_count":14 + }, + { + "index":63, + "name":"Apricot Orange", + "slug":"apricot-orange", + "cmyk_array":[ + 0, + 55, + 75, + 0 + ], + "cmyk":"C:0 / M:55 / Y:75 / K:0", + "rgb_array":[ + 255, + 115, + 64 + ], + "rgb":"R:255 / G:115 / B:64", + "hex":"#ff7340", + "combinations":[ + 211, + 253, + 309, + 328 + ], + "use_count":4 + }, + { + "index":64, + "name":"Orange", + "slug":"orange", + "cmyk_array":[ + 0, + 68, + 100, + 0 + ], + "cmyk":"C:0 / M:68 / Y:100 / K:0", + "rgb_array":[ + 255, + 82, + 0 + ], + "rgb":"R:255 / G:82 / B:0", + "hex":"#ff5200", + "combinations":[ + 7, + 46, + 141, + 144, + 149, + 256, + 272 + ], + "use_count":7 + }, + { + "index":65, + "name":"Peach Red", + "slug":"peach-red", + "cmyk_array":[ + 0, + 80, + 90, + 0 + ], + "cmyk":"C:0 / M:80 / Y:90 / K:0", + "rgb_array":[ + 255, + 51, + 25 + ], + "rgb":"R:255 / G:51 / B:25", + "hex":"#ff3319", + "combinations":[ + 115, + 250, + 274, + 285, + 298, + 303, + 326, + 340 + ], + "use_count":8 + }, + { + "index":66, + "name":"English Red", + "slug":"english-red", + "cmyk_array":[ + 13, + 73, + 100, + 0 + ], + "cmyk":"C:13 / M:73 / Y:100 / K:0", + "rgb_array":[ + 222, + 69, + 0 + ], + "rgb":"R:222 / G:69 / B:0", + "hex":"#de4500", + "combinations":[ + 1, + 131, + 190, + 308, + 339 + ], + "use_count":5 + }, + { + "index":67, + "name":"Cinnamon Rufous", + "slug":"cinnamon-rufous", + "cmyk_array":[ + 20, + 60, + 82, + 5 + ], + "cmyk":"C:20 / M:60 / Y:82 / K:5", + "rgb_array":[ + 194, + 97, + 44 + ], + "rgb":"R:194 / G:97 / B:44", + "hex":"#c2612c", + "combinations":[ + 8, + 10, + 103, + 158, + 172, + 204, + 206 + ], + "use_count":7 + }, + { + "index":68, + "name":"Orange Rufous", + "slug":"orange-rufous", + "cmyk_array":[ + 18, + 65, + 100, + 8 + ], + "cmyk":"C:18 / M:65 / Y:100 / K:8", + "rgb_array":[ + 192, + 82, + 0 + ], + "rgb":"R:192 / G:82 / B:0", + "hex":"#c05200", + "combinations":[ + 91, + 102, + 222 + ], + "use_count":3 + }, + { + "index":69, + "name":"Sulphine Yellow", + "slug":"sulphine-yellow", + "cmyk_array":[ + 24, + 32, + 100, + 4 + ], + "cmyk":"C:24 / M:32 / Y:100 / K:4", + "rgb_array":[ + 186, + 166, + 0 + ], + "rgb":"R:186 / G:166 / B:0", + "hex":"#baa600", + "combinations":[ + 36, + 65, + 142, + 160, + 252 + ], + "use_count":5 + }, + { + "index":70, + "name":"Khaki", + "slug":"khaki", + "cmyk_array":[ + 24, + 45, + 100, + 6 + ], + "cmyk":"C:24 / M:45 / Y:100 / K:6", + "rgb_array":[ + 182, + 132, + 0 + ], + "rgb":"R:182 / G:132 / B:0", + "hex":"#b68400", + "combinations":[ + 129, + 146, + 159, + 236, + 248 + ], + "use_count":5 + }, + { + "index":71, + "name":"Citron Yellow", + "slug":"citron-yellow", + "cmyk_array":[ + 35, + 17, + 95, + 0 + ], + "cmyk":"C:35 / M:17 / Y:95 / K:0", + "rgb_array":[ + 166, + 212, + 13 + ], + "rgb":"R:166 / G:212 / B:13", + "hex":"#a6d40d", + "combinations":[ + 59, + 93, + 132, + 133, + 262 + ], + "use_count":5 + }, + { + "index":72, + "name":"Buffy Citrine", + "slug":"buffy-citrine", + "cmyk_array":[ + 42, + 40, + 82, + 8 + ], + "cmyk":"C:42 / M:40 / Y:82 / K:8", + "rgb_array":[ + 136, + 141, + 42 + ], + "rgb":"R:136 / G:141 / B:42", + "hex":"#888d2a", + "combinations":[ + 100, + 177, + 233 + ], + "use_count":3 + }, + { + "index":73, + "name":"Dark Citrine", + "slug":"dark-citrine", + "cmyk_array":[ + 38, + 34, + 67, + 20 + ], + "cmyk":"C:38 / M:34 / Y:67 / K:20", + "rgb_array":[ + 126, + 135, + 67 + ], + "rgb":"R:126 / G:135 / B:67", + "hex":"#7e8743", + "combinations":[ + 10, + 41, + 274, + 304 + ], + "use_count":4 + }, + { + "index":74, + "name":"Light Grayish Olive", + "slug":"light-grayish-olive", + "cmyk_array":[ + 43, + 36, + 62, + 19 + ], + "cmyk":"C:43 / M:36 / Y:62 / K:19", + "rgb_array":[ + 118, + 132, + 78 + ], + "rgb":"R:118 / G:132 / B:78", + "hex":"#76844e", + "combinations":[ + 107, + 184 + ], + "use_count":2 + }, + { + "index":75, + "name":"Krongbergs Green", + "slug":"krongbergs-green", + "cmyk_array":[ + 48, + 35, + 70, + 12 + ], + "cmyk":"C:48 / M:35 / Y:70 / K:12", + "rgb_array":[ + 117, + 146, + 67 + ], + "rgb":"R:117 / G:146 / B:67", + "hex":"#759243", + "combinations":[ + 29 + ], + "use_count":1 + }, + { + "index":76, + "name":"Olive", + "slug":"olive", + "cmyk_array":[ + 48, + 38, + 100, + 15 + ], + "cmyk":"C:48 / M:38 / Y:100 / K:15", + "rgb_array":[ + 113, + 134, + 0 + ], + "rgb":"R:113 / G:134 / B:0", + "hex":"#718600", + "combinations":[ + 96, + 201, + 254, + 258, + 277, + 310, + 334 + ], + "use_count":7 + }, + { + "index":77, + "name":"Orange Citrine", + "slug":"orange-citrine", + "cmyk_array":[ + 28, + 48, + 92, + 24 + ], + "cmyk":"C:28 / M:48 / Y:92 / K:24", + "rgb_array":[ + 140, + 101, + 16 + ], + "rgb":"R:140 / G:101 / B:16", + "hex":"#8c6510", + "combinations":[ + 212, + 342 + ], + "use_count":2 + }, + { + "index":78, + "name":"Sudan Brown", + "slug":"sudan-brown", + "cmyk_array":[ + 25, + 60, + 65, + 19 + ], + "cmyk":"C:25 / M:60 / Y:65 / K:19", + "rgb_array":[ + 155, + 83, + 72 + ], + "rgb":"R:155 / G:83 / B:72", + "hex":"#9b5348", + "combinations":[ + 207, + 214, + 273 + ], + "use_count":3 + }, + { + "index":79, + "name":"Olive Green", + "slug":"olive-green", + "cmyk_array":[ + 56, + 40, + 85, + 22 + ], + "cmyk":"C:56 / M:40 / Y:85 / K:22", + "rgb_array":[ + 88, + 119, + 30 + ], + "rgb":"R:88 / G:119 / B:30", + "hex":"#58771e", + "combinations":[ + 66, + 243, + 270, + 297 + ], + "use_count":4 + }, + { + "index":80, + "name":"Light Brownish Olive", + "slug":"light-brownish-olive", + "cmyk_array":[ + 42, + 46, + 73, + 24 + ], + "cmyk":"C:42 / M:46 / Y:73 / K:24", + "rgb_array":[ + 112, + 105, + 52 + ], + "rgb":"R:112 / G:105 / B:52", + "hex":"#706934", + "combinations":[ + 199, + 318 + ], + "use_count":2 + }, + { + "index":81, + "name":"Deep Grayish Olive", + "slug":"deep-grayish-olive", + "cmyk_array":[ + 50, + 48, + 78, + 37 + ], + "cmyk":"C:50 / M:48 / Y:78 / K:37", + "rgb_array":[ + 80, + 84, + 35 + ], + "rgb":"R:80 / G:84 / B:35", + "hex":"#505423", + "combinations":[ + 146, + 343 + ], + "use_count":2 + }, + { + "index":82, + "name":"Pale Raw Umber", + "slug":"pale-raw-umber", + "cmyk_array":[ + 46, + 63, + 87, + 32 + ], + "cmyk":"C:46 / M:63 / Y:87 / K:32", + "rgb_array":[ + 94, + 64, + 23 + ], + "rgb":"R:94 / G:64 / B:23", + "hex":"#5e4017", + "combinations":[ + 26, + 73, + 160, + 234, + 296 + ], + "use_count":5 + }, + { + "index":83, + "name":"Sepia", + "slug":"sepia", + "cmyk_array":[ + 48, + 60, + 100, + 40 + ], + "cmyk":"C:48 / M:60 / Y:100 / K:40", + "rgb_array":[ + 80, + 61, + 0 + ], + "rgb":"R:80 / G:61 / B:0", + "hex":"#503d00", + "combinations":[ + 24, + 288 + ], + "use_count":2 + }, + { + "index":84, + "name":"Madder Brown", + "slug":"madder-brown", + "cmyk_array":[ + 36, + 88, + 100, + 38 + ], + "cmyk":"C:36 / M:88 / Y:100 / K:38", + "rgb_array":[ + 101, + 19, + 0 + ], + "rgb":"R:101 / G:19 / B:0", + "hex":"#651300", + "combinations":[ + 28, + 79, + 98, + 173, + 237, + 275, + 323 + ], + "use_count":7 + }, + { + "index":85, + "name":"Mars Brown / Tobacco", + "slug":"mars-brown-tobacco", + "cmyk_array":[ + 39, + 76, + 100, + 47 + ], + "cmyk":"C:39 / M:76 / Y:100 / K:47", + "rgb_array":[ + 82, + 32, + 0 + ], + "rgb":"R:82 / G:32 / B:0", + "hex":"#522000", + "combinations":[ + 19 + ], + "use_count":1 + }, + { + "index":86, + "name":"Vandyke Brown", + "slug":"vandyke-brown", + "cmyk_array":[ + 56, + 71, + 97, + 52 + ], + "cmyk":"C:56 / M:71 / Y:97 / K:52", + "rgb_array":[ + 54, + 35, + 4 + ], + "rgb":"R:54 / G:35 / B:4", + "hex":"#362304", + "combinations":[ + 110, + 113, + 118, + 182, + 192 + ], + "use_count":5 + }, + { + "index":87, + "name":"Turquoise Green", + "slug":"turquoise-green", + "cmyk_array":[ + 29, + 0, + 24, + 0 + ], + "cmyk":"C:29 / M:0 / Y:24 / K:0", + "rgb_array":[ + 181, + 255, + 194 + ], + "rgb":"R:181 / G:255 / B:194", + "hex":"#b5ffc2", + "combinations":[ + 36, + 74, + 147, + 163, + 173, + 202, + 223, + 230, + 263, + 272, + 285, + 293, + 300, + 305, + 317, + 346 + ], + "use_count":16 + }, + { + "index":88, + "name":"Glaucous Green", + "slug":"glaucous-green", + "cmyk_array":[ + 30, + 9, + 24, + 0 + ], + "cmyk":"C:30 / M:9 / Y:24 / K:0", + "rgb_array":[ + 179, + 232, + 194 + ], + "rgb":"R:179 / G:232 / B:194", + "hex":"#b3e8c2", + "combinations":[ + 7, + 150, + 171, + 207, + 239, + 260 + ], + "use_count":6 + }, + { + "index":89, + "name":"Dark Greenish Glaucous", + "slug":"dark-greenish-glaucous", + "cmyk_array":[ + 30, + 15, + 36, + 0 + ], + "cmyk":"C:30 / M:15 / Y:36 / K:0", + "rgb_array":[ + 179, + 217, + 163 + ], + "rgb":"R:179 / G:217 / B:163", + "hex":"#b3d9a3", + "combinations":[ + 264, + 311 + ], + "use_count":2 + }, + { + "index":90, + "name":"Yellow Green", + "slug":"yellow-green", + "cmyk_array":[ + 35, + 0, + 72, + 0 + ], + "cmyk":"C:35 / M:0 / Y:72 / K:0", + "rgb_array":[ + 166, + 255, + 71 + ], + "rgb":"R:166 / G:255 / B:71", + "hex":"#a6ff47", + "combinations":[ + 111, + 141, + 276, + 326, + 334 + ], + "use_count":5 + }, + { + "index":91, + "name":"Light Green Yellow", + "slug":"light-green-yellow", + "cmyk_array":[ + 26, + 5, + 85, + 0 + ], + "cmyk":"C:26 / M:5 / Y:85 / K:0", + "rgb_array":[ + 189, + 242, + 38 + ], + "rgb":"R:189 / G:242 / B:38", + "hex":"#bdf226", + "combinations":[ + 61, + 289, + 291, + 311, + 346 + ], + "use_count":5 + }, + { + "index":92, + "name":"Night Green", + "slug":"night-green", + "cmyk_array":[ + 52, + 0, + 100, + 0 + ], + "cmyk":"C:52 / M:0 / Y:100 / K:0", + "rgb_array":[ + 122, + 255, + 0 + ], + "rgb":"R:122 / G:255 / B:0", + "hex":"#7aff00", + "combinations":[ + 19, + 32, + 158, + 326 + ], + "use_count":4 + }, + { + "index":93, + "name":"Olive Yellow", + "slug":"olive-yellow", + "cmyk_array":[ + 40, + 30, + 80, + 0 + ], + "cmyk":"C:40 / M:30 / Y:80 / K:0", + "rgb_array":[ + 153, + 179, + 51 + ], + "rgb":"R:153 / G:179 / B:51", + "hex":"#99b333", + "combinations":[ + 124, + 211, + 265, + 347 + ], + "use_count":4 + }, + { + "index":94, + "name":"Artemesia Green", + "slug":"artemesia-green", + "cmyk_array":[ + 57, + 28, + 39, + 8 + ], + "cmyk":"C:57 / M:28 / Y:39 / K:8", + "rgb_array":[ + 101, + 169, + 143 + ], + "rgb":"R:101 / G:169 / B:143", + "hex":"#65a98f", + "combinations":[ + 293, + 312 + ], + "use_count":2 + }, + { + "index":95, + "name":"Andover Green", + "slug":"andover-green", + "cmyk_array":[ + 60, + 40, + 50, + 10 + ], + "cmyk":"C:60 / M:40 / Y:50 / K:10", + "rgb_array":[ + 92, + 138, + 115 + ], + "rgb":"R:92 / G:138 / B:115", + "hex":"#5c8a73", + "combinations":[ + 244, + 346 + ], + "use_count":2 + }, + { + "index":96, + "name":"Rainette Green", + "slug":"rainette-green", + "cmyk_array":[ + 42, + 20, + 62, + 10 + ], + "cmyk":"C:42 / M:20 / Y:62 / K:10", + "rgb_array":[ + 133, + 184, + 87 + ], + "rgb":"R:133 / G:184 / B:87", + "hex":"#85b857", + "combinations":[ + 105, + 200, + 219, + 283 + ], + "use_count":4 + }, + { + "index":97, + "name":"Pistachio Green", + "slug":"pistachio-green", + "cmyk_array":[ + 64, + 29, + 56, + 6 + ], + "cmyk":"C:64 / M:29 / Y:56 / K:6", + "rgb_array":[ + 86, + 170, + 105 + ], + "rgb":"R:86 / G:170 / B:105", + "hex":"#56aa69", + "combinations":[ + 127, + 237 + ], + "use_count":2 + }, + { + "index":98, + "name":"Sea Green", + "slug":"sea-green", + "cmyk_array":[ + 80, + 0, + 51, + 0 + ], + "cmyk":"C:80 / M:0 / Y:51 / K:0", + "rgb_array":[ + 51, + 255, + 125 + ], + "rgb":"R:51 / G:255 / B:125", + "hex":"#33ff7d", + "combinations":[ + 17, + 21, + 58, + 86, + 133, + 250, + 260, + 284, + 291, + 340, + 347 + ], + "use_count":11 + }, + { + "index":99, + "name":"Benzol Green", + "slug":"benzol-green", + "cmyk_array":[ + 100, + 15, + 55, + 0 + ], + "cmyk":"C:100 / M:15 / Y:55 / K:0", + "rgb_array":[ + 0, + 217, + 115 + ], + "rgb":"R:0 / G:217 / B:115", + "hex":"#00d973", + "combinations":[ + 15, + 54, + 92, + 122, + 155, + 247, + 266, + 267, + 281, + 304, + 306 + ], + "use_count":11 + }, + { + "index":100, + "name":"Light Porcelain Green", + "slug":"light-porcelain-green", + "cmyk_array":[ + 86, + 22, + 50, + 3 + ], + "cmyk":"C:86 / M:22 / Y:50 / K:3", + "rgb_array":[ + 35, + 193, + 124 + ], + "rgb":"R:35 / G:193 / B:124", + "hex":"#23c17c", + "combinations":[ + 44, + 193, + 328 + ], + "use_count":3 + }, + { + "index":101, + "name":"Green", + "slug":"green", + "cmyk_array":[ + 75, + 21, + 73, + 0 + ], + "cmyk":"C:75 / M:21 / Y:73 / K:0", + "rgb_array":[ + 64, + 201, + 69 + ], + "rgb":"R:64 / G:201 / B:69", + "hex":"#40c945", + "combinations":[ + 198, + 216, + 293 + ], + "use_count":3 + }, + { + "index":102, + "name":"Dull Viridian Green", + "slug":"dull-viridian-green", + "cmyk_array":[ + 90, + 20, + 80, + 0 + ], + "cmyk":"C:90 / M:20 / Y:80 / K:0", + "rgb_array":[ + 25, + 204, + 51 + ], + "rgb":"R:25 / G:204 / B:51", + "hex":"#19cc33", + "combinations":[ + 136, + 256, + 306, + 316 + ], + "use_count":4 + }, + { + "index":103, + "name":"Oil Green", + "slug":"oil-green", + "cmyk_array":[ + 53, + 28, + 100, + 8 + ], + "cmyk":"C:53 / M:28 / Y:100 / K:8", + "rgb_array":[ + 110, + 169, + 0 + ], + "rgb":"R:110 / G:169 / B:0", + "hex":"#6ea900", + "combinations":[ + 245, + 299, + 320 + ], + "use_count":3 + }, + { + "index":104, + "name":"Diamine Green", + "slug":"diamine-green", + "cmyk_array":[ + 87, + 32, + 91, + 18 + ], + "cmyk":"C:87 / M:32 / Y:91 / K:18", + "rgb_array":[ + 27, + 142, + 19 + ], + "rgb":"R:27 / G:142 / B:19", + "hex":"#1b8e13", + "combinations":[ + 38, + 146, + 217, + 242, + 251, + 313 + ], + "use_count":6 + }, + { + "index":105, + "name":"Cossack Green", + "slug":"cossack-green", + "cmyk_array":[ + 76, + 32, + 91, + 18 + ], + "cmyk":"C:76 / M:32 / Y:91 / K:18", + "rgb_array":[ + 50, + 142, + 19 + ], + "rgb":"R:50 / G:142 / B:19", + "hex":"#328e13", + "combinations":[ + 5, + 135, + 262, + 270, + 278, + 294, + 319, + 341, + 348 + ], + "use_count":9 + }, + { + "index":106, + "name":"Lincoln Green", + "slug":"lincoln-green", + "cmyk_array":[ + 60, + 48, + 86, + 37 + ], + "cmyk":"C:60 / M:48 / Y:86 / K:37", + "rgb_array":[ + 64, + 84, + 22 + ], + "rgb":"R:64 / G:84 / B:22", + "hex":"#405416", + "combinations":[ + 70, + 121, + 203, + 210, + 280, + 290 + ], + "use_count":6 + }, + { + "index":107, + "name":"Blackish Olive", + "slug":"blackish-olive", + "cmyk_array":[ + 56, + 32, + 63, + 55 + ], + "cmyk":"C:56 / M:32 / Y:63 / K:55", + "rgb_array":[ + 50, + 78, + 42 + ], + "rgb":"R:50 / G:78 / B:42", + "hex":"#324e2a", + "combinations":[ + 109, + 318, + 336 + ], + "use_count":3 + }, + { + "index":108, + "name":"Deep Slate Olive", + "slug":"deep-slate-olive", + "cmyk_array":[ + 76, + 60, + 80, + 62 + ], + "cmyk":"C:76 / M:60 / Y:80 / K:62", + "rgb_array":[ + 23, + 39, + 19 + ], + "rgb":"R:23 / G:39 / B:19", + "hex":"#172713", + "combinations":[ + 189, + 229, + 268, + 303, + 310, + 321, + 332, + 341, + 342, + 348 + ], + "use_count":10 + }, + { + "index":109, + "name":"Nile Blue", + "slug":"nile-blue", + "cmyk_array":[ + 25, + 0, + 10, + 0 + ], + "cmyk":"C:25 / M:0 / Y:10 / K:0", + "rgb_array":[ + 191, + 255, + 230 + ], + "rgb":"R:191 / G:255 / B:230", + "hex":"#bfffe6", + "combinations":[ + 25, + 250, + 268, + 302, + 306, + 330, + 345 + ], + "use_count":7 + }, + { + "index":110, + "name":"Pale King's Blue", + "slug":"pale-king's-blue", + "cmyk_array":[ + 33, + 4, + 7, + 0 + ], + "cmyk":"C:33 / M:4 / Y:7 / K:0", + "rgb_array":[ + 171, + 245, + 237 + ], + "rgb":"R:171 / G:245 / B:237", + "hex":"#abf5ed", + "combinations":[ + 16, + 49, + 72, + 75, + 167, + 196, + 213, + 234, + 287 + ], + "use_count":9 + }, + { + "index":111, + "name":"Light Glaucous Blue", + "slug":"light-glaucous-blue", + "cmyk_array":[ + 35, + 10, + 14, + 0 + ], + "cmyk":"C:35 / M:10 / Y:14 / K:0", + "rgb_array":[ + 166, + 230, + 219 + ], + "rgb":"R:166 / G:230 / B:219", + "hex":"#a6e6db", + "combinations":[ + 54, + 93, + 119, + 152, + 178, + 204, + 227, + 320, + 339, + 341 + ], + "use_count":10 + }, + { + "index":112, + "name":"Salvia Blue", + "slug":"salvia-blue", + "cmyk_array":[ + 41, + 25, + 10, + 0 + ], + "cmyk":"C:41 / M:25 / Y:10 / K:0", + "rgb_array":[ + 150, + 191, + 230 + ], + "rgb":"R:150 / G:191 / B:230", + "hex":"#96bfe6", + "combinations":[ + 29, + 129, + 135, + 139, + 142, + 188, + 209, + 212, + 237, + 272, + 294, + 321, + 330 + ], + "use_count":13 + }, + { + "index":113, + "name":"Cobalt Green", + "slug":"cobalt-green", + "cmyk_array":[ + 42, + 0, + 42, + 0 + ], + "cmyk":"C:42 / M:0 / Y:42 / K:0", + "rgb_array":[ + 148, + 255, + 148 + ], + "rgb":"R:148 / G:255 / B:148", + "hex":"#94ff94", + "combinations":[ + 156, + 188, + 201, + 202, + 230, + 271, + 281, + 282, + 290, + 291, + 308, + 333 + ], + "use_count":12 + }, + { + "index":114, + "name":"Calamine BLue", + "slug":"calamine-blue", + "cmyk_array":[ + 50, + 0, + 20, + 0 + ], + "cmyk":"C:50 / M:0 / Y:20 / K:0", + "rgb_array":[ + 128, + 255, + 204 + ], + "rgb":"R:128 / G:255 / B:204", + "hex":"#80ffcc", + "combinations":[ + 20, + 41, + 65, + 159, + 176, + 255, + 261, + 287, + 291, + 300 + ], + "use_count":10 + }, + { + "index":115, + "name":"Venice Green", + "slug":"venice-green", + "cmyk_array":[ + 58, + 0, + 30, + 0 + ], + "cmyk":"C:58 / M:0 / Y:30 / K:0", + "rgb_array":[ + 107, + 255, + 179 + ], + "rgb":"R:107 / G:255 / B:179", + "hex":"#6bffb3", + "combinations":[ + 78, + 128, + 138, + 189, + 283, + 345 + ], + "use_count":6 + }, + { + "index":116, + "name":"Cerulian Blue", + "slug":"cerulian-blue", + "cmyk_array":[ + 84, + 26, + 32, + 0 + ], + "cmyk":"C:84 / M:26 / Y:32 / K:0", + "rgb_array":[ + 41, + 189, + 173 + ], + "rgb":"R:41 / G:189 / B:173", + "hex":"#29bdad", + "combinations":[ + 1, + 63, + 99, + 125, + 148, + 227, + 240, + 264 + ], + "use_count":8 + }, + { + "index":117, + "name":"Peacock Blue", + "slug":"peacock-blue", + "cmyk_array":[ + 100, + 19, + 43, + 0 + ], + "cmyk":"C:100 / M:19 / Y:43 / K:0", + "rgb_array":[ + 0, + 207, + 145 + ], + "rgb":"R:0 / G:207 / B:145", + "hex":"#00cf91", + "combinations":[ + 131, + 286 + ], + "use_count":2 + }, + { + "index":118, + "name":"Green Blue", + "slug":"green-blue", + "cmyk_array":[ + 82, + 24, + 40, + 3 + ], + "cmyk":"C:82 / M:24 / Y:40 / K:3", + "rgb_array":[ + 45, + 188, + 148 + ], + "rgb":"R:45 / G:188 / B:148", + "hex":"#2dbc94", + "combinations":[ + 12, + 74, + 79, + 178, + 208, + 252, + 259, + 271, + 330 + ], + "use_count":9 + }, + { + "index":119, + "name":"Olympic Blue", + "slug":"olympic-blue", + "cmyk_array":[ + 69, + 44, + 10, + 0 + ], + "cmyk":"C:69 / M:44 / Y:10 / K:0", + "rgb_array":[ + 79, + 143, + 230 + ], + "rgb":"R:79 / G:143 / B:230", + "hex":"#4f8fe6", + "combinations":[ + 44, + 67, + 157, + 194, + 231, + 274, + 324 + ], + "use_count":7 + }, + { + "index":120, + "name":"Blue", + "slug":"blue", + "cmyk_array":[ + 95, + 54, + 0, + 0 + ], + "cmyk":"C:95 / M:54 / Y:0 / K:0", + "rgb_array":[ + 13, + 117, + 255 + ], + "rgb":"R:13 / G:117 / B:255", + "hex":"#0d75ff", + "combinations":[ + 49, + 51, + 88, + 143, + 154, + 186, + 191, + 215, + 257, + 267, + 295, + 333 + ], + "use_count":12 + }, + { + "index":121, + "name":"Antwarp Blue", + "slug":"antwarp-blue", + "cmyk_array":[ + 100, + 40, + 30, + 10 + ], + "cmyk":"C:100 / M:40 / Y:30 / K:10", + "rgb_array":[ + 0, + 138, + 161 + ], + "rgb":"R:0 / G:138 / B:161", + "hex":"#008aa1", + "combinations":[ + 85, + 106, + 114, + 140, + 163, + 172, + 208, + 244, + 258, + 281, + 299, + 302, + 334 + ], + "use_count":13 + }, + { + "index":122, + "name":"Helvetia Blue", + "slug":"helvetia-blue", + "cmyk_array":[ + 100, + 62, + 19, + 10 + ], + "cmyk":"C:100 / M:62 / Y:19 / K:10", + "rgb_array":[ + 0, + 87, + 186 + ], + "rgb":"R:0 / G:87 / B:186", + "hex":"#0057ba", + "combinations":[ + 39, + 48, + 161, + 187, + 218, + 259, + 312, + 347 + ], + "use_count":8 + }, + { + "index":123, + "name":"Dark Medici Blue", + "slug":"dark-medici-blue", + "cmyk_array":[ + 70, + 45, + 45, + 15 + ], + "cmyk":"C:70 / M:45 / Y:45 / K:15", + "rgb_array":[ + 65, + 119, + 119 + ], + "rgb":"R:65 / G:119 / B:119", + "hex":"#417777", + "combinations":[ + 160, + 224, + 241, + 249 + ], + "use_count":4 + }, + { + "index":124, + "name":"Dusky Green", + "slug":"dusky-green", + "cmyk_array":[ + 100, + 30, + 64, + 50 + ], + "cmyk":"C:100 / M:30 / Y:64 / K:50", + "rgb_array":[ + 0, + 89, + 46 + ], + "rgb":"R:0 / G:89 / B:46", + "hex":"#00592e", + "combinations":[ + 94, + 219, + 225, + 278, + 284, + 318, + 332, + 338 + ], + "use_count":8 + }, + { + "index":125, + "name":"Deep Lyons Blue", + "slug":"deep-lyons-blue", + "cmyk_array":[ + 100, + 85, + 15, + 6 + ], + "cmyk":"C:100 / M:85 / Y:15 / K:6", + "rgb_array":[ + 0, + 36, + 204 + ], + "rgb":"R:0 / G:36 / B:204", + "hex":"#0024cc", + "combinations":[ + 22, + 38, + 101, + 126, + 179, + 199, + 236, + 247, + 314, + 344 + ], + "use_count":10 + }, + { + "index":126, + "name":"Violet Blue", + "slug":"violet-blue", + "cmyk_array":[ + 85, + 79, + 38, + 16 + ], + "cmyk":"C:85 / M:79 / Y:38 / K:16", + "rgb_array":[ + 32, + 45, + 133 + ], + "rgb":"R:32 / G:45 / B:133", + "hex":"#202d85", + "combinations":[ + 75, + 83, + 89, + 98, + 125, + 233, + 286, + 289, + 297, + 309, + 339 + ], + "use_count":11 + }, + { + "index":127, + "name":"Vandar Poel's Blue", + "slug":"vandar-poel's-blue", + "cmyk_array":[ + 100, + 73, + 43, + 10 + ], + "cmyk":"C:100 / M:73 / Y:43 / K:10", + "rgb_array":[ + 0, + 62, + 131 + ], + "rgb":"R:0 / G:62 / B:131", + "hex":"#003e83", + "combinations":[ + + ], + "use_count":0 + }, + { + "index":128, + "name":"Dark Tyrian Blue", + "slug":"dark-tyrian-blue", + "cmyk_array":[ + 90, + 66, + 36, + 50 + ], + "cmyk":"C:90 / M:66 / Y:36 / K:50", + "rgb_array":[ + 13, + 43, + 82 + ], + "rgb":"R:13 / G:43 / B:82", + "hex":"#0d2b52", + "combinations":[ + 2, + 60, + 67, + 119, + 141, + 245, + 279 + ], + "use_count":7 + }, + { + "index":129, + "name":"Dull Violet Black", + "slug":"dull-violet-black", + "cmyk_array":[ + 95, + 106, + 38, + 50 + ], + "cmyk":"C:95 / M:106 / Y:38 / K:50", + "rgb_array":[ + 6, + 0, + 79 + ], + "rgb":"R:6 / G:0 / B:79", + "hex":"#06004f", + "combinations":[ + 95, + 106, + 145, + 265, + 277, + 289, + 295, + 331 + ], + "use_count":8 + }, + { + "index":130, + "name":"Deep Indigo", + "slug":"deep-indigo", + "cmyk_array":[ + 100, + 92, + 52, + 60 + ], + "cmyk":"C:100 / M:92 / Y:52 / K:60", + "rgb_array":[ + 0, + 8, + 49 + ], + "rgb":"R:0 / G:8 / B:49", + "hex":"#000831", + "combinations":[ + 6, + 28, + 139, + 155, + 182, + 211, + 232 + ], + "use_count":7 + }, + { + "index":131, + "name":"Deep Slate Green", + "slug":"deep-slate-green", + "cmyk_array":[ + 80, + 50, + 60, + 70 + ], + "cmyk":"C:80 / M:50 / Y:60 / K:70", + "rgb_array":[ + 15, + 38, + 31 + ], + "rgb":"R:15 / G:38 / B:31", + "hex":"#0f261f", + "combinations":[ + 84, + 149, + 166, + 271, + 318, + 325 + ], + "use_count":6 + }, + { + "index":132, + "name":"Grayish Lavender - A", + "slug":"grayish-lavender---a", + "cmyk_array":[ + 28, + 28, + 0, + 0 + ], + "cmyk":"C:28 / M:28 / Y:0 / K:0", + "rgb_array":[ + 184, + 184, + 255 + ], + "rgb":"R:184 / G:184 / B:255", + "hex":"#b8b8ff", + "combinations":[ + 8, + 15, + 159, + 177, + 218, + 248, + 307 + ], + "use_count":7 + }, + { + "index":133, + "name":"Grayish Lavender - B", + "slug":"grayish-lavender---b", + "cmyk_array":[ + 25, + 33, + 20, + 0 + ], + "cmyk":"C:25 / M:33 / Y:20 / K:0", + "rgb_array":[ + 191, + 171, + 204 + ], + "rgb":"R:191 / G:171 / B:204", + "hex":"#bfabcc", + "combinations":[ + 47, + 56, + 174, + 187, + 235, + 327, + 329, + 338 + ], + "use_count":8 + }, + { + "index":134, + "name":"Laelia Pink", + "slug":"laelia-pink", + "cmyk_array":[ + 20, + 48, + 18, + 0 + ], + "cmyk":"C:20 / M:48 / Y:18 / K:0", + "rgb_array":[ + 204, + 133, + 209 + ], + "rgb":"R:204 / G:133 / B:209", + "hex":"#cc85d1", + "combinations":[ + 20, + 254, + 280, + 337 + ], + "use_count":4 + }, + { + "index":135, + "name":"Lilac", + "slug":"lilac", + "cmyk_array":[ + 28, + 54, + 8, + 0 + ], + "cmyk":"C:28 / M:54 / Y:8 / K:0", + "rgb_array":[ + 184, + 117, + 235 + ], + "rgb":"R:184 / G:117 / B:235", + "hex":"#b875eb", + "combinations":[ + 143, + 162, + 282, + 347 + ], + "use_count":4 + }, + { + "index":136, + "name":"Eupatorium Purple", + "slug":"eupatorium-purple", + "cmyk_array":[ + 25, + 79, + 12, + 0 + ], + "cmyk":"C:25 / M:79 / Y:12 / K:0", + "rgb_array":[ + 191, + 54, + 224 + ], + "rgb":"R:191 / G:54 / B:224", + "hex":"#bf36e0", + "combinations":[ + 23, + 80, + 128, + 134, + 180, + 274, + 331 + ], + "use_count":7 + }, + { + "index":137, + "name":"Light Mauve", + "slug":"light-mauve", + "cmyk_array":[ + 43, + 62, + 5, + 0 + ], + "cmyk":"C:43 / M:62 / Y:5 / K:0", + "rgb_array":[ + 145, + 97, + 242 + ], + "rgb":"R:145 / G:97 / B:242", + "hex":"#9161f2", + "combinations":[ + 23, + 80, + 128, + 134, + 180, + 274, + 331 + ], + "use_count":7 + }, + { + "index":138, + "name":"Aconite Violet", + "slug":"aconite-violet", + "cmyk_array":[ + 39, + 68, + 5, + 0 + ], + "cmyk":"C:39 / M:68 / Y:5 / K:0", + "rgb_array":[ + 156, + 82, + 242 + ], + "rgb":"R:156 / G:82 / B:242", + "hex":"#9c52f2", + "combinations":[ + 43, + 64, + 90, + 187, + 220, + 257, + 269, + 301, + 307, + 324, + 344 + ], + "use_count":11 + }, + { + "index":139, + "name":"Dull Blue Violet", + "slug":"dull-blue-violet", + "cmyk_array":[ + 57, + 60, + 17, + 0 + ], + "cmyk":"C:57 / M:60 / Y:17 / K:0", + "rgb_array":[ + 110, + 102, + 212 + ], + "rgb":"R:110 / G:102 / B:212", + "hex":"#6e66d4", + "combinations":[ + 9, + 100 + ], + "use_count":2 + }, + { + "index":140, + "name":"Dark Soft Violet", + "slug":"dark-soft-violet", + "cmyk_array":[ + 70, + 68, + 13, + 0 + ], + "cmyk":"C:70 / M:68 / Y:13 / K:0", + "rgb_array":[ + 77, + 82, + 222 + ], + "rgb":"R:77 / G:82 / B:222", + "hex":"#4d52de", + "combinations":[ + 64, + 127, + 197 + ], + "use_count":3 + }, + { + "index":141, + "name":"Blue Violet", + "slug":"blue-violet", + "cmyk_array":[ + 72, + 80, + 0, + 0 + ], + "cmyk":"C:72 / M:80 / Y:0 / K:0", + "rgb_array":[ + 71, + 51, + 255 + ], + "rgb":"R:71 / G:51 / B:255", + "hex":"#4733ff", + "combinations":[ + 116, + 175, + 196, + 322, + 345 + ], + "use_count":5 + }, + { + "index":142, + "name":"Purple Drab", + "slug":"purple-drab", + "cmyk_array":[ + 38, + 65, + 49, + 26 + ], + "cmyk":"C:38 / M:65 / Y:49 / K:26", + "rgb_array":[ + 117, + 66, + 96 + ], + "rgb":"R:117 / G:66 / B:96", + "hex":"#754260", + "combinations":[ + 236 + ], + "use_count":1 + }, + { + "index":143, + "name":"Deep Violet / Plumbeous", + "slug":"deep-violet-plumbeous", + "cmyk_array":[ + 61, + 52, + 43, + 7 + ], + "cmyk":"C:61 / M:52 / Y:43 / K:7", + "rgb_array":[ + 92, + 114, + 135 + ], + "rgb":"R:92 / G:114 / B:135", + "hex":"#5c7287", + "combinations":[ + 183, + 192, + 218 + ], + "use_count":3 + }, + { + "index":144, + "name":"Veronia Purple", + "slug":"veronia-purple", + "cmyk_array":[ + 42, + 78, + 46, + 15 + ], + "cmyk":"C:42 / M:78 / Y:46 / K:15", + "rgb_array":[ + 126, + 48, + 117 + ], + "rgb":"R:126 / G:48 / B:117", + "hex":"#7e3075", + "combinations":[ + 13, + 24, + 168, + 183 + ], + "use_count":4 + }, + { + "index":145, + "name":"Dark Slate Purple", + "slug":"dark-slate-purple", + "cmyk_array":[ + 64, + 85, + 60, + 10 + ], + "cmyk":"C:64 / M:85 / Y:60 / K:10", + "rgb_array":[ + 83, + 34, + 92 + ], + "rgb":"R:83 / G:34 / B:92", + "hex":"#53225c", + "combinations":[ + 225, + 248 + ], + "use_count":2 + }, + { + "index":146, + "name":"Taupe Brown", + "slug":"taupe-brown", + "cmyk_array":[ + 30, + 70, + 35, + 40 + ], + "cmyk":"C:30 / M:70 / Y:35 / K:40", + "rgb_array":[ + 107, + 46, + 99 + ], + "rgb":"R:107 / G:46 / B:99", + "hex":"#6b2e63", + "combinations":[ + 57, + 123, + 174, + 224, + 275, + 280, + 288 + ], + "use_count":7 + }, + { + "index":147, + "name":"Violet Carmine", + "slug":"violet-carmine", + "cmyk_array":[ + 64, + 90, + 70, + 10 + ], + "cmyk":"C:64 / M:90 / Y:70 / K:10", + "rgb_array":[ + 83, + 23, + 69 + ], + "rgb":"R:83 / G:23 / B:69", + "hex":"#531745", + "combinations":[ + 337 + ], + "use_count":1 + }, + { + "index":148, + "name":"Violet", + "slug":"violet", + "cmyk_array":[ + 85, + 90, + 18, + 0 + ], + "cmyk":"C:85 / M:90 / Y:18 / K:0", + "rgb_array":[ + 38, + 25, + 209 + ], + "rgb":"R:38 / G:25 / B:209", + "hex":"#2619d1", + "combinations":[ + 42, + 56, + 130, + 156, + 164, + 181, + 205, + 214, + 226, + 316, + 331, + 335 + ], + "use_count":12 + }, + { + "index":149, + "name":"Red Violet", + "slug":"red-violet", + "cmyk_array":[ + 76, + 100, + 25, + 15 + ], + "cmyk":"C:76 / M:100 / Y:25 / K:15", + "rgb_array":[ + 52, + 0, + 163 + ], + "rgb":"R:52 / G:0 / B:163", + "hex":"#3400a3", + "combinations":[ + 4, + 37, + 134, + 136, + 170, + 172, + 183, + 316 + ], + "use_count":8 + }, + { + "index":150, + "name":"Cotinga Purple", + "slug":"cotinga-purple", + "cmyk_array":[ + 66, + 100, + 42, + 40 + ], + "cmyk":"C:66 / M:100 / Y:42 / K:40", + "rgb_array":[ + 52, + 0, + 89 + ], + "rgb":"R:52 / G:0 / B:89", + "hex":"#340059", + "combinations":[ + 61, + 181, + 238, + 253, + 307, + 329, + 348 + ], + "use_count":7 + }, + { + "index":151, + "name":"Dusky Madder Violet", + "slug":"dusky-madder-violet", + "cmyk_array":[ + 75, + 100, + 46, + 30 + ], + "cmyk":"C:75 / M:100 / Y:46 / K:30", + "rgb_array":[ + 45, + 0, + 96 + ], + "rgb":"R:45 / G:0 / B:96", + "hex":"#2d0060", + "combinations":[ + 18, + 50, + 53, + 82, + 103, + 314 + ], + "use_count":6 + }, + { + "index":152, + "name":"White", + "slug":"white", + "cmyk_array":[ + 0, + 0, + 0, + 0 + ], + "cmyk":"C:0 / M:0 / Y:0 / K:0", + "rgb_array":[ + 255, + 255, + 255 + ], + "rgb":"R:255 / G:255 / B:255", + "hex":"#ffffff", + "combinations":[ + 55 + ], + "use_count":1 + }, + { + "index":153, + "name":"Neutral Gray", + "slug":"neutral-gray", + "cmyk_array":[ + 29, + 18, + 20, + 0 + ], + "cmyk":"C:29 / M:18 / Y:20 / K:0", + "rgb_array":[ + 181, + 209, + 204 + ], + "rgb":"R:181 / G:209 / B:204", + "hex":"#b5d1cc", + "combinations":[ + 34, + 139, + 180, + 195, + 197, + 221, + 228, + 229, + 273, + 303, + 324, + 340 + ], + "use_count":12 + }, + { + "index":154, + "name":"Mineral Gray", + "slug":"mineral-gray", + "cmyk_array":[ + 33, + 18, + 25, + 7 + ], + "cmyk":"C:33 / M:18 / Y:25 / K:7", + "rgb_array":[ + 159, + 194, + 178 + ], + "rgb":"R:159 / G:194 / B:178", + "hex":"#9fc2b2", + "combinations":[ + 11, + 30 + ], + "use_count":2 + }, + { + "index":155, + "name":"Warm Gray", + "slug":"warm-gray", + "cmyk_array":[ + 37, + 28, + 36, + 3 + ], + "cmyk":"C:37 / M:28 / Y:36 / K:3", + "rgb_array":[ + 156, + 178, + 158 + ], + "rgb":"R:156 / G:178 / B:158", + "hex":"#9cb29e", + "combinations":[ + 69, + 76, + 81, + 143, + 169, + 238, + 259, + 261 + ], + "use_count":8 + }, + { + "index":156, + "name":"Slate Color", + "slug":"slate-color", + "cmyk_array":[ + 85, + 70, + 62, + 30 + ], + "cmyk":"C:85 / M:70 / Y:62 / K:30", + "rgb_array":[ + 27, + 54, + 68 + ], + "rgb":"R:27 / G:54 / B:68", + "hex":"#1b3644", + "combinations":[ + 27, + 33, + 57, + 140, + 202, + 243, + 245, + 251, + 253, + 263, + 296, + 329, + 335 + ], + "use_count":13 + }, + { + "index":157, + "name":"Black", + "slug":"black", + "cmyk_array":[ + 20, + 10, + 15, + 100 + ], + "cmyk":"C:20 / M:10 / Y:15 / K:100", + "rgb_array":[ + 0, + 0, + 0 + ], + "rgb":"R:0 / G:0 / B:0", + "hex":"#000000", + "combinations":[ + 46, + 52, + 62, + 69, + 112, + 117, + 144, + 190, + 207, + 216, + 221, + 242, + 255, + 256, + 269, + 276, + 288, + 198, + 313, + 323, + 337, + 340, + 344 + ], + "use_count":23 + } + ] +} \ No newline at end of file diff --git a/scripts/build_closet_dataset.py b/scripts/build_closet_dataset.py new file mode 100644 index 0000000..9e4b893 --- /dev/null +++ b/scripts/build_closet_dataset.py @@ -0,0 +1,129 @@ +"""Build synthetic-data/closet/ from the cached Fashionpedia val split. + +Prereq: .fashionpedia-cache/ holds instances_attributes_val2020.json and the +unzipped val_test2020 images (URLs in the design doc, +docs/superpowers/specs/2026-07-17-closet-dataset-design.md). +""" +import json +import random +import sys +from collections import Counter +from pathlib import Path + +from PIL import Image + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from closet_lib import group_for, make_name, sample_items, split_attributes, synthesize + +REPO = Path(__file__).resolve().parent.parent +CACHE = REPO / ".fashionpedia-cache" +OUT = REPO / "synthetic-data" / "closet" +SEED = 42 +TARGET_TOTAL = 100 +PAD_FRACTION = 0.10 +MAX_SIDE = 256 +JPEG_QUALITY = 85 + + +def load_data(): + ann_path = CACHE / "instances_attributes_val2020.json" + if not ann_path.exists(): + sys.exit(f"Missing {ann_path} — download the Fashionpedia val annotations first.") + return json.loads(ann_path.read_text()) + + +def index_image_files(): + files = {} + for p in (CACHE / "images").rglob("*.jpg"): + files[p.name] = p + if not files: + sys.exit(f"No images found under {CACHE / 'images'} — unzip val_test2020.zip there.") + return files + + +def crop_item(src_path, bbox, dst_path): + x, y, w, h = bbox + with Image.open(src_path) as im: + im = im.convert("RGB") + pad = PAD_FRACTION * max(w, h) + left = max(0, int(x - pad)) + top = max(0, int(y - pad)) + right = min(im.width, int(x + w + pad)) + bottom = min(im.height, int(y + h + pad)) + crop = im.crop((left, top, right, bottom)) + crop.thumbnail((MAX_SIDE, MAX_SIDE)) # never upscales + crop.save(dst_path, "JPEG", quality=JPEG_QUALITY) + + +def main(): + data = load_data() + files = index_image_files() + attr_index = {a["id"]: a for a in data["attributes"]} + cat_index = {c["id"]: c["name"] for c in data["categories"]} + images = {i["id"]: i for i in data["images"]} + licenses = {l["id"]: l for l in data["licenses"]} + + rng = random.Random(SEED) + picked = sample_items(data["annotations"], rng) + + (OUT / "images").mkdir(parents=True, exist_ok=True) + records, skipped = [], 0 + for ann in picked: + img = images[ann["image_id"]] + src = files.get(img["file_name"]) + if src is None: + skipped += 1 + print(f"skip: {img['file_name']} not in zip (annotation {ann['id']})") + continue + item_id = f"item_{len(records) + 1:03d}" + image_rel = f"images/{item_id}.jpg" + try: + crop_item(src, ann["bbox"], OUT / image_rel) + except OSError as e: + skipped += 1 + print(f"skip: {img['file_name']} unreadable ({e})") + continue + materials, attrs = split_attributes(ann.get("attribute_ids", []), attr_index) + condition, tier = synthesize(rng) + category = cat_index[ann["category_id"]] + lic = licenses.get(img.get("license"), {}) + records.append({ + "id": item_id, + "name": make_name(materials, attrs, category), + "category": category.split(",")[0].strip(), + "group": group_for(ann["category_id"]), + "material": materials, + "attributes": attrs, + "condition": condition, + "quality_tier": tier, + "image": image_rel, + "source": { + "fashionpedia_image_id": ann["image_id"], + "annotation_id": ann["id"], + "license": lic.get("name", "unknown"), + "license_url": lic.get("url", ""), + "original_url": img.get("original_url", ""), + }, + }) + + with open(OUT / "items.jsonl", "w") as f: + for r in records: + f.write(json.dumps(r) + "\n") + + # Validation pass + lines = (OUT / "items.jsonl").read_text().splitlines() + assert all((OUT / json.loads(l)["image"]).exists() for l in lines), "missing image file" + print(f"\nwrote {len(lines)} items, skipped {skipped}") + print("groups:", dict(Counter(json.loads(l)["group"] for l in lines))) + print("categories:", dict(Counter(json.loads(l)["category"] for l in lines))) + print("conditions:", dict(Counter(json.loads(l)["condition"] for l in lines))) + print("tiers:", dict(Counter(json.loads(l)["quality_tier"] for l in lines))) + materials = Counter(m for l in lines for m in json.loads(l)["material"]) + print("materials:", dict(materials)) + if len(lines) < TARGET_TOTAL: + sys.exit(f"FAILED: only {len(lines)}/{TARGET_TOTAL} items written") + print("OK") + + +if __name__ == "__main__": + main() diff --git a/scripts/closet_lib.py b/scripts/closet_lib.py new file mode 100644 index 0000000..04a812d --- /dev/null +++ b/scripts/closet_lib.py @@ -0,0 +1,97 @@ +"""Pure selection/synthesis logic for the closet dataset (no I/O).""" + +TOPS = {0, 1, 2, 3, 4, 5, 9, 10, 11, 12} +BOTTOMS = {6, 7, 8} +ACCESSORIES = {13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26} + +GROUP_TARGETS = {"tops": 40, "bottoms": 30, "accessories": 30} +MIN_BOX = {"tops": 100, "bottoms": 100, "accessories": 60} +MATERIAL_SUPERCATS = {"leather", "non-textile material type"} + +CONDITIONS = ["new", "good", "worn", "needs repair"] +CONDITION_WEIGHTS = [0.20, 0.45, 0.25, 0.10] +TIERS = ["luxury", "mid", "budget"] +TIER_WEIGHTS = [0.20, 0.50, 0.30] + + +def group_for(category_id): + if category_id in TOPS: + return "tops" + if category_id in BOTTOMS: + return "bottoms" + if category_id in ACCESSORIES: + return "accessories" + return None + + +def passes_filters(ann): + group = group_for(ann["category_id"]) + if group is None: + return False + min_side = MIN_BOX[group] + _, _, w, h = ann["bbox"] + return w >= min_side and h >= min_side + + +def sample_items(annotations, rng, max_per_image=2): + buckets = {g: [] for g in GROUP_TARGETS} + for ann in annotations: + if passes_filters(ann): + buckets[group_for(ann["category_id"])].append(ann) + for bucket in buckets.values(): + rng.shuffle(bucket) + + picked, per_image, leftovers = [], {}, [] + + def take(ann): + if per_image.get(ann["image_id"], 0) >= max_per_image: + return False + per_image[ann["image_id"]] = per_image.get(ann["image_id"], 0) + 1 + picked.append(ann) + return True + + for group, target in GROUP_TARGETS.items(): + taken = 0 + for ann in buckets[group]: + if taken < target and take(ann): + taken += 1 + elif taken >= target: + leftovers.append(ann) + + total = sum(GROUP_TARGETS.values()) + rng.shuffle(leftovers) + for ann in leftovers: + if len(picked) >= total: + break + take(ann) + return picked + + +def _clean(name): + return name.split("(")[0].strip() + + +def split_attributes(attribute_ids, attr_index): + materials, attrs = [], [] + for aid in attribute_ids: + attr = attr_index.get(aid) + if attr is None: + continue + name = _clean(attr["name"]) + if name.startswith("no "): # negative markers like "no non-textile material" + continue + target = materials if attr["supercategory"] in MATERIAL_SUPERCATS else attrs + target.append(name) + return materials, attrs + + +def make_name(materials, attributes, category_name): + short_cat = category_name.split(",")[0].strip() + descriptors = (materials + attributes)[:2] + return " ".join(descriptors + [short_cat]) + + +def synthesize(rng): + condition = rng.choices(CONDITIONS, weights=CONDITION_WEIGHTS)[0] + tier = rng.choices(TIERS, weights=TIER_WEIGHTS)[0] + return condition, tier diff --git a/scripts/download_polyvore.sh b/scripts/download_polyvore.sh new file mode 100755 index 0000000..66f8cc2 --- /dev/null +++ b/scripts/download_polyvore.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# Download the Polyvore Outfits dataset (Stylique/Polyvore mirror on Hugging Face) +# into data/polyvore/ (git-ignored). ~2.75 GB after skipping the legacy HGLMM +# feature files (14 GB of pre-LLM text features we don't use). +# +# Usage: ./scripts/download_polyvore.sh [--with-images] +# default: metadata + outfit splits + hard negatives (~250 MB) +# --with-images: also fetch images.zip (2.5 GB) and unzip it +set -euo pipefail + +REPO="https://huggingface.co/datasets/Stylique/Polyvore/resolve/main" +DEST="$(cd "$(dirname "$0")/.." && pwd)/data/polyvore" +mkdir -p "$DEST" + +FILES=( + categories.csv + polyvore_item_metadata.json + polyvore_outfit_titles.json + disjoint/compatibility_test.txt + disjoint/compatibility_train.txt + disjoint/compatibility_valid.txt + disjoint/fill_in_blank_test.json + disjoint/fill_in_blank_train.json + disjoint/fill_in_blank_valid.json + disjoint/test.json + disjoint/train.json + disjoint/valid.json + disjoint/typespaces.p + nondisjoint/compatibility_test.txt + nondisjoint/compatibility_train.txt + nondisjoint/compatibility_valid.txt + nondisjoint/fill_in_blank_test.json + nondisjoint/fill_in_blank_train.json + nondisjoint/fill_in_blank_valid.json + nondisjoint/test.json + nondisjoint/train.json + nondisjoint/valid.json + nondisjoint/typespaces.p + maryland_polyvore_hardneg/compatibility_test.txt + maryland_polyvore_hardneg/compatibility_train.txt + maryland_polyvore_hardneg/compatibility_valid.txt + maryland_polyvore_hardneg/fill_in_blank_test.json + maryland_polyvore_hardneg/fill_in_blank_train.json + maryland_polyvore_hardneg/fill_in_blank_valid.json +) + +for f in "${FILES[@]}"; do + out="$DEST/$f" + if [[ -s "$out" ]]; then + echo "skip (exists): $f" + continue + fi + echo "downloading: $f" + curl -fSL --retry 3 --create-dirs -o "$out" "$REPO/$f" +done + +if [[ "${1:-}" == "--with-images" ]]; then + if [[ ! -d "$DEST/images" ]]; then + if [[ ! -s "$DEST/images.zip" ]]; then + echo "downloading: images.zip (2.5 GB)" + curl -fSL --retry 3 -C - -o "$DEST/images.zip" "$REPO/images.zip" + fi + echo "unzipping images.zip" + unzip -q "$DEST/images.zip" -d "$DEST" + else + echo "skip (exists): images/" + fi +fi + +echo "done → $DEST" diff --git a/scripts/make_samples.py b/scripts/make_samples.py new file mode 100644 index 0000000..de1b4b4 --- /dev/null +++ b/scripts/make_samples.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 +"""Generate the committed samples/ directory from the full datasets in data/. + +Prereqs: + - scripts/download_polyvore.sh has run (metadata at minimum; --with-images + for the sample images to be copied) + - data/fashionpedia/instances_attributes_val2020.json (14.5 MB): + curl -fsSL -o data/fashionpedia/instances_attributes_val2020.json \ + https://s3.amazonaws.com/ifashionist-dataset/annotations/instances_attributes_val2020.json + +Run: python3 scripts/make_samples.py +""" +import json +import shutil +import subprocess +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +DATA = ROOT / "data" +SAMPLES = ROOT / "samples" + +N_OUTFITS = 3 +N_COMPAT_LINES = 5 # per label (5 positive + 5 negative) +N_FITB = 2 +N_FASHIONPEDIA_IMAGES = 2 + + +def sample_polyvore(): + src = DATA / "polyvore" + out = SAMPLES / "polyvore" + out.mkdir(parents=True, exist_ok=True) + + metadata = json.loads((src / "polyvore_item_metadata.json").read_text()) + outfits = json.loads((src / "nondisjoint" / "train.json").read_text()) + + # Pick the first N outfits of 4+ items whose items all have metadata + picked = [] + for o in outfits: + ids = [i["item_id"] for i in o["items"]] + if len(ids) >= 4 and all(i in metadata for i in ids): + picked.append(o) + if len(picked) == N_OUTFITS: + break + + item_ids = [i["item_id"] for o in picked for i in o["items"]] + (out / "outfits_sample.json").write_text(json.dumps(picked, indent=2)) + (out / "items_sample.json").write_text( + json.dumps({i: metadata[i] for i in item_ids}, indent=2) + ) + + # Compatibility task lines: "1 _ ..." = compatible outfit, "0 ..." = not + pos, neg = [], [] + with open(src / "nondisjoint" / "compatibility_train.txt") as f: + for line in f: + (pos if line.startswith("1") else neg).append(line) + if len(pos) >= N_COMPAT_LINES and len(neg) >= N_COMPAT_LINES: + break + (out / "compatibility_sample.txt").write_text( + "".join(pos[:N_COMPAT_LINES] + neg[:N_COMPAT_LINES]) + ) + + fitb = json.loads((src / "nondisjoint" / "fill_in_blank_train.json").read_text()) + (out / "fill_in_blank_sample.json").write_text(json.dumps(fitb[:N_FITB], indent=2)) + + shutil.copy(src / "categories.csv", out / "categories.csv") + + images = src / "images" + if images.is_dir(): + img_out = out / "images" + img_out.mkdir(exist_ok=True) + missing = 0 + for i in item_ids: + f = images / f"{i}.jpg" + if f.exists(): + shutil.copy(f, img_out / f.name) + else: + missing += 1 + print(f"polyvore: copied {len(item_ids) - missing} images ({missing} missing)") + else: + print("polyvore: images/ not unzipped yet — rerun after --with-images finishes") + print(f"polyvore: {len(picked)} outfits, {len(item_ids)} items") + + +def sample_fashionpedia(): + src = DATA / "fashionpedia" / "instances_attributes_val2020.json" + out = SAMPLES / "fashionpedia" + out.mkdir(parents=True, exist_ok=True) + d = json.loads(src.read_text()) + + # Full label space — small and exactly what a builder needs + (out / "categories.json").write_text(json.dumps(d["categories"], indent=2)) + (out / "attributes.json").write_text(json.dumps(d["attributes"], indent=2)) + + # Pick CC-licensed images that have several annotated garments + lic_ok = {l["id"] for l in d["licenses"] if "creativecommons" in l.get("url", "")} + by_image = {} + for a in d["annotations"]: + by_image.setdefault(a["image_id"], []).append(a) + picked = [ + img for img in d["images"] + if img["license"] in lic_ok and len(by_image.get(img["id"], [])) >= 4 + ][:N_FASHIONPEDIA_IMAGES] + + anns = [a for img in picked for a in by_image[img["id"]]] + licenses = [l for l in d["licenses"] if l["id"] in {i["license"] for i in picked}] + (out / "annotations_sample.json").write_text( + json.dumps({"images": picked, "annotations": anns, "licenses": licenses}, indent=2) + ) + + img_out = out / "images" + img_out.mkdir(exist_ok=True) + for img in picked: + dest = img_out / img["file_name"] + if not dest.exists(): + subprocess.run( + ["curl", "-fsSL", "-o", str(dest), img["original_url"]], check=True + ) + print(f"fashionpedia: {len(picked)} images, {len(anns)} annotations") + + +def sample_sanzo_wada(): + out = SAMPLES / "sanzo-wada" + out.mkdir(parents=True, exist_ok=True) + dest = out / "colors.json" + if not dest.exists(): + subprocess.run( + ["curl", "-fsSL", "-o", str(dest), "https://sanzo-wada.dmbk.io/assets/colors.json"], + check=True, + ) + n = len(json.loads(dest.read_text())["colors"]) + print(f"sanzo-wada: full dataset committed ({n} colors)") + + +if __name__ == "__main__": + sample_polyvore() + sample_fashionpedia() + sample_sanzo_wada() diff --git a/synthetic-data/closet/images/item_001.jpg b/synthetic-data/closet/images/item_001.jpg new file mode 100644 index 0000000..2d29f73 Binary files /dev/null and b/synthetic-data/closet/images/item_001.jpg differ diff --git a/synthetic-data/closet/images/item_002.jpg b/synthetic-data/closet/images/item_002.jpg new file mode 100644 index 0000000..bbb64d2 Binary files /dev/null and b/synthetic-data/closet/images/item_002.jpg differ diff --git a/synthetic-data/closet/images/item_003.jpg b/synthetic-data/closet/images/item_003.jpg new file mode 100644 index 0000000..16fd9b0 Binary files /dev/null and b/synthetic-data/closet/images/item_003.jpg differ diff --git a/synthetic-data/closet/images/item_004.jpg b/synthetic-data/closet/images/item_004.jpg new file mode 100644 index 0000000..4b7a083 Binary files /dev/null and b/synthetic-data/closet/images/item_004.jpg differ diff --git a/synthetic-data/closet/images/item_005.jpg b/synthetic-data/closet/images/item_005.jpg new file mode 100644 index 0000000..96200d6 Binary files /dev/null and b/synthetic-data/closet/images/item_005.jpg differ diff --git a/synthetic-data/closet/images/item_006.jpg b/synthetic-data/closet/images/item_006.jpg new file mode 100644 index 0000000..3ee2d3d Binary files /dev/null and b/synthetic-data/closet/images/item_006.jpg differ diff --git a/synthetic-data/closet/images/item_007.jpg b/synthetic-data/closet/images/item_007.jpg new file mode 100644 index 0000000..70a1336 Binary files /dev/null and b/synthetic-data/closet/images/item_007.jpg differ diff --git a/synthetic-data/closet/images/item_008.jpg b/synthetic-data/closet/images/item_008.jpg new file mode 100644 index 0000000..ff950da Binary files /dev/null and b/synthetic-data/closet/images/item_008.jpg differ diff --git a/synthetic-data/closet/images/item_009.jpg b/synthetic-data/closet/images/item_009.jpg new file mode 100644 index 0000000..1a7a800 Binary files /dev/null and b/synthetic-data/closet/images/item_009.jpg differ diff --git a/synthetic-data/closet/images/item_010.jpg b/synthetic-data/closet/images/item_010.jpg new file mode 100644 index 0000000..03ce1a0 Binary files /dev/null and b/synthetic-data/closet/images/item_010.jpg differ diff --git a/synthetic-data/closet/images/item_011.jpg b/synthetic-data/closet/images/item_011.jpg new file mode 100644 index 0000000..da6002d Binary files /dev/null and b/synthetic-data/closet/images/item_011.jpg differ diff --git a/synthetic-data/closet/images/item_012.jpg b/synthetic-data/closet/images/item_012.jpg new file mode 100644 index 0000000..f3a5f09 Binary files /dev/null and b/synthetic-data/closet/images/item_012.jpg differ diff --git a/synthetic-data/closet/images/item_013.jpg b/synthetic-data/closet/images/item_013.jpg new file mode 100644 index 0000000..64e458c Binary files /dev/null and b/synthetic-data/closet/images/item_013.jpg differ diff --git a/synthetic-data/closet/images/item_014.jpg b/synthetic-data/closet/images/item_014.jpg new file mode 100644 index 0000000..66653e2 Binary files /dev/null and b/synthetic-data/closet/images/item_014.jpg differ diff --git a/synthetic-data/closet/images/item_015.jpg b/synthetic-data/closet/images/item_015.jpg new file mode 100644 index 0000000..a86fc4c Binary files /dev/null and b/synthetic-data/closet/images/item_015.jpg differ diff --git a/synthetic-data/closet/images/item_016.jpg b/synthetic-data/closet/images/item_016.jpg new file mode 100644 index 0000000..8dcb119 Binary files /dev/null and b/synthetic-data/closet/images/item_016.jpg differ diff --git a/synthetic-data/closet/images/item_017.jpg b/synthetic-data/closet/images/item_017.jpg new file mode 100644 index 0000000..7f2a61a Binary files /dev/null and b/synthetic-data/closet/images/item_017.jpg differ diff --git a/synthetic-data/closet/images/item_018.jpg b/synthetic-data/closet/images/item_018.jpg new file mode 100644 index 0000000..d8b502d Binary files /dev/null and b/synthetic-data/closet/images/item_018.jpg differ diff --git a/synthetic-data/closet/images/item_019.jpg b/synthetic-data/closet/images/item_019.jpg new file mode 100644 index 0000000..f997612 Binary files /dev/null and b/synthetic-data/closet/images/item_019.jpg differ diff --git a/synthetic-data/closet/images/item_020.jpg b/synthetic-data/closet/images/item_020.jpg new file mode 100644 index 0000000..fbb481d Binary files /dev/null and b/synthetic-data/closet/images/item_020.jpg differ diff --git a/synthetic-data/closet/images/item_021.jpg b/synthetic-data/closet/images/item_021.jpg new file mode 100644 index 0000000..3016445 Binary files /dev/null and b/synthetic-data/closet/images/item_021.jpg differ diff --git a/synthetic-data/closet/images/item_022.jpg b/synthetic-data/closet/images/item_022.jpg new file mode 100644 index 0000000..95f31d6 Binary files /dev/null and b/synthetic-data/closet/images/item_022.jpg differ diff --git a/synthetic-data/closet/images/item_023.jpg b/synthetic-data/closet/images/item_023.jpg new file mode 100644 index 0000000..e349b2f Binary files /dev/null and b/synthetic-data/closet/images/item_023.jpg differ diff --git a/synthetic-data/closet/images/item_024.jpg b/synthetic-data/closet/images/item_024.jpg new file mode 100644 index 0000000..a445763 Binary files /dev/null and b/synthetic-data/closet/images/item_024.jpg differ diff --git a/synthetic-data/closet/images/item_025.jpg b/synthetic-data/closet/images/item_025.jpg new file mode 100644 index 0000000..a5b23fc Binary files /dev/null and b/synthetic-data/closet/images/item_025.jpg differ diff --git a/synthetic-data/closet/images/item_026.jpg b/synthetic-data/closet/images/item_026.jpg new file mode 100644 index 0000000..a0463f0 Binary files /dev/null and b/synthetic-data/closet/images/item_026.jpg differ diff --git a/synthetic-data/closet/images/item_027.jpg b/synthetic-data/closet/images/item_027.jpg new file mode 100644 index 0000000..057cef6 Binary files /dev/null and b/synthetic-data/closet/images/item_027.jpg differ diff --git a/synthetic-data/closet/images/item_028.jpg b/synthetic-data/closet/images/item_028.jpg new file mode 100644 index 0000000..e9b58db Binary files /dev/null and b/synthetic-data/closet/images/item_028.jpg differ diff --git a/synthetic-data/closet/images/item_029.jpg b/synthetic-data/closet/images/item_029.jpg new file mode 100644 index 0000000..a8544b0 Binary files /dev/null and b/synthetic-data/closet/images/item_029.jpg differ diff --git a/synthetic-data/closet/images/item_030.jpg b/synthetic-data/closet/images/item_030.jpg new file mode 100644 index 0000000..398aeac Binary files /dev/null and b/synthetic-data/closet/images/item_030.jpg differ diff --git a/synthetic-data/closet/images/item_031.jpg b/synthetic-data/closet/images/item_031.jpg new file mode 100644 index 0000000..6b47574 Binary files /dev/null and b/synthetic-data/closet/images/item_031.jpg differ diff --git a/synthetic-data/closet/images/item_032.jpg b/synthetic-data/closet/images/item_032.jpg new file mode 100644 index 0000000..6cd39d7 Binary files /dev/null and b/synthetic-data/closet/images/item_032.jpg differ diff --git a/synthetic-data/closet/images/item_033.jpg b/synthetic-data/closet/images/item_033.jpg new file mode 100644 index 0000000..6e93b8a Binary files /dev/null and b/synthetic-data/closet/images/item_033.jpg differ diff --git a/synthetic-data/closet/images/item_034.jpg b/synthetic-data/closet/images/item_034.jpg new file mode 100644 index 0000000..4007479 Binary files /dev/null and b/synthetic-data/closet/images/item_034.jpg differ diff --git a/synthetic-data/closet/images/item_035.jpg b/synthetic-data/closet/images/item_035.jpg new file mode 100644 index 0000000..a534e38 Binary files /dev/null and b/synthetic-data/closet/images/item_035.jpg differ diff --git a/synthetic-data/closet/images/item_036.jpg b/synthetic-data/closet/images/item_036.jpg new file mode 100644 index 0000000..fc8ee4a Binary files /dev/null and b/synthetic-data/closet/images/item_036.jpg differ diff --git a/synthetic-data/closet/images/item_037.jpg b/synthetic-data/closet/images/item_037.jpg new file mode 100644 index 0000000..46ca6a1 Binary files /dev/null and b/synthetic-data/closet/images/item_037.jpg differ diff --git a/synthetic-data/closet/images/item_038.jpg b/synthetic-data/closet/images/item_038.jpg new file mode 100644 index 0000000..2ce8735 Binary files /dev/null and b/synthetic-data/closet/images/item_038.jpg differ diff --git a/synthetic-data/closet/images/item_039.jpg b/synthetic-data/closet/images/item_039.jpg new file mode 100644 index 0000000..c926229 Binary files /dev/null and b/synthetic-data/closet/images/item_039.jpg differ diff --git a/synthetic-data/closet/images/item_040.jpg b/synthetic-data/closet/images/item_040.jpg new file mode 100644 index 0000000..effd3bb Binary files /dev/null and b/synthetic-data/closet/images/item_040.jpg differ diff --git a/synthetic-data/closet/images/item_041.jpg b/synthetic-data/closet/images/item_041.jpg new file mode 100644 index 0000000..027b490 Binary files /dev/null and b/synthetic-data/closet/images/item_041.jpg differ diff --git a/synthetic-data/closet/images/item_042.jpg b/synthetic-data/closet/images/item_042.jpg new file mode 100644 index 0000000..e5b11ac Binary files /dev/null and b/synthetic-data/closet/images/item_042.jpg differ diff --git a/synthetic-data/closet/images/item_043.jpg b/synthetic-data/closet/images/item_043.jpg new file mode 100644 index 0000000..d86b418 Binary files /dev/null and b/synthetic-data/closet/images/item_043.jpg differ diff --git a/synthetic-data/closet/images/item_044.jpg b/synthetic-data/closet/images/item_044.jpg new file mode 100644 index 0000000..9db921e Binary files /dev/null and b/synthetic-data/closet/images/item_044.jpg differ diff --git a/synthetic-data/closet/images/item_045.jpg b/synthetic-data/closet/images/item_045.jpg new file mode 100644 index 0000000..cf43ff3 Binary files /dev/null and b/synthetic-data/closet/images/item_045.jpg differ diff --git a/synthetic-data/closet/images/item_046.jpg b/synthetic-data/closet/images/item_046.jpg new file mode 100644 index 0000000..84c6c89 Binary files /dev/null and b/synthetic-data/closet/images/item_046.jpg differ diff --git a/synthetic-data/closet/images/item_047.jpg b/synthetic-data/closet/images/item_047.jpg new file mode 100644 index 0000000..6422013 Binary files /dev/null and b/synthetic-data/closet/images/item_047.jpg differ diff --git a/synthetic-data/closet/images/item_048.jpg b/synthetic-data/closet/images/item_048.jpg new file mode 100644 index 0000000..406061c Binary files /dev/null and b/synthetic-data/closet/images/item_048.jpg differ diff --git a/synthetic-data/closet/images/item_049.jpg b/synthetic-data/closet/images/item_049.jpg new file mode 100644 index 0000000..cf299a8 Binary files /dev/null and b/synthetic-data/closet/images/item_049.jpg differ diff --git a/synthetic-data/closet/images/item_050.jpg b/synthetic-data/closet/images/item_050.jpg new file mode 100644 index 0000000..27a197a Binary files /dev/null and b/synthetic-data/closet/images/item_050.jpg differ diff --git a/synthetic-data/closet/images/item_051.jpg b/synthetic-data/closet/images/item_051.jpg new file mode 100644 index 0000000..4f6cd99 Binary files /dev/null and b/synthetic-data/closet/images/item_051.jpg differ diff --git a/synthetic-data/closet/images/item_052.jpg b/synthetic-data/closet/images/item_052.jpg new file mode 100644 index 0000000..e2810ef Binary files /dev/null and b/synthetic-data/closet/images/item_052.jpg differ diff --git a/synthetic-data/closet/images/item_053.jpg b/synthetic-data/closet/images/item_053.jpg new file mode 100644 index 0000000..c4ea7a5 Binary files /dev/null and b/synthetic-data/closet/images/item_053.jpg differ diff --git a/synthetic-data/closet/images/item_054.jpg b/synthetic-data/closet/images/item_054.jpg new file mode 100644 index 0000000..997c9df Binary files /dev/null and b/synthetic-data/closet/images/item_054.jpg differ diff --git a/synthetic-data/closet/images/item_055.jpg b/synthetic-data/closet/images/item_055.jpg new file mode 100644 index 0000000..7749428 Binary files /dev/null and b/synthetic-data/closet/images/item_055.jpg differ diff --git a/synthetic-data/closet/images/item_056.jpg b/synthetic-data/closet/images/item_056.jpg new file mode 100644 index 0000000..420907d Binary files /dev/null and b/synthetic-data/closet/images/item_056.jpg differ diff --git a/synthetic-data/closet/images/item_057.jpg b/synthetic-data/closet/images/item_057.jpg new file mode 100644 index 0000000..31f82ab Binary files /dev/null and b/synthetic-data/closet/images/item_057.jpg differ diff --git a/synthetic-data/closet/images/item_058.jpg b/synthetic-data/closet/images/item_058.jpg new file mode 100644 index 0000000..75a6b75 Binary files /dev/null and b/synthetic-data/closet/images/item_058.jpg differ diff --git a/synthetic-data/closet/images/item_059.jpg b/synthetic-data/closet/images/item_059.jpg new file mode 100644 index 0000000..735daea Binary files /dev/null and b/synthetic-data/closet/images/item_059.jpg differ diff --git a/synthetic-data/closet/images/item_060.jpg b/synthetic-data/closet/images/item_060.jpg new file mode 100644 index 0000000..0c2c10e Binary files /dev/null and b/synthetic-data/closet/images/item_060.jpg differ diff --git a/synthetic-data/closet/images/item_061.jpg b/synthetic-data/closet/images/item_061.jpg new file mode 100644 index 0000000..feac425 Binary files /dev/null and b/synthetic-data/closet/images/item_061.jpg differ diff --git a/synthetic-data/closet/images/item_062.jpg b/synthetic-data/closet/images/item_062.jpg new file mode 100644 index 0000000..ae53e5f Binary files /dev/null and b/synthetic-data/closet/images/item_062.jpg differ diff --git a/synthetic-data/closet/images/item_063.jpg b/synthetic-data/closet/images/item_063.jpg new file mode 100644 index 0000000..ec1602c Binary files /dev/null and b/synthetic-data/closet/images/item_063.jpg differ diff --git a/synthetic-data/closet/images/item_064.jpg b/synthetic-data/closet/images/item_064.jpg new file mode 100644 index 0000000..11ecfad Binary files /dev/null and b/synthetic-data/closet/images/item_064.jpg differ diff --git a/synthetic-data/closet/images/item_065.jpg b/synthetic-data/closet/images/item_065.jpg new file mode 100644 index 0000000..dbdd55b Binary files /dev/null and b/synthetic-data/closet/images/item_065.jpg differ diff --git a/synthetic-data/closet/images/item_066.jpg b/synthetic-data/closet/images/item_066.jpg new file mode 100644 index 0000000..7df8395 Binary files /dev/null and b/synthetic-data/closet/images/item_066.jpg differ diff --git a/synthetic-data/closet/images/item_067.jpg b/synthetic-data/closet/images/item_067.jpg new file mode 100644 index 0000000..fb076f9 Binary files /dev/null and b/synthetic-data/closet/images/item_067.jpg differ diff --git a/synthetic-data/closet/images/item_068.jpg b/synthetic-data/closet/images/item_068.jpg new file mode 100644 index 0000000..1adfc65 Binary files /dev/null and b/synthetic-data/closet/images/item_068.jpg differ diff --git a/synthetic-data/closet/images/item_069.jpg b/synthetic-data/closet/images/item_069.jpg new file mode 100644 index 0000000..63fbc66 Binary files /dev/null and b/synthetic-data/closet/images/item_069.jpg differ diff --git a/synthetic-data/closet/images/item_070.jpg b/synthetic-data/closet/images/item_070.jpg new file mode 100644 index 0000000..66bf6a4 Binary files /dev/null and b/synthetic-data/closet/images/item_070.jpg differ diff --git a/synthetic-data/closet/images/item_071.jpg b/synthetic-data/closet/images/item_071.jpg new file mode 100644 index 0000000..839d758 Binary files /dev/null and b/synthetic-data/closet/images/item_071.jpg differ diff --git a/synthetic-data/closet/images/item_072.jpg b/synthetic-data/closet/images/item_072.jpg new file mode 100644 index 0000000..560d53f Binary files /dev/null and b/synthetic-data/closet/images/item_072.jpg differ diff --git a/synthetic-data/closet/images/item_073.jpg b/synthetic-data/closet/images/item_073.jpg new file mode 100644 index 0000000..7ab8553 Binary files /dev/null and b/synthetic-data/closet/images/item_073.jpg differ diff --git a/synthetic-data/closet/images/item_074.jpg b/synthetic-data/closet/images/item_074.jpg new file mode 100644 index 0000000..bc73ec5 Binary files /dev/null and b/synthetic-data/closet/images/item_074.jpg differ diff --git a/synthetic-data/closet/images/item_075.jpg b/synthetic-data/closet/images/item_075.jpg new file mode 100644 index 0000000..d5bc865 Binary files /dev/null and b/synthetic-data/closet/images/item_075.jpg differ diff --git a/synthetic-data/closet/images/item_076.jpg b/synthetic-data/closet/images/item_076.jpg new file mode 100644 index 0000000..ea95915 Binary files /dev/null and b/synthetic-data/closet/images/item_076.jpg differ diff --git a/synthetic-data/closet/images/item_077.jpg b/synthetic-data/closet/images/item_077.jpg new file mode 100644 index 0000000..3561b28 Binary files /dev/null and b/synthetic-data/closet/images/item_077.jpg differ diff --git a/synthetic-data/closet/images/item_078.jpg b/synthetic-data/closet/images/item_078.jpg new file mode 100644 index 0000000..a8e9722 Binary files /dev/null and b/synthetic-data/closet/images/item_078.jpg differ diff --git a/synthetic-data/closet/images/item_079.jpg b/synthetic-data/closet/images/item_079.jpg new file mode 100644 index 0000000..c401b19 Binary files /dev/null and b/synthetic-data/closet/images/item_079.jpg differ diff --git a/synthetic-data/closet/images/item_080.jpg b/synthetic-data/closet/images/item_080.jpg new file mode 100644 index 0000000..92b80fb Binary files /dev/null and b/synthetic-data/closet/images/item_080.jpg differ diff --git a/synthetic-data/closet/images/item_081.jpg b/synthetic-data/closet/images/item_081.jpg new file mode 100644 index 0000000..9360319 Binary files /dev/null and b/synthetic-data/closet/images/item_081.jpg differ diff --git a/synthetic-data/closet/images/item_082.jpg b/synthetic-data/closet/images/item_082.jpg new file mode 100644 index 0000000..dd39ece Binary files /dev/null and b/synthetic-data/closet/images/item_082.jpg differ diff --git a/synthetic-data/closet/images/item_083.jpg b/synthetic-data/closet/images/item_083.jpg new file mode 100644 index 0000000..b2f5d34 Binary files /dev/null and b/synthetic-data/closet/images/item_083.jpg differ diff --git a/synthetic-data/closet/images/item_084.jpg b/synthetic-data/closet/images/item_084.jpg new file mode 100644 index 0000000..3dac17a Binary files /dev/null and b/synthetic-data/closet/images/item_084.jpg differ diff --git a/synthetic-data/closet/images/item_085.jpg b/synthetic-data/closet/images/item_085.jpg new file mode 100644 index 0000000..e729e03 Binary files /dev/null and b/synthetic-data/closet/images/item_085.jpg differ diff --git a/synthetic-data/closet/images/item_086.jpg b/synthetic-data/closet/images/item_086.jpg new file mode 100644 index 0000000..7838446 Binary files /dev/null and b/synthetic-data/closet/images/item_086.jpg differ diff --git a/synthetic-data/closet/images/item_087.jpg b/synthetic-data/closet/images/item_087.jpg new file mode 100644 index 0000000..c0c78f6 Binary files /dev/null and b/synthetic-data/closet/images/item_087.jpg differ diff --git a/synthetic-data/closet/images/item_088.jpg b/synthetic-data/closet/images/item_088.jpg new file mode 100644 index 0000000..e163f1e Binary files /dev/null and b/synthetic-data/closet/images/item_088.jpg differ diff --git a/synthetic-data/closet/images/item_089.jpg b/synthetic-data/closet/images/item_089.jpg new file mode 100644 index 0000000..66a5272 Binary files /dev/null and b/synthetic-data/closet/images/item_089.jpg differ diff --git a/synthetic-data/closet/images/item_090.jpg b/synthetic-data/closet/images/item_090.jpg new file mode 100644 index 0000000..2982469 Binary files /dev/null and b/synthetic-data/closet/images/item_090.jpg differ diff --git a/synthetic-data/closet/images/item_091.jpg b/synthetic-data/closet/images/item_091.jpg new file mode 100644 index 0000000..d9f356e Binary files /dev/null and b/synthetic-data/closet/images/item_091.jpg differ diff --git a/synthetic-data/closet/images/item_092.jpg b/synthetic-data/closet/images/item_092.jpg new file mode 100644 index 0000000..7ee1dad Binary files /dev/null and b/synthetic-data/closet/images/item_092.jpg differ diff --git a/synthetic-data/closet/images/item_093.jpg b/synthetic-data/closet/images/item_093.jpg new file mode 100644 index 0000000..8874ef6 Binary files /dev/null and b/synthetic-data/closet/images/item_093.jpg differ diff --git a/synthetic-data/closet/images/item_094.jpg b/synthetic-data/closet/images/item_094.jpg new file mode 100644 index 0000000..99f7514 Binary files /dev/null and b/synthetic-data/closet/images/item_094.jpg differ diff --git a/synthetic-data/closet/images/item_095.jpg b/synthetic-data/closet/images/item_095.jpg new file mode 100644 index 0000000..8351bbf Binary files /dev/null and b/synthetic-data/closet/images/item_095.jpg differ diff --git a/synthetic-data/closet/images/item_096.jpg b/synthetic-data/closet/images/item_096.jpg new file mode 100644 index 0000000..120d18c Binary files /dev/null and b/synthetic-data/closet/images/item_096.jpg differ diff --git a/synthetic-data/closet/images/item_097.jpg b/synthetic-data/closet/images/item_097.jpg new file mode 100644 index 0000000..4921076 Binary files /dev/null and b/synthetic-data/closet/images/item_097.jpg differ diff --git a/synthetic-data/closet/images/item_098.jpg b/synthetic-data/closet/images/item_098.jpg new file mode 100644 index 0000000..c7ecb46 Binary files /dev/null and b/synthetic-data/closet/images/item_098.jpg differ diff --git a/synthetic-data/closet/images/item_099.jpg b/synthetic-data/closet/images/item_099.jpg new file mode 100644 index 0000000..1efa17a Binary files /dev/null and b/synthetic-data/closet/images/item_099.jpg differ diff --git a/synthetic-data/closet/images/item_100.jpg b/synthetic-data/closet/images/item_100.jpg new file mode 100644 index 0000000..9e29a3f Binary files /dev/null and b/synthetic-data/closet/images/item_100.jpg differ diff --git a/synthetic-data/closet/items.jsonl b/synthetic-data/closet/items.jsonl new file mode 100644 index 0000000..7fd111f --- /dev/null +++ b/synthetic-data/closet/items.jsonl @@ -0,0 +1,100 @@ +{"id": "item_001", "name": "plain above-the-hip jacket", "category": "jacket", "group": "tops", "material": [], "attributes": ["plain", "above-the-hip", "normal waist", "washed", "tight", "single breasted", "symmetrical", "trucker"], "condition": "good", "quality_tier": "mid", "image": "images/item_001.jpg", "source": {"fashionpedia_image_id": 9743, "annotation_id": 6063, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm8.staticflickr.com/7088/7114887849_588edc2231_n.jpg"}} +{"id": "item_002", "name": "loose above-the-knee coat", "category": "coat", "group": "tops", "material": [], "attributes": ["loose", "above-the-knee", "single breasted", "blanket", "symmetrical", "geometric"], "condition": "good", "quality_tier": "luxury", "image": "images/item_002.jpg", "source": {"fashionpedia_image_id": 13507, "annotation_id": 9217, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm8.staticflickr.com/7356/12397418495_541004d99b_n.jpg"}} +{"id": "item_003", "name": "plain regular top", "category": "top", "group": "tops", "material": [], "attributes": ["plain", "regular", "classic", "hip", "geometric", "symmetrical"], "condition": "good", "quality_tier": "mid", "image": "images/item_003.jpg", "source": {"fashionpedia_image_id": 11469, "annotation_id": 1469, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://www.flickr.com/photos/westerncanadafashionweek/33488526111"}} +{"id": "item_004", "name": "plain above-the-hip top", "category": "top", "group": "tops", "material": [], "attributes": ["plain", "above-the-hip", "regular", "tank", "symmetrical"], "condition": "good", "quality_tier": "budget", "image": "images/item_004.jpg", "source": {"fashionpedia_image_id": 18717, "annotation_id": 3282, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/15126456037_9d9d76ced7_o.jpg"}} +{"id": "item_005", "name": "plain micro top", "category": "top", "group": "tops", "material": [], "attributes": ["plain", "micro", "regular", "symmetrical", "tunic"], "condition": "good", "quality_tier": "mid", "image": "images/item_005.jpg", "source": {"fashionpedia_image_id": 12109, "annotation_id": 8031, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/15312650182_9d9d76ced7_o.jpg"}} +{"id": "item_006", "name": "plain above-the-hip jacket", "category": "jacket", "group": "tops", "material": [], "attributes": ["plain", "above-the-hip", "tight", "bolero", "symmetrical", "high waist"], "condition": "good", "quality_tier": "mid", "image": "images/item_006.jpg", "source": {"fashionpedia_image_id": 15703, "annotation_id": 554, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/16332363153_9d9d76ced7_o.jpg"}} +{"id": "item_007", "name": "regular check shirt", "category": "shirt", "group": "tops", "material": [], "attributes": ["regular", "check", "single breasted", "hip", "symmetrical"], "condition": "good", "quality_tier": "mid", "image": "images/item_007.jpg", "source": {"fashionpedia_image_id": 11791, "annotation_id": 7742, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm9.staticflickr.com/8559/15585652260_b2923794d2_n.jpg"}} +{"id": "item_008", "name": "plain mini dress", "category": "dress", "group": "tops", "material": [], "attributes": ["plain", "mini", "shift", "symmetrical", "straight"], "condition": "worn", "quality_tier": "mid", "image": "images/item_008.jpg", "source": {"fashionpedia_image_id": 12215, "annotation_id": 8106, "license": "Attribution-NonCommercial-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-nc-sa/2.0/", "original_url": "http://farm6.staticflickr.com/5777/31269041475_dbe8e148aa_n.jpg"}} +{"id": "item_009", "name": "plain above-the-hip top", "category": "top", "group": "tops", "material": [], "attributes": ["plain", "above-the-hip", "regular", "printed", "classic", "symmetrical"], "condition": "worn", "quality_tier": "budget", "image": "images/item_009.jpg", "source": {"fashionpedia_image_id": 18704, "annotation_id": 3258, "license": "Attribution-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nd/2.0/", "original_url": "http://farm6.staticflickr.com/5452/9517467634_8a5a63c285_n.jpg"}} +{"id": "item_010", "name": "tight asymmetrical top", "category": "top", "group": "tops", "material": [], "attributes": ["tight", "asymmetrical", "lining", "floral", "hip", "tube", "high waist"], "condition": "good", "quality_tier": "mid", "image": "images/item_010.jpg", "source": {"fashionpedia_image_id": 16651, "annotation_id": 1348, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/9994921215_9d9d76ced7_o.jpg"}} +{"id": "item_011", "name": "plain normal waist shirt", "category": "shirt", "group": "tops", "material": [], "attributes": ["plain", "normal waist", "regular", "single breasted", "symmetrical"], "condition": "good", "quality_tier": "budget", "image": "images/item_011.jpg", "source": {"fashionpedia_image_id": 16504, "annotation_id": 1187, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/21049928163_9d9d76ced7_o.jpg"}} +{"id": "item_012", "name": "plain jacket", "category": "jacket", "group": "tops", "material": [], "attributes": ["plain"], "condition": "good", "quality_tier": "budget", "image": "images/item_012.jpg", "source": {"fashionpedia_image_id": 18183, "annotation_id": 2631, "license": "Attribution-NonCommercial-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-nc-sa/2.0/", "original_url": "http://farm9.staticflickr.com/8404/8674883788_21f421ac9d_n.jpg"}} +{"id": "item_013", "name": "gown a-line dress", "category": "dress", "group": "tops", "material": [], "attributes": ["gown", "a-line", "zip-up", "dropped waistline", "floor", "mermaid", "floral", "symmetrical"], "condition": "worn", "quality_tier": "mid", "image": "images/item_013.jpg", "source": {"fashionpedia_image_id": 15076, "annotation_id": 54, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/9946029575_9d9d76ced7_o.jpg"}} +{"id": "item_014", "name": "plain above-the-hip top", "category": "top", "group": "tops", "material": [], "attributes": ["plain", "above-the-hip", "normal waist", "regular", "printed", "classic", "symmetrical"], "condition": "good", "quality_tier": "mid", "image": "images/item_014.jpg", "source": {"fashionpedia_image_id": 16004, "annotation_id": 894, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm8.staticflickr.com/7339/11952551606_aa3650b49f_n.jpg"}} +{"id": "item_015", "name": "blazer normal waist jacket", "category": "jacket", "group": "tops", "material": [], "attributes": ["blazer", "normal waist", "plain", "regular", "single breasted", "hip", "symmetrical"], "condition": "worn", "quality_tier": "mid", "image": "images/item_015.jpg", "source": {"fashionpedia_image_id": 11895, "annotation_id": 7811, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/32936956463_9d9d76ced7_o.jpg"}} +{"id": "item_016", "name": "plain loose top", "category": "top", "group": "tops", "material": [], "attributes": ["plain", "loose", "above-the-hip", "tank", "symmetrical"], "condition": "good", "quality_tier": "mid", "image": "images/item_016.jpg", "source": {"fashionpedia_image_id": 15530, "annotation_id": 421, "license": "Attribution-NonCommercial-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-nc-sa/2.0/", "original_url": "http://farm6.staticflickr.com/5817/21984687341_4bbb3af4f2_n.jpg"}} +{"id": "item_017", "name": "plain gown dress", "category": "dress", "group": "tops", "material": [], "attributes": ["plain", "gown", "zip-up", "dropped waistline", "floor", "symmetrical", "straight"], "condition": "worn", "quality_tier": "mid", "image": "images/item_017.jpg", "source": {"fashionpedia_image_id": 15145, "annotation_id": 104, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/9946943646_9d9d76ced7_o.jpg"}} +{"id": "item_018", "name": "abstract zip-up dress", "category": "dress", "group": "tops", "material": [], "attributes": ["abstract", "zip-up", "mini", "shift", "symmetrical", "straight"], "condition": "good", "quality_tier": "luxury", "image": "images/item_018.jpg", "source": {"fashionpedia_image_id": 17600, "annotation_id": 2136, "license": "Attribution-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-sa/2.0/", "original_url": "http://farm8.staticflickr.com/7211/7221019400_c88d86aaef_n.jpg"}} +{"id": "item_019", "name": "plastic sequin dress", "category": "dress", "group": "tops", "material": ["plastic"], "attributes": ["sequin", "normal waist", "fit and flare", "zip-up", "skater", "pleat", "plain", "mini", "floral", "symmetrical"], "condition": "good", "quality_tier": "mid", "image": "images/item_019.jpg", "source": {"fashionpedia_image_id": 18696, "annotation_id": 3229, "license": "Attribution-NonCommercial License", "license_url": "https://creativecommons.org/licenses/by-nc/2.0/", "original_url": "http://farm9.staticflickr.com/8474/8414472772_4d24043c8d_n.jpg"}} +{"id": "item_020", "name": "plain regular coat", "category": "coat", "group": "tops", "material": [], "attributes": ["plain", "regular", "lining", "blanket", "symmetrical"], "condition": "good", "quality_tier": "luxury", "image": "images/item_020.jpg", "source": {"fashionpedia_image_id": 17958, "annotation_id": 3976, "license": "Attribution-NonCommercial License", "license_url": "https://creativecommons.org/licenses/by-nc/2.0/", "original_url": "http://farm8.staticflickr.com/7760/17109520827_48032d61b7_n.jpg"}} +{"id": "item_021", "name": "loose mini coat", "category": "coat", "group": "tops", "material": [], "attributes": ["loose", "mini", "symmetrical"], "condition": "worn", "quality_tier": "budget", "image": "images/item_021.jpg", "source": {"fashionpedia_image_id": 20066, "annotation_id": 4628, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://www.flickr.com/photos/westerncanadafashionweek/29765673741"}} +{"id": "item_022", "name": "plain above-the-hip top", "category": "top", "group": "tops", "material": [], "attributes": ["plain", "above-the-hip", "camisole"], "condition": "new", "quality_tier": "budget", "image": "images/item_022.jpg", "source": {"fashionpedia_image_id": 18208, "annotation_id": 2650, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/8762928138_9d9d76ced7_o.jpg"}} +{"id": "item_023", "name": "plain slit dress", "category": "dress", "group": "tops", "material": [], "attributes": ["plain", "slit", "midi", "tent", "shift", "symmetrical", "zip-up"], "condition": "good", "quality_tier": "mid", "image": "images/item_023.jpg", "source": {"fashionpedia_image_id": 12508, "annotation_id": 8340, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/21772431231_9d9d76ced7_o.jpg"}} +{"id": "item_024", "name": "plain circle dress", "category": "dress", "group": "tops", "material": [], "attributes": ["plain", "circle", "gown", "gathering", "floor", "empire waistline", "symmetrical", "zip-up"], "condition": "good", "quality_tier": "mid", "image": "images/item_024.jpg", "source": {"fashionpedia_image_id": 9309, "annotation_id": 5615, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/8602752916_9d9d76ced7_o.jpg"}} +{"id": "item_025", "name": "loose dot shirt", "category": "shirt", "group": "tops", "material": [], "attributes": ["loose", "dot", "single breasted", "floral", "symmetrical", "hip"], "condition": "worn", "quality_tier": "budget", "image": "images/item_025.jpg", "source": {"fashionpedia_image_id": 17443, "annotation_id": 2008, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/15312646992_9d9d76ced7_o.jpg"}} +{"id": "item_026", "name": "gem plain dress", "category": "dress", "group": "tops", "material": ["gem"], "attributes": ["plain", "circle", "applique", "gown", "basque", "floral", "symmetrical", "zip-up"], "condition": "good", "quality_tier": "budget", "image": "images/item_026.jpg", "source": {"fashionpedia_image_id": 10181, "annotation_id": 6308, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/9946931705_9d9d76ced7_o.jpg"}} +{"id": "item_027", "name": "plain normal waist jacket", "category": "jacket", "group": "tops", "material": [], "attributes": ["plain", "normal waist", "above-the-hip", "zip-up", "biker", "regular", "symmetrical"], "condition": "new", "quality_tier": "luxury", "image": "images/item_027.jpg", "source": {"fashionpedia_image_id": 19806, "annotation_id": 4382, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm3.staticflickr.com/2947/33006128413_9e96dea927_n.jpg"}} +{"id": "item_028", "name": "double breasted regular coat", "category": "coat", "group": "tops", "material": [], "attributes": ["double breasted", "regular", "lining", "symmetrical", "snakeskin"], "condition": "needs repair", "quality_tier": "mid", "image": "images/item_028.jpg", "source": {"fashionpedia_image_id": 13585, "annotation_id": 9293, "license": "pexels", "license_url": "https://www.pexels.com/photo-license", "original_url": "https://www.pexels.com"}} +{"id": "item_029", "name": "plastic gem dress", "category": "dress", "group": "tops", "material": ["plastic", "gem"], "attributes": ["plain", "gown", "fit and flare", "dot", "floor", "rivet", "symmetrical", "zip-up", "high waist"], "condition": "new", "quality_tier": "budget", "image": "images/item_029.jpg", "source": {"fashionpedia_image_id": 12806, "annotation_id": 8580, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm8.staticflickr.com/7615/16815848202_2b9cdbab4a_n.jpg"}} +{"id": "item_030", "name": "plain regular top", "category": "top", "group": "tops", "material": [], "attributes": ["plain", "regular", "printed", "classic", "symmetrical"], "condition": "needs repair", "quality_tier": "budget", "image": "images/item_030.jpg", "source": {"fashionpedia_image_id": 11376, "annotation_id": 7422, "license": "freestocks", "license_url": "https://freestocks.org/terms-of-use", "original_url": "https://freestocks.org"}} +{"id": "item_031", "name": "plastic sequin dress", "category": "dress", "group": "tops", "material": ["plastic"], "attributes": ["sequin", "plain", "gown", "dropped waistline", "trumpet", "gathering", "symmetrical", "zip-up"], "condition": "good", "quality_tier": "mid", "image": "images/item_031.jpg", "source": {"fashionpedia_image_id": 9564, "annotation_id": 5808, "license": "Attribution License", "license_url": "https://creativecommons.org/licenses/by/2.0/", "original_url": "http://farm9.staticflickr.com/8069/8194486681_265cfe08ab_n.jpg"}} +{"id": "item_032", "name": "plain regular top", "category": "top", "group": "tops", "material": [], "attributes": ["plain", "regular", "undershirt", "symmetrical"], "condition": "worn", "quality_tier": "budget", "image": "images/item_032.jpg", "source": {"fashionpedia_image_id": 11125, "annotation_id": 7214, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm9.staticflickr.com/8220/29602994866_29486cf9c3_n.jpg"}} +{"id": "item_033", "name": "plain regular vest", "category": "vest", "group": "tops", "material": [], "attributes": ["plain", "regular", "knee", "symmetrical", "high waist"], "condition": "good", "quality_tier": "mid", "image": "images/item_033.jpg", "source": {"fashionpedia_image_id": 10542, "annotation_id": 6519, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/25610724153_9d9d76ced7_o.jpg"}} +{"id": "item_034", "name": "plain normal waist top", "category": "top", "group": "tops", "material": [], "attributes": ["plain", "normal waist", "regular", "classic", "symmetrical"], "condition": "new", "quality_tier": "budget", "image": "images/item_034.jpg", "source": {"fashionpedia_image_id": 13477, "annotation_id": 9160, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm5.staticflickr.com/4661/40582941952_ba0cc05045_n.jpg"}} +{"id": "item_035", "name": "plastic sequin dress", "category": "dress", "group": "tops", "material": ["plastic"], "attributes": ["sequin", "slit", "gown", "dropped waistline", "asymmetrical", "maxi", "geometric", "zip-up", "straight"], "condition": "good", "quality_tier": "mid", "image": "images/item_035.jpg", "source": {"fashionpedia_image_id": 18509, "annotation_id": 3086, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/15367153575_9d9d76ced7_o.jpg"}} +{"id": "item_036", "name": "micro loose dress", "category": "dress", "group": "tops", "material": [], "attributes": ["micro", "loose", "plain", "symmetrical"], "condition": "worn", "quality_tier": "luxury", "image": "images/item_036.jpg", "source": {"fashionpedia_image_id": 15430, "annotation_id": 357, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm9.staticflickr.com/8125/8701608698_ef9f8c76a5_n.jpg"}} +{"id": "item_037", "name": "abstract tight top", "category": "top", "group": "tops", "material": [], "attributes": ["abstract", "tight", "symmetrical"], "condition": "good", "quality_tier": "mid", "image": "images/item_037.jpg", "source": {"fashionpedia_image_id": 17136, "annotation_id": 1749, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/7057877393_9d9d76ced7_o.jpg"}} +{"id": "item_038", "name": "plain normal waist jumpsuit", "category": "jumpsuit", "group": "tops", "material": [], "attributes": ["plain", "normal waist", "regular", "cutout", "symmetrical", "zip-up", "straight"], "condition": "needs repair", "quality_tier": "luxury", "image": "images/item_038.jpg", "source": {"fashionpedia_image_id": 9112, "annotation_id": 5422, "license": "Attribution License", "license_url": "https://creativecommons.org/licenses/by/2.0/", "original_url": "http://farm5.staticflickr.com/4445/37124408663_0393db52e4_n.jpg"}} +{"id": "item_039", "name": "regular tank top", "category": "top", "group": "tops", "material": [], "attributes": ["regular", "tank", "floral", "symmetrical", "hip"], "condition": "good", "quality_tier": "budget", "image": "images/item_039.jpg", "source": {"fashionpedia_image_id": 15815, "annotation_id": 661, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/6923934222_9d9d76ced7_o.jpg"}} +{"id": "item_040", "name": "plain normal waist top", "category": "top", "group": "tops", "material": [], "attributes": ["plain", "normal waist", "above-the-hip", "tight", "symmetrical", "camisole"], "condition": "worn", "quality_tier": "mid", "image": "images/item_040.jpg", "source": {"fashionpedia_image_id": 11127, "annotation_id": 7228, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm8.staticflickr.com/7185/6940312109_0b661388b9_n.jpg"}} +{"id": "item_041", "name": "micro normal waist shorts", "category": "shorts", "group": "bottoms", "material": [], "attributes": ["micro", "normal waist", "plain", "distressed", "regular", "short", "symmetrical", "fly"], "condition": "new", "quality_tier": "mid", "image": "images/item_041.jpg", "source": {"fashionpedia_image_id": 13477, "annotation_id": 9163, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm5.staticflickr.com/4661/40582941952_ba0cc05045_n.jpg"}} +{"id": "item_042", "name": "plain normal waist pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["plain", "normal waist", "leggings", "tight", "fly", "maxi", "symmetrical"], "condition": "good", "quality_tier": "luxury", "image": "images/item_042.jpg", "source": {"fashionpedia_image_id": 20712, "annotation_id": 22, "license": "Attribution-NonCommercial-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-nc-sa/2.0/", "original_url": "http://farm6.staticflickr.com/5253/5485297290_ca13539407_n.jpg"}} +{"id": "item_043", "name": "plain leggings pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["plain", "leggings", "tight", "maxi", "symmetrical"], "condition": "worn", "quality_tier": "mid", "image": "images/item_043.jpg", "source": {"fashionpedia_image_id": 12197, "annotation_id": 9038, "license": "pexels", "license_url": "https://www.pexels.com/photo-license", "original_url": "https://www.pexels.com"}} +{"id": "item_044", "name": "plain sheath skirt", "category": "skirt", "group": "bottoms", "material": [], "attributes": ["plain", "sheath", "mini", "symmetrical", "straight"], "condition": "new", "quality_tier": "mid", "image": "images/item_044.jpg", "source": {"fashionpedia_image_id": 18208, "annotation_id": 2649, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/8762928138_9d9d76ced7_o.jpg"}} +{"id": "item_045", "name": "oversized plain pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["oversized", "plain", "sailor", "normal waist", "wide leg", "symmetrical"], "condition": "worn", "quality_tier": "luxury", "image": "images/item_045.jpg", "source": {"fashionpedia_image_id": 18415, "annotation_id": 2801, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/26155510935_9d9d76ced7_o.jpg"}} +{"id": "item_046", "name": "plain regular pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["plain", "regular", "fly", "maxi", "symmetrical", "peg"], "condition": "good", "quality_tier": "mid", "image": "images/item_046.jpg", "source": {"fashionpedia_image_id": 12823, "annotation_id": 8587, "license": "unsplash", "license_url": "https://unsplash.com/license", "original_url": "https://unsplash.com"}} +{"id": "item_047", "name": "plain normal waist pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["plain", "normal waist", "leggings", "tight", "fly", "symmetrical"], "condition": "needs repair", "quality_tier": "mid", "image": "images/item_047.jpg", "source": {"fashionpedia_image_id": 20315, "annotation_id": 4855, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm8.staticflickr.com/7376/11580290646_60460ecca2_n.jpg"}} +{"id": "item_048", "name": "plain jeans pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["plain", "jeans", "tight", "washed", "maxi", "symmetrical", "fly", "distressed"], "condition": "new", "quality_tier": "mid", "image": "images/item_048.jpg", "source": {"fashionpedia_image_id": 16148, "annotation_id": 997, "license": "unsplash", "license_url": "https://unsplash.com/license", "original_url": "https://unsplash.com"}} +{"id": "item_049", "name": "sailor loose pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["sailor", "loose", "plain", "floor", "pleat", "wide leg", "symmetrical", "zip-up", "high waist"], "condition": "good", "quality_tier": "budget", "image": "images/item_049.jpg", "source": {"fashionpedia_image_id": 8554, "annotation_id": 7109, "license": "Attribution License", "license_url": "https://creativecommons.org/licenses/by/2.0/", "original_url": "http://farm6.staticflickr.com/5252/5532520712_0c13a15017_n.jpg"}} +{"id": "item_050", "name": "plain normal waist skirt", "category": "skirt", "group": "bottoms", "material": [], "attributes": ["plain", "normal waist", "slit", "a-line", "sheath", "floor", "symmetrical", "zip-up"], "condition": "good", "quality_tier": "mid", "image": "images/item_050.jpg", "source": {"fashionpedia_image_id": 16455, "annotation_id": 1146, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/21539965451_9d9d76ced7_o.jpg"}} +{"id": "item_051", "name": "plain normal waist skirt", "category": "skirt", "group": "bottoms", "material": [], "attributes": ["plain", "normal waist", "washed", "sheath", "pencil", "mini", "symmetrical", "fly"], "condition": "good", "quality_tier": "mid", "image": "images/item_051.jpg", "source": {"fashionpedia_image_id": 15920, "annotation_id": 840, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/13481514585_9d9d76ced7_o.jpg"}} +{"id": "item_052", "name": "sailor plain pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["sailor", "plain", "regular", "fly", "maxi", "symmetrical", "straight"], "condition": "needs repair", "quality_tier": "mid", "image": "images/item_052.jpg", "source": {"fashionpedia_image_id": 6410, "annotation_id": 6021, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://www.flickr.com/photos/westerncanadafashionweek/25593625114"}} +{"id": "item_053", "name": "plain normal waist skirt", "category": "skirt", "group": "bottoms", "material": [], "attributes": ["plain", "normal waist", "a-line", "mini", "symmetrical", "fly"], "condition": "worn", "quality_tier": "budget", "image": "images/item_053.jpg", "source": {"fashionpedia_image_id": 18991, "annotation_id": 3525, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/9063063261_9d9d76ced7_o.jpg"}} +{"id": "item_054", "name": "jeans plain pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["jeans", "plain", "regular", "fly", "symmetrical", "straight"], "condition": "worn", "quality_tier": "mid", "image": "images/item_054.jpg", "source": {"fashionpedia_image_id": 11125, "annotation_id": 7210, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm9.staticflickr.com/8220/29602994866_29486cf9c3_n.jpg"}} +{"id": "item_055", "name": "plain below the knee shorts", "category": "shorts", "group": "bottoms", "material": [], "attributes": ["plain", "below the knee", "normal waist", "tight", "symmetrical"], "condition": "worn", "quality_tier": "luxury", "image": "images/item_055.jpg", "source": {"fashionpedia_image_id": 8810, "annotation_id": 7115, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/15311416182_9d9d76ced7_o.jpg"}} +{"id": "item_056", "name": "plain jeans pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["plain", "jeans", "tight", "washed", "maxi", "symmetrical", "fly", "distressed", "high waist"], "condition": "worn", "quality_tier": "budget", "image": "images/item_056.jpg", "source": {"fashionpedia_image_id": 18908, "annotation_id": 3432, "license": "unsplash", "license_url": "https://unsplash.com/license", "original_url": "https://unsplash.com"}} +{"id": "item_057", "name": "jeans plain pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["jeans", "plain", "regular", "low waist", "pleat", "symmetrical", "maxi", "fly", "straight"], "condition": "good", "quality_tier": "luxury", "image": "images/item_057.jpg", "source": {"fashionpedia_image_id": 13297, "annotation_id": 8931, "license": "Attribution-NonCommercial-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-nc-sa/2.0/", "original_url": "http://farm3.staticflickr.com/2908/33675201796_d5dfe329da_n.jpg"}} +{"id": "item_058", "name": "plain a-line skirt", "category": "skirt", "group": "bottoms", "material": [], "attributes": ["plain", "a-line", "mini", "symmetrical", "zip-up", "high waist"], "condition": "good", "quality_tier": "luxury", "image": "images/item_058.jpg", "source": {"fashionpedia_image_id": 9147, "annotation_id": 5454, "license": "Attribution-NonCommercial-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-nc-sa/2.0/", "original_url": "http://farm6.staticflickr.com/5103/5662716758_225ba5d8fb_n.jpg"}} +{"id": "item_059", "name": "jeans plain pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["jeans", "plain", "regular", "washed", "maxi", "symmetrical", "fly", "straight"], "condition": "worn", "quality_tier": "mid", "image": "images/item_059.jpg", "source": {"fashionpedia_image_id": 20590, "annotation_id": 5117, "license": "unsplash", "license_url": "https://unsplash.com/license", "original_url": "https://unsplash.com"}} +{"id": "item_060", "name": "loose plain pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["loose", "plain", "fly", "maxi", "symmetrical", "straight"], "condition": "good", "quality_tier": "mid", "image": "images/item_060.jpg", "source": {"fashionpedia_image_id": 19944, "annotation_id": 4533, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://www.flickr.com/photos/westerncanadafashionweek/25573862834"}} +{"id": "item_061", "name": "plain leggings pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["plain", "leggings", "tight", "fly", "maxi", "symmetrical"], "condition": "good", "quality_tier": "mid", "image": "images/item_061.jpg", "source": {"fashionpedia_image_id": 19768, "annotation_id": 4307, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm8.staticflickr.com/7207/6897102859_58ca8b05a0_n.jpg"}} +{"id": "item_062", "name": "plain normal waist skirt", "category": "skirt", "group": "bottoms", "material": [], "attributes": ["plain", "normal waist", "sheath", "pencil", "mini", "floral", "symmetrical"], "condition": "worn", "quality_tier": "luxury", "image": "images/item_062.jpg", "source": {"fashionpedia_image_id": 10918, "annotation_id": 7031, "license": "Attribution-NonCommercial License", "license_url": "https://creativecommons.org/licenses/by-nc/2.0/", "original_url": "http://farm4.staticflickr.com/3786/10986617556_c846270a8a_n.jpg"}} +{"id": "item_063", "name": "wide leg geometric pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["wide leg", "geometric", "loose", "fly", "high waist", "sailor", "floral", "maxi", "symmetrical"], "condition": "new", "quality_tier": "luxury", "image": "images/item_063.jpg", "source": {"fashionpedia_image_id": 20199, "annotation_id": 4711, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm5.staticflickr.com/4376/36936289611_a98164efd7_n.jpg"}} +{"id": "item_064", "name": "plain leggings pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["plain", "leggings", "tight", "maxi", "symmetrical"], "condition": "good", "quality_tier": "mid", "image": "images/item_064.jpg", "source": {"fashionpedia_image_id": 11807, "annotation_id": 7788, "license": "Attribution-NonCommercial-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-nc-sa/2.0/", "original_url": "http://farm8.staticflickr.com/7609/16870514468_0994dbb5a1_n.jpg"}} +{"id": "item_065", "name": "jeans plain pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["jeans", "plain", "regular", "low waist", "washed", "symmetrical", "fly", "straight"], "condition": "worn", "quality_tier": "luxury", "image": "images/item_065.jpg", "source": {"fashionpedia_image_id": 9880, "annotation_id": 6669, "license": "Attribution-NonCommercial License", "license_url": "https://creativecommons.org/licenses/by-nc/2.0/", "original_url": "http://farm9.staticflickr.com/8701/16774153914_d7e21f7224_n.jpg"}} +{"id": "item_066", "name": "flare gypsy skirt", "category": "skirt", "group": "bottoms", "material": [], "attributes": ["flare", "gypsy", "maxi", "symmetrical", "floral"], "condition": "worn", "quality_tier": "mid", "image": "images/item_066.jpg", "source": {"fashionpedia_image_id": 15800, "annotation_id": 653, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm5.staticflickr.com/4047/4656031056_14940799ff_n.jpg"}} +{"id": "item_067", "name": "normal waist prairie skirt", "category": "skirt", "group": "bottoms", "material": [], "attributes": ["normal waist", "prairie", "bell", "lace up", "knee", "symmetrical", "geometric"], "condition": "good", "quality_tier": "mid", "image": "images/item_067.jpg", "source": {"fashionpedia_image_id": 16221, "annotation_id": 1024, "license": "Attribution License", "license_url": "https://creativecommons.org/licenses/by/2.0/", "original_url": "http://farm6.staticflickr.com/5735/21082063715_46a144cc1b_n.jpg"}} +{"id": "item_068", "name": "suede plain pants", "category": "pants", "group": "bottoms", "material": ["suede"], "attributes": ["plain", "leggings", "tight", "maxi", "symmetrical"], "condition": "worn", "quality_tier": "mid", "image": "images/item_068.jpg", "source": {"fashionpedia_image_id": 8875, "annotation_id": 5241, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/8583932902_9d9d76ced7_o.jpg"}} +{"id": "item_069", "name": "plain normal waist pants", "category": "pants", "group": "bottoms", "material": [], "attributes": ["plain", "normal waist", "leggings", "tight", "maxi", "symmetrical"], "condition": "good", "quality_tier": "mid", "image": "images/item_069.jpg", "source": {"fashionpedia_image_id": 17687, "annotation_id": 2219, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/8584293035_9d9d76ced7_o.jpg"}} +{"id": "item_070", "name": "plain normal waist skirt", "category": "skirt", "group": "bottoms", "material": [], "attributes": ["plain", "normal waist", "bell", "pleat", "mini", "symmetrical", "skater"], "condition": "worn", "quality_tier": "mid", "image": "images/item_070.jpg", "source": {"fashionpedia_image_id": 10518, "annotation_id": 6498, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm8.staticflickr.com/7403/9603153697_5793c7fe0b_n.jpg"}} +{"id": "item_071", "name": "headband", "category": "headband", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "mid", "image": "images/item_071.jpg", "source": {"fashionpedia_image_id": 13581, "annotation_id": 9279, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/41794338281_9d9d76ced7_o.jpg"}} +{"id": "item_072", "name": "tights", "category": "tights", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "budget", "image": "images/item_072.jpg", "source": {"fashionpedia_image_id": 8971, "annotation_id": 5290, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/8595351427_9d9d76ced7_o.jpg"}} +{"id": "item_073", "name": "hat", "category": "hat", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "mid", "image": "images/item_073.jpg", "source": {"fashionpedia_image_id": 10858, "annotation_id": 6954, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm5.staticflickr.com/4410/36268765504_04b2bd0642_n.jpg"}} +{"id": "item_074", "name": "bag", "category": "bag", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "budget", "image": "images/item_074.jpg", "source": {"fashionpedia_image_id": 10566, "annotation_id": 6545, "license": "Attribution License", "license_url": "https://creativecommons.org/licenses/by/2.0/", "original_url": "http://farm1.staticflickr.com/281/32150084240_fa95759246_n.jpg"}} +{"id": "item_075", "name": "bag", "category": "bag", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "luxury", "image": "images/item_075.jpg", "source": {"fashionpedia_image_id": 17658, "annotation_id": 2212, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm6.staticflickr.com/5582/31301244391_1e20912d13_n.jpg"}} +{"id": "item_076", "name": "headband", "category": "headband", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "mid", "image": "images/item_076.jpg", "source": {"fashionpedia_image_id": 17229, "annotation_id": 1836, "license": "Attribution-NonCommercial-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-nc-sa/2.0/", "original_url": "http://farm8.staticflickr.com/7265/7590678548_b01dae66d9_n.jpg"}} +{"id": "item_077", "name": "bag", "category": "bag", "group": "accessories", "material": [], "attributes": [], "condition": "needs repair", "quality_tier": "budget", "image": "images/item_077.jpg", "source": {"fashionpedia_image_id": 19794, "annotation_id": 4374, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm4.staticflickr.com/3380/3330216454_b7cfb18015_m.jpg"}} +{"id": "item_078", "name": "tights", "category": "tights", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "budget", "image": "images/item_078.jpg", "source": {"fashionpedia_image_id": 17845, "annotation_id": 2345, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm6.staticflickr.com/5331/9367728147_95ec802588_n.jpg"}} +{"id": "item_079", "name": "tights", "category": "tights", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "mid", "image": "images/item_079.jpg", "source": {"fashionpedia_image_id": 12726, "annotation_id": 8510, "license": "Attribution-NonCommercial License", "license_url": "https://creativecommons.org/licenses/by-nc/2.0/", "original_url": "http://farm4.staticflickr.com/3424/3376870537_528f97195b_n.jpg"}} +{"id": "item_080", "name": "shoe", "category": "shoe", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "budget", "image": "images/item_080.jpg", "source": {"fashionpedia_image_id": 15729, "annotation_id": 585, "license": "Attribution-NonCommercial-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-nc-sa/2.0/", "original_url": "http://farm6.staticflickr.com/5003/29254065174_cdb94b1639_n.jpg"}} +{"id": "item_081", "name": "tights", "category": "tights", "group": "accessories", "material": [], "attributes": [], "condition": "new", "quality_tier": "mid", "image": "images/item_081.jpg", "source": {"fashionpedia_image_id": 20052, "annotation_id": 4607, "license": "Attribution-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-sa/2.0/", "original_url": "http://farm8.staticflickr.com/7125/7609287094_c6a3a9abc5_n.jpg"}} +{"id": "item_082", "name": "shoe", "category": "shoe", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "mid", "image": "images/item_082.jpg", "source": {"fashionpedia_image_id": 9971, "annotation_id": 6184, "license": "Attribution License", "license_url": "https://creativecommons.org/licenses/by/2.0/", "original_url": "http://farm4.staticflickr.com/3758/9349117595_d89e1c4520_n.jpg"}} +{"id": "item_083", "name": "shoe", "category": "shoe", "group": "accessories", "material": [], "attributes": [], "condition": "worn", "quality_tier": "mid", "image": "images/item_083.jpg", "source": {"fashionpedia_image_id": 15967, "annotation_id": 874, "license": "Attribution-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-sa/2.0/", "original_url": "http://farm6.staticflickr.com/5530/14404251815_3b0ea81fc9_n.jpg"}} +{"id": "item_084", "name": "bag", "category": "bag", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "budget", "image": "images/item_084.jpg", "source": {"fashionpedia_image_id": 12257, "annotation_id": 8188, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm4.staticflickr.com/3006/3019117627_c3a1a34125_m.jpg"}} +{"id": "item_085", "name": "shoe", "category": "shoe", "group": "accessories", "material": [], "attributes": [], "condition": "worn", "quality_tier": "budget", "image": "images/item_085.jpg", "source": {"fashionpedia_image_id": 18108, "annotation_id": 2581, "license": "Attribution License", "license_url": "https://creativecommons.org/licenses/by/2.0/", "original_url": "http://farm3.staticflickr.com/2882/13737212405_092964b06e_n.jpg"}} +{"id": "item_086", "name": "shoe", "category": "shoe", "group": "accessories", "material": [], "attributes": [], "condition": "worn", "quality_tier": "mid", "image": "images/item_086.jpg", "source": {"fashionpedia_image_id": 15528, "annotation_id": 408, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm9.staticflickr.com/8620/16539570328_06546776c8_n.jpg"}} +{"id": "item_087", "name": "shoe", "category": "shoe", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "luxury", "image": "images/item_087.jpg", "source": {"fashionpedia_image_id": 15145, "annotation_id": 105, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/9946943646_9d9d76ced7_o.jpg"}} +{"id": "item_088", "name": "bag", "category": "bag", "group": "accessories", "material": [], "attributes": [], "condition": "worn", "quality_tier": "luxury", "image": "images/item_088.jpg", "source": {"fashionpedia_image_id": 13482, "annotation_id": 9174, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm2.staticflickr.com/1088/1450363100_24fbad6e12_m.jpg"}} +{"id": "item_089", "name": "scarf", "category": "scarf", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "mid", "image": "images/item_089.jpg", "source": {"fashionpedia_image_id": 18745, "annotation_id": 3323, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/29644866232_9d9d76ced7_o.jpg"}} +{"id": "item_090", "name": "belt", "category": "belt", "group": "accessories", "material": [], "attributes": [], "condition": "worn", "quality_tier": "budget", "image": "images/item_090.jpg", "source": {"fashionpedia_image_id": 16537, "annotation_id": 2918, "license": "Attribution-NonCommercial License", "license_url": "https://creativecommons.org/licenses/by-nc/2.0/", "original_url": "http://farm4.staticflickr.com/3813/11047131414_6d577933dd_n.jpg"}} +{"id": "item_091", "name": "hat", "category": "hat", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "mid", "image": "images/item_091.jpg", "source": {"fashionpedia_image_id": 13365, "annotation_id": 9055, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm8.staticflickr.com/7340/10766552704_a0327195ce_n.jpg"}} +{"id": "item_092", "name": "glove", "category": "glove", "group": "accessories", "material": [], "attributes": [], "condition": "new", "quality_tier": "budget", "image": "images/item_092.jpg", "source": {"fashionpedia_image_id": 19162, "annotation_id": 3841, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://farm2.staticflickr.com/1936/9956006346_9d9d76ced7_o.jpg"}} +{"id": "item_093", "name": "shoe", "category": "shoe", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "luxury", "image": "images/item_093.jpg", "source": {"fashionpedia_image_id": 17600, "annotation_id": 2135, "license": "Attribution-ShareAlike License", "license_url": "https://creativecommons.org/licenses/by-sa/2.0/", "original_url": "http://farm8.staticflickr.com/7211/7221019400_c88d86aaef_n.jpg"}} +{"id": "item_094", "name": "belt", "category": "belt", "group": "accessories", "material": [], "attributes": [], "condition": "worn", "quality_tier": "mid", "image": "images/item_094.jpg", "source": {"fashionpedia_image_id": 10011, "annotation_id": 6228, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "http://farm9.staticflickr.com/8451/7946607512_bce2f36583_n.jpg"}} +{"id": "item_095", "name": "shoe", "category": "shoe", "group": "accessories", "material": [], "attributes": [], "condition": "needs repair", "quality_tier": "luxury", "image": "images/item_095.jpg", "source": {"fashionpedia_image_id": 20214, "annotation_id": 4728, "license": "Attribution-NonCommercial License", "license_url": "https://creativecommons.org/licenses/by-nc/2.0/", "original_url": "http://farm5.staticflickr.com/4239/35414423502_dfb0a88999_n.jpg"}} +{"id": "item_096", "name": "shoe", "category": "shoe", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "luxury", "image": "images/item_096.jpg", "source": {"fashionpedia_image_id": 12448, "annotation_id": 8311, "license": "Attribution-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nd/2.0/", "original_url": "http://farm8.staticflickr.com/7321/10648989423_5f76019ebe_n.jpg"}} +{"id": "item_097", "name": "belt", "category": "belt", "group": "accessories", "material": [], "attributes": [], "condition": "needs repair", "quality_tier": "mid", "image": "images/item_097.jpg", "source": {"fashionpedia_image_id": 15871, "annotation_id": 717, "license": "Attribution-NonCommercial License", "license_url": "https://creativecommons.org/licenses/by-nc/2.0/", "original_url": "http://farm5.staticflickr.com/4306/35404737294_14cbffd26d_n.jpg"}} +{"id": "item_098", "name": "shoe", "category": "shoe", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "budget", "image": "images/item_098.jpg", "source": {"fashionpedia_image_id": 18461, "annotation_id": 3010, "license": "Attribution-NonCommercial-NoDerivatives License", "license_url": "https://creativecommons.org/licenses/by-nc-nd/2.0/", "original_url": "https://www.flickr.com/photos/evasee/6837149541/"}} +{"id": "item_099", "name": "shoe", "category": "shoe", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "luxury", "image": "images/item_099.jpg", "source": {"fashionpedia_image_id": 10382, "annotation_id": 6431, "license": "Attribution License", "license_url": "https://creativecommons.org/licenses/by/2.0/", "original_url": "http://farm4.staticflickr.com/3001/2895057983_7b4e64a1a5_n.jpg"}} +{"id": "item_100", "name": "hat", "category": "hat", "group": "accessories", "material": [], "attributes": [], "condition": "good", "quality_tier": "luxury", "image": "images/item_100.jpg", "source": {"fashionpedia_image_id": 10382, "annotation_id": 6435, "license": "Attribution License", "license_url": "https://creativecommons.org/licenses/by/2.0/", "original_url": "http://farm4.staticflickr.com/3001/2895057983_7b4e64a1a5_n.jpg"}} diff --git a/tests/test_closet_lib.py b/tests/test_closet_lib.py new file mode 100644 index 0000000..87f9502 --- /dev/null +++ b/tests/test_closet_lib.py @@ -0,0 +1,92 @@ +import random +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts")) + +from closet_lib import ( + group_for, passes_filters, sample_items, split_attributes, + make_name, synthesize, GROUP_TARGETS, +) + + +def ann(id, category_id, image_id, w, h, attrs=()): + return {"id": id, "category_id": category_id, "image_id": image_id, + "bbox": [0, 0, w, h], "attribute_ids": list(attrs)} + + +def test_group_for(): + assert group_for(6) == "bottoms" # pants + assert group_for(10) == "tops" # dress + assert group_for(24) == "accessories" # bag, wallet + assert group_for(31) is None # sleeve (garment part) + + +def test_passes_filters_thresholds(): + assert passes_filters(ann(1, 6, 1, 100, 100)) # garment at 100px + assert not passes_filters(ann(2, 6, 1, 99, 300)) # garment under 100px + assert passes_filters(ann(3, 24, 1, 60, 60)) # accessory at 60px + assert not passes_filters(ann(4, 24, 1, 59, 200)) # accessory under 60px + assert not passes_filters(ann(5, 31, 1, 500, 500)) # excluded category + + +def test_sample_respects_targets_and_image_cap(): + anns = [] + n = 0 + # 3 candidates per image -> cap of 2/image must bite + for img in range(200): + for _ in range(3): + n += 1 + cid = [6, 0, 24][n % 3] + size = 60 if cid == 24 else 100 + anns.append(ann(n, cid, img, size, size)) + picked = sample_items(anns, random.Random(42)) + assert len(picked) == sum(GROUP_TARGETS.values()) == 100 + from collections import Counter + per_img = Counter(a["image_id"] for a in picked) + assert max(per_img.values()) <= 2 + groups = Counter(group_for(a["category_id"]) for a in picked) + assert groups == GROUP_TARGETS + + +def test_sample_is_deterministic(): + anns = [ann(i, 6, i, 120, 120) for i in range(60)] + a = sample_items(anns, random.Random(42)) + b = sample_items(anns, random.Random(42)) + assert [x["id"] for x in a] == [x["id"] for x in b] + + +def test_sample_fills_shortfall_from_other_groups(): + # only 5 accessories exist; total candidates still >= 100 + anns = [ann(i, 24, 1000 + i, 80, 80) for i in range(5)] + anns += [ann(100 + i, 6, i, 120, 120) for i in range(60)] + anns += [ann(300 + i, 0, 500 + i, 120, 120) for i in range(60)] + picked = sample_items(anns, random.Random(42)) + assert len(picked) == 100 + + +def test_split_attributes(): + attr_index = { + 1: {"name": "suede", "supercategory": "leather"}, + 2: {"name": "plain (pattern)", "supercategory": "textile pattern"}, + 3: {"name": "washed", "supercategory": "textile finishing, manufacturing techniques"}, + 4: {"name": "metal", "supercategory": "non-textile material type"}, + 5: {"name": "no non-textile material", "supercategory": "non-textile material type"}, + 6: {"name": "no waistline", "supercategory": "waistline"}, + } + materials, attrs = split_attributes([1, 2, 3, 4, 5, 6], attr_index) + assert materials == ["suede", "metal"] + assert attrs == ["plain", "washed"] + + +def test_make_name(): + assert make_name(["suede"], ["washed"], "jacket") == "suede washed jacket" + assert make_name([], [], "bag, wallet") == "bag" + assert make_name([], ["a", "b", "c"], "pants") == "a b pants" # capped at 2 descriptors + + +def test_synthesize_values_and_determinism(): + c, t = synthesize(random.Random(7)) + assert c in {"new", "good", "worn", "needs repair"} + assert t in {"luxury", "mid", "budget"} + assert synthesize(random.Random(7)) == (c, t)