diff --git a/experiments/autodetect/.gitignore b/experiments/autodetect/.gitignore new file mode 100644 index 000000000..2d9f16e2d --- /dev/null +++ b/experiments/autodetect/.gitignore @@ -0,0 +1,2 @@ +.build/ +.swiftpm/ diff --git a/experiments/autodetect/.python-version b/experiments/autodetect/.python-version new file mode 100644 index 000000000..e4fba2183 --- /dev/null +++ b/experiments/autodetect/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/experiments/autodetect/PLAN.md b/experiments/autodetect/PLAN.md new file mode 100644 index 000000000..7bd87449e --- /dev/null +++ b/experiments/autodetect/PLAN.md @@ -0,0 +1,102 @@ +# Auto-proposed marks: recommendation, flow and integration plan + +Written for the experience design thread, which owns the confirm UI, and for S3 and Aiden, who own +the app. The measurements are in [README.md](README.md) and `results/`. Line numbers refer to +`origin/t3/ios-mvf`. + +## Recommendation + +1. **Ship the meter brand now.** Vision's text recognition already runs on the close-up, and a list + of meter makers turns its lines into a brand. It names the right maker on 17 of 19 photos where + the brand is printed in plain letters, and on 22 of 42 where it is part of a logo, such as + Tatung's round badge or GE's script monogram. It named nothing on the 9 photos without a brand, + and a wrong maker once, on a plate carrying two makers' names + ([meter_brand/results/brand.md](meter_brand/results/brand.md)). Show the brand pre-filled and + editable above the number candidates. It needs no model and no download. +2. **Don't ship automatic wall-object proposals from public data.** No candidate passed. The best, + OWLv2, found 23% of Open Images windows at 55% precision, and it is a 308 MB model that takes + about half a second a frame on a Mac GPU. The on-device student (Create ML, 6.8 MB, 50 ms on the + Mac) found 7%. The public photos show whole buildings from far away. The app sees one wall from + 1 to 3 m. Counting only large objects, the student's window AP50 rises from 9% to 38%, which + points at the data, not the model size. +3. **Collect the app's own frames and train on those.** The packet already keeps every keyframe + with its pose. Aiden records walls with the app (about 30 to start; nothing yet says how many + are enough); OWLv2 pre-labels the keyframes offline (Apache-2.0, and this harness already runs + it); a person accepts or fixes each box; the Create ML student retrains on that, and this + harness scores it on held-out houses against the same criteria. That is the first run whose + result can settle the question, and the same labels give the first test of AC units, gas + meters, electrical boxes, garage doors and batteries, which no public set labels. +4. **Lift boxes from their inner corners.** Lifting a true door box through the laser depth from + the midpoints of its sides is off by 0.59 ft p90; from the inner corner of each side, by + 0.11 ft ([results/extent.md](results/extent.md)). Whatever detector lands, the lifting code + should use inner corners. +5. **Leave the long D-FINE and Grounding DINO runs.** D-FINE would train about 10 hours and + Grounding DINO would label for about 5 hours on this shared Mac, both on the same off-view data + that limited the student. Neither would change recommendation 3. + +Not measured, and worth a device check once the flow exists: ARKit's mesh classes include window +and door on LiDAR phones only, with no published outdoor accuracy, so they can at most add a cue. +RoomPlan is documented for indoor rooms. On iOS 27 the Foundation Models framework accepts images, +but Apple documents no box output, so it could at most verify a crop ("is this a gas meter?"). + +## The flow once a detector passes + +The homeowner answers yes or no to what the phone found, and draws only what it missed. + +``` +Walk along the wall (unchanged) + │ the detector runs on each kept keyframe, off the main actor + │ a proposal appears once the same object lifts to the same wall stretch in 2 keyframes + │ it is drawn on the wall as a dashed outline with its kind; no prompt, no haptic, + │ so the walk is not interrupted + ↓ +"Anything else near your meter?" (MarkFeaturesScreen) + │ "We spotted 3 things on this wall", nearest the meter first, at most 6 rows + │ each row: crop from the sharpest keyframe with the box drawn · kind · "About 7 ft right" + │ [Yes] [Not a window ▾] (menu: another kind, or "Nothing there") + ├──→ Yes: the row turns solid; a window then asks "Does it open?" as today + ├──→ another kind: the kind changes and the row is confirmed + ├──→ Nothing there: the row goes away and is recorded as rejected + ├──→ tap the crop: the full photo with four edge handles; drag, Done; the box is lifted again + ├──→ Add something: today's tap-to-mark flow, unchanged + ↓ +"Looks complete": unanswered proposals are exported, never dropped +``` + +Why each choice: + +- **An unanswered proposal stays.** Dropping an unconfirmed gas meter would turn unsure into clear, + which AGENTS.md forbids. It goes to the server as `source: "vlm"` with its `conf`, so the server + applies the vision-model error bar. +- **Adjust on a still photo, not in AR.** Dragging handles on a live view fights hand shake and + tracking. The crop is the image the extent was computed from, so an edit maps straight back. +- **Yes is the big target; rejecting takes two taps.** "Nothing there" sits inside the kind menu. +- **Dashed means proposed and solid means confirmed**, in AR and in the list, so the state never + rests on colour alone. +- **Motion.** An outline fades in over 200 ms with a strong ease-out from 96% scale, and turns + solid over 150 ms when confirmed. With Reduce Motion, opacity only. Nothing bounces. +- **VoiceOver** reads a row as "Window, about 7 feet right of the meter, proposed", with actions + Yes, Change kind and Nothing there. Targets are at least 44 pt. + +The meter close-up gains one line above the number candidates: the brand, with "Change". A brand +not on the list shows "Brand not read" and a picker, and never blocks the step. + +## Where it goes in HouseScanKit and the app + +PR #52 (`t3/battery-mark`) adds `.battery` and `.elecBox` to `FeatureKind` and should merge first. +`FeatureKind` still has no garage door, although `PacketMark.Kind` has `garageDoor`. + +| Step | Files | Change | +|---|---|---| +| 1. Brand | `HouseScan/Runtime/MeterReader/VisionMeterNumberReader.swift:11-70`, new `HouseScanKit/Meter/MeterBrand.swift`, `UI/Screens/MeterCloseUpScreen.swift` | Keep the recognised lines, which are discarded after ranking today; port `meter_brand/brands.py` with strict tests; show the brand. Ships alone. | +| 2. Detector interface | new `HouseScanKit/Detect/WallObjectDetector.swift`; new `HouseScan/Runtime/Detect/CoreMLWallObjectDetector.swift` | `detect(jpeg:) -> [ImageBox]` in landscape sensor pixels, matching the intrinsics (AGENTS.md). The app target holds the model; the package stays model-free. A file-backed stub lets steps 3-7 ship before a model passes. | +| 3. Lift to the wall | `HouseScanKit/Geometry/WallFrame.swift:214-257`, `Geometry/Camera.swift:65-107` | Box → rays through the inner corners → keyframe depth when present, else `WallFrame.intersectWall` → span, bottom, top. | +| 4. Fuse keyframes | new `HouseScanKit/Detect/ProposalTracker.swift` | Match lifted boxes by kind and overlapping span; keep a proposal after 2 views; median edges and their spread. | +| 5. Run on keyframes | `HouseScan/Runtime/KeyframeStore.swift:66-116`, `Runtime/ScanEngine.swift:524-550` | Detect in the detached task that already writes each keyframe; post results to the engine on the main actor. | +| 6. State | `HouseScan/Contract/ScanContract.swift:406-449` | `MarkedFeature` gains its origin (tap or proposal with `conf`), a status (unanswered, confirmed, rejected), and the keyframe and box it came from. | +| 7. Review UI | `UI/Screens/MarkFeaturesScreen.swift`, `UI/Camera/WallMarksOverlay.swift:46-71`, `UI/Copy/ScanCopy.swift:149-178` | The rows, outlines and copy above. | +| 8. Export | `Runtime/ScanEngine+Export.swift:13-51`, `HouseScanKit/Scene/SceneExport.swift:407-434` | `source: "vlm"` and `conf` for proposals. `SceneDocument.Object` has no `conf` field yet. | +| 9. Replay test | `Runtime/ReplayPlayer.swift`, `HouseScanKit/Replay/ReplaySession.swift` | Replay a recorded walk through steps 2-5 and check the proposals, without a phone. | + +Steps 1, 3 and 4 are pure logic with one correct answer, so they get strict unit tests; step 3 can +reuse the ETH3D door numbers in `results/extent.md`. diff --git a/experiments/autodetect/README.md b/experiments/autodetect/README.md new file mode 100644 index 000000000..06d6a227c --- /dev/null +++ b/experiments/autodetect/README.md @@ -0,0 +1,45 @@ +# Autodetect: can the phone propose windows and doors? + +Today the homeowner draws each window box and taps its corners. This experiment asks which detector could propose windows and doors for the homeowner to confirm, how fast it runs, and whether a detected box, lifted onto the wall, is accurate enough to replace the taps. + +## Pass criteria (fixed before any scored run) + +1. **Proposals.** A candidate is good enough to propose window or door when, at its operating threshold, recall is at least 80% and precision at least 60% at IoU 0.5. The threshold is chosen per class on a 150-image Open Images tune set, then applied unchanged to each held-out set: 300 Open Images images and the 378 CMP Facade base images. The verdict is given per set. Open Images scoring follows its own rules for unverified classes and group-of boxes (`autodetect/oieval.py`). Both sets differ from the app's view: they show whole buildings from a distance, and CMP's facades are frontal and rectified. The app sees one wall at an angle from 1 to 3 m. +2. **Speed class**, from Mac (M4 Pro) timings: live (at most 100 ms a frame), keyframe (at most 1 s), or offline (over 1 s). +3. **3D extent.** A detected edge lifted to the wall replaces a tap when its p90 error is at most 0.5 ft. Ground truth is each door's or window's edges measured once in the ETH3D electro laser scan. Separately, the spread of one object's lifted edges across photos is reported. + +Prompts, thresholds and detector settings are in `autodetect/config.py`. + +## Rerun + +Needs about 300 MB in `~/house-scanning-data/autodetect/`, plus one model's weights at a time (up to 360 MB) and 230 MB of Create ML checkpoints while the student trains. The 3D step needs the ETH3D electro packet and scan from the evals lane. `results/resources.md` has the time and memory of each step. + +```sh +uv sync && uv run pytest +uv run python -m autodetect.openimages select && uv run python -m autodetect.openimages download +uv run python -m autodetect.cmp +swift build -c release --package-path vision # copy rects, coremldet, trainod to ~/house-scanning-data/autodetect/bin +uv run python -m autodetect.run_vision oi_tune oi_eval cmp electro +uv run python -m autodetect.owl oi_tune oi_eval cmp electro # needs weights/owlv2/model_fp16.onnx, then delete it +uv run python -m autodetect.student prepare && uv run python -m autodetect.student train transfer 1000 +uv run python -m autodetect.student crop transfer # tune set only; scaleFill won +uv run python -m autodetect.student predict transfer scaleFill +uv run python -m autodetect.score # results/proposals.md +uv run python -m autodetect.extent_gt save && uv run python -m autodetect.extent # results/extent.md +``` + +Written but not run to completion, for lack of time on the shared Mac: `autodetect.gdino` (Grounding DINO tiny) and `autodetect.dfine` (D-FINE small fine-tune). Each module's docstring says why. + +## Result + +No candidate passes, so the app should not propose walls' windows and doors from a model trained on public photos. [PLAN.md](PLAN.md) has the recommendation, the confirm flow and the integration plan. + +| Candidate | Size, Mac speed | Window P / R, Open Images | Door P / R, Open Images | Door edges lifted, p90 | +|---|---|---|---|---| +| OWLv2, zero-shot | 308 MB, 481 ms (GPU) | 55% / 23% | 75% / 58% | 1.62 ft | +| Create ML student | 6.8 MB, 50 ms | 56% / 7% | 53% / 8% | no door matched | +| Vision rectangles | in the OS, 12 ms | 6.5% / 15% | – | 1.18 ft | + +CMP Facade gives the same verdict (`results/proposals.md`). Lifting a true door box onto the laser-scanned wall is off by 0.11 ft p90 from the box's inner corners and 0.59 ft from its side midpoints, so the lifting step works and the boxes are what fail (`results/extent.md`). The public photos show whole buildings from far away; counting only large objects, the student's window AP50 rises from 9% to 38%. + +**Meter brand.** Vision's lines plus a list of meter makers (`meter_brand/`) name the brand on 17 of 19 photos where it is printed in plain letters and 22 of 42 where it is part of a logo, and name nothing on the 9 without one. No pass bar was set before this run. Details and the post-run changes are in `meter_brand/README.md`. diff --git a/experiments/autodetect/autodetect/__init__.py b/experiments/autodetect/autodetect/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/experiments/autodetect/autodetect/cmp.py b/experiments/autodetect/autodetect/cmp.py new file mode 100644 index 000000000..ebb83b079 --- /dev/null +++ b/experiments/autodetect/autodetect/cmp.py @@ -0,0 +1,77 @@ +"""CMP Facade base set (Tylecek and Sara, GCPR 2013; CC BY-SA) as a second, frontal eval set. + +Every facade element is annotated, so window and door count as verified in every image: an +image with no door rectangle is a verified negative for door. There are no group-of boxes. + +In the XML, the two values are the rectangle's vertical extent and the two values its +horizontal extent, both normalized with a top-left origin. Read as labelled, window rectangles +cover 18% window pixels in the set's own label maps on average; swapped, they cover 87% (the +rest is blinds and railings drawn over windows), and they sit on the windows by eye. + +The images are rectified frontal facades, often several storeys, shot from across a street. +The app sees one wall from 1 to 3 m at an angle, so this set tests recognition on a different +view from the product's. + +Usage: python -m autodetect.cmp # DATA/cmp/gt.json and manifests/cmp_base.csv +""" + +from __future__ import annotations + +import csv +import json +import re +from pathlib import Path + +from PIL import Image + +from .paths import CMP, MANIFESTS + +URL = "https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip" +OBJECT = re.compile(r"(.*?)", re.S) + + +def _field(block: str, tag: str) -> list[str]: + return [v.strip() for v in re.findall(rf"<{tag}>(.*?)", block, re.S)] + + +def parse(xml_path: Path) -> list[dict]: + boxes = [] + for block in OBJECT.findall(xml_path.read_text()): + (name,) = _field(block, "labelname") + if name not in ("window", "door"): + continue + rows = sorted(float(v) for v in _field(block, "x")) # vertical, despite the tag + cols = sorted(float(v) for v in _field(block, "y")) # horizontal + if len(rows) != 2 or len(cols) != 2: + raise ValueError(f"{xml_path.name}: expected 2 and 2 values, got {rows} {cols}") + boxes.append({"label": name, "box": [cols[0], rows[0], cols[1], rows[1]], "group": False}) + return boxes + + +def build() -> None: + gt = {} + for xml in sorted((CMP / "base").glob("cmp_b*.xml")): + image_id = xml.stem + boxes = parse(xml) + with Image.open(xml.with_suffix(".jpg")) as im: + w, h = im.size + labels = {b["label"] for b in boxes} + gt[image_id] = { + "w": w, + "h": h, + "verified": {c: int(c in labels) for c in ("window", "door")}, + "boxes": boxes, + } + (CMP / "gt.json").write_text(json.dumps(gt)) + with open(MANIFESTS / "cmp_base.csv", "w", newline="") as f: + w = csv.writer(f) + w.writerow(["image_id", "source_url", "license", "author"]) + for image_id in gt: + w.writerow([image_id, URL, "CC BY-SA 3.0", "R. Tylecek, R. Sara, CMP Prague (collected from various sources)"]) + n_w = sum(b["label"] == "window" for g in gt.values() for b in g["boxes"]) + n_d = sum(b["label"] == "door" for g in gt.values() for b in g["boxes"]) + print(f"{len(gt)} images, {n_w} windows, {n_d} doors, {sum(g['verified']['door'] for g in gt.values())} images with a door") + + +if __name__ == "__main__": + build() diff --git a/experiments/autodetect/autodetect/config.py b/experiments/autodetect/autodetect/config.py new file mode 100644 index 000000000..400663b5d --- /dev/null +++ b/experiments/autodetect/autodetect/config.py @@ -0,0 +1,73 @@ +"""Choices fixed before any scored run. Changing one after scoring means rerunning every candidate. + +Committed together with the pass criteria in README.md, before the first scored run. +""" + +# Operating threshold: chosen per model and class on the OI tune set (150 images, disjoint from +# eval), then applied unchanged to OI eval and CMP. Rule: the lowest score at which precision is +# at least MIN_PRECISION, which gives the most recall that still meets the precision bar; when no +# score reaches it, the score with the best F1. See oieval.choose_threshold. +MIN_PRECISION = 0.60 +MIN_RECALL = 0.80 +IOU = 0.5 + +# Diagnostic only, not a pass criterion: at 1 to 3 m an iPhone frame holds a window or door at +# roughly 15% or more of the frame's width. Boxes smaller than this fraction of the image in +# either dimension are treated as "difficult" (detections on them ignored, not counted as missed) +# in the "near-sized" tables, and detections that small are dropped there (added after the first +# scored run; see results/proposals.md). +NEAR_MIN_SIDE = 0.10 + +# OWLv2 text queries, one per wall object. Scored classes are window and door; the others are in +# the query list so a door competes with "garage door" the way it would in the app. Each box +# takes the query with the highest score. +OWL_QUERIES = { + "window": "a photo of a window", + "door": "a photo of a door", + "garage_door": "a photo of a garage door", + "ac": "a photo of an air conditioner", + "gas_meter": "a photo of a gas meter", + "elec_box": "a photo of an electrical box", + "battery": "a photo of a home battery", +} +# Grounding DINO takes one caption with the same objects, each phrase ending in " .". +GDINO_PHRASES = { + "window": "window", + "door": "door", + "garage_door": "garage door", + "ac": "air conditioner", + "gas_meter": "gas meter", + "elec_box": "electrical box", + "battery": "home battery", +} + +# Post-processing for the open-vocabulary models: per-class NMS at this IoU, then the top +# MAX_DETS boxes above MIN_SCORE per image. The low floor keeps the tail needed for AP. The +# student gets the same per-image cap after its own NMS (set before it was scored). +NMS_IOU = 0.5 +MAX_DETS = 100 +MIN_SCORE = 0.01 + +# Apple Vision VNDetectRectanglesRequest. Defaults would return one rectangle at least 20% of the +# image; these allow many small ones. Aspect ratio is short side over long side, so 0.2 admits a +# door (about 0.4). Quadrature tolerance stays at Apple's default, 30 degrees. +VISION_RECTS = { + "maximumObservations": 0, # 0 = no limit + "minimumAspectRatio": 0.2, + "maximumAspectRatio": 1.0, + "minimumSize": 0.03, + "quadratureTolerance": 30.0, + "minimumConfidence": 0.0, +} + +# Create ML student: transfer learning on Apple's object feature print, trained on the OI train +# subset (window and door). Core ML confidence floor for scoring, and the NMS IoU in its pipeline. +STUDENT_CONFIDENCE_FLOOR = 0.01 +STUDENT_NMS_IOU = 0.45 + +# Speed classes from Mac timings (M4 Pro); an iPhone is slower, so these are optimistic. +LIVE_MS = 100 +KEYFRAME_MS = 1000 + +# 3D extent: an edge lifted to the wall replaces a tap when its p90 error is at most this. +EXTENT_P90_FT = 0.5 diff --git a/experiments/autodetect/autodetect/dfine.py b/experiments/autodetect/autodetect/dfine.py new file mode 100644 index 000000000..26ca6ebdc --- /dev/null +++ b/experiments/autodetect/autodetect/dfine.py @@ -0,0 +1,203 @@ +"""Fallback student: D-FINE small (ustc-community/dfine-small-coco, Apache-2.0, COCO-pretrained) +fine-tuned for window and door on the same 1,340 Open Images train images as the Create ML student, +in PyTorch on MPS. Used because the Create ML transfer-learning student scored poorly +(results/proposals.md). + +Preprocessing is the checkpoint's: resize to 640 x 640 and scale to [0, 1], no normalization. +Training: horizontal flips, AdamW (backbone at a tenth of the base rate), linear warmup, gradient +clipping at 0.1, a fixed number of epochs set before any scoring, final weights kept. Each box +takes its best class; the shared post-processing (nms.py) then applies, as for OWLv2. + +transformers' DFineIntegral calls F.linear with a one-dimensional weight, whose backward pass fails +on MPS ("mat2 must be a matrix"). _patch_integral swaps in the same weighted sum written as a +product and sum; tests/test_dfine.py checks the two agree. + +Not trained in this run. `probe` measured 8.6 s a step (batch 4, 640 px, 3.56 GB of GPU memory) +on this shared Mac at a load average near 300, which is about 48 minutes an epoch. Timings from +`predict` would be PyTorch on the Mac (MPS, and CPU-only for OI eval); there is no Core ML export +here, so on-device speed would still be unmeasured. + +Usage: python -m autodetect.dfine train [batch] + python -m autodetect.dfine probe # time 20 training steps and report memory + python -m autodetect.dfine predict +""" + +from __future__ import annotations + +import json +import random +import sys +import time + +import numpy as np +from PIL import Image + +from .nms import postprocess +from .paths import DATA, WEIGHTS +from .sets import SETS, ground_truth, image_path, save_preds + +BASE = WEIGHTS / "dfine-small" +OUT = DATA / "student" / "dfine_small" +LABELS = ["window", "door"] +SIZE = 640 +LR, BACKBONE_LR_SCALE, WEIGHT_DECAY, WARMUP, CLIP = 2e-4, 0.1, 1e-4, 100, 0.1 +MPS_MEMORY_FRACTION = 0.2 # of the recommended working set, to keep GPU memory near 3 GB +SEED = 20260926 + + +def _integral_forward(self, pred_corners, project): + import torch.nn.functional as F + + batch_size, num_queries, _ = pred_corners.shape + prob = F.softmax(pred_corners.reshape(-1, self.max_num_bins + 1), dim=1) + corners = (prob * project.to(prob.device).reshape(1, -1)).sum(1).reshape(-1, 4) + return corners.reshape(batch_size, num_queries, -1) + + +def _patch_integral() -> None: + from transformers.models.d_fine import modeling_d_fine + + modeling_d_fine.DFineIntegral.forward = _integral_forward + + +def _device(): + import torch + + if not torch.backends.mps.is_available(): + raise RuntimeError("MPS not available") + torch.mps.set_per_process_memory_fraction(MPS_MEMORY_FRACTION) + return torch.device("mps") + + +def pixels(im: Image.Image) -> np.ndarray: + x = np.asarray(im.convert("RGB").resize((SIZE, SIZE), Image.Resampling.BILINEAR), dtype=np.float32) / 255.0 + return x.transpose(2, 0, 1) + + +def _batches(gt: dict, batch: int, rng: random.Random): + ids = sorted(gt) + rng.shuffle(ids) + for k in range(0, len(ids) - batch + 1, batch): + xs, ys = [], [] + for i in ids[k : k + batch]: + x = pixels(Image.open(image_path("oi_train", i))) + b = np.array([bb["box"] for bb in gt[i]["boxes"]], dtype=np.float32) + c = np.array([LABELS.index(bb["label"]) for bb in gt[i]["boxes"]]) + if rng.random() < 0.5: + x = x[:, :, ::-1].copy() + b = np.stack([1 - b[:, 2], b[:, 1], 1 - b[:, 0], b[:, 3]], 1) + cxcywh = np.stack([(b[:, 0] + b[:, 2]) / 2, (b[:, 1] + b[:, 3]) / 2, b[:, 2] - b[:, 0], b[:, 3] - b[:, 1]], 1) + xs.append(x) + ys.append((c, cxcywh)) + yield np.stack(xs), ys + + +def _model(path, device): + from transformers import DFineForObjectDetection + + _patch_integral() + kw = {} + if path == BASE: + kw = dict(num_labels=2, id2label=dict(enumerate(LABELS)), label2id={n: k for k, n in enumerate(LABELS)}, ignore_mismatched_sizes=True) + return DFineForObjectDetection.from_pretrained(str(path), **kw).to(device) + + +def train(epochs: int, batch: int = 4, max_steps: int | None = None) -> None: + import torch + + torch.manual_seed(SEED) + dev = _device() + model = _model(BASE, dev).train() + backbone = [p for n, p in model.named_parameters() if "backbone" in n] + rest = [p for n, p in model.named_parameters() if "backbone" not in n] + opt = torch.optim.AdamW( + [{"params": backbone, "lr": LR * BACKBONE_LR_SCALE}, {"params": rest, "lr": LR}], weight_decay=WEIGHT_DECAY + ) + base_lrs = [g["lr"] for g in opt.param_groups] + gt = ground_truth("oi_train") + rng = random.Random(SEED) + step, t0 = 0, time.perf_counter() + log = open(DATA / "student" / "dfine_small_train.log", "a") + for epoch in range(epochs): + losses = [] + for x, ys in _batches(gt, batch, rng): + labels = [{"class_labels": torch.from_numpy(c).to(dev), "boxes": torch.from_numpy(b).to(dev)} for c, b in ys] + out = model(pixel_values=torch.from_numpy(x).to(dev), labels=labels) + opt.zero_grad() + out.loss.backward() + torch.nn.utils.clip_grad_norm_(model.parameters(), CLIP) + warm = min(1.0, (step + 1) / WARMUP) + for g, lr in zip(opt.param_groups, base_lrs): + g["lr"] = lr * warm + opt.step() + losses.append(out.loss.item()) + step += 1 + if step % 20 == 0: + msg = f"epoch {epoch} step {step} loss {np.mean(losses[-20:]):.3f} {time.perf_counter() - t0:.0f}s mps {torch.mps.driver_allocated_memory() / 1e9:.2f} GB" + print(msg, file=sys.stderr) + log.write(msg + "\n") + log.flush() + if max_steps and step >= max_steps: + return + OUT.mkdir(parents=True, exist_ok=True) + model.save_pretrained(str(OUT)) + (OUT / "train.json").write_text(json.dumps({"epochs": epochs, "batch": batch, "steps": step, "seconds": time.perf_counter() - t0})) + + +def detect(model, dev, path) -> tuple[list[dict], float]: + import torch + + x = torch.from_numpy(pixels(Image.open(path))[None]).to(dev) + t0 = time.perf_counter() + with torch.inference_mode(): + out = model(pixel_values=x) + logits = out.logits[0].float().cpu().numpy() + boxes = out.pred_boxes[0].float().cpu().numpy() + ms = 1000 * (time.perf_counter() - t0) + prob = 1 / (1 + np.exp(-logits)) + cx, cy, w, h = boxes.T + xyxy = np.clip(np.stack([cx - w / 2, cy - h / 2, cx + w / 2, cy + h / 2], 1), 0, 1) + return postprocess(xyxy, prob.max(1), [LABELS[k] for k in prob.argmax(1)]), ms + + +def predict() -> None: + import torch + + size = sum(p.stat().st_size for p in OUT.glob("*.safetensors")) + meta = { + "model": "D-FINE small, fine-tuned for window and door", + "license": "Apache-2.0 base; fine-tuned on Open Images V7 train (CC BY 2.0 images, CC BY 4.0 boxes)", + "size": f"{size / 1e6:.0f} MB (safetensors fp32)", + "runtime": "PyTorch MPS (GPU), Mac, fp32", + "input": "640 x 640 (stretched)", + "train": json.loads((OUT / "train.json").read_text()), + "command": "uv run python -m autodetect.dfine predict", + } + dev = _device() + model = _model(OUT, dev).eval() + for s in (*SETS, "electro"): + images = {} + for i in sorted(ground_truth(s)): + dets, ms = detect(model, dev, image_path(s, i)) + images[i] = {"elapsed_ms": ms, "dets": dets} + save_preds("student_dfine", s, meta, images) + print(f"{s}: {len(images)} images", file=sys.stderr) + cpu = torch.device("cpu") + model = model.to(cpu) + images = {} + for i in sorted(ground_truth("oi_eval"))[:61]: # 60 timed after one warm-up + dets, ms = detect(model, cpu, image_path("oi_eval", i)) + images[i] = {"elapsed_ms": ms, "dets": dets} + save_preds("student_dfine_cpu", "oi_eval", dict(meta, runtime="PyTorch CPU, Mac, fp32 (first 61 OI eval images)"), images) + + +if __name__ == "__main__": + step = sys.argv[1] + if step == "train": + train(int(sys.argv[2]), int(sys.argv[3]) if len(sys.argv) > 3 else 4) + elif step == "probe": + train(1, 4, max_steps=20) + elif step == "predict": + predict() + else: + raise SystemExit(f"unknown step {step!r}") diff --git a/experiments/autodetect/autodetect/electro.py b/experiments/autodetect/autodetect/electro.py new file mode 100644 index 000000000..6f0c4cbdb --- /dev/null +++ b/experiments/autodetect/autodetect/electro.py @@ -0,0 +1,184 @@ +"""Geometry of the ETH3D electro capture packet (packet 1.1) and its laser scan, in the meter frame. + +Conventions (packet/README.md and docs/00): poses map ARKit camera coordinates (x right, y up, +looking down -z) into the meter frame (+y up, +z out of the meter's wall), 16 numbers column-major. +Intrinsics are for the stored landscape photo. Depth is float32 meters along the camera's -z axis +on a grid 1/16 of the photo, 0 = none. The ray through photo pixel (u, v) is +((u - cx) / fx, -(v - cy) / fy, -1) before rotation. + +The laser scan (ETH3D scan_points_10mm.npy, from the evals lane) is in ETH3D's frame. Its map to +the meter frame is meter_from_cam @ diag(1, -1, -1) @ cam_from_scan, where cam_from_scan is +ETH3D's COLMAP pose; all eight photos give the same map to 1e-15 m. +""" + +from __future__ import annotations + +import json +from dataclasses import dataclass +from functools import cache +from pathlib import Path + +import numpy as np + +from .paths import DATA, ELECTRO + +EVALS = Path.home() / "house-scanning-data" / "evals" / "eth3d" / "electro" +FT = 3.280839895 + + +@dataclass +class Photo: + id: str + W: int + H: int + K: np.ndarray # fx, fy, cx, cy for the full photo + pose: np.ndarray # 4x4 camera (ARKit axes) to meter frame + depth: np.ndarray # (h, w) meters along -z, 0 = none + + def ray(self, u: np.ndarray, v: np.ndarray) -> tuple[np.ndarray, np.ndarray]: + """Origin and unit direction in the meter frame of rays through full-photo pixels.""" + fx, fy, cx, cy = self.K + d = np.stack([(u - cx) / fx, -(v - cy) / fy, -np.ones_like(u, dtype=float)], -1) + d = d @ self.pose[:3, :3].T + return self.pose[:3, 3], d / np.linalg.norm(d, axis=-1, keepdims=True) + + def depth_points(self, x0: float, y0: float, x1: float, y1: float) -> np.ndarray: + """Meter-frame points of every depth pixel whose centre lies in a normalized box.""" + h, w = self.depth.shape + c0, c1 = int(np.floor(max(x0, 0) * w)), int(np.ceil(min(x1, 1) * w)) + r0, r1 = int(np.floor(max(y0, 0) * h)), int(np.ceil(min(y1, 1) * h)) + rr, cc = np.mgrid[r0:r1, c0:c1] + z = self.depth[r0:r1, c0:c1] + ok = z > 0 + u = (cc[ok] + 0.5) * self.W / w + v = (rr[ok] + 0.5) * self.H / h + fx, fy, cx, cy = self.K + pc = np.stack([(u - cx) / fx * z[ok], -(v - cy) / fy * z[ok], -z[ok]], -1) + return pc @ self.pose[:3, :3].T + self.pose[:3, 3] + + def project(self, p: np.ndarray) -> np.ndarray: + """Normalized image coordinates (x, y in [0, 1] inside the photo) of meter-frame points.""" + R, t = self.pose[:3, :3], self.pose[:3, 3] + pc = (p - t) @ R # into camera axes + fx, fy, cx, cy = self.K + u = fx * pc[..., 0] / -pc[..., 2] + cx + v = -fy * pc[..., 1] / -pc[..., 2] + cy + return np.stack([u / self.W, v / self.H], -1) + + +@cache +def manifest() -> dict: + return json.loads((ELECTRO / "manifest.json").read_text()) + + +def ground_y() -> float: + return manifest()["session"]["meter_anchor"]["ground_y_m"] + + +@cache +def photos() -> dict[str, Photo]: + out = {} + for p in manifest()["photos"]: + d = p["depth"] + depth = np.fromfile(ELECTRO / d["map"]["path"], " dict[str, np.ndarray]: + out = {} + for line in (EVALS / "dslr_calibration_undistorted" / "images.txt").read_text().splitlines(): + f = line.split() + if line.startswith("#") or len(f) != 10 or not f[9].startswith("dslr_images"): + continue + w, x, y, z = map(float, f[1:5]) + R = np.array([ + [1 - 2 * (y * y + z * z), 2 * (x * y - z * w), 2 * (x * z + y * w)], + [2 * (x * y + z * w), 1 - 2 * (x * x + z * z), 2 * (y * z - x * w)], + [2 * (x * z - y * w), 2 * (y * z + x * w), 1 - 2 * (x * x + y * y)], + ]) + T = np.eye(4) + T[:3, :3], T[:3, 3] = R, list(map(float, f[5:8])) + out[f[9].split("/")[-1]] = T + return out + + +def meter_from_scan() -> np.ndarray: + """Scan frame to meter frame; raises if the eight photos disagree by more than 1 mm.""" + first = int(manifest()["session"]["id"].split("-")[2]) # eth3d-electro-9257-9264 + cols = _colmap_poses() + Ts = [ + photos()[p["id"]].pose @ np.diag([1.0, -1.0, -1.0, 1.0]) @ cols[f"DSC_{first + k}.JPG"] + for k, p in enumerate(manifest()["photos"]) + ] + spread = np.abs(np.array(Ts) - Ts[0]).max() + if spread > 1e-3: + raise ValueError(f"photos disagree on the scan-to-meter map by {spread}") + return Ts[0] + + +@cache +def scan() -> np.ndarray: + """Laser points in the meter frame (float32, cached in DATA).""" + cached = DATA / "scan_meter_frame.npy" + if cached.exists(): + return np.load(cached) + T = meter_from_scan() + P = np.load(EVALS / "scan_points_10mm.npy") + Q = (P @ T[:3, :3].T + T[:3, 3]).astype(np.float32) + np.save(cached, Q) + return Q + + +@dataclass +class WallFrame: + """A vertical plane: origin, outward unit normal (toward the cameras), and unit axis along + the wall to the right as seen facing it. Height is meter-frame y above the meter's ground.""" + + origin: np.ndarray + normal: np.ndarray + along: np.ndarray + + @staticmethod + def from_normal(origin: np.ndarray, normal: np.ndarray) -> "WallFrame": + n = np.array([normal[0], 0.0, normal[2]]) + n /= np.linalg.norm(n) + along = np.cross([0.0, 1.0, 0.0], n) # up x out = right, facing the wall + return WallFrame(np.asarray(origin, float), n, along / np.linalg.norm(along)) + + def coords(self, p: np.ndarray) -> np.ndarray: + """(along, height, out) in meters.""" + d = p - self.origin + return np.stack([d @ self.along, p[..., 1] - ground_y(), d @ self.normal], -1) + + def intersect(self, o: np.ndarray, d: np.ndarray) -> np.ndarray: + t = ((self.origin - o) @ self.normal) / (d @ self.normal) + return o + t[..., None] * d + + +def fit_vertical_plane(pts: np.ndarray, toward: np.ndarray, tol: float = 0.02, iters: int = 400, seed: int = 0) -> tuple[WallFrame, float]: + """RANSAC plane whose normal is within 10 degrees of horizontal, oriented toward `toward`. + Returns the frame (origin = inlier centroid) and the inlier fraction.""" + rng = np.random.default_rng(seed) + best, best_n = None, -1 + for _ in range(iters): + a, b, c = pts[rng.choice(len(pts), 3, replace=False)] + n = np.cross(b - a, c - a) + if np.linalg.norm(n) < 1e-9: + continue + n /= np.linalg.norm(n) + if abs(n[1]) > np.sin(np.radians(10)): + continue + inl = np.abs((pts - a) @ n) < tol + if inl.sum() > best_n: + best, best_n = inl, inl.sum() + if best is None: + raise ValueError("no vertical plane found") + q = pts[best] + c = q.mean(0) + # refine: normal = smallest singular vector of the inliers, forced vertical + n = np.linalg.svd(q - c, full_matrices=False)[2][-1] + if (toward - c) @ n < 0: + n = -n + return WallFrame.from_normal(c, n), best_n / len(pts) diff --git a/experiments/autodetect/autodetect/extent.py b/experiments/autodetect/autodetect/extent.py new file mode 100644 index 000000000..25c076eb0 --- /dev/null +++ b/experiments/autodetect/autodetect/extent.py @@ -0,0 +1,317 @@ +"""3D extent: lift detected door boxes onto their wall through the laser depth and compare each +edge with the door's edge measured in the laser scan (extent_gt.py). + +For every photo and every ground-truth door, the door's rectangle is projected into the photo. +A detection at the model's door operating threshold (chosen on the OI tune set) matches the +projected door at IoU >= 0.5, highest score first. Lifting uses only what the app would have, the +photo's pose, intrinsics and depth: a vertical plane is RANSAC-fitted to the depth inside the +detection's box grown by 30%, and rays through the box meet that plane. Two rules turn the box +into edges, both reported: + +- mid-side: rays through the midpoints of the box's four sides. +- inner corner: rays through the box's four corners; each edge takes the inner of its two corners + (the right-most of the left pair, the lowest of the top pair, and so on). A door seen at an angle + projects to a quadrilateral whose axis-aligned box touches it at one corner per side, so the other + corner of that side lies outside the door; the inner one is the door's own corner when the box + is tight. + +A door the photo cuts off is scored separately: the top of its visible part sits at the border +crossing, so an axis-aligned box cannot place its edges, and skipping border corners made the +control worse (p90 0.25 to 0.33 ft). The primary numbers use doors wholly inside the photo. + +Lifted points are measured along the door's wall and as heights, in the ground-truth frame. Edges +that the photo cuts off are not scored. + +A model's "any score" row matches its door detections down to the cached floor (0.01) instead of +the operating threshold. The homeowner confirms a proposal whatever its score, so this row isolates +how well a matched box places the door from whether the threshold keeps it. + +The "projected ground truth" row lifts the projected door rectangle itself through the same steps. +Its error is what the lifting adds on its own: plane fit, and the box sides of a door seen at an +angle not being the door's edges. + +Usage: python -m autodetect.extent [model ...] # writes results/extent.md +""" + +from __future__ import annotations + +import datetime +import json +import sys + +import numpy as np + +from . import config +from .electro import FT, WallFrame, fit_vertical_plane, ground_y, photos +from .oieval import _iou, choose_threshold, class_entries +from .paths import DATA, RESULTS +from .sets import ground_truth, load_preds, pred_path + +EDGES = ("left", "right", "bottom", "top") +BORDER = 0.005 # a projected edge this close to or past the photo border is cut off +REF = "projected ground truth" + + +def gt_doors() -> dict[str, dict]: + doors = json.loads((DATA / "extent_gt.json").read_text()) + for d in doors.values(): + d["frame"] = WallFrame.from_normal(np.array(d["origin"]), np.array(d["normal"])) + return doors + + +def rectangle(door: dict) -> np.ndarray: + """The door's four corners in the meter frame: TL, TR, BR, BL.""" + f, e = door["frame"], door["edges_m"] + + def pt(a: float, h: float) -> np.ndarray: + p = f.origin + a * f.along + return np.array([p[0], ground_y() + h, p[2]]) + + return np.array([pt(e["left"], e["top"]), pt(e["right"], e["top"]), pt(e["right"], e["bottom"]), pt(e["left"], e["bottom"])]) + + +def projected_box(photo, door: dict) -> tuple[list[float], dict[str, bool]] | None: + """Clipped normalized box of the door in a photo, and which edges are inside the photo.""" + corners = rectangle(door) + cam = (corners - photo.pose[:3, 3]) @ photo.pose[:3, :3] + if (cam[:, 2] > -0.3).any(): # behind or at the camera + return None + xy = photo.project(corners) + x0, y0 = xy.min(0) + x1, y1 = xy.max(0) + inside = {"left": x0 > BORDER, "right": x1 < 1 - BORDER, "top": y0 > BORDER, "bottom": y1 < 1 - BORDER} + poly = clip_to_frame(xy) + if len(poly) < 3: + return None + box = [*poly.min(0), *poly.max(0)] # what a detector sees: bounds of the visible part + if box[2] - box[0] < 0.02 or box[3] - box[1] < 0.02: + return None + return box, inside + + +def clip_to_frame(poly: np.ndarray) -> np.ndarray: + """Sutherland-Hodgman clip of a polygon (normalized coordinates) to the unit square.""" + pts = [tuple(p) for p in poly] + for axis, bound, keep_low in ((0, 0.0, False), (0, 1.0, True), (1, 0.0, False), (1, 1.0, True)): + inside = (lambda p: p[axis] <= bound) if keep_low else (lambda p: p[axis] >= bound) + out = [] + for i, cur in enumerate(pts): + prev = pts[i - 1] + if inside(cur) != inside(prev): + t = (bound - prev[axis]) / (cur[axis] - prev[axis]) + out.append(tuple(prev[k] + t * (cur[k] - prev[k]) for k in range(2))) + if inside(cur): + out.append(cur) + pts = out + if not pts: + break + return np.array(pts).reshape(-1, 2) + + +RULES = ("mid-side", "inner corner") + + +def lift(photo, box: list[float], door: dict, rule: str) -> dict[str, float]: + """Edges of a normalized box lifted onto the wall, in the door's ground-truth frame (m).""" + x0, y0, x1, y1 = box + gw, gh = 0.3 * (x1 - x0), 0.3 * (y1 - y0) + pts = photo.depth_points(x0 - gw, y0 - gh, x1 + gw, y1 + gh) + plane, _ = fit_vertical_plane(pts, toward=photo.pose[:3, 3]) + if rule == "mid-side": + xm, ym = (x0 + x1) / 2, (y0 + y1) / 2 + u = np.array([x0, x1, xm, xm]) * photo.W + v = np.array([ym, ym, y1, y0]) * photo.H + c = door["frame"].coords(plane.intersect(*photo.ray(u, v))) + return {"left": c[0, 0], "right": c[1, 0], "bottom": c[2, 1], "top": c[3, 1]} + if rule == "inner corner": + u = np.array([x0, x1, x1, x0]) * photo.W # TL, TR, BR, BL + v = np.array([y0, y0, y1, y1]) * photo.H + c = door["frame"].coords(plane.intersect(*photo.ray(u, v))) + return { + "left": max(c[0, 0], c[3, 0]), + "right": min(c[1, 0], c[2, 0]), + "top": min(c[0, 1], c[1, 1]), + "bottom": max(c[2, 1], c[3, 1]), + } + raise ValueError(f"unknown lifting rule {rule!r}") + + +def door_threshold(model: str) -> float: + cls = "window" if model == "vision_rects" else "door" + preds = {i: v["dets"] for i, v in load_preds(model, "oi_tune")["images"].items()} + t, _ = choose_threshold(class_entries(ground_truth("oi_tune"), preds, cls), config.MIN_PRECISION) + return t + + +def evaluate(model: str | None, rule: str, any_score: bool = False) -> dict: + """model None = the projected ground-truth control.""" + doors = gt_doors() + rows = [] + visible = visible_whole = 0 + if model is not None: + t = config.MIN_SCORE if any_score else door_threshold(model) + preds = load_preds(model, "electro")["images"] + label = "window" if model == "vision_rects" else "door" + for pid, photo in photos().items(): + views = {k: projected_box(photo, d) for k, d in doors.items()} + views = {k: v for k, v in views.items() if v is not None} + visible += len(views) + visible_whole += sum(all(v[1].values()) for v in views.values()) + if model is None: + matches = [(k, views[k][0], 1.0) for k in views] + else: + dets = sorted((x for x in preds[pid]["dets"] if x["label"] == label and x["score"] >= t), key=lambda x: -x["score"]) + free = set(views) + matches = [] + for det in dets: + if not free: + break + keys = sorted(free) + ious = _iou(np.array([det["box"]]), np.array([views[k][0] for k in keys]))[0] + j = int(ious.argmax()) + if ious[j] >= 0.5: + matches.append((keys[j], det["box"], det["score"])) + free.discard(keys[j]) + for k, box, score in matches: + lifted = lift(photo, box, doors[k], rule) + inside = views[k][1] + for e in EDGES: + if inside[e]: + rows.append({"photo": pid, "door": k, "edge": e, "error_ft": (lifted[e] - doors[k]["edges_m"][e]) * FT, + "eye_only": not doors[k]["snapped"][e], "whole": all(inside.values())}) + name = REF if model is None else (f"{model} (any score)" if any_score else model) + return {"model": name, "rule": rule, "rows": rows, "visible": visible, + "visible_whole": visible_whole, + "matched": len({(r["photo"], r["door"]) for r in rows if r["whole"]}), + "matched_cut": len({(r["photo"], r["door"]) for r in rows if not r["whole"]}), + "threshold": None if model is None else t} + + +def summarize(r: dict) -> dict: + whole = [x for x in r["rows"] if x["whole"]] + cut = np.array([abs(x["error_ft"]) for x in r["rows"] if not x["whole"]]) + err = np.array([abs(x["error_ft"]) for x in whole]) + by_edge = {e: np.array([abs(x["error_ft"]) for x in whole if x["edge"] == e]) for e in EDGES} + spreads = [] + for door in {x["door"] for x in whole}: + for e in EDGES: + v = [x["error_ft"] for x in whole if x["door"] == door and x["edge"] == e] + if len(v) >= 2: + spreads.append(max(v) - min(v)) + pct = lambda a, q: float(np.percentile(a, q)) if len(a) else float("nan") # noqa: E731 + return { + "n": len(err), + "p50": pct(err, 50), + "p90": pct(err, 90), + "max": float(err.max()) if len(err) else float("nan"), + "edge_p90": {e: pct(a, 90) for e, a in by_edge.items()}, + "edge_n": {e: len(a) for e, a in by_edge.items()}, + "spread_n": len(spreads), + "spread_median": pct(np.array(spreads), 50), + "spread_max": float(max(spreads)) if spreads else float("nan"), + "cut_n": len(cut), + "cut_p90": pct(cut, 90), + } + + +def f(x: float) -> str: + return "n/a" if np.isnan(x) else f"{x:.2f}" + + +def write(results: list[dict]) -> None: + doors = gt_doors() + L = [ + "# 3D extent: detected door edges lifted onto the wall", + "", + f"Generated {datetime.date.today()} by `uv run python -m autodetect.extent` (ground truth first:", + "`uv run python -m autodetect.extent_gt save`). Data: the ETH3D electro packet, 8 DSLR photos", + "with depth rendered from the laser scan, standing in for LiDAR. Door centres are 3.3 to 12.7 m", + "from the camera (median 7.6 m) and seen 5 to 43 degrees off the wall's normal (median 16).", + "", + "Ground truth is each door's edges measured once in the laser scan, independent of any photo or", + "detector (method in `autodetect/extent_gt.py`). Four doors: two gray metal doors in recesses and", + "two glass double doors. Heights are above the ground at the meter; the doors' thresholds sit", + "0 to 0.12 m above it.", + "", + "| Door | Width (ft) | Height (ft) | Edges read by eye only |", + "|---|---|---|---|", + ] + for k, d in doors.items(): + e = d["edges_m"] + eye = [x for x in EDGES if not d["snapped"][x]] or ["none"] + L.append(f"| {k} | {(e['right'] - e['left']) * FT:.2f} | {(e['top'] - e['bottom']) * FT:.2f} | {', '.join(eye)} |") + L += [ + "", + f"Pass: p90 absolute edge error at most {config.EXTENT_P90_FT} ft over all scored edges. Each detector", + "uses its door operating threshold from the OI tune set (Vision rectangles: its only threshold).", + "", + "Primary: doors wholly inside the photo. The last two columns are the doors the photo cuts off,", + "for their edges that are in view (not part of the pass).", + "", + "| Boxes from | Lifting | Threshold | Whole door views matched / in view | Edges scored | p50 ft | p90 ft | max ft | Pass | Cut-off views matched | Cut-off edges p90 ft |", + "|---|---|---|---|---|---|---|---|---|---|---|", + ] + for r in results: + s = r["summary"] + thr = "n/a" if r["threshold"] is None else f"{r['threshold']:.3f}" + diagnostic = r["model"] == REF or r["model"].endswith("(any score)") + passes = "n/a" if diagnostic else ("yes" if s["p90"] <= config.EXTENT_P90_FT else "no") + L.append( + f"| {r['model']} | {r['rule']} | {thr} | {r['matched']} / {r['visible_whole']} | {s['n']} | {f(s['p50'])} | " + f"{f(s['p90'])} | {f(s['max'])} | {passes} | {r['matched_cut']} / {r['visible'] - r['visible_whole']} | " + f"{f(s['cut_p90'])} ({s['cut_n']}) |" + ) + L += [ + "", + "## By edge (p90 absolute error, ft; count in brackets)", + "", + "| Boxes from | Lifting | Left | Right | Bottom | Top |", + "|---|---|---|---|---|---|", + ] + for r in results: + s = r["summary"] + L.append("| " + r["model"] + " | " + r["rule"] + " | " + " | ".join(f"{f(s['edge_p90'][e])} ({s['edge_n'][e]})" for e in EDGES) + " |") + L += [ + "", + "## Cross-view spread", + "", + "For each door edge seen in two or more photos: the largest minus the smallest lifted position.", + "", + "| Boxes from | Lifting | Door edges with 2+ views | Median spread ft | Max spread ft |", + "|---|---|---|---|---|", + ] + for r in results: + s = r["summary"] + L.append(f"| {r['model']} | {r['rule']} | {s['spread_n']} | {f(s['spread_median'])} | {f(s['spread_max'])} |") + L += [ + "", + "## Every scored edge", + "", + "| Boxes from | Lifting | Photo | Door | Door in view | Edge | Error ft (lifted minus truth) |", + "|---|---|---|---|---|---|---|", + ] + for r in results: + for x in r["rows"]: + L.append(f"| {r['model']} | {r['rule']} | {x['photo']} | {x['door']} | {'whole' if x['whole'] else 'cut off'} | {x['edge']}{' (eye-only truth)' if x['eye_only'] else ''} | {x['error_ft']:+.2f} |") + L += [ + "", + "Limits: four doors on one building, seen by a DSLR from two to four times the app's 1 to 3 m, with", + "laser depth that is denser and cleaner than an iPhone's LiDAR and absent on phones without it.", + "No windows: the electro windows are curtain-wall glazing, not house windows.", + ] + (RESULTS / "extent.md").write_text("\n".join(L) + "\n") + + +if __name__ == "__main__": + models = sys.argv[1:] or sorted(p.parent.name for p in (DATA / "preds").glob("*/electro.json")) + results = [] + for m in [None, *models]: + if m is not None and not pred_path(m, "electro").exists(): + raise FileNotFoundError(f"no electro predictions for {m}") + for any_score, rule in [(a, rule) for a in ((False,) if m is None else (False, True)) for rule in RULES]: + r = evaluate(m, rule, any_score) + r["summary"] = summarize(r) + results.append(r) + s = r["summary"] + print(f"{r['model']:24s} {rule:13s} whole {r['matched']}/{r['visible_whole']} edges {s['n']} p50 {f(s['p50'])} p90 {f(s['p90'])} ft; cut p90 {f(s['cut_p90'])} ({s['cut_n']})", file=sys.stderr) + write(results) diff --git a/experiments/autodetect/autodetect/extent_gt.py b/experiments/autodetect/autodetect/extent_gt.py new file mode 100644 index 000000000..73d68ffd4 --- /dev/null +++ b/experiments/autodetect/autodetect/extent_gt.py @@ -0,0 +1,168 @@ +"""Ground truth for the 3D-extent test: each door's edges read once from the ETH3D laser scan. + +For each door, a rough box drawn by eye on one photo (ROUGH, pixels of the 1024 px copy) picks +out the door. Its wall plane is a RANSAC fit to the laser depth inside that box grown by 30%. +`render` then draws an orthographic elevation of the laser scan in that plane: 1 cm per pixel, +colored by distance in front of (red) or behind (blue) the plane, black where the scanner saw +nothing (glass, or occluded), with a 10 cm grid. Each edge is read off the elevation by eye +(EYE), then snapped to the sharpest change, within 12 cm, in the fraction of scan pixels lying on +the plane (within 3 cm): a door leaf between proud pillars, a niche behind the wall face, or a +glass door's frame against empty glass all change that fraction at the edge. An edge whose snap +runs to the 12 cm limit found no step, so it keeps the eye reading and is marked eye-only in the +results. The edges come from +the scan alone, never from a detector. What remains is the choice of which physical edge counts: +the outer edge of the frame or leaf, as a detector's box would draw it. Door A is left out +because it sits flush in its wall, so the scan shows no edge. The right gray double door is in +no photo whole. + +The plane frames and edges are saved to DATA/extent_gt.json, outside git: ETH3D's license allows +accuracy testing, not redistribution. + +Usage: python -m autodetect.extent_gt render # elevations to DATA/preview/elev_.png + python -m autodetect.extent_gt save # DATA/extent_gt.json from EYE, snapped +""" + +from __future__ import annotations + +import json +import sys + +import numpy as np +from PIL import Image, ImageDraw + +from .electro import WallFrame, fit_vertical_plane, photos, scan +from .paths import DATA + +# door id -> (reference photo, rough box [x0, y0, x1, y1] in pixels of the 1024 x 682 copy) +ROUGH = { + "B_open_niche": ("p00001", [300, 262, 434, 528]), + "C_gray_double": ("p00001", [497, 232, 724, 552]), + "E_glass_64": ("p00005", [357, 262, 512, 476]), + "F_glass_double": ("p00005", [657, 256, 818, 463]), +} +COPY_W, COPY_H = 1024, 682 +RES = 0.01 # m per elevation pixel +MARGIN = 0.5 # m shown around the rough extent + +# door id -> edges read by eye from the elevations, meters in that door's wall frame: +# [along_left, along_right, height_bottom, height_top] +EYE: dict[str, list[float]] = { + "B_open_niche": [-1.58, 0.46, 0.0, 2.98], # niche opening in the wall face + "C_gray_double": [-1.13, 0.94, 0.0, 3.0], # door leaves between the pillars, under the canopy + "E_glass_64": [-1.35, 1.2, 0.1, 3.2], # outer edge of the door frame; head below the transom bar + "F_glass_double": [-1.33, 0.85, 0.1, 3.2], # left leaf's frame is not in the scan: threshold end +} +SNAP = 0.12 # m +ON_PLANE = 0.03 # m + + +def frame_for(door: str) -> tuple[WallFrame, np.ndarray]: + """The door's wall frame and its rough extent [along0, along1, h0, h1] in that frame.""" + pid, (x0, y0, x1, y1) = ROUGH[door] + ph = photos()[pid] + bx = np.array([x0, y0, x1, y1]) / [COPY_W, COPY_H, COPY_W, COPY_H] + gw, gh = 0.3 * (bx[2] - bx[0]), 0.3 * (bx[3] - bx[1]) + pts = ph.depth_points(bx[0] - gw, bx[1] - gh, bx[2] + gw, bx[3] + gh) + frame, _ = fit_vertical_plane(pts, toward=ph.pose[:3, 3]) + corners_u = np.array([bx[0], bx[2], bx[0], bx[2]]) * ph.W + corners_v = np.array([bx[1], bx[1], bx[3], bx[3]]) * ph.H + o, d = ph.ray(corners_u, corners_v) + c = frame.coords(frame.intersect(o, d)) + return frame, np.array([c[:, 0].min(), c[:, 0].max(), c[:, 1].min(), c[:, 1].max()]) + + +def raster(door: str) -> tuple[np.ndarray, tuple[float, float, float, float], WallFrame]: + """Elevation raster (nearest-to-camera offset per 1 cm pixel, NaN = no point) and its extent.""" + frame, (a0, a1, h0, h1) = frame_for(door) + a0, a1, h0, h1 = a0 - MARGIN, a1 + MARGIN, max(h0 - MARGIN, -0.3), h1 + MARGIN + c = frame.coords(scan()) + sel = (c[:, 0] >= a0) & (c[:, 0] < a1) & (c[:, 1] >= h0) & (c[:, 1] < h1) & (np.abs(c[:, 2]) < 0.6) + c = c[sel] + W, H = int((a1 - a0) / RES) + 1, int((h1 - h0) / RES) + 1 + img = np.full((H, W), np.nan) + col = ((c[:, 0] - a0) / RES).astype(int) + row = ((h1 - c[:, 1]) / RES).astype(int) + order = np.argsort(c[:, 2]) # nearest to the camera side wins + img[row[order], col[order]] = c[order, 2] + return img, (a0, a1, h0, h1), frame + + +def snap(door: str) -> tuple[list[float], list[bool]]: + """Each EYE edge moved to the largest step in on-plane fraction within SNAP of it, and + whether it snapped (False: the step sat at the search limit, so the eye reading stands).""" + img, (a0, a1, h0, h1), _ = raster(door) + on = np.abs(np.nan_to_num(img, nan=1.0)) < ON_PLANE + left, right, bottom, top = EYE[door] + # vertical edges: fraction per column over the middle 60% of the door's height + rows = slice(int((h1 - (bottom + 0.8 * (top - bottom))) / RES), int((h1 - (bottom + 0.2 * (top - bottom))) / RES)) + cols = slice(int((left + 0.2 * (right - left) - a0) / RES), int((left + 0.8 * (right - left) - a0) / RES)) + col_prof = on[rows].mean(0) + row_prof = on[:, cols].mean(1) + def step(profile: np.ndarray, pos_px: float) -> float: + k = np.convolve(profile, np.ones(3) / 3, mode="same") + diff = np.abs(np.diff(k)) + lo, hi = int(max(pos_px - SNAP / RES, 0)), int(min(pos_px + SNAP / RES, len(diff))) + return lo + int(np.argmax(diff[lo:hi])) + 1.0 # boundary between pixel i and i+1 + found = [ + a0 + step(col_prof, (left - a0) / RES) * RES, + a0 + step(col_prof, (right - a0) / RES) * RES, + h1 - step(row_prof, (h1 - bottom) / RES) * RES, + h1 - step(row_prof, (h1 - top) / RES) * RES, + ] + snapped = [bool(abs(f - e) < SNAP - 0.015) for f, e in zip(found, EYE[door])] + return [round(float(f if ok else e), 3) for f, e, ok in zip(found, EYE[door], snapped)], snapped + + +def render(door: str) -> str: + img, (a0, a1, h0, h1), _ = raster(door) + H, W = img.shape + rgb = np.zeros((H, W, 3), np.uint8) + v = ~np.isnan(img) + z = np.clip(img[v] / 0.3, -1, 1) + rgb[v, 0] = (140 + 115 * np.clip(z, 0, 1) - 100 * np.clip(-z, 0, 1)).astype(np.uint8) + rgb[v, 1] = (140 - 100 * np.abs(z)).astype(np.uint8) + rgb[v, 2] = (140 + 115 * np.clip(-z, 0, 1) - 100 * np.clip(z, 0, 1)).astype(np.uint8) + im = Image.fromarray(rgb).resize((2 * W, 2 * H), Image.Resampling.NEAREST) + d = ImageDraw.Draw(im) + for g in np.arange(np.ceil(a0 * 10) / 10, a1, 0.1): + x = 2 * (g - a0) / RES + major = abs(g * 2 - round(g * 2)) < 1e-6 + d.line([(x, 0), (x, 2 * H)], fill=(255, 255, 255) if major else (90, 90, 90)) + if major: + d.text((x + 2, 2), f"{g:.1f}", fill=(255, 255, 0)) + for g in np.arange(np.ceil(h0 * 10) / 10, h1, 0.1): + y = 2 * (h1 - g) / RES + major = abs(g * 2 - round(g * 2)) < 1e-6 + d.line([(0, y), (2 * W, y)], fill=(255, 255, 255) if major else (90, 90, 90)) + if major: + d.text((2, y - 11), f"{g:.1f}", fill=(255, 255, 0)) + out = DATA / "preview" / f"elev_{door}.png" + im.save(out) + return str(out) + + +def save() -> None: + out = {} + for door, eye in EYE.items(): + frame, _ = frame_for(door) + edges, snapped = snap(door) + moved = np.abs(np.array(edges) - eye) + print(f"{door}: eye {eye} -> {edges}, snapped {snapped} (moved up to {moved.max() * 100:.0f} cm)") + out[door] = { + "photo": ROUGH[door][0], + "origin": frame.origin.tolist(), + "normal": frame.normal.tolist(), + "edges_m": dict(zip(("left", "right", "bottom", "top"), edges)), + "eye_m": dict(zip(("left", "right", "bottom", "top"), eye)), + "snapped": dict(zip(("left", "right", "bottom", "top"), snapped)), + } + (DATA / "extent_gt.json").write_text(json.dumps(out, indent=1)) + print(f"{len(out)} doors") + + +if __name__ == "__main__": + if sys.argv[1] == "render": + for door in sys.argv[2:] or ROUGH: + print(render(door)) + elif sys.argv[1] == "save": + save() diff --git a/experiments/autodetect/autodetect/gdino.py b/experiments/autodetect/autodetect/gdino.py new file mode 100644 index 000000000..43761d6f7 --- /dev/null +++ b/experiments/autodetect/autodetect/gdino.py @@ -0,0 +1,125 @@ +"""Grounding DINO tiny (IDEA-Research/grounding-dino-tiny, Apache-2.0) zero-shot detection through +the ONNX export in onnx-community/grounding-dino-tiny-ONNX, on onnxruntime's CPU provider with the +fp16 graph upcast to fp32 in memory (owl.upcast_fp16). + +The export takes a fixed 800 x 800 image. Each image is resized so its long side is 800, padded +bottom and right, and pixel_mask marks the real pixels; predicted boxes are (cx, cy, w, h) +relative to the real pixels, as in DETR-style models. The caption joins the phrases in config, +each ending in " ."; a box's score for a phrase is the highest token probability within that +phrase's tokens, and the box takes its best phrase. + +Not scored in this run: one electro photo took 15 to 31 s on this shared Mac at a load average +near 130, about 5 hours for the 836 images. The torch route used for OWLv2 does not carry over: +294 of the 1,046 parameters of transformers 5.17's GroundingDinoForObjectDetection have no +same-named weight in the export (the Swin backbone is named differently). + +Usage: python -m autodetect.gdino [set ...] # default: every set, then electro +""" + +from __future__ import annotations + +import sys +import time +from pathlib import Path + +import numpy as np +from PIL import Image + +from . import config +from .nms import postprocess +from .owl import upcast_fp16 +from .paths import WEIGHTS +from .sets import SETS, ground_truth, image_path, save_preds + +DIR = WEIGHTS / "gdino" +MODEL = DIR / "model_fp16.onnx" +URL = "https://huggingface.co/onnx-community/grounding-dino-tiny-ONNX/resolve/main/onnx/model_fp16.onnx" +SIZE = 800 +MEAN = np.array([0.485, 0.456, 0.406], dtype=np.float32) +STD = np.array([0.229, 0.224, 0.225], dtype=np.float32) + + +class GDino: + def __init__(self) -> None: + import onnxruntime as ort + from tokenizers import Tokenizer + + if not MODEL.exists(): + raise FileNotFoundError(f"{MODEL} missing; download it from {URL}") + self.session = ort.InferenceSession(upcast_fp16(MODEL), providers=["CPUExecutionProvider"]) + tok = Tokenizer.from_file(str(DIR / "tokenizer.json")) + self.labels = list(config.GDINO_PHRASES) + caption = " ".join(f"{p} ." for p in config.GDINO_PHRASES.values()) + enc = tok.encode(caption) + self.ids = np.array([enc.ids], dtype=np.int64) + self.mask = np.ones_like(self.ids) + self.types = np.zeros_like(self.ids) + # token positions of each phrase, from character offsets in the caption + spans, pos = [], 0 + for p in config.GDINO_PHRASES.values(): + start = caption.index(p, pos) + spans.append((start, start + len(p))) + pos = start + len(p) + self.token_sets = [] + for a, b in spans: + toks = [k for k, (s, e) in enumerate(enc.offsets) if e > s and s >= a and e <= b] + if not toks: + raise ValueError(f"phrase at {a}:{b} has no tokens") + self.token_sets.append(toks) + + @staticmethod + def preprocess(im: Image.Image) -> tuple[np.ndarray, np.ndarray]: + w, h = im.size + scale = SIZE / max(w, h) + nw, nh = round(w * scale), round(h * scale) + x = np.zeros((SIZE, SIZE, 3), dtype=np.float32) + x[:nh, :nw] = (np.asarray(im.resize((nw, nh), Image.Resampling.BILINEAR), dtype=np.float32) / 255.0 - MEAN) / STD + mask = np.zeros((1, SIZE, SIZE), dtype=np.int64) + mask[0, :nh, :nw] = 1 + return x.transpose(2, 0, 1)[None], mask + + def detect(self, path: Path) -> tuple[list[dict], float, float]: + im = Image.open(path).convert("RGB") + t0 = time.perf_counter() + pixels, pmask = self.preprocess(im) + t1 = time.perf_counter() + logits, boxes = self.session.run( + ["logits", "pred_boxes"], + {"pixel_values": pixels, "input_ids": self.ids, "token_type_ids": self.types, "attention_mask": self.mask, "pixel_mask": pmask}, + ) + t2 = time.perf_counter() + prob = 1 / (1 + np.exp(-logits[0])) # (900, 256) + per_phrase = np.stack([prob[:, toks].max(1) for toks in self.token_sets], 1) + label = per_phrase.argmax(1) + score = per_phrase.max(1) + cx, cy, bw, bh = boxes[0].T + xyxy = np.clip(np.stack([cx - bw / 2, cy - bh / 2, cx + bw / 2, cy + bh / 2], 1), 0, 1) + return postprocess(xyxy, score, [self.labels[i] for i in label]), 1000 * (t1 - t0), 1000 * (t2 - t1) + + +def meta() -> dict: + return { + "model": "Grounding DINO tiny, ONNX fp16 upcast to fp32", + "phrases": config.GDINO_PHRASES, + "license": "Apache-2.0", + "size": f"{MODEL.stat().st_size / 1e6:.0f} MB (fp16 ONNX)", + "runtime": "onnxruntime CPU, Mac, fp32", + "input": "800 x 800 (long side 800, padded)", + "command": "uv run python -m autodetect.gdino", + } + + +def run(model: GDino, name: str) -> None: + images = {} + for k, i in enumerate(sorted(ground_truth(name))): + dets, pre_ms, ms = model.detect(image_path(name, i)) + images[i] = {"elapsed_ms": ms, "preprocess_ms": pre_ms, "dets": dets} + if k % 50 == 0: + print(f"{name}: {k} images, last {ms:.0f} ms", file=sys.stderr) + save_preds("gdino", name, meta(), images) + + +if __name__ == "__main__": + g = GDino() + for s in sys.argv[1:] or (*SETS, "electro"): + run(g, s) diff --git a/experiments/autodetect/autodetect/nms.py b/experiments/autodetect/autodetect/nms.py new file mode 100644 index 000000000..3f5a5cb01 --- /dev/null +++ b/experiments/autodetect/autodetect/nms.py @@ -0,0 +1,38 @@ +"""Shared post-processing for the open-vocabulary detectors: per-class NMS, a score floor and a +per-image cap, all from config.""" + +from __future__ import annotations + +import numpy as np + +from . import config + + +def nms(boxes: np.ndarray, scores: np.ndarray, iou: float) -> list[int]: + """Indices kept by greedy NMS, highest score first.""" + order = np.argsort(-scores, kind="stable") + keep: list[int] = [] + area = (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1]) + while len(order): + i = order[0] + keep.append(int(i)) + rest = order[1:] + ix = np.clip(np.minimum(boxes[i, 2], boxes[rest, 2]) - np.maximum(boxes[i, 0], boxes[rest, 0]), 0, None) + iy = np.clip(np.minimum(boxes[i, 3], boxes[rest, 3]) - np.maximum(boxes[i, 1], boxes[rest, 1]), 0, None) + inter = ix * iy + overlap = inter / np.maximum(area[i] + area[rest] - inter, 1e-12) + order = rest[overlap <= iou] + return keep + + +def postprocess(boxes: np.ndarray, scores: np.ndarray, labels: list[str]) -> list[dict]: + keep_floor = scores >= config.MIN_SCORE + out: list[dict] = [] + labels_arr = np.array(labels) + for cls in sorted(set(labels_arr[keep_floor])): + idx = np.where(keep_floor & (labels_arr == cls))[0] + for j in nms(boxes[idx], scores[idx], config.NMS_IOU): + k = idx[j] + out.append({"label": cls, "score": float(scores[k]), "box": [float(v) for v in boxes[k]]}) + out.sort(key=lambda d: -d["score"]) + return out[: config.MAX_DETS] diff --git a/experiments/autodetect/autodetect/oieval.py b/experiments/autodetect/autodetect/oieval.py new file mode 100644 index 000000000..bfe77ef7d --- /dev/null +++ b/experiments/autodetect/autodetect/oieval.py @@ -0,0 +1,207 @@ +"""Open Images detection scoring at IoU 0.5, following the official OID challenge protocol +(TensorFlow Object Detection API, `per_image_evaluation.py` in its Open Images mode). + +- A class is scored in an image only when a person verified that class there. Detections of an + unverified class are ignored, neither true nor false positives, and its boxes are not counted. +- Verified negative: no ground truth, so every detection of the class is a false positive. +- Detections match non-group boxes first, in score order, at IoU >= 0.5 against the box they + overlap most; a second detection of an already-matched box is a false positive. +- A detection left unmatched whose intersection with a group-of box covers >= 50% of the + detection's own area joins that group. Each group yields one true positive, scored with the + highest score among its detections, and absorbs the rest without false positives. A group + nobody detected counts as one missed object. + +Ground truth per image: {"verified": {cls: 1 | 0}, "boxes": [{"label", "box", "group"}]}. +Detections per image: [{"label", "score", "box"}]. Boxes are [x0, y0, x1, y1], normalized. + +A box marked "difficult" (used only by the near-sized diagnostic, for boxes too small to be what +the app sees at 1 to 3 m) is not counted as a miss, and a detection matched to it is ignored, as +the protocol treats difficult boxes. + +The class "window_or_door" merges both classes. It is scored only in images where both Window +and Door were verified, since otherwise an unboxed door could turn a correct detection into a +false positive. +""" + +from __future__ import annotations + +from dataclasses import dataclass + +import numpy as np + +IOU = 0.5 +MERGED = "window_or_door" +MERGED_FROM = ("window", "door") + + +@dataclass +class ClassEntries: + """Scored entries for one class over a set: one per counted detection or detected group.""" + + scores: np.ndarray # float + tp: np.ndarray # bool + num_gt: int + num_images: int # images where the class was scored + + +def _iou(d: np.ndarray, g: np.ndarray) -> np.ndarray: + ix = np.clip(np.minimum(d[:, None, 2], g[None, :, 2]) - np.maximum(d[:, None, 0], g[None, :, 0]), 0, None) + iy = np.clip(np.minimum(d[:, None, 3], g[None, :, 3]) - np.maximum(d[:, None, 1], g[None, :, 1]), 0, None) + inter = ix * iy + ad = (d[:, 2] - d[:, 0]) * (d[:, 3] - d[:, 1]) + ag = (g[:, 2] - g[:, 0]) * (g[:, 3] - g[:, 1]) + return inter / np.maximum(ad[:, None] + ag[None, :] - inter, 1e-12) + + +def _ioa_det(d: np.ndarray, g: np.ndarray) -> np.ndarray: + """Intersection over the detection's area.""" + ix = np.clip(np.minimum(d[:, None, 2], g[None, :, 2]) - np.maximum(d[:, None, 0], g[None, :, 0]), 0, None) + iy = np.clip(np.minimum(d[:, None, 3], g[None, :, 3]) - np.maximum(d[:, None, 1], g[None, :, 1]), 0, None) + ad = (d[:, 2] - d[:, 0]) * (d[:, 3] - d[:, 1]) + return ix * iy / np.maximum(ad[:, None], 1e-12) + + +def image_entries(gt_boxes: list[dict], dets: list[dict], iou_thr: float = IOU) -> tuple[list[float], list[bool], int]: + """Entries for one class in one image where it is verified. Inputs are already that class only.""" + order = sorted(range(len(dets)), key=lambda i: -dets[i]["score"]) + scores = np.array([dets[i]["score"] for i in order], dtype=float) + d = np.array([dets[i]["box"] for i in order], dtype=float).reshape(-1, 4) + singles = [b for b in gt_boxes if not b["group"]] + grouped = [b for b in gt_boxes if b["group"]] + single = np.array([b["box"] for b in singles], dtype=float).reshape(-1, 4) + groups = np.array([b["box"] for b in grouped], dtype=float).reshape(-1, 4) + single_hard = np.array([b.get("difficult", False) for b in singles], dtype=bool) + group_hard = np.array([b.get("difficult", False) for b in grouped], dtype=bool) + n = len(scores) + tp = np.zeros(n, dtype=bool) + ignored = np.zeros(n, dtype=bool) # matched to a difficult box, or absorbed by a group + + if len(single) and n: + iou = _iou(d, single) + best = iou.argmax(axis=1) + taken = np.zeros(len(single), dtype=bool) + for i in range(n): + g = best[i] + if iou[i, g] < iou_thr: + continue + if single_hard[g]: + ignored[i] = True + elif not taken[g]: + tp[i] = True + taken[g] = True + + group_score = np.zeros(len(groups)) + if len(groups) and n: + ioa = _ioa_det(d, groups) + best = ioa.argmax(axis=1) + for i in range(n): + g = best[i] + if not tp[i] and not ignored[i] and ioa[i, g] >= iou_thr: + ignored[i] = True + group_score[g] = max(group_score[g], scores[i]) + + keep = ~ignored + hit_groups = (group_score > 0) & ~group_hard + out_scores = list(scores[keep]) + list(group_score[hit_groups]) + out_tp = list(tp[keep]) + [True] * int(hit_groups.sum()) + return out_scores, out_tp, int((~single_hard).sum() + (~group_hard).sum()) + + +def _view(gt: dict, dets: list[dict], cls: str) -> tuple[int | None, list[dict], list[dict]]: + """(verification, gt boxes, detections) of one class in one image, merging for MERGED.""" + if cls == MERGED: + v = [gt["verified"].get(c) for c in MERGED_FROM] + status = None if None in v else int(max(v)) + members = set(MERGED_FROM) + else: + status = gt["verified"].get(cls) + members = {cls} + boxes = [b for b in gt["boxes"] if b["label"] in members] + ds = [x for x in dets if x["label"] in members] + return status, boxes, ds + + +def _mark_small(boxes: list[dict], min_side: float) -> list[dict]: + return [dict(b, difficult=min(b["box"][2] - b["box"][0], b["box"][3] - b["box"][1]) < min_side) for b in boxes] + + +def class_entries( + gts: dict[str, dict], + preds: dict[str, list[dict]], + cls: str, + iou_thr: float = IOU, + near_min_side: float | None = None, +) -> ClassEntries: + """Entries over a set. With near_min_side, ground-truth boxes narrower or shorter than that + fraction of the image are difficult, and detections that small are dropped, as an app that + only proposes near objects would drop them.""" + scores: list[float] = [] + tps: list[bool] = [] + num_gt = 0 + num_images = 0 + for image_id, gt in gts.items(): + status, boxes, dets = _view(gt, preds.get(image_id, []), cls) + if status is None: + continue # not verified: detections ignored, boxes not counted + num_images += 1 + if near_min_side is not None: + boxes = _mark_small(boxes, near_min_side) + dets = [x for x in dets if min(x["box"][2] - x["box"][0], x["box"][3] - x["box"][1]) >= near_min_side] + s, t, n = image_entries(boxes if status == 1 else [], dets, iou_thr) + scores += s + tps += t + num_gt += n + return ClassEntries(np.array(scores, dtype=float), np.array(tps, dtype=bool), num_gt, num_images) + + +def average_precision(e: ClassEntries) -> float: + """Area under the precision envelope over recall (all points), as in the OID challenge.""" + if e.num_gt == 0: + return float("nan") + if len(e.scores) == 0: + return 0.0 + order = np.argsort(-e.scores, kind="stable") + tp = e.tp[order].astype(float) + ctp = np.cumsum(tp) + cfp = np.cumsum(1 - tp) + recall = np.concatenate([[0.0], ctp / e.num_gt, [1.0]]) + precision = np.concatenate([[0.0], ctp / (ctp + cfp), [0.0]]) + for i in range(len(precision) - 2, -1, -1): + precision[i] = max(precision[i], precision[i + 1]) + steps = np.where(recall[1:] != recall[:-1])[0] + 1 + return float(np.sum((recall[steps] - recall[steps - 1]) * precision[steps])) + + +def at_threshold(e: ClassEntries, t: float) -> dict: + sel = e.scores >= t + tp = int(e.tp[sel].sum()) + fp = int(sel.sum()) - tp + return { + "threshold": t, + "tp": tp, + "fp": fp, + "num_gt": e.num_gt, + "precision": tp / (tp + fp) if tp + fp else float("nan"), + "recall": tp / e.num_gt if e.num_gt else float("nan"), + } + + +def choose_threshold(e: ClassEntries, min_precision: float = 0.6) -> tuple[float, str]: + """Operating threshold from a tuning set: the lowest score at which precision >= min_precision + (the most recall that meets the precision bar). If no score reaches it, the score with the best + F1. Returns (threshold, rule used).""" + if len(e.scores) == 0 or e.num_gt == 0: + return float("inf"), "no-detections" + order = np.argsort(-e.scores, kind="stable") + s = e.scores[order] + tp = np.cumsum(e.tp[order]) + n = np.arange(1, len(s) + 1) + # Only a cut between distinct scores is a real threshold; take the last index of each score. + last = np.r_[s[1:] != s[:-1], True] + s, tp, n = s[last], tp[last], n[last] + precision = tp / n + ok = np.where(precision >= min_precision)[0] + if len(ok): + return float(s[ok.max()]), f"lowest score with precision >= {min_precision:g}" + f1 = 2 * tp / (n + e.num_gt) + return float(s[f1.argmax()]), "best F1 (no score reaches the precision bar)" diff --git a/experiments/autodetect/autodetect/openimages.py b/experiments/autodetect/autodetect/openimages.py new file mode 100644 index 000000000..30db9f4f3 --- /dev/null +++ b/experiments/autodetect/autodetect/openimages.py @@ -0,0 +1,238 @@ +"""Select and download the Open Images V7 sets: eval and tune (validation + test) and train. + +An image qualifies when its human-verified image-level labels include House or Building as +positive and Window or Door as positive. Boxes and verification status are kept only for +Window and Door, the two scored classes; neither has subclasses in the OI hierarchy. + +Metadata CSVs are streamed and filtered on the fly, so only the selected rows reach disk. The +train CSVs are large, so each HTTP read is capped at 450 MB. The train box file is sorted by image +id, so its first 450 MB holds every box of the images whose ids come first (about 20% of train). +The train image list (638 MB) is not sorted, so it is read whole in two ranges. + +Usage: python -m autodetect.openimages select # metadata -> DATA/oi/meta/*.json + python -m autodetect.openimages download # images + manifests/oi_*.csv + DATA/oi/gt_*.json +""" + +from __future__ import annotations + +import csv +import io +import json +import random +import sys +import tempfile +import urllib.request +from concurrent.futures import ThreadPoolExecutor +from pathlib import Path + +from PIL import Image + +from .paths import MANIFESTS, OI + +MID = {"/m/0d4v4": "window", "/m/02dgv": "door", "/m/03jm5": "house", "/m/0cgh4": "building"} +SCORED = ("window", "door") + +GCS = "https://storage.googleapis.com/openimages" +LABELS = { + "validation": f"{GCS}/v5/validation-annotations-human-imagelabels-boxable.csv", + "test": f"{GCS}/v5/test-annotations-human-imagelabels-boxable.csv", + "train": f"{GCS}/v5/train-annotations-human-imagelabels-boxable.csv", +} +BOXES = { + "validation": f"{GCS}/v5/validation-annotations-bbox.csv", + "test": f"{GCS}/v5/test-annotations-bbox.csv", + "train": f"{GCS}/v6/oidv6-train-annotations-bbox.csv", +} +IMAGES = { + "validation": f"{GCS}/2018_04/validation/validation-images-with-rotation.csv", + "test": f"{GCS}/2018_04/test/test-images-with-rotation.csv", + "train": f"{GCS}/2018_04/train/train-images-boxable-with-rotation.csv", +} +S3 = "https://open-images-dataset.s3.amazonaws.com/{split}/{id}.jpg" +TRAIN_RANGE_BYTES = 450_000_000 # keeps each train metadata read under the 500 MB download cap + +SEED = 20260926 +N_EVAL, N_TUNE, N_TRAIN = 300, 150, 1500 +EVAL_LONG_SIDE, TRAIN_LONG_SIDE = 1024, 640 + + +def _header(url: str) -> list[str]: + req = urllib.request.Request(url, headers={"Range": "bytes=0-4095"}) + with urllib.request.urlopen(req, timeout=60) as resp: + return next(csv.reader([resp.read().decode().splitlines()[0]])) + + +def stream_rows(url: str, max_bytes: int | None = None, start: int = 0): + """Yield CSV rows as dicts from bytes [start, start + max_bytes), or to the end without + max_bytes. A line cut by either end of the range is dropped, and so is the first line after + `start`, so consecutive ranges never yield a row twice or half a row (the row at a boundary + can be lost).""" + req = urllib.request.Request(url) + if max_bytes or start: + end = "" if max_bytes is None else str(start + max_bytes - 1) + req.add_header("Range", f"bytes={start}-{end}") + header = _header(url) if start else None + with urllib.request.urlopen(req, timeout=120) as resp: + text = io.TextIOWrapper(resp, encoding="utf-8", newline="") + first = text.readline() + if header is None: + header = next(csv.reader([first])) + pending = None + for line in text: + if pending is not None: + yield dict(zip(header, next(csv.reader([pending])))) + pending = line + # With a byte range the final line is usually truncated; without one it is complete. + if pending is not None and (max_bytes is None or pending.endswith("\n")): + yield dict(zip(header, next(csv.reader([pending])))) + + +def verified_labels(split: str) -> dict[str, dict[str, int]]: + """image id -> {class: 1 positive | 0 negative} for the four classes, human-verified only.""" + out: dict[str, dict[str, int]] = {} + for row in stream_rows(LABELS[split]): + name = MID.get(row["LabelName"]) + if name: + out.setdefault(row["ImageID"], {})[name] = int(row["Confidence"]) + return out + + +def qualifies(v: dict[str, int]) -> bool: + return (v.get("house") == 1 or v.get("building") == 1) and (v.get("window") == 1 or v.get("door") == 1) + + +def select() -> None: + meta = OI / "meta" + meta.mkdir(parents=True, exist_ok=True) + for split in ("validation", "test", "train"): + cap = TRAIN_RANGE_BYTES if split == "train" else None + labels = verified_labels(split) + pool = {i: {"verified": {k: v[k] for k in SCORED if k in v}} for i, v in labels.items() if qualifies(v)} + print(f"{split}: {len(pool)} images pass the label filter", file=sys.stderr) + + last_id = None + for row in stream_rows(BOXES[split], cap): + last_id = row["ImageID"] + name = MID.get(row["LabelName"]) + if name in SCORED and last_id in pool: + box = [float(row[k]) for k in ("XMin", "YMin", "XMax", "YMax")] + pool[last_id].setdefault("boxes", []).append( + {"label": name, "box": box, "group": row["IsGroupOf"] == "1"} + ) + if cap: + # Box file is sorted by id: keep ids strictly before the last one read, which may be cut off. + pool = {i: p for i, p in pool.items() if i < last_id} + print(f"{split}: {len(pool)} with ids below {last_id} (box-file prefix)", file=sys.stderr) + + # The image list is not sorted, so for train read all of it, in two ranges under the cap. + parts = [(TRAIN_RANGE_BYTES, 0), (None, TRAIN_RANGE_BYTES)] if cap else [(None, 0)] + rows = (row for size, start in parts for row in stream_rows(IMAGES[split], size, start)) + for row in rows: + p = pool.get(row["ImageID"]) + if p is not None: + p["src"] = { + "landing_url": row["OriginalLandingURL"], + "license": row["License"], + "author": row["Author"], + "rotation": row["Rotation"], + } + kept = {i: p for i, p in pool.items() if "src" in p and p["src"]["rotation"] in ("0", "0.0")} + print(f"{split}: {len(kept)} with image metadata and no rotation", file=sys.stderr) + (meta / f"pool_{split}.json").write_text(json.dumps(kept)) + + +def _fetch(split: str, image_id: str, dest: Path, long_side: int) -> tuple[int, int] | str: + """Download one original, downscale it, delete the original. Returns (w, h) or a skip reason.""" + if dest.exists(): + with Image.open(dest) as im: + return im.size + url = S3.format(split=split, id=image_id) + with tempfile.NamedTemporaryFile(suffix=".jpg", dir=dest.parent) as tmp: + try: + with urllib.request.urlopen(url, timeout=60) as resp: + tmp.write(resp.read()) + tmp.flush() + with Image.open(tmp.name) as im: + # Boxes are normalized to the image as stored. An EXIF rotation would move them. + if im.getexif().get(274, 1) != 1: + return "exif-rotated" + im = im.convert("RGB") + im.thumbnail((long_side, long_side), Image.Resampling.LANCZOS) + im.save(dest, quality=90) + return im.size + except Exception as e: # noqa: BLE001 - a missing or corrupt original just skips the image + return f"error: {e}" + + +def _eval_ok(p: dict) -> bool: + return bool(p.get("boxes")) + + +def _train_ok(p: dict) -> bool: + # Both classes verified, so both are exhaustively boxed; no group-of boxes, which would teach + # the student to box a whole row of windows as one. + v = p["verified"] + boxes = p.get("boxes", []) + return "window" in v and "door" in v and bool(boxes) and not any(b["group"] for b in boxes) + + +def download() -> None: + meta = OI / "meta" + evalpool = {} + for split in ("validation", "test"): + for i, p in json.loads((meta / f"pool_{split}.json").read_text()).items(): + if _eval_ok(p): + evalpool[i] = dict(p, split=split) + trainpool = { + i: dict(p, split="train") + for i, p in json.loads((meta / "pool_train.json").read_text()).items() + if _train_ok(p) + } + rng = random.Random(SEED) + eval_ids = sorted(evalpool) + rng.shuffle(eval_ids) + train_ids = sorted(trainpool) + rng.shuffle(train_ids) + print(f"eval pool {len(eval_ids)}, train pool {len(train_ids)}", file=sys.stderr) + + # Tune and eval draw from one shuffled order: tune takes the first N_TUNE that download, + # eval the next N_EVAL. They never share an image. + plan = [("tune", N_TUNE, eval_ids, evalpool, EVAL_LONG_SIDE), ("train", N_TRAIN, train_ids, trainpool, TRAIN_LONG_SIDE)] + taken: dict[str, list[tuple[str, dict, tuple[int, int]]]] = {"tune": [], "eval": [], "train": []} + for role, n, ids, pool, side in plan: + roles = ["tune", "eval"] if role == "tune" else ["train"] + targets = {"tune": N_TUNE, "eval": N_EVAL, "train": N_TRAIN} + skips: dict[str, int] = {} + cursor = 0 + with ThreadPoolExecutor(8) as ex: + for r in roles: + folder = OI / r + folder.mkdir(parents=True, exist_ok=True) + while len(taken[r]) < targets[r] and cursor < len(ids): + batch = ids[cursor : cursor + (targets[r] - len(taken[r]))] + cursor += len(batch) + for i, res in zip(batch, ex.map(lambda i: _fetch(pool[i]["split"], i, folder / f"{i}.jpg", side), batch)): + if isinstance(res, str): + skips[res.split(":")[0]] = skips.get(res.split(":")[0], 0) + 1 + else: + taken[r].append((i, pool[i], res)) + print(f"{r}: {len(taken[r])} images, skipped {skips}", file=sys.stderr) + + MANIFESTS.mkdir(exist_ok=True) + for r, rows in taken.items(): + rows.sort(key=lambda t: t[0]) + with open(MANIFESTS / f"oi_{r}.csv", "w", newline="") as f: + w = csv.writer(f) + w.writerow(["image_id", "split", "source_url", "landing_url", "license", "author"]) + for i, p, _ in rows: + s = p["src"] + w.writerow([i, p["split"], S3.format(split=p["split"], id=i), s["landing_url"], s["license"], s["author"]]) + gt = { + i: {"w": wh[0], "h": wh[1], "verified": p["verified"], "boxes": p.get("boxes", [])} + for i, p, wh in rows + } + (OI / f"gt_{r}.json").write_text(json.dumps(gt)) + + +if __name__ == "__main__": + {"select": select, "download": download}[sys.argv[1]]() diff --git a/experiments/autodetect/autodetect/owl.py b/experiments/autodetect/autodetect/owl.py new file mode 100644 index 000000000..5f21cc938 --- /dev/null +++ b/experiments/autodetect/autodetect/owl.py @@ -0,0 +1,211 @@ +"""OWLv2 (google/owlv2-base-patch16-ensemble, Apache-2.0) zero-shot detection through the ONNX +fp16 export in Xenova/owlv2-base-patch16-ensemble, on onnxruntime's CPU provider. + +onnxruntime's CPU provider runs this graph at 7 to 27 s an image on this shared Mac (fp16, or +upcast to fp32 in memory), and its Core ML provider fails to compile it. So the bulk runs load the +same ONNX weights into transformers' Owlv2ForObjectDetection on the GPU (MPS): named weights copy +across, and each unnamed MatMul weight takes the module path of the node that consumes it, +transposed. The export omits the objectness head, visual projection and logit scale, none of which +feed the text-query logits or boxes. `parity` checks the two runtimes agree on one image. + +Preprocessing follows transformers' Owlv2ImageProcessor: scale to [0, 1], pad bottom and right +with zeros to a square, resize to 960 x 960, normalize with CLIP's mean and std. Predicted boxes +are (cx, cy, w, h) relative to the padded square. Queries are the fixed list in config. + +Usage: python -m autodetect.owl [set ...] # default: every set, on MPS + python -m autodetect.owl parity +""" + +from __future__ import annotations + +import sys +import time +from pathlib import Path + +import numpy as np +from PIL import Image + +from . import config +from .nms import postprocess +from .paths import WEIGHTS +from .sets import SETS, ground_truth, image_path, save_preds + +DIR = WEIGHTS / "owlv2" +MODEL = DIR / "model_fp16.onnx" +URL = "https://huggingface.co/Xenova/owlv2-base-patch16-ensemble/resolve/main/onnx/model_fp16.onnx" +SIZE = 960 +MEAN = np.array([0.48145466, 0.4578275, 0.40821073], dtype=np.float32) +STD = np.array([0.26862954, 0.26130258, 0.27577711], dtype=np.float32) +MAX_TOKENS = 16 # OWLv2's text position embeddings + + +def upcast_fp16(path: Path) -> bytes: + """Serialized copy of an fp16 ONNX graph with every fp16 tensor and cast turned into fp32.""" + import onnx + from onnx import TensorProto, numpy_helper + + m = onnx.load(str(path)) + g = m.graph + + def up(t: TensorProto) -> TensorProto: + return numpy_helper.from_array(numpy_helper.to_array(t).astype(np.float32), t.name) + + for k, t in enumerate(g.initializer): + if t.data_type == TensorProto.FLOAT16: + g.initializer[k].CopyFrom(up(t)) + for n in g.node: + for a in n.attribute: + if a.type == onnx.AttributeProto.TENSOR and a.t.data_type == TensorProto.FLOAT16: + a.t.CopyFrom(up(a.t)) + if n.op_type == "Cast" and a.name == "to" and a.i == TensorProto.FLOAT16: + a.i = TensorProto.FLOAT + for v in list(g.value_info) + list(g.input) + list(g.output): + if v.type.tensor_type.elem_type == TensorProto.FLOAT16: + v.type.tensor_type.elem_type = TensorProto.FLOAT + return m.SerializeToString() + + +def torch_model(device: str): + """transformers OWLv2 carrying the ONNX export's weights, in fp32, in eval mode.""" + import onnx + import torch + from onnx import numpy_helper + from transformers import Owlv2Config, Owlv2ForObjectDetection + + m = onnx.load(str(MODEL)) + weights = {t.name: numpy_helper.to_array(t) for t in m.graph.initializer} + by_node = {} + for n in m.graph.node: + if n.op_type == "MatMul": + for x in n.input: + if x.startswith("onnx::") and x in weights: + by_node[n.name.strip("/").rsplit("/", 1)[0].replace("/", ".") + ".weight"] = weights[x].T + del m + model = Owlv2ForObjectDetection(Owlv2Config.from_pretrained(str(DIR))) + sd = model.state_dict() + unused = {"owlv2.logit_scale", "owlv2.visual_projection.weight"} | {k for k in sd if k.startswith("objectness_head.")} + loaded = {} + for k, v in sd.items(): + src = weights.get(k, by_node.get(k)) + if src is None: + if k not in unused: + raise KeyError(f"no ONNX weight for {k}") + continue + if tuple(src.shape) != tuple(v.shape): + raise ValueError(f"{k}: ONNX {src.shape} vs model {tuple(v.shape)}") + loaded[k] = torch.from_numpy(src.astype(np.float32)) + missing = model.load_state_dict(loaded, strict=False).missing_keys + if set(missing) - unused: + raise KeyError(f"unloaded: {set(missing) - unused}") + return model.eval().to(device) + + +class Owl: + def __init__(self, runtime: str = "mps") -> None: + from tokenizers import Tokenizer + + if not MODEL.exists(): + raise FileNotFoundError(f"{MODEL} missing; download it from {URL}") + self.runtime = runtime + if runtime == "onnx-cpu": + import onnxruntime as ort + + self.session = ort.InferenceSession(upcast_fp16(MODEL), providers=["CPUExecutionProvider"]) + else: + self.model = torch_model(runtime) + tok = Tokenizer.from_file(str(DIR / "tokenizer.json")) + self.labels = list(config.OWL_QUERIES) + ids = np.zeros((len(self.labels), MAX_TOKENS), dtype=np.int64) # pad token "!" is id 0 + mask = np.zeros_like(ids) + for k, q in enumerate(config.OWL_QUERIES.values()): + enc = tok.encode(q).ids + if len(enc) > MAX_TOKENS: + raise ValueError(f"query {q!r} is {len(enc)} tokens; OWLv2 takes {MAX_TOKENS}") + ids[k, : len(enc)] = enc + mask[k, : len(enc)] = 1 + self.ids, self.mask = ids, mask + + def forward(self, pixels: np.ndarray) -> tuple[np.ndarray, np.ndarray]: + if self.runtime == "onnx-cpu": + feeds = {"input_ids": self.ids, "attention_mask": self.mask, "pixel_values": pixels} + return tuple(self.session.run(["logits", "pred_boxes"], feeds)) + import torch + + dev = self.runtime + with torch.inference_mode(): + out = self.model( + input_ids=torch.from_numpy(self.ids).to(dev), + attention_mask=torch.from_numpy(self.mask).to(dev), + pixel_values=torch.from_numpy(pixels).to(dev), + ) + return out.logits.float().cpu().numpy(), out.pred_boxes.float().cpu().numpy() + + @staticmethod + def preprocess(im: Image.Image) -> np.ndarray: + w, h = im.size + s = max(w, h) + square = Image.new("RGB", (s, s), (0, 0, 0)) + square.paste(im, (0, 0)) + x = np.asarray(square.resize((SIZE, SIZE), Image.Resampling.BILINEAR), dtype=np.float32) / 255.0 + x = (x - MEAN) / STD + return x.transpose(2, 0, 1)[None] + + def detect(self, path: Path) -> tuple[list[dict], float, float]: + """Detections in image-normalized [x0, y0, x1, y1]; preprocess ms; inference ms.""" + im = Image.open(path).convert("RGB") + w, h = im.size + t0 = time.perf_counter() + pixels = self.preprocess(im) + t1 = time.perf_counter() + logits, boxes = self.forward(pixels) + t2 = time.perf_counter() + scores = 1 / (1 + np.exp(-logits[0])) # (3600, queries) + label = scores.argmax(1) + score = scores.max(1) + cx, cy, bw, bh = boxes[0].T + s = max(w, h) + xyxy = np.stack([(cx - bw / 2) * s / w, (cy - bh / 2) * s / h, (cx + bw / 2) * s / w, (cy + bh / 2) * s / h], 1) + dets = postprocess(np.clip(xyxy, 0, 1), score, [self.labels[i] for i in label]) + return dets, 1000 * (t1 - t0), 1000 * (t2 - t1) + + +def meta() -> dict: + return { + "model": "OWLv2 base patch16 ensemble, ONNX fp16", + "queries": config.OWL_QUERIES, + "license": "Apache-2.0", + "size": f"{MODEL.stat().st_size / 1e6:.0f} MB (fp16 ONNX)", + "runtime": "PyTorch MPS (GPU), Mac, fp32", + "input": "960 x 960 (padded square)", + "command": "uv run python -m autodetect.owl", + } + + +def run(owl: Owl, name: str) -> None: + images = {} + for k, i in enumerate(sorted(ground_truth(name))): + dets, pre_ms, ms = owl.detect(image_path(name, i)) + images[i] = {"elapsed_ms": ms, "preprocess_ms": pre_ms, "dets": dets} + if k % 50 == 0: + print(f"{name}: {k} images, last {ms:.0f} ms", file=sys.stderr) + save_preds("owlv2", name, meta(), images) + + +def parity(path: Path) -> None: + im = Image.open(path).convert("RGB") + x = Owl.preprocess(im) + ref = Owl("onnx-cpu") + a = ref.forward(x) + del ref + b = Owl("mps").forward(x) + print(f"max |logit diff| {np.abs(a[0] - b[0]).max():.4f} (logit range {a[0].min():.1f}..{a[0].max():.1f}), " + f"max |box diff| {np.abs(a[1] - b[1]).max():.5f}") + + +if __name__ == "__main__": + if sys.argv[1:2] == ["parity"]: + parity(Path(sys.argv[2])) + else: + owl = Owl() + for s in sys.argv[1:] or SETS: + run(owl, s) diff --git a/experiments/autodetect/autodetect/paths.py b/experiments/autodetect/autodetect/paths.py new file mode 100644 index 000000000..07a3fbe35 --- /dev/null +++ b/experiments/autodetect/autodetect/paths.py @@ -0,0 +1,16 @@ +"""Where things live. Code and results are in git; images, weights and predictions are not.""" + +from pathlib import Path + +HERE = Path(__file__).resolve().parent.parent # experiments/autodetect +RESULTS = HERE / "results" +MANIFESTS = HERE / "manifests" + +# Outside git: downloaded images, weights, cached predictions on real images. +DATA = Path.home() / "house-scanning-data" / "autodetect" +OI = DATA / "oi" +CMP = DATA / "cmp" +WEIGHTS = DATA / "weights" +PREDS = DATA / "preds" + +ELECTRO = Path.home() / "house-scanning-data" / "packets" / "eth3d-electro" diff --git a/experiments/autodetect/autodetect/run_vision.py b/experiments/autodetect/autodetect/run_vision.py new file mode 100644 index 000000000..b9a24991e --- /dev/null +++ b/experiments/autodetect/autodetect/run_vision.py @@ -0,0 +1,48 @@ +"""Apple Vision rectangles as class-agnostic proposals. Every rectangle is labelled "window", so +it is scored as window, and as window-or-door through the merged class in oieval. + +Usage: python -m autodetect.run_vision [set ...] # default: every set +""" + +from __future__ import annotations + +import json +import subprocess +import sys + +from .config import VISION_RECTS +from .paths import DATA +from .sets import SETS, ground_truth, image_path, save_preds + +BIN = DATA / "bin" / "rects" + + +def run(name: str) -> None: + ids = sorted(ground_truth(name)) + lines = "".join(json.dumps({"path": str(image_path(name, i)), **VISION_RECTS}) + "\n" for i in ids) + out = subprocess.run([str(BIN)], input=lines, capture_output=True, text=True, check=True).stdout.splitlines() + if len(out) != len(ids): + raise RuntimeError(f"{name}: sent {len(ids)} images, got {len(out)} results") + images = {} + for i, line in zip(ids, out): + r = json.loads(line) + if r.get("error"): + raise RuntimeError(f"{name}/{i}: {r['error']}") + dets = [{"label": "window", "score": x["score"], "box": x["box"]} for x in r["rects"]] + images[i] = {"elapsed_ms": r["elapsed_ms"], "dets": dets} + meta = { + "model": "Apple Vision VNDetectRectanglesRequest", + "params": VISION_RECTS, + "license": "OS API (no weights shipped)", + "size": "0 (in the OS)", + "runtime": "Vision, Mac", + "input": "image as stored (OI 1024 px, CMP about 1024 px)", + "command": "uv run python -m autodetect.run_vision", + } + save_preds("vision_rects", name, meta, images) + print(f"{name}: {len(images)} images, {sum(len(v['dets']) for v in images.values())} rectangles", file=sys.stderr) + + +if __name__ == "__main__": + for s in sys.argv[1:] or SETS: + run(s) diff --git a/experiments/autodetect/autodetect/score.py b/experiments/autodetect/autodetect/score.py new file mode 100644 index 000000000..d35d1a145 --- /dev/null +++ b/experiments/autodetect/autodetect/score.py @@ -0,0 +1,191 @@ +"""Score every cached candidate and write results/proposals.md. + +For each model and class: the operating threshold from the OI tune set, then precision, recall +and AP50 on OI eval and CMP, the pass verdict per set, a near-sized diagnostic, and Mac latency. + +Usage: python -m autodetect.score [model ...] # default: every model with cached predictions +""" + +from __future__ import annotations + +import datetime +import math +import sys + +import numpy as np + +from . import config +from .oieval import MERGED, at_threshold, average_precision, choose_threshold, class_entries +from .paths import PREDS, RESULTS +from .sets import ground_truth, load_preds + +CLASSES = ("window", "door", MERGED) +HELD_OUT = ("oi_eval", "cmp") +SET_NAMES = {"oi_eval": "Open Images eval", "cmp": "CMP base", "oi_tune": "Open Images tune"} + + +def _fmt(x: float, pct: bool = True) -> str: + if x is None or (isinstance(x, float) and math.isnan(x)): + return "n/a" + return f"{100 * x:.1f}%" if pct else f"{x:.3f}" + + +def speed_class(ms: float) -> str: + if ms <= config.LIVE_MS: + return "live" + if ms <= config.KEYFRAME_MS: + return "keyframe" + return "offline" + + +def latency(preds: dict) -> tuple[float, float, int]: + """Median and p90 per-image ms, skipping the first image (model load and warm-up).""" + ms = [v["elapsed_ms"] for _, v in sorted(preds["images"].items())][1:] + return float(np.median(ms)), float(np.percentile(ms, 90)), len(ms) + + +def model_classes(preds: dict) -> list[str]: + labels = {d["label"] for v in preds["images"].values() for d in v["dets"]} + return [c for c in CLASSES if c in labels or (c == MERGED and labels & {"window", "door"})] + + +def as_images(preds: dict) -> dict[str, list[dict]]: + return {i: v["dets"] for i, v in preds["images"].items()} + + +def score_model(model: str) -> dict: + tune = load_preds(model, "oi_tune") + out = {"model": model, "meta": tune["meta"], "classes": {}} + gts = {s: ground_truth(s) for s in ("oi_tune", *HELD_OUT)} + preds = {s: as_images(load_preds(model, s)) for s in ("oi_tune", *HELD_OUT)} + for cls in model_classes(tune): + e_tune = class_entries(gts["oi_tune"], preds["oi_tune"], cls) + t, rule = choose_threshold(e_tune, config.MIN_PRECISION) + row = {"threshold": t, "rule": rule, "tune": at_threshold(e_tune, t), "sets": {}} + for s in HELD_OUT: + e = class_entries(gts[s], preds[s], cls) + near = class_entries(gts[s], preds[s], cls, near_min_side=config.NEAR_MIN_SIDE) + r = at_threshold(e, t) + r["ap50"] = average_precision(e) + r["images"] = e.num_images + r["passes"] = bool(r["recall"] >= config.MIN_RECALL and r["precision"] >= config.MIN_PRECISION) + rn = at_threshold(near, t) + rn["ap50"] = average_precision(near) + t_oracle, oracle_rule = choose_threshold(e, config.MIN_PRECISION) + ro = at_threshold(e, t_oracle) + ro["reaches_bar"] = oracle_rule.startswith("lowest") + row["sets"][s] = {"all": r, "near": rn, "oracle": ro} + out["classes"][cls] = row + out["latency"] = {s: latency(load_preds(model, s)) for s in HELD_OUT} + return out + + +def write(results: list[dict]) -> None: + L = [ + "# Proposals: window and door detection", + "", + f"Generated {datetime.date.today()} by `uv run python -m autodetect.score` from cached predictions", + "(see each model's run command below). Criteria are in `../README.md`, settings in", + "`../autodetect/config.py`. IoU 0.5; Open Images rules for unverified classes and group-of boxes.", + "The threshold is chosen on the 150-image OI tune set and applied unchanged to both held-out sets.", + "", + "## Operating point", + "", + "Pass needs recall >= 80% and precision >= 60% at the operating threshold, judged per set.", + "", + "| Model | Class | Threshold | Set | Images | GT | TP | FP | Precision | Recall | AP50 | Pass |", + "|---|---|---|---|---|---|---|---|---|---|---|---|", + ] + for r in results: + for cls, row in r["classes"].items(): + for s in HELD_OUT: + a = row["sets"][s]["all"] + L.append( + f"| {r['model']} | {cls} | {row['threshold']:.3f} | {SET_NAMES[s]} | {a['images']} | {a['num_gt']} | " + f"{a['tp']} | {a['fp']} | {_fmt(a['precision'])} | {_fmt(a['recall'])} | {_fmt(a['ap50'])} | " + f"{'yes' if a['passes'] else 'no'} |" + ) + L += [ + "", + "## Tune-set operating point (where each threshold came from)", + "", + "| Model | Class | Threshold | Rule | Tune precision | Tune recall |", + "|---|---|---|---|---|---|", + ] + for r in results: + for cls, row in r["classes"].items(): + tu = row["tune"] + L.append(f"| {r['model']} | {cls} | {row['threshold']:.3f} | {row['rule']} | {_fmt(tu['precision'])} | {_fmt(tu['recall'])} |") + L += [ + "", + "## Diagnostic: best recall at 60% precision on the scored set itself", + "", + "Not a pass criterion: the threshold here is chosen on the set it is scored on. It shows whether", + "a failure comes from the tune-set threshold not transferring or from the model, since no", + "threshold passes when even this recall is under 80%.", + "", + "| Model | Class | Set | Threshold | Precision | Recall |", + "|---|---|---|---|---|---|", + ] + for r in results: + for cls, row in r["classes"].items(): + for s in HELD_OUT: + o = row["sets"][s]["oracle"] + note = "" if o["reaches_bar"] else " (never reaches 60%; best F1)" + L.append(f"| {r['model']} | {cls} | {SET_NAMES[s]} | {o['threshold']:.3f}{note} | {_fmt(o['precision'])} | {_fmt(o['recall'])} |") + L += [ + "", + "## Diagnostic: near-sized objects only", + "", + f"Not a pass criterion. Ground-truth boxes narrower or shorter than {config.NEAR_MIN_SIDE:.0%} of the image", + "are treated as difficult (a detection on one is ignored, a miss is not counted), and detections", + "that small are dropped, to approximate the large objects in a 1 to 3 m phone frame. Same", + "thresholds. Dropping small detections was added after the first scored run showed that", + "without it the small false positives alone kept precision under 25%.", + "", + "| Model | Class | Set | GT | Precision | Recall | AP50 |", + "|---|---|---|---|---|---|---|", + ] + for r in results: + for cls, row in r["classes"].items(): + for s in HELD_OUT: + n = row["sets"][s]["near"] + L.append(f"| {r['model']} | {cls} | {SET_NAMES[s]} | {n['num_gt']} | {_fmt(n['precision'])} | {_fmt(n['recall'])} | {_fmt(n['ap50'])} |") + L += [ + "", + "## Model, license and Mac latency", + "", + "Latency is per image on this Mac (Apple M4 Pro, 24 GB), inference call only, excluding JPEG", + "decode, preprocessing and the first (warm-up) image. It is not an iPhone number; a phone is", + "slower. Other agents shared the Mac throughout: the load average column is the 1, 5 and 15", + "minute load when the OI eval predictions were saved (12 cores), and loads of 100 to 490 were", + "seen during the OWLv2 run, so every timing here is likely slower than on an idle Mac.", + "", + "| Model | License | Size | Runtime | Input | OI eval median ms | OI eval p90 ms | CMP median ms | CPU-only median / p90 ms | Load average | Speed class (Mac, p90) | Command |", + "|---|---|---|---|---|---|---|---|---|---|---|---|", + ] + for r in results: + m = r["meta"] + oi_med, oi_p90, _ = r["latency"]["oi_eval"] + cmp_med, _, _ = r["latency"]["cmp"] + cpu = "n/a" + if (PREDS / f"{r['model']}_cpu" / "oi_eval.json").exists(): + c_med, c_p90, _ = latency(load_preds(f"{r['model']}_cpu", "oi_eval")) + cpu = f"{c_med:.1f} / {c_p90:.1f} ({speed_class(c_p90)})" + load = load_preds(r["model"], "oi_eval")["meta"].get("load_avg_at_save", "not recorded") + L.append( + f"| {r['model']} | {m.get('license', '?')} | {m.get('size', '?')} | {m.get('runtime', '?')} | {m.get('input', '?')} | " + f"{oi_med:.1f} | {oi_p90:.1f} | {cmp_med:.1f} | {cpu} | {load} | {speed_class(oi_p90)} | `{m.get('command', '?')}` |" + ) + (RESULTS / "proposals.md").write_text("\n".join(L) + "\n") + + +if __name__ == "__main__": + models = sys.argv[1:] or sorted(p.name for p in PREDS.iterdir() if (p / "oi_tune.json").exists()) + results = [score_model(m) for m in models] + write(results) + for r in results: + for cls, row in r["classes"].items(): + for s in HELD_OUT: + a = row["sets"][s]["all"] + print(f"{r['model']:14s} {cls:15s} {s:8s} P {_fmt(a['precision']):>6s} R {_fmt(a['recall']):>6s} AP {_fmt(a['ap50']):>6s}", file=sys.stderr) diff --git a/experiments/autodetect/autodetect/sets.py b/experiments/autodetect/autodetect/sets.py new file mode 100644 index 000000000..cabbef6de --- /dev/null +++ b/experiments/autodetect/autodetect/sets.py @@ -0,0 +1,54 @@ +"""The scored image sets and the prediction cache shared by every candidate. + +Predictions live outside git at PREDS//.json: +{"meta": {...}, "images": {image_id: {"elapsed_ms": float, "dets": [{"label", "score", "box"}]}}} +""" + +from __future__ import annotations + +import json +import os +from pathlib import Path + +from .paths import CMP, DATA, ELECTRO, OI, PREDS + +SETS = ("oi_tune", "oi_eval", "cmp") +# Prediction-only set for the 3D-extent step: the eight ETH3D electro photos, downscaled to 1024 px +# on the long side (python -m autodetect.extent prepare). No 2D ground truth. +ELECTRO_1024 = DATA / "electro_1024" + + +def ground_truth(name: str) -> dict[str, dict]: + if name == "electro": + photos = json.loads((ELECTRO / "manifest.json").read_text())["photos"] + return {p["id"]: {"verified": {}, "boxes": []} for p in photos} + if name == "cmp": + return json.loads((CMP / "gt.json").read_text()) + if name in ("oi_tune", "oi_eval", "oi_train"): + return json.loads((OI / f"gt_{name[3:]}.json").read_text()) + raise KeyError(f"unknown set {name!r}; expected one of {SETS} or oi_train") + + +def image_path(name: str, image_id: str) -> Path: + if name == "electro": + return ELECTRO_1024 / f"{image_id}.jpg" + if name == "cmp": + return CMP / "base" / f"{image_id}.jpg" + return OI / name[3:] / f"{image_id}.jpg" + + +def pred_path(model: str, name: str) -> Path: + return PREDS / model / f"{name}.json" + + +def save_preds(model: str, name: str, meta: dict, images: dict) -> None: + """Also records the 1, 5 and 15 minute load averages at save time: the Mac is shared, and a + loaded machine slows every timing.""" + meta = dict(meta, load_avg_at_save=[round(x, 1) for x in os.getloadavg()]) + p = pred_path(model, name) + p.parent.mkdir(parents=True, exist_ok=True) + p.write_text(json.dumps({"meta": meta, "images": images})) + + +def load_preds(model: str, name: str) -> dict: + return json.loads(pred_path(model, name).read_text()) diff --git a/experiments/autodetect/autodetect/show.py b/experiments/autodetect/autodetect/show.py new file mode 100644 index 000000000..6069661be --- /dev/null +++ b/experiments/autodetect/autodetect/show.py @@ -0,0 +1,37 @@ +"""Draw ground truth (green window, blue door, dashed = group-of) and a model's detections at or +above a threshold (red) on one image, for checking coordinates by eye. Writes to DATA/preview. + +Usage: python -m autodetect.show [model] [threshold] +""" + +from __future__ import annotations + +import sys + +from PIL import Image, ImageDraw + +from .paths import DATA +from .sets import ground_truth, image_path, load_preds + + +def draw(name: str, image_id: str, model: str | None = None, threshold: float = 0.0) -> str: + im = Image.open(image_path(name, image_id)).convert("RGB") + w, h = im.size + d = ImageDraw.Draw(im) + px = lambda b: [b[0] * w, b[1] * h, b[2] * w, b[3] * h] # noqa: E731 + for b in ground_truth(name)[image_id]["boxes"]: + d.rectangle(px(b["box"]), outline=(0, 200, 0) if b["label"] == "window" else (0, 80, 255), width=1 if b["group"] else 3) + if model: + for det in load_preds(model, name)["images"][image_id]["dets"]: + if det["score"] >= threshold: + d.rectangle(px(det["box"]), outline=(255, 0, 0), width=2) + d.text((det["box"][0] * w + 2, det["box"][1] * h + 2), f"{det['label'][:1]}{det['score']:.2f}", fill=(255, 0, 0)) + out = DATA / "preview" / f"{name}_{image_id}_{model or 'gt'}.jpg" + out.parent.mkdir(parents=True, exist_ok=True) + im.save(out) + return str(out) + + +if __name__ == "__main__": + a = sys.argv[1:] + print(draw(a[0], a[1], a[2] if len(a) > 2 else None, float(a[3]) if len(a) > 3 else 0.0)) diff --git a/experiments/autodetect/autodetect/student.py b/experiments/autodetect/autodetect/student.py new file mode 100644 index 000000000..7ecfa9c94 --- /dev/null +++ b/experiments/autodetect/autodetect/student.py @@ -0,0 +1,127 @@ +"""The on-device student: a Create ML object detector trained on the Open Images train subset +(1,340 images, window and door, both classes verified in every image, no group-of boxes). + + prepare hard-link the train images into DATA/student/train with Create ML's annotations.json + train run the Swift trainer (transfer learning on Apple's object feature print) + predict run the model through Vision on every set and the electro photos with compute units + .all, and time OI eval again CPU-only + crop compare Vision's crop-and-scale options on the tune set only (the one setting chosen + after training, and never on a scored set) + +Usage: python -m autodetect.student prepare + python -m autodetect.student train + python -m autodetect.student crop + python -m autodetect.student predict +""" + +from __future__ import annotations + +import json +import os +import subprocess +import sys + +from . import config +from .oieval import MERGED, average_precision, class_entries +from .paths import DATA +from .sets import SETS, ground_truth, image_path, save_preds + +DIR = DATA / "student" +TRAIN = DIR / "train" +BIN = DATA / "bin" + + +def model_path(algo: str) -> "os.PathLike": + return DIR / f"window_door_{algo}.mlmodel" + + +def prepare() -> None: + TRAIN.mkdir(parents=True, exist_ok=True) + gt = ground_truth("oi_train") + ann = [] + for i, g in sorted(gt.items()): + dest = TRAIN / f"{i}.jpg" + if not dest.exists(): + os.link(image_path("oi_train", i), dest) + w, h = g["w"], g["h"] + boxes = [] + for b in g["boxes"]: + x0, y0, x1, y1 = b["box"] + boxes.append({ + "label": b["label"], + "coordinates": {"x": (x0 + x1) / 2 * w, "y": (y0 + y1) / 2 * h, "width": (x1 - x0) * w, "height": (y1 - y0) * h}, + }) + ann.append({"image": dest.name, "annotations": boxes}) + (TRAIN / "annotations.json").write_text(json.dumps(ann)) + n = sum(len(a["annotations"]) for a in ann) + print(f"{len(ann)} images, {n} boxes", file=sys.stderr) + + +def train(algo: str, iterations: int) -> None: + """Progress goes to DATA/student/train_.log; rerunning resumes from the session folder.""" + log = DIR / f"train_{algo}.log" + cmd = [str(BIN / "trainod"), str(TRAIN), str(model_path(algo)), algo, str(iterations), str(DIR / f"session_{algo}")] + with open(log, "a") as err: + out = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=err, text=True) + if out.returncode: + raise RuntimeError(f"trainod failed; see {log}") + report = out.stdout[out.stdout.index("{") :] + (DIR / f"train_{algo}.json").write_text(report) + print(report) + + +def _run(algo: str, name: str, units: str, crop: str) -> dict: + ids = sorted(ground_truth(name)) + cmd = [str(BIN / "coremldet"), str(model_path(algo)), units, crop, str(config.STUDENT_CONFIDENCE_FLOOR), str(config.STUDENT_NMS_IOU)] + paths = "".join(f"{image_path(name, i)}\n" for i in ids) + out = subprocess.run(cmd, input=paths, capture_output=True, text=True, check=True).stdout.splitlines() + if len(out) != len(ids): + raise RuntimeError(f"{name}: sent {len(ids)} images, got {len(out)} results") + images = {} + for i, line in zip(ids, out): + r = json.loads(line) + if r.get("error"): + raise RuntimeError(f"{name}/{i}: {r['error']}") + dets = sorted(r["detections"], key=lambda d: -d["score"])[: config.MAX_DETS] + images[i] = {"elapsed_ms": r["elapsed_ms"], "dets": [{k: d[k] for k in ("label", "score", "box")} for d in dets]} + return images + + +def crop(algo: str) -> None: + gt = ground_truth("oi_tune") + for option in ("scaleFill", "scaleFit", "centerCrop"): + preds = {i: v["dets"] for i, v in _run(algo, "oi_tune", "all", option).items()} + aps = {c: average_precision(class_entries(gt, preds, c)) for c in ("window", "door", MERGED)} + print(option, {c: round(v, 3) for c, v in aps.items()}) + + +def predict(algo: str, crop_option: str) -> None: + size = sum(f.stat().st_size for f in [model_path(algo)]) + meta = { + "model": f"Create ML MLObjectDetector ({algo}), window and door", + "license": "ours; trained on Open Images V7 train (CC BY 2.0 images, CC BY 4.0 boxes)", + "size": f"{size / 1e6:.1f} MB (.mlmodel)", + "runtime": "Core ML via Vision, compute units .all, Mac", + "input": f"Vision {crop_option} to the model's input", + "crop": crop_option, + "command": f"uv run python -m autodetect.student predict {algo}", + } + for s in (*SETS, "electro"): + save_preds(f"student_{algo}", s, meta, _run(algo, s, "all", crop_option)) + cpu = _run(algo, "oi_eval", "cpu", crop_option) + save_preds(f"student_{algo}_cpu", "oi_eval", dict(meta, runtime="Core ML via Vision, CPU only, Mac"), cpu) + + +if __name__ == "__main__": + step = sys.argv[1] + algo = sys.argv[2] if len(sys.argv) > 2 else "transfer" + if step == "prepare": + prepare() + elif step == "train": + train(algo, int(sys.argv[3])) + elif step == "crop": + crop(algo) + elif step == "predict": + predict(algo, sys.argv[3] if len(sys.argv) > 3 else "scaleFill") + else: + raise SystemExit(f"unknown step {step!r}") diff --git a/experiments/autodetect/manifests/cmp_base.csv b/experiments/autodetect/manifests/cmp_base.csv new file mode 100644 index 000000000..16f126f8d --- /dev/null +++ b/experiments/autodetect/manifests/cmp_base.csv @@ -0,0 +1,379 @@ +image_id,source_url,license,author +cmp_b0001,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0002,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0003,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0004,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0005,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0006,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0007,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0008,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0009,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0010,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0011,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0012,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0013,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0014,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0015,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0016,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0017,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0018,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0019,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0020,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0021,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0022,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0023,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0024,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0025,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0026,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0027,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0028,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0029,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0030,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0031,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0032,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0033,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0034,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0035,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0036,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0037,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0038,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0039,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0040,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0041,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0042,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0043,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0044,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0045,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0046,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0047,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0048,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0049,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0050,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0051,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0052,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0053,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0054,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0055,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0056,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0057,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0058,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0059,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0060,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0061,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0062,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0063,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0064,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0065,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0066,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0067,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0068,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0069,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0070,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0071,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0072,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0073,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0074,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0075,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0076,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0077,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0078,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0079,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0080,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0081,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0082,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0083,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0084,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0085,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0086,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0087,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0088,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0089,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0090,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0091,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0092,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0093,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0094,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0095,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0096,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0097,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0098,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0099,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0100,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0101,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0102,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0103,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0104,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0105,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0106,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0107,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0108,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0109,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0110,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0111,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0112,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0113,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0114,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0115,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0116,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0117,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0118,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0119,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0120,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0121,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0122,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0123,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0124,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0125,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0126,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0127,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0128,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0129,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0130,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0131,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0132,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0133,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0134,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0135,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0136,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0137,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0138,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0139,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0140,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0141,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0142,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0143,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0144,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0145,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0146,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0147,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0148,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0149,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0150,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0151,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0152,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0153,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0154,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0155,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0156,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0157,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0158,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0159,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0160,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0161,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0162,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0163,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0164,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0165,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0166,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0167,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0168,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0169,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0170,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0171,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0172,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0173,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0174,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0175,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0176,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0177,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0178,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0179,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0180,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0181,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0182,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0183,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0184,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0185,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0186,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0187,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0188,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0189,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0190,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0191,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0192,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0193,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0194,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0195,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0196,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0197,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0198,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0199,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0200,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0201,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0202,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0203,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0204,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0205,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0206,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0207,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0208,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0209,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0210,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0211,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0212,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0213,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0214,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0215,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0216,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0217,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0218,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0219,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0220,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0221,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0222,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0223,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0224,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0225,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0226,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0227,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0228,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0229,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0230,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0231,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0232,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0233,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0234,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0235,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0236,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0237,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0238,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0239,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0240,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0241,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0242,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0243,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0244,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0245,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0246,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0247,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0248,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0249,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0250,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0251,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0252,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0253,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0254,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0255,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0256,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0257,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0258,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0259,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0260,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0261,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0262,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0263,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0264,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0265,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0266,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0267,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0268,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0269,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0270,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0271,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0272,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0273,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0274,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0275,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0276,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0277,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0278,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0279,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0280,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0281,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0282,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0283,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0284,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0285,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0286,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0287,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0288,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0289,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0290,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0291,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0292,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0293,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0294,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0295,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0296,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0297,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0298,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0299,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0300,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0301,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0302,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0303,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0304,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0305,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0306,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0307,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0308,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0309,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0310,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0311,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0312,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0313,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0314,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0315,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0316,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0317,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0318,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0319,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0320,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0321,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0322,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0323,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0324,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0325,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0326,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0327,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0328,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0329,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0330,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0331,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0332,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0333,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0334,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0335,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0336,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0337,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0338,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0339,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0340,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0341,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0342,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0343,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0344,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0345,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0346,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0347,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0348,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0349,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0350,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0351,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0352,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0353,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0354,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0355,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0356,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0357,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0358,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0359,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0360,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0361,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0362,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0363,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0364,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0365,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0366,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0367,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0368,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0369,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0370,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0371,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0372,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0373,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0374,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0375,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0376,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0377,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" +cmp_b0378,https://cmp.felk.cvut.cz/~tylecr1/facade/CMP_facade_DB_base.zip,CC BY-SA 3.0,"R. Tylecek, R. Sara, CMP Prague (collected from various sources)" diff --git a/experiments/autodetect/manifests/oi_eval.csv b/experiments/autodetect/manifests/oi_eval.csv new file mode 100644 index 000000000..5267308ff --- /dev/null +++ b/experiments/autodetect/manifests/oi_eval.csv @@ -0,0 +1,301 @@ +image_id,split,source_url,landing_url,license,author +01a6c89f9885d483,validation,https://open-images-dataset.s3.amazonaws.com/validation/01a6c89f9885d483.jpg,https://www.flickr.com/photos/visittuscany/14617092224,https://creativecommons.org/licenses/by/2.0/,Visit Tuscany +01b4338cf83ad263,test,https://open-images-dataset.s3.amazonaws.com/test/01b4338cf83ad263.jpg,https://www.flickr.com/photos/gandalfar/4528780542,https://creativecommons.org/licenses/by/2.0/,Jure Cuhalev +0224eb6948c6627e,test,https://open-images-dataset.s3.amazonaws.com/test/0224eb6948c6627e.jpg,https://www.flickr.com/photos/shankbone/2830138700/,https://creativecommons.org/licenses/by/2.0/,David Shankbone +02539d32a56b0a52,test,https://open-images-dataset.s3.amazonaws.com/test/02539d32a56b0a52.jpg,https://www.flickr.com/photos/homeaidnova/5755582326,https://creativecommons.org/licenses/by/2.0/,HomeAid Northern Virginia +04a3909bf0952c9d,test,https://open-images-dataset.s3.amazonaws.com/test/04a3909bf0952c9d.jpg,https://www.flickr.com/photos/momthebarbarian/1292850,https://creativecommons.org/licenses/by/2.0/,Mom the Barbarian +04ee7b4f218ef27c,test,https://open-images-dataset.s3.amazonaws.com/test/04ee7b4f218ef27c.jpg,https://www.flickr.com/photos/spidere/5341604165,https://creativecommons.org/licenses/by/2.0/,Spidere Warmouse +06358abb2ea99449,test,https://open-images-dataset.s3.amazonaws.com/test/06358abb2ea99449.jpg,https://www.flickr.com/photos/docentjoyce/3141739177,https://creativecommons.org/licenses/by/2.0/,docentjoyce +08080135b824bd85,test,https://open-images-dataset.s3.amazonaws.com/test/08080135b824bd85.jpg,https://www.flickr.com/photos/summonedbyfells/7302044652,https://creativecommons.org/licenses/by/2.0/,summonedbyfells +08380c1be6830cf7,test,https://open-images-dataset.s3.amazonaws.com/test/08380c1be6830cf7.jpg,https://www.flickr.com/photos/jimwinstead/214649613,https://creativecommons.org/licenses/by/2.0/,Jim Winstead +08b33e22ca2eed03,test,https://open-images-dataset.s3.amazonaws.com/test/08b33e22ca2eed03.jpg,https://www.flickr.com/photos/bdom/2054827904,https://creativecommons.org/licenses/by/2.0/,bDom - artiste - www.bdom.info +0ba9d2cc31b93d70,validation,https://open-images-dataset.s3.amazonaws.com/validation/0ba9d2cc31b93d70.jpg,https://www.flickr.com/photos/garryknight/8712032568,https://creativecommons.org/licenses/by/2.0/,Garry Knight +0bc1073a2ce8e2d1,test,https://open-images-dataset.s3.amazonaws.com/test/0bc1073a2ce8e2d1.jpg,https://www.flickr.com/photos/carios/2410958576,https://creativecommons.org/licenses/by/2.0/,fotocarios +0c08d0cd7a9bf658,test,https://open-images-dataset.s3.amazonaws.com/test/0c08d0cd7a9bf658.jpg,https://www.flickr.com/photos/13073825@N07/5167738209/in/faves-worldgoneby/,https://creativecommons.org/licenses/by/2.0/,Laura LaVoie +0f2976036ded177b,validation,https://open-images-dataset.s3.amazonaws.com/validation/0f2976036ded177b.jpg,https://www.flickr.com/photos/enriquefreire/7486288624,https://creativecommons.org/licenses/by/2.0/,Enrique Freire +1064d513dc8bd213,test,https://open-images-dataset.s3.amazonaws.com/test/1064d513dc8bd213.jpg,https://www.flickr.com/photos/gravyphig/4232728963,https://creativecommons.org/licenses/by/2.0/,Graham Smith +108fe902d5b95d15,test,https://open-images-dataset.s3.amazonaws.com/test/108fe902d5b95d15.jpg,https://www.flickr.com/photos/26822994@N06/2510871945,https://creativecommons.org/licenses/by/2.0/,riversideavondale +10f2ecb632162624,test,https://open-images-dataset.s3.amazonaws.com/test/10f2ecb632162624.jpg,https://www.flickr.com/photos/donhomer/7711984238,https://creativecommons.org/licenses/by/2.0/,Michael Bentley +113d25ebfb361514,test,https://open-images-dataset.s3.amazonaws.com/test/113d25ebfb361514.jpg,https://www.flickr.com/photos/uschi-mitzkat/18726782189,https://creativecommons.org/licenses/by/2.0/,uschi mitzkat +11f399f4aa46b261,validation,https://open-images-dataset.s3.amazonaws.com/validation/11f399f4aa46b261.jpg,https://www.flickr.com/photos/vrysxy/3272651417,https://creativecommons.org/licenses/by/2.0/,Vrysxy +13734cb58200fca6,test,https://open-images-dataset.s3.amazonaws.com/test/13734cb58200fca6.jpg,https://www.flickr.com/photos/nilswoxholt/2994485347,https://creativecommons.org/licenses/by/2.0/,Nils.Woxholt +1438aa09e6d7e1b2,test,https://open-images-dataset.s3.amazonaws.com/test/1438aa09e6d7e1b2.jpg,https://www.flickr.com/photos/123798245@N06/19441010536,https://creativecommons.org/licenses/by/2.0/,Dimitar Chilov +1546e9f31eec6118,test,https://open-images-dataset.s3.amazonaws.com/test/1546e9f31eec6118.jpg,https://www.flickr.com/photos/montalbino/4578197957,https://creativecommons.org/licenses/by/2.0/,Agriturismo Montalbino +179c9818e1216bba,test,https://open-images-dataset.s3.amazonaws.com/test/179c9818e1216bba.jpg,https://www.flickr.com/photos/zemzina/16900781878,https://creativecommons.org/licenses/by/2.0/,Olga Khomitsevich +182d1021b939ec3e,test,https://open-images-dataset.s3.amazonaws.com/test/182d1021b939ec3e.jpg,https://www.flickr.com/photos/javatourism/2844349912,https://creativecommons.org/licenses/by/2.0/,java tourism +186e35aafc8a0d42,test,https://open-images-dataset.s3.amazonaws.com/test/186e35aafc8a0d42.jpg,https://www.flickr.com/photos/nicholas_cardot/10318941103,https://creativecommons.org/licenses/by/2.0/,Nicholas Cardot +187fef6c8b9b9429,test,https://open-images-dataset.s3.amazonaws.com/test/187fef6c8b9b9429.jpg,https://www.flickr.com/photos/juhansonin/2146465441,https://creativecommons.org/licenses/by/2.0/,Juhan Sonin +18992e1b224efa1b,test,https://open-images-dataset.s3.amazonaws.com/test/18992e1b224efa1b.jpg,https://www.flickr.com/photos/jaycross/2420669178,https://creativecommons.org/licenses/by/2.0/,Jay Cross +18a957798a0fed54,test,https://open-images-dataset.s3.amazonaws.com/test/18a957798a0fed54.jpg,https://www.flickr.com/photos/u-suke/4762951680,https://creativecommons.org/licenses/by/2.0/,Yusuke Kawasaki +18e19684837166f2,test,https://open-images-dataset.s3.amazonaws.com/test/18e19684837166f2.jpg,https://www.flickr.com/photos/84299143@N00/3171412938,https://creativecommons.org/licenses/by/2.0/,Charles Stanford +1989996881e6acf3,test,https://open-images-dataset.s3.amazonaws.com/test/1989996881e6acf3.jpg,https://www.flickr.com/photos/mjtmail/4868708012,https://creativecommons.org/licenses/by/2.0/,mjtmail (tiggy) +19c8c88413751fbb,test,https://open-images-dataset.s3.amazonaws.com/test/19c8c88413751fbb.jpg,https://www.flickr.com/photos/28648582@N02/19483270065,https://creativecommons.org/licenses/by/2.0/,Kevin Shorter +19f5c3b3a490beff,validation,https://open-images-dataset.s3.amazonaws.com/validation/19f5c3b3a490beff.jpg,https://www.flickr.com/photos/47919858@N00/11134109635,https://creativecommons.org/licenses/by/2.0/,Eric +1a15ae6f60a3f184,test,https://open-images-dataset.s3.amazonaws.com/test/1a15ae6f60a3f184.jpg,https://www.flickr.com/photos/thienzieyung/7162845879,https://creativecommons.org/licenses/by/2.0/,Jason Thien +1af752b509c87694,test,https://open-images-dataset.s3.amazonaws.com/test/1af752b509c87694.jpg,https://www.flickr.com/photos/fischler/3973694297,https://creativecommons.org/licenses/by/2.0/,andreas_fischler +1b16cb29d5fbfed9,test,https://open-images-dataset.s3.amazonaws.com/test/1b16cb29d5fbfed9.jpg,https://www.flickr.com/photos/twak/6348750452,https://creativecommons.org/licenses/by/2.0/,twak +1cc6326c2e3f71a8,test,https://open-images-dataset.s3.amazonaws.com/test/1cc6326c2e3f71a8.jpg,https://www.flickr.com/photos/johnbeagle/707182254,https://creativecommons.org/licenses/by/2.0/,John Beagle +20d5897655ffeb17,test,https://open-images-dataset.s3.amazonaws.com/test/20d5897655ffeb17.jpg,https://www.flickr.com/photos/dakiny/8886803650,https://creativecommons.org/licenses/by/2.0/,Toshihiro Gamo +217b95a71cb220f8,validation,https://open-images-dataset.s3.amazonaws.com/validation/217b95a71cb220f8.jpg,https://www.flickr.com/photos/calliope/4790183349/,https://creativecommons.org/licenses/by/2.0/,liz west +21b246ca3da40334,validation,https://open-images-dataset.s3.amazonaws.com/validation/21b246ca3da40334.jpg,https://www.flickr.com/photos/18614695@N00/373730222,https://creativecommons.org/licenses/by/2.0/,Xavi +21d78ed47bea859c,test,https://open-images-dataset.s3.amazonaws.com/test/21d78ed47bea859c.jpg,https://www.flickr.com/photos/54711379@N02/16755772218,https://creativecommons.org/licenses/by/2.0/,Jun's fav +23a1d1da6a4dec69,test,https://open-images-dataset.s3.amazonaws.com/test/23a1d1da6a4dec69.jpg,https://www.flickr.com/photos/itiro/4356195067,https://creativecommons.org/licenses/by/2.0/,Itiro +24d24e968db6992f,validation,https://open-images-dataset.s3.amazonaws.com/validation/24d24e968db6992f.jpg,https://www.flickr.com/photos/edwin_steele/8397566230,https://creativecommons.org/licenses/by/2.0/,Edwin +2847b40c81780f47,test,https://open-images-dataset.s3.amazonaws.com/test/2847b40c81780f47.jpg,https://www.flickr.com/photos/chasbot/14680767,https://creativecommons.org/licenses/by/2.0/,Chas Redmond +28d59f5f0a3cfd8f,test,https://open-images-dataset.s3.amazonaws.com/test/28d59f5f0a3cfd8f.jpg,https://www.flickr.com/photos/sfmine79/9770172813,https://creativecommons.org/licenses/by/2.0/,MiNe +2a0905a2ff63f09e,validation,https://open-images-dataset.s3.amazonaws.com/validation/2a0905a2ff63f09e.jpg,https://www.flickr.com/photos/apapp/8069880438,https://creativecommons.org/licenses/by/2.0/,Arnie Papp +2a7f61a074483cb0,validation,https://open-images-dataset.s3.amazonaws.com/validation/2a7f61a074483cb0.jpg,https://www.flickr.com/photos/tostie14/34118144,https://creativecommons.org/licenses/by/2.0/,Kevin Tostado +2bc01d47b00dba1b,test,https://open-images-dataset.s3.amazonaws.com/test/2bc01d47b00dba1b.jpg,https://www.flickr.com/photos/sue_elias/15681225413,https://creativecommons.org/licenses/by/2.0/,Sue +2c2541c2b82f1c70,validation,https://open-images-dataset.s3.amazonaws.com/validation/2c2541c2b82f1c70.jpg,https://www.flickr.com/photos/vagueonthehow/4220963722/,https://creativecommons.org/licenses/by/2.0/,vagueonthehow +2e38eb8daa07c52a,test,https://open-images-dataset.s3.amazonaws.com/test/2e38eb8daa07c52a.jpg,https://www.flickr.com/photos/sats_somu/225411773,https://creativecommons.org/licenses/by/2.0/,Satish Somasundaram +2f8af40a36358154,test,https://open-images-dataset.s3.amazonaws.com/test/2f8af40a36358154.jpg,https://www.flickr.com/photos/72906133@N00/9593581252,https://creativecommons.org/licenses/by/2.0/,Konstantinos Dafalias +2f8ea4ffa5504726,test,https://open-images-dataset.s3.amazonaws.com/test/2f8ea4ffa5504726.jpg,https://www.flickr.com/photos/mkumm/3548235931,https://creativecommons.org/licenses/by/2.0/,Michael Kumm +31b49c19f7401c9c,test,https://open-images-dataset.s3.amazonaws.com/test/31b49c19f7401c9c.jpg,https://www.flickr.com/photos/bopuc/201093684,https://creativecommons.org/licenses/by/2.0/,Bopuc +33d46829f7a1cdd5,test,https://open-images-dataset.s3.amazonaws.com/test/33d46829f7a1cdd5.jpg,https://www.flickr.com/photos/geishaboy500/492674341,https://creativecommons.org/licenses/by/2.0/,THOR +341745608bb07173,test,https://open-images-dataset.s3.amazonaws.com/test/341745608bb07173.jpg,https://www.flickr.com/photos/27606531@N02/2870115672,https://creativecommons.org/licenses/by/2.0/,WarOnTomato +342719d0e7eec50c,test,https://open-images-dataset.s3.amazonaws.com/test/342719d0e7eec50c.jpg,https://www.flickr.com/photos/60464669@N06/5680976481,https://creativecommons.org/licenses/by/2.0/,pat York +34797ed5cb94c635,test,https://open-images-dataset.s3.amazonaws.com/test/34797ed5cb94c635.jpg,https://www.flickr.com/photos/26085795@N02/5478559760,https://creativecommons.org/licenses/by/2.0/,Jan Smith +3484e7b9e2d9284e,test,https://open-images-dataset.s3.amazonaws.com/test/3484e7b9e2d9284e.jpg,https://www.flickr.com/photos/pululante/2229153700/,https://creativecommons.org/licenses/by/2.0/,pululante +35dd43805eb3b260,test,https://open-images-dataset.s3.amazonaws.com/test/35dd43805eb3b260.jpg,https://www.flickr.com/photos/hiltibold/14489082747,https://creativecommons.org/licenses/by/2.0/,Hiltibold +36cbe68e2ecf9425,test,https://open-images-dataset.s3.amazonaws.com/test/36cbe68e2ecf9425.jpg,https://www.flickr.com/photos/amywindsor/6957490587/,https://creativecommons.org/licenses/by/2.0/,Amy Spreitzer Windsor +373697d1ef5c62b3,test,https://open-images-dataset.s3.amazonaws.com/test/373697d1ef5c62b3.jpg,https://www.flickr.com/photos/59834423@N04/6461090925,https://creativecommons.org/licenses/by/2.0/,LivingLandscapeArchitecture +3b30dceda536f012,test,https://open-images-dataset.s3.amazonaws.com/test/3b30dceda536f012.jpg,https://www.flickr.com/photos/neshuma/10153954416,https://creativecommons.org/licenses/by/2.0/,Daviddje +3c2d9e184101279b,test,https://open-images-dataset.s3.amazonaws.com/test/3c2d9e184101279b.jpg,https://www.flickr.com/photos/hughe/6028202379,https://creativecommons.org/licenses/by/2.0/,hughepaul +3c91a03d78f56a78,test,https://open-images-dataset.s3.amazonaws.com/test/3c91a03d78f56a78.jpg,https://www.flickr.com/photos/jlcarmichael/3531158513,https://creativecommons.org/licenses/by/2.0/,John Carmichael +3cc54c27ab7e8e77,test,https://open-images-dataset.s3.amazonaws.com/test/3cc54c27ab7e8e77.jpg,https://www.flickr.com/photos/coben-liao/6111618533,https://creativecommons.org/licenses/by/2.0/,Coben liao +3f06517ff2832d9f,test,https://open-images-dataset.s3.amazonaws.com/test/3f06517ff2832d9f.jpg,https://www.flickr.com/photos/gracewanderer/2832016950,https://creativecommons.org/licenses/by/2.0/,Daniel Crookston +3f3c878a57393259,validation,https://open-images-dataset.s3.amazonaws.com/validation/3f3c878a57393259.jpg,https://www.flickr.com/photos/nickhubbard/4211023709/,https://creativecommons.org/licenses/by/2.0/,Nick Hubbard +404ebd115e027fd2,test,https://open-images-dataset.s3.amazonaws.com/test/404ebd115e027fd2.jpg,https://www.flickr.com/photos/63837784@N08/14703184333,https://creativecommons.org/licenses/by/2.0/,Ohio Redevelopment Projects - ODSA +40e3252f39eee5d3,validation,https://open-images-dataset.s3.amazonaws.com/validation/40e3252f39eee5d3.jpg,https://www.flickr.com/photos/bracken/420989115,https://creativecommons.org/licenses/by/2.0/,John Bracken +4262ed4710f517ef,validation,https://open-images-dataset.s3.amazonaws.com/validation/4262ed4710f517ef.jpg,https://www.flickr.com/photos/jtarrio/7722212860,https://creativecommons.org/licenses/by/2.0/,Jacobo Tarrío +43279ad5d74d5f67,validation,https://open-images-dataset.s3.amazonaws.com/validation/43279ad5d74d5f67.jpg,https://www.flickr.com/photos/ivankovpak/2800412694,https://creativecommons.org/licenses/by/2.0/,Ivan Kovpak +45ed28848e14e7e2,validation,https://open-images-dataset.s3.amazonaws.com/validation/45ed28848e14e7e2.jpg,https://www.flickr.com/photos/schnappi/1412873982,https://creativecommons.org/licenses/by/2.0/,Graham C99 +4663a37552b224c8,test,https://open-images-dataset.s3.amazonaws.com/test/4663a37552b224c8.jpg,https://www.flickr.com/photos/dave_mcmt/10764860326,https://creativecommons.org/licenses/by/2.0/,David Schott +466c489ead2b5076,test,https://open-images-dataset.s3.amazonaws.com/test/466c489ead2b5076.jpg,https://www.flickr.com/photos/cmag/2628890409,https://creativecommons.org/licenses/by/2.0/,spader +4728d08f71017579,test,https://open-images-dataset.s3.amazonaws.com/test/4728d08f71017579.jpg,https://www.flickr.com/photos/robotb/2563322888,https://creativecommons.org/licenses/by/2.0/,Robot B +47f1a72d56b811af,validation,https://open-images-dataset.s3.amazonaws.com/validation/47f1a72d56b811af.jpg,https://www.flickr.com/photos/mattandkim/8013107915,https://creativecommons.org/licenses/by/2.0/,Shever +4c8e739d8542535d,test,https://open-images-dataset.s3.amazonaws.com/test/4c8e739d8542535d.jpg,https://www.flickr.com/photos/wwworks/7433060784,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks +4d0b8bc1ccf799db,test,https://open-images-dataset.s3.amazonaws.com/test/4d0b8bc1ccf799db.jpg,https://www.flickr.com/photos/mrpolyonymous/7632306986,https://creativecommons.org/licenses/by/2.0/,mrpolyonymous +4dab78f1c29c5edb,test,https://open-images-dataset.s3.amazonaws.com/test/4dab78f1c29c5edb.jpg,https://www.flickr.com/photos/bobnrenee/15102480175,https://creativecommons.org/licenses/by/2.0/,Bob n Renee +4e3d5de6e81bc3d3,test,https://open-images-dataset.s3.amazonaws.com/test/4e3d5de6e81bc3d3.jpg,https://www.flickr.com/photos/barrypeters/4674752205,https://creativecommons.org/licenses/by/2.0/,Barry Peters +4e69197e9ff6755e,test,https://open-images-dataset.s3.amazonaws.com/test/4e69197e9ff6755e.jpg,https://www.flickr.com/photos/albrightgarden/9138725861,https://creativecommons.org/licenses/by/2.0/,Albright Garden +5086c8bc2631858a,test,https://open-images-dataset.s3.amazonaws.com/test/5086c8bc2631858a.jpg,https://www.flickr.com/photos/jaymedr/6307507729,https://creativecommons.org/licenses/by/2.0/,Jayme del Rosario +51d47e8d418e8b60,test,https://open-images-dataset.s3.amazonaws.com/test/51d47e8d418e8b60.jpg,https://www.flickr.com/photos/andrewbain/1819490167,https://creativecommons.org/licenses/by/2.0/,Taber Andrew Bain +51ed77c19fe0c482,validation,https://open-images-dataset.s3.amazonaws.com/validation/51ed77c19fe0c482.jpg,https://www.flickr.com/photos/49024304@N00/3935965806,https://creativecommons.org/licenses/by/2.0/,anyjazz65 +523a7e16da172ed3,test,https://open-images-dataset.s3.amazonaws.com/test/523a7e16da172ed3.jpg,https://www.flickr.com/photos/nihgov/20876433969,https://creativecommons.org/licenses/by/2.0/,NIH Image Gallery +523bacb334a7f986,test,https://open-images-dataset.s3.amazonaws.com/test/523bacb334a7f986.jpg,https://www.flickr.com/photos/mjryall/483595409,https://creativecommons.org/licenses/by/2.0/,Matt Ryall +53d8c2a65a3bd02f,test,https://open-images-dataset.s3.amazonaws.com/test/53d8c2a65a3bd02f.jpg,https://www.flickr.com/photos/pagedooley/411058662,https://creativecommons.org/licenses/by/2.0/,Kevin Dooley +547faad424854128,validation,https://open-images-dataset.s3.amazonaws.com/validation/547faad424854128.jpg,https://www.flickr.com/photos/msquirrell/6523179191,https://creativecommons.org/licenses/by/2.0/,Matt Squirrell +552a70c1ff965d19,test,https://open-images-dataset.s3.amazonaws.com/test/552a70c1ff965d19.jpg,https://www.flickr.com/photos/wangjs/178339945,https://creativecommons.org/licenses/by/2.0/,Jiashiang +56cf28a24726bdc0,validation,https://open-images-dataset.s3.amazonaws.com/validation/56cf28a24726bdc0.jpg,https://www.flickr.com/photos/dalehugo/92898481,https://creativecommons.org/licenses/by/2.0/,Dale Leschnitzer +571e87b93aecab33,validation,https://open-images-dataset.s3.amazonaws.com/validation/571e87b93aecab33.jpg,https://www.flickr.com/photos/rjhuttondfw/2849276810,https://creativecommons.org/licenses/by/2.0/,Rodney +57272c481c83d3a2,validation,https://open-images-dataset.s3.amazonaws.com/validation/57272c481c83d3a2.jpg,https://www.flickr.com/photos/jonhurd/3730608628,https://creativecommons.org/licenses/by/2.0/,Jon Hurd +58469930243d0514,test,https://open-images-dataset.s3.amazonaws.com/test/58469930243d0514.jpg,https://www.flickr.com/photos/fridayinla/3119771838,https://creativecommons.org/licenses/by/2.0/,Stephen Friday +58b8894b0151952e,validation,https://open-images-dataset.s3.amazonaws.com/validation/58b8894b0151952e.jpg,https://www.flickr.com/photos/b0jangles/7014520149,https://creativecommons.org/licenses/by/2.0/,b0jangles +58f451b8ee77b512,test,https://open-images-dataset.s3.amazonaws.com/test/58f451b8ee77b512.jpg,https://www.flickr.com/photos/amanderson/2133431250/,https://creativecommons.org/licenses/by/2.0/,amanderson2 +5923c522139e1159,validation,https://open-images-dataset.s3.amazonaws.com/validation/5923c522139e1159.jpg,https://www.flickr.com/photos/gregwest98/3732928361/,https://creativecommons.org/licenses/by/2.0/,gregwest98 +59972bee26ac2e17,test,https://open-images-dataset.s3.amazonaws.com/test/59972bee26ac2e17.jpg,https://www.flickr.com/photos/blackfog/16338512412,https://creativecommons.org/licenses/by/2.0/,Ashish Gupta +5a5445ca5203d82c,test,https://open-images-dataset.s3.amazonaws.com/test/5a5445ca5203d82c.jpg,https://www.flickr.com/photos/sumikaproject/3408342083,https://creativecommons.org/licenses/by/2.0/,japanese_craft_construction +5a912acc5b557645,validation,https://open-images-dataset.s3.amazonaws.com/validation/5a912acc5b557645.jpg,https://www.flickr.com/photos/geowolfe/15834915245,https://creativecommons.org/licenses/by/2.0/,George Wolfe +5b8cabe92a2b398a,test,https://open-images-dataset.s3.amazonaws.com/test/5b8cabe92a2b398a.jpg,https://www.flickr.com/photos/www_ukberri_net/3700405895,https://creativecommons.org/licenses/by/2.0/,UKBERRI.NET Uribe Kosta eta Erandioko agerkari digitala +5c2064b9201c2eda,test,https://open-images-dataset.s3.amazonaws.com/test/5c2064b9201c2eda.jpg,https://www.flickr.com/photos/davebloggs007/9336340139,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page +5cf775420031edb7,test,https://open-images-dataset.s3.amazonaws.com/test/5cf775420031edb7.jpg,https://www.flickr.com/photos/sg2012/8279343380,https://creativecommons.org/licenses/by/2.0/,Steve Glover +5de2564634fe0d1a,test,https://open-images-dataset.s3.amazonaws.com/test/5de2564634fe0d1a.jpg,https://www.flickr.com/photos/mattstabile/14681085246/,https://creativecommons.org/licenses/by/2.0/,Matt Stabile +5de60feeb0346bc6,test,https://open-images-dataset.s3.amazonaws.com/test/5de60feeb0346bc6.jpg,https://www.flickr.com/photos/dahlstroms/16423329001,https://creativecommons.org/licenses/by/2.0/,Håkan Dahlström +5e50b2815fd0b262,test,https://open-images-dataset.s3.amazonaws.com/test/5e50b2815fd0b262.jpg,https://www.flickr.com/photos/lorihowesm/14051367180,https://creativecommons.org/licenses/by/2.0/,Lori Howe +61fe4d72b966141e,validation,https://open-images-dataset.s3.amazonaws.com/validation/61fe4d72b966141e.jpg,https://www.flickr.com/photos/markjhandel/14551356118/,https://creativecommons.org/licenses/by/2.0/,markjhandel +6256ba0011318ab9,test,https://open-images-dataset.s3.amazonaws.com/test/6256ba0011318ab9.jpg,https://www.flickr.com/photos/lakemartinvoice/16258139050,https://creativecommons.org/licenses/by/2.0/,John Coley +63349b9e92aba1c4,validation,https://open-images-dataset.s3.amazonaws.com/validation/63349b9e92aba1c4.jpg,https://www.flickr.com/photos/jfraire/5999197843,https://creativecommons.org/licenses/by/2.0/,julio_f +6596f072b0630db1,test,https://open-images-dataset.s3.amazonaws.com/test/6596f072b0630db1.jpg,https://www.flickr.com/photos/bolshakov/5532393012,https://creativecommons.org/licenses/by/2.0/,Un Bolshakov +66e8154234ab4ea4,test,https://open-images-dataset.s3.amazonaws.com/test/66e8154234ab4ea4.jpg,https://www.flickr.com/photos/davidkarvala/3231208418,https://creativecommons.org/licenses/by/2.0/,David Karvala +678d8f787e832ca3,validation,https://open-images-dataset.s3.amazonaws.com/validation/678d8f787e832ca3.jpg,https://www.flickr.com/photos/lazymonkey/1380420349,https://creativecommons.org/licenses/by/2.0/,Bess Sadler +6852e6363c23c4e3,test,https://open-images-dataset.s3.amazonaws.com/test/6852e6363c23c4e3.jpg,https://www.flickr.com/photos/12573625@N08/15137656778,https://creativecommons.org/licenses/by/2.0/,John Kalucki +68fe85d7fec2500d,test,https://open-images-dataset.s3.amazonaws.com/test/68fe85d7fec2500d.jpg,https://www.flickr.com/photos/homeaidnova/10578020283/,https://creativecommons.org/licenses/by/2.0/,HomeAid Northern Virginia +690b9118e0829de5,test,https://open-images-dataset.s3.amazonaws.com/test/690b9118e0829de5.jpg,https://www.flickr.com/photos/vlsergey/1632053780,https://creativecommons.org/licenses/by/2.0/,Sergey Vladimirov +694bb7362d16738f,test,https://open-images-dataset.s3.amazonaws.com/test/694bb7362d16738f.jpg,https://www.flickr.com/photos/shwirtz/671883126,https://creativecommons.org/licenses/by/2.0/,Jacob Shwirtz +69b2a3bd238c5ff8,test,https://open-images-dataset.s3.amazonaws.com/test/69b2a3bd238c5ff8.jpg,https://www.flickr.com/photos/redmoonsanctuary/10474202864,https://creativecommons.org/licenses/by/2.0/,Brett and Sue Coulstock +6b2ec6fe7140c0cd,test,https://open-images-dataset.s3.amazonaws.com/test/6b2ec6fe7140c0cd.jpg,https://www.flickr.com/photos/vasenka/6923150407,https://creativecommons.org/licenses/by/2.0/,VasenkaPhotography +6bf691e578a37832,test,https://open-images-dataset.s3.amazonaws.com/test/6bf691e578a37832.jpg,https://www.flickr.com/photos/olsenart/14310438096,https://creativecommons.org/licenses/by/2.0/,Lucky Lynda +6c3fc1526f31a7ad,test,https://open-images-dataset.s3.amazonaws.com/test/6c3fc1526f31a7ad.jpg,https://www.flickr.com/photos/futureshape/11057646116,https://creativecommons.org/licenses/by/2.0/,Alexander Baxevanis +6c8b6162e7c4f04c,validation,https://open-images-dataset.s3.amazonaws.com/validation/6c8b6162e7c4f04c.jpg,https://www.flickr.com/photos/pcgb_r2_photos/15103191182,https://creativecommons.org/licenses/by/2.0/,PCGB Region 2 Photos +6d62f5d3568a76e6,test,https://open-images-dataset.s3.amazonaws.com/test/6d62f5d3568a76e6.jpg,https://www.flickr.com/photos/wyzik/340936814,https://creativecommons.org/licenses/by/2.0/,Craig Wyzik +6dd2bc3ce1e2750f,test,https://open-images-dataset.s3.amazonaws.com/test/6dd2bc3ce1e2750f.jpg,https://www.flickr.com/photos/sneakerdog/399232499,https://creativecommons.org/licenses/by/2.0/,sneakerdog +6ddbe788ef2aa7eb,test,https://open-images-dataset.s3.amazonaws.com/test/6ddbe788ef2aa7eb.jpg,https://www.flickr.com/photos/itiro/3644923053,https://creativecommons.org/licenses/by/2.0/,Itiro +6e1f6f0e20e8a01c,test,https://open-images-dataset.s3.amazonaws.com/test/6e1f6f0e20e8a01c.jpg,https://www.flickr.com/photos/agenciabrasilia/20174003855,https://creativecommons.org/licenses/by/2.0/,Agência Brasília +6eab9b589eaa5f25,validation,https://open-images-dataset.s3.amazonaws.com/validation/6eab9b589eaa5f25.jpg,https://www.flickr.com/photos/mike52ad/14399899270,https://creativecommons.org/licenses/by/2.0/,Michael 1952 +6f0e0608c6cbe3e9,test,https://open-images-dataset.s3.amazonaws.com/test/6f0e0608c6cbe3e9.jpg,https://www.flickr.com/photos/dickdotcom/14912027280,https://creativecommons.org/licenses/by/2.0/,Richard Leeming +6fd518b48496cad8,test,https://open-images-dataset.s3.amazonaws.com/test/6fd518b48496cad8.jpg,https://www.flickr.com/photos/thedarkthing/5363574925,https://creativecommons.org/licenses/by/2.0/,William Ross +6fe40a8bf07e3919,test,https://open-images-dataset.s3.amazonaws.com/test/6fe40a8bf07e3919.jpg,https://www.flickr.com/photos/missbenefit/3238563285,https://creativecommons.org/licenses/by/2.0/,emina visnic +71b3bea110ee810c,test,https://open-images-dataset.s3.amazonaws.com/test/71b3bea110ee810c.jpg,https://www.flickr.com/photos/boilermakerjim/4573332662,https://creativecommons.org/licenses/by/2.0/,James Brooks +72e01f702e715951,test,https://open-images-dataset.s3.amazonaws.com/test/72e01f702e715951.jpg,https://www.flickr.com/photos/ssblan/5730251748,https://creativecommons.org/licenses/by/2.0/,Regionbibliotek Stockholm +7426814926355374,test,https://open-images-dataset.s3.amazonaws.com/test/7426814926355374.jpg,https://www.flickr.com/photos/wsa_in_jeddah/6056878430,https://creativecommons.org/licenses/by/2.0/,Project Manager +74de0f1058df22cf,test,https://open-images-dataset.s3.amazonaws.com/test/74de0f1058df22cf.jpg,https://www.flickr.com/photos/abulic_monkey/191798112,https://creativecommons.org/licenses/by/2.0/,Abulic Monkey +75cd38ac81c1df96,test,https://open-images-dataset.s3.amazonaws.com/test/75cd38ac81c1df96.jpg,https://www.flickr.com/photos/alisongor/13536956024,https://creativecommons.org/licenses/by/2.0/,alison_gor +762478c26a4e3375,test,https://open-images-dataset.s3.amazonaws.com/test/762478c26a4e3375.jpg,https://www.flickr.com/photos/14646075@N03/2005770465,https://creativecommons.org/licenses/by/2.0/,digital cat +77b04159b2908717,test,https://open-images-dataset.s3.amazonaws.com/test/77b04159b2908717.jpg,https://www.flickr.com/photos/34480553@N06/20229332102,https://creativecommons.org/licenses/by/2.0/,Wilferd Duckitt +781078d5e691ea3b,test,https://open-images-dataset.s3.amazonaws.com/test/781078d5e691ea3b.jpg,https://www.flickr.com/photos/chrstphre/5783167402,https://creativecommons.org/licenses/by/2.0/,chrstphre ㋛ campbell +78f6be0b4c2490ff,test,https://open-images-dataset.s3.amazonaws.com/test/78f6be0b4c2490ff.jpg,https://www.flickr.com/photos/atgeist/10858923726,https://creativecommons.org/licenses/by/2.0/,TownePost Network +7a274aa7292686b0,test,https://open-images-dataset.s3.amazonaws.com/test/7a274aa7292686b0.jpg,https://www.flickr.com/photos/mrwynd/6170807960,https://creativecommons.org/licenses/by/2.0/,mrwynd +7ac20c760c0aea6a,test,https://open-images-dataset.s3.amazonaws.com/test/7ac20c760c0aea6a.jpg,https://www.flickr.com/photos/90224784@N03/8379112002,https://creativecommons.org/licenses/by/2.0/,fifthandhope +7e15fdfd8b69df09,test,https://open-images-dataset.s3.amazonaws.com/test/7e15fdfd8b69df09.jpg,https://www.flickr.com/photos/mikehamm/4435895460/,https://creativecommons.org/licenses/by/2.0/,Mike Hammerton +7e413f9aa1554a6c,validation,https://open-images-dataset.s3.amazonaws.com/validation/7e413f9aa1554a6c.jpg,https://www.flickr.com/photos/hllewellyn/2384712411,https://creativecommons.org/licenses/by/2.0/,H Dragon +7f04042e3a9aa9dd,test,https://open-images-dataset.s3.amazonaws.com/test/7f04042e3a9aa9dd.jpg,https://www.flickr.com/photos/vastateparksstaff/5114224664,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks +7f4c604e89948d40,validation,https://open-images-dataset.s3.amazonaws.com/validation/7f4c604e89948d40.jpg,https://www.flickr.com/photos/mccready/2875893479,https://creativecommons.org/licenses/by/2.0/,mccready +83e873bba2ba5baa,test,https://open-images-dataset.s3.amazonaws.com/test/83e873bba2ba5baa.jpg,https://www.flickr.com/photos/tiagopadua/8366285060/,https://creativecommons.org/licenses/by/2.0/,Tiago Pádua +84314c1b755e2def,test,https://open-images-dataset.s3.amazonaws.com/test/84314c1b755e2def.jpg,https://www.flickr.com/photos/shht/7644407220,https://creativecommons.org/licenses/by/2.0/,Miquel C. +84b80819b3d9d0bb,test,https://open-images-dataset.s3.amazonaws.com/test/84b80819b3d9d0bb.jpg,https://www.flickr.com/photos/silvercirclemovie/6797955070/,https://creativecommons.org/licenses/by/2.0/,Lineplot Productions +853335d133172986,test,https://open-images-dataset.s3.amazonaws.com/test/853335d133172986.jpg,https://www.flickr.com/photos/sr/30068936,https://creativecommons.org/licenses/by/2.0/,Shagun +854feb7dafe26a4e,test,https://open-images-dataset.s3.amazonaws.com/test/854feb7dafe26a4e.jpg,https://www.flickr.com/photos/bobolink/6944673534,https://creativecommons.org/licenses/by/2.0/,Robert Taylor +8561b18fc1a8fd35,test,https://open-images-dataset.s3.amazonaws.com/test/8561b18fc1a8fd35.jpg,https://www.flickr.com/photos/124857278@N06/15060029658,https://creativecommons.org/licenses/by/2.0/,Francesco Pierantoni +85f5cf4451545d98,validation,https://open-images-dataset.s3.amazonaws.com/validation/85f5cf4451545d98.jpg,https://www.flickr.com/photos/bfishadow/3110276562,https://creativecommons.org/licenses/by/2.0/,bfishadow +86455200264b985a,test,https://open-images-dataset.s3.amazonaws.com/test/86455200264b985a.jpg,https://www.flickr.com/photos/nateone/3246926349,https://creativecommons.org/licenses/by/2.0/,Nate Grigg +866b12ae418aa914,test,https://open-images-dataset.s3.amazonaws.com/test/866b12ae418aa914.jpg,https://www.flickr.com/photos/donotlick/4222061534,https://creativecommons.org/licenses/by/2.0/,Jennifer Morrow +87b1fa47c3ed5a92,validation,https://open-images-dataset.s3.amazonaws.com/validation/87b1fa47c3ed5a92.jpg,https://www.flickr.com/photos/usiruk/6433568817,https://creativecommons.org/licenses/by/2.0/,Christian Schmitt +87f3dd74de6a8087,validation,https://open-images-dataset.s3.amazonaws.com/validation/87f3dd74de6a8087.jpg,https://www.flickr.com/photos/jennifer-juniper/2138573417,https://creativecommons.org/licenses/by/2.0/,Jennifer Rafieyan +882cbfff93e54379,test,https://open-images-dataset.s3.amazonaws.com/test/882cbfff93e54379.jpg,https://www.flickr.com/photos/torybrown/68850674,https://creativecommons.org/licenses/by/2.0/,Tory +89a1cd5c79b0c670,test,https://open-images-dataset.s3.amazonaws.com/test/89a1cd5c79b0c670.jpg,https://www.flickr.com/photos/anakbrunei/6841205065,https://creativecommons.org/licenses/by/2.0/,Reedz Malik +89e78cb41035488a,validation,https://open-images-dataset.s3.amazonaws.com/validation/89e78cb41035488a.jpg,https://www.flickr.com/photos/ivanwalsh/4782978564,https://creativecommons.org/licenses/by/2.0/,IvanWalsh.com +8a01d74cbf72e782,validation,https://open-images-dataset.s3.amazonaws.com/validation/8a01d74cbf72e782.jpg,https://www.flickr.com/photos/clutterbusters/2393478061,https://creativecommons.org/licenses/by/2.0/,Tami Hills +8a5a04c1b336f9a5,test,https://open-images-dataset.s3.amazonaws.com/test/8a5a04c1b336f9a5.jpg,https://www.flickr.com/photos/hagengraf/5169167017/,https://creativecommons.org/licenses/by/2.0/,Christine und Hagen Graf +8d5ad3659915d9d3,test,https://open-images-dataset.s3.amazonaws.com/test/8d5ad3659915d9d3.jpg,https://www.flickr.com/photos/bgreenlee/109980378,https://creativecommons.org/licenses/by/2.0/,Brad Greenlee +90085bf9d38b64a5,test,https://open-images-dataset.s3.amazonaws.com/test/90085bf9d38b64a5.jpg,https://www.flickr.com/photos/jimholmes/4656906875,https://creativecommons.org/licenses/by/2.0/,Jim Holmes +90f71cb8f7aab599,test,https://open-images-dataset.s3.amazonaws.com/test/90f71cb8f7aab599.jpg,https://www.flickr.com/photos/meequalthecurve/7307641336,https://creativecommons.org/licenses/by/2.0/,siska maria eviline +914694b46e993be3,test,https://open-images-dataset.s3.amazonaws.com/test/914694b46e993be3.jpg,https://www.flickr.com/photos/mjryall/1902444250,https://creativecommons.org/licenses/by/2.0/,Matt Ryall +920cad2819e4bb3f,validation,https://open-images-dataset.s3.amazonaws.com/validation/920cad2819e4bb3f.jpg,https://www.flickr.com/photos/arru/6783025563,https://creativecommons.org/licenses/by/2.0/,Arvid Rudling +920cdf2d9f5a8b82,validation,https://open-images-dataset.s3.amazonaws.com/validation/920cdf2d9f5a8b82.jpg,https://www.flickr.com/photos/66558210@N04/8092370930,https://creativecommons.org/licenses/by/2.0/,gmarcos87 +9210ce35abaef2d2,validation,https://open-images-dataset.s3.amazonaws.com/validation/9210ce35abaef2d2.jpg,https://www.flickr.com/photos/kaja_a/5217382812,https://creativecommons.org/licenses/by/2.0/,Kaja Avberšek +9371ec0daae61a97,test,https://open-images-dataset.s3.amazonaws.com/test/9371ec0daae61a97.jpg,https://www.flickr.com/photos/126736692@N05/14811391988,https://creativecommons.org/licenses/by/2.0/,sophia.deluna +93ab0b0e6509f1f3,test,https://open-images-dataset.s3.amazonaws.com/test/93ab0b0e6509f1f3.jpg,https://www.flickr.com/photos/gupfee/14330398245,https://creativecommons.org/licenses/by/2.0/,Marie +940cfed18361805f,test,https://open-images-dataset.s3.amazonaws.com/test/940cfed18361805f.jpg,https://www.flickr.com/photos/84335369@N00/7624014876,https://creativecommons.org/licenses/by/2.0/,trenttsd +9461295b6747aae0,test,https://open-images-dataset.s3.amazonaws.com/test/9461295b6747aae0.jpg,https://www.flickr.com/photos/jeffgunn/6949046986,https://creativecommons.org/licenses/by/2.0/,Jeff Gunn +9499e1e17de38558,test,https://open-images-dataset.s3.amazonaws.com/test/9499e1e17de38558.jpg,https://www.flickr.com/photos/energieagentur-nrw/15418334932,https://creativecommons.org/licenses/by/2.0/,EnergieAgentur.NRW +94d3972541dd8a9b,test,https://open-images-dataset.s3.amazonaws.com/test/94d3972541dd8a9b.jpg,https://www.flickr.com/photos/mualphachi/4703851169,https://creativecommons.org/licenses/by/2.0/,Maxwell Hamilton +9542c109fb24d650,test,https://open-images-dataset.s3.amazonaws.com/test/9542c109fb24d650.jpg,https://www.flickr.com/photos/fguy/2461605280,https://creativecommons.org/licenses/by/2.0/,Taehoon Kang +960ad4269254f3c6,test,https://open-images-dataset.s3.amazonaws.com/test/960ad4269254f3c6.jpg,https://www.flickr.com/photos/superchango/35827967,https://creativecommons.org/licenses/by/2.0/,Maarten +9702bb81bb1bcb65,test,https://open-images-dataset.s3.amazonaws.com/test/9702bb81bb1bcb65.jpg,https://www.flickr.com/photos/keironskillett/2218273355,https://creativecommons.org/licenses/by/2.0/,Keiron +976093cd8c1d21fb,validation,https://open-images-dataset.s3.amazonaws.com/validation/976093cd8c1d21fb.jpg,https://www.flickr.com/photos/22374748@N02/4822973317,https://creativecommons.org/licenses/by/2.0/,Steve Bland +991719e8263357d6,test,https://open-images-dataset.s3.amazonaws.com/test/991719e8263357d6.jpg,https://www.flickr.com/photos/emaringolo/377945677,https://creativecommons.org/licenses/by/2.0/,Esteban Maringolo +992f86f1ffad29e9,test,https://open-images-dataset.s3.amazonaws.com/test/992f86f1ffad29e9.jpg,https://www.flickr.com/photos/antoniotajuelo/14799068474,https://creativecommons.org/licenses/by/2.0/,Antonio Tajuelo +993a68a7bc956b4c,test,https://open-images-dataset.s3.amazonaws.com/test/993a68a7bc956b4c.jpg,https://www.flickr.com/photos/ryu1miwa/5104317657,https://creativecommons.org/licenses/by/2.0/,Ryu1chi Miwa +9971996f732fce6e,validation,https://open-images-dataset.s3.amazonaws.com/validation/9971996f732fce6e.jpg,https://www.flickr.com/photos/kishjar/12617559694,https://creativecommons.org/licenses/by/2.0/,kishjar? +9b5c1eaf3136be52,validation,https://open-images-dataset.s3.amazonaws.com/validation/9b5c1eaf3136be52.jpg,https://www.flickr.com/photos/apium/511425096/,https://creativecommons.org/licenses/by/2.0/,apium +9d26bc145c534576,test,https://open-images-dataset.s3.amazonaws.com/test/9d26bc145c534576.jpg,https://www.flickr.com/photos/spakattacks/263265512,https://creativecommons.org/licenses/by/2.0/,Amanda +9f12d29e419c06d2,test,https://open-images-dataset.s3.amazonaws.com/test/9f12d29e419c06d2.jpg,https://www.flickr.com/photos/jasonsussberg/8064788887,https://creativecommons.org/licenses/by/2.0/,Jason Sussberg +9fc3577679985fb2,test,https://open-images-dataset.s3.amazonaws.com/test/9fc3577679985fb2.jpg,https://www.flickr.com/photos/walkingsf/4762466115,https://creativecommons.org/licenses/by/2.0/,Eric Fischer +a085b7fe40032055,validation,https://open-images-dataset.s3.amazonaws.com/validation/a085b7fe40032055.jpg,https://www.flickr.com/photos/7546038@N03/15670668846,https://creativecommons.org/licenses/by/2.0/,BrianBoardman +a09e31d5dbbbef2c,test,https://open-images-dataset.s3.amazonaws.com/test/a09e31d5dbbbef2c.jpg,https://www.flickr.com/photos/30615966@N00/2063768012,https://creativecommons.org/licenses/by/2.0/,Bill Williams +a1fe76b7a8849269,test,https://open-images-dataset.s3.amazonaws.com/test/a1fe76b7a8849269.jpg,https://www.flickr.com/photos/63837784@N08/5912681464/,https://creativecommons.org/licenses/by/2.0/,Ohio Redevelopment Projects - ODSA +a202156cdcee0cb1,validation,https://open-images-dataset.s3.amazonaws.com/validation/a202156cdcee0cb1.jpg,https://www.flickr.com/photos/rhysasplundh/7187825764,https://creativecommons.org/licenses/by/2.0/,Rhys A. +a23e5cf055323737,validation,https://open-images-dataset.s3.amazonaws.com/validation/a23e5cf055323737.jpg,https://www.flickr.com/photos/fundacionsagradafamilia/5666313684,https://creativecommons.org/licenses/by/2.0/,Vivienda Digna +a317b21951138076,test,https://open-images-dataset.s3.amazonaws.com/test/a317b21951138076.jpg,https://www.flickr.com/photos/kheelcenter/5279888180,https://creativecommons.org/licenses/by/2.0/,Kheel Center +a375700ffce35d96,test,https://open-images-dataset.s3.amazonaws.com/test/a375700ffce35d96.jpg,https://www.flickr.com/photos/64336674@N00/379493541,https://creativecommons.org/licenses/by/2.0/,thomas parisi +a3792682b8a65cff,validation,https://open-images-dataset.s3.amazonaws.com/validation/a3792682b8a65cff.jpg,https://www.flickr.com/photos/wigu/9077650457,https://creativecommons.org/licenses/by/2.0/,Jeffrey Rowland +a41cf6ceaba06015,test,https://open-images-dataset.s3.amazonaws.com/test/a41cf6ceaba06015.jpg,https://www.flickr.com/photos/pascal_subtil/7731926364,https://creativecommons.org/licenses/by/2.0/,Pascal Subtil +a4de19b855aea878,test,https://open-images-dataset.s3.amazonaws.com/test/a4de19b855aea878.jpg,https://www.flickr.com/photos/69091371@N00/4142307636,https://creativecommons.org/licenses/by/2.0/,Heather McCall +a7b63a28fa61d980,test,https://open-images-dataset.s3.amazonaws.com/test/a7b63a28fa61d980.jpg,https://www.flickr.com/photos/eperales/3427384653,https://creativecommons.org/licenses/by/2.0/,eperales +a9f1faac7bfe00d7,test,https://open-images-dataset.s3.amazonaws.com/test/a9f1faac7bfe00d7.jpg,https://www.flickr.com/photos/leateds/4905212841,https://creativecommons.org/licenses/by/2.0/,Sean Lucas +aa66e02d12272bb8,test,https://open-images-dataset.s3.amazonaws.com/test/aa66e02d12272bb8.jpg,https://www.flickr.com/photos/atoach/5916347794,https://creativecommons.org/licenses/by/2.0/,Tim Green +aa78dede5fd22352,validation,https://open-images-dataset.s3.amazonaws.com/validation/aa78dede5fd22352.jpg,https://www.flickr.com/photos/puroticorico/5069485221,https://creativecommons.org/licenses/by/2.0/,Richie Diesterheft +aac42a8ec84cc786,test,https://open-images-dataset.s3.amazonaws.com/test/aac42a8ec84cc786.jpg,https://www.flickr.com/photos/iamagenious/473158184,https://creativecommons.org/licenses/by/2.0/,eric molina +ad2a50d8ef602683,validation,https://open-images-dataset.s3.amazonaws.com/validation/ad2a50d8ef602683.jpg,https://www.flickr.com/photos/aeverett55/6151452462,https://creativecommons.org/licenses/by/2.0/,Andrew Everett +ade4e1fef2a60b24,test,https://open-images-dataset.s3.amazonaws.com/test/ade4e1fef2a60b24.jpg,https://www.flickr.com/photos/29621494@N02/3307289895,https://creativecommons.org/licenses/by/2.0/,Paula Lively +aed59fc1d72f575d,validation,https://open-images-dataset.s3.amazonaws.com/validation/aed59fc1d72f575d.jpg,https://www.flickr.com/photos/9258223@N05/8128535620,https://creativecommons.org/licenses/by/2.0/,John Horton +b09b4fe077be4205,validation,https://open-images-dataset.s3.amazonaws.com/validation/b09b4fe077be4205.jpg,https://www.flickr.com/photos/nmcvirtualworlds/3698232666,https://creativecommons.org/licenses/by/2.0/,NMC Virtual Worlds +b10abf64e88807c7,test,https://open-images-dataset.s3.amazonaws.com/test/b10abf64e88807c7.jpg,https://www.flickr.com/photos/thinkspace/418374968,https://creativecommons.org/licenses/by/2.0/,thinkspace_gallery +b19a0a482fb36565,validation,https://open-images-dataset.s3.amazonaws.com/validation/b19a0a482fb36565.jpg,https://www.flickr.com/photos/cacostello/7329465526,https://creativecommons.org/licenses/by/2.0/,Chris Costello +b22ea9e0dc24dcec,test,https://open-images-dataset.s3.amazonaws.com/test/b22ea9e0dc24dcec.jpg,https://www.flickr.com/photos/geoglauco/2541858434,https://creativecommons.org/licenses/by/2.0/,Glauco Umbelino +b98fc0efa3c55039,test,https://open-images-dataset.s3.amazonaws.com/test/b98fc0efa3c55039.jpg,https://www.flickr.com/photos/aconas/5808061336/,https://creativecommons.org/licenses/by/2.0/,Luc Slosse +b9b006eb63b338dc,test,https://open-images-dataset.s3.amazonaws.com/test/b9b006eb63b338dc.jpg,https://www.flickr.com/photos/gsec/7702039840,https://creativecommons.org/licenses/by/2.0/,The Greater Southwestern Exploration Company +b9b242a2f6a636e8,test,https://open-images-dataset.s3.amazonaws.com/test/b9b242a2f6a636e8.jpg,https://www.flickr.com/photos/tommychheng/16278142081,https://creativecommons.org/licenses/by/2.0/,tommy chheng +ba23e3fa4281230c,test,https://open-images-dataset.s3.amazonaws.com/test/ba23e3fa4281230c.jpg,https://www.flickr.com/photos/erix/2586193547,https://creativecommons.org/licenses/by/2.0/,Erich Ferdinand +ba314c80e2ad7de0,test,https://open-images-dataset.s3.amazonaws.com/test/ba314c80e2ad7de0.jpg,https://www.flickr.com/photos/mark233/6296085204,https://creativecommons.org/licenses/by/2.0/,marksontok +ba60ca89e6b19d6f,validation,https://open-images-dataset.s3.amazonaws.com/validation/ba60ca89e6b19d6f.jpg,https://www.flickr.com/photos/bevgoodwin/10285801423,https://creativecommons.org/licenses/by/2.0/,Beverley Goodwin +bbd2d90fd10036fb,test,https://open-images-dataset.s3.amazonaws.com/test/bbd2d90fd10036fb.jpg,https://www.flickr.com/photos/arg_flickr/9219188081,https://creativecommons.org/licenses/by/2.0/,Andrew +bc0ab4a6991d0155,test,https://open-images-dataset.s3.amazonaws.com/test/bc0ab4a6991d0155.jpg,https://www.flickr.com/photos/xurble/64772026,https://creativecommons.org/licenses/by/2.0/,Gareth Simpson +bd447c418bebef8d,test,https://open-images-dataset.s3.amazonaws.com/test/bd447c418bebef8d.jpg,https://www.flickr.com/photos/tpholland/2287728695,https://creativecommons.org/licenses/by/2.0/,tpholland +bdacab2ade27314c,test,https://open-images-dataset.s3.amazonaws.com/test/bdacab2ade27314c.jpg,https://www.flickr.com/photos/robbie1/2383419375,https://creativecommons.org/licenses/by/2.0/,Robbie Sproule +bdafb066142f05d3,test,https://open-images-dataset.s3.amazonaws.com/test/bdafb066142f05d3.jpg,https://www.flickr.com/photos/seo2/401208973,https://creativecommons.org/licenses/by/2.0/,Cristian Borquez +bf34111353c70c97,test,https://open-images-dataset.s3.amazonaws.com/test/bf34111353c70c97.jpg,https://www.flickr.com/photos/ccordova/3691931549,https://creativecommons.org/licenses/by/2.0/,Christian Córdova +c4312e24a0bff01e,test,https://open-images-dataset.s3.amazonaws.com/test/c4312e24a0bff01e.jpg,https://www.flickr.com/photos/matthewdevalle/5605736109,https://creativecommons.org/licenses/by/2.0/,Matthew Colvin de Valle +c61866ee67153b4f,validation,https://open-images-dataset.s3.amazonaws.com/validation/c61866ee67153b4f.jpg,https://www.flickr.com/photos/viclic/3439959299,https://creativecommons.org/licenses/by/2.0/,Victoria Rachitzky Hoch +c6449c7d5bb2aa48,test,https://open-images-dataset.s3.amazonaws.com/test/c6449c7d5bb2aa48.jpg,https://www.flickr.com/photos/belenko/4237002125,https://creativecommons.org/licenses/by/2.0/,Andrey Belenko +c691b5ce2c260489,test,https://open-images-dataset.s3.amazonaws.com/test/c691b5ce2c260489.jpg,https://www.flickr.com/photos/deidrew/5184066214,https://creativecommons.org/licenses/by/2.0/,Deidre Woollard +c6a3396c6490196e,test,https://open-images-dataset.s3.amazonaws.com/test/c6a3396c6490196e.jpg,https://www.flickr.com/photos/scillystuff/451305830,https://creativecommons.org/licenses/by/2.0/,scillystuff +c8b07d21a569a821,test,https://open-images-dataset.s3.amazonaws.com/test/c8b07d21a569a821.jpg,https://www.flickr.com/photos/jesuitsireland/13128197715,https://creativecommons.org/licenses/by/2.0/,Irish Jesuits +cb7510c996fe31c2,test,https://open-images-dataset.s3.amazonaws.com/test/cb7510c996fe31c2.jpg,https://www.flickr.com/photos/walkn/4811479499,https://creativecommons.org/licenses/by/2.0/,walknboston +cc4160f4a22da444,test,https://open-images-dataset.s3.amazonaws.com/test/cc4160f4a22da444.jpg,https://www.flickr.com/photos/crescibene/2700900289,https://creativecommons.org/licenses/by/2.0/,Tony Crescibene +ccb09651649718e0,test,https://open-images-dataset.s3.amazonaws.com/test/ccb09651649718e0.jpg,https://www.flickr.com/photos/purpleslog/233368571,https://creativecommons.org/licenses/by/2.0/,Purple Slog +ccc3f0bc6500081c,validation,https://open-images-dataset.s3.amazonaws.com/validation/ccc3f0bc6500081c.jpg,https://www.flickr.com/photos/drivingthenortheast/5684016673,https://creativecommons.org/licenses/by/2.0/,DrivingtheNortheast +cd26241c3a751807,validation,https://open-images-dataset.s3.amazonaws.com/validation/cd26241c3a751807.jpg,https://www.flickr.com/photos/dok1/5249157056,https://creativecommons.org/licenses/by/2.0/,Don O'Brien +ce18212ec1854528,validation,https://open-images-dataset.s3.amazonaws.com/validation/ce18212ec1854528.jpg,https://www.flickr.com/photos/acnatta/6186041184,https://creativecommons.org/licenses/by/2.0/,André Natta +ceb47a42c22a7472,test,https://open-images-dataset.s3.amazonaws.com/test/ceb47a42c22a7472.jpg,https://www.flickr.com/photos/designmark/17952236874,https://creativecommons.org/licenses/by/2.0/,Mark Fugarino +d011b1d016ce4622,test,https://open-images-dataset.s3.amazonaws.com/test/d011b1d016ce4622.jpg,https://www.flickr.com/photos/uclmaps/10344922524,https://creativecommons.org/licenses/by/2.0/,UCL Mathematical and Physical Sciences +d019a10af6c301d3,test,https://open-images-dataset.s3.amazonaws.com/test/d019a10af6c301d3.jpg,https://www.flickr.com/photos/36339698@N00/18348654192,https://creativecommons.org/licenses/by/2.0/,kevincellis36109 +d03a9e6293d18e28,validation,https://open-images-dataset.s3.amazonaws.com/validation/d03a9e6293d18e28.jpg,https://www.flickr.com/photos/upsand/3661177741/,https://creativecommons.org/licenses/by/2.0/,Upsilon Andromedae +d050d011ad020af6,test,https://open-images-dataset.s3.amazonaws.com/test/d050d011ad020af6.jpg,https://www.flickr.com/photos/pellesten/4612259080,https://creativecommons.org/licenses/by/2.0/,Pelle Sten +d06c5cfaddce98b7,validation,https://open-images-dataset.s3.amazonaws.com/validation/d06c5cfaddce98b7.jpg,https://www.flickr.com/photos/15812694@N00/2397716975,https://creativecommons.org/licenses/by/2.0/,aubanel +d206e6285e114440,test,https://open-images-dataset.s3.amazonaws.com/test/d206e6285e114440.jpg,https://www.flickr.com/photos/elmas156/3869095649,https://creativecommons.org/licenses/by/2.0/,Eric Coulston +d34e973b530b39e5,test,https://open-images-dataset.s3.amazonaws.com/test/d34e973b530b39e5.jpg,https://www.flickr.com/photos/ilker/349541322,https://creativecommons.org/licenses/by/2.0/,ilkerender +d498ff3de2bb80da,test,https://open-images-dataset.s3.amazonaws.com/test/d498ff3de2bb80da.jpg,https://www.flickr.com/photos/31929761@N06/3584761334,https://creativecommons.org/licenses/by/2.0/,Christine Barrett +d4f5cd8272be78f5,test,https://open-images-dataset.s3.amazonaws.com/test/d4f5cd8272be78f5.jpg,https://www.flickr.com/photos/ambuj/421069653,https://creativecommons.org/licenses/by/2.0/,Ambuj Saxena +d5616e7411a58099,validation,https://open-images-dataset.s3.amazonaws.com/validation/d5616e7411a58099.jpg,https://www.flickr.com/photos/tanj/4337172022,https://creativecommons.org/licenses/by/2.0/,tanjila ahmed +d572d04ee79ced2c,test,https://open-images-dataset.s3.amazonaws.com/test/d572d04ee79ced2c.jpg,https://www.flickr.com/photos/dalbera/6180099425,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalbéra +d6f396023704df30,test,https://open-images-dataset.s3.amazonaws.com/test/d6f396023704df30.jpg,https://www.flickr.com/photos/takeleus/7390193380,https://creativecommons.org/licenses/by/2.0/,takeleus +d754114af3532e5b,validation,https://open-images-dataset.s3.amazonaws.com/validation/d754114af3532e5b.jpg,https://www.flickr.com/photos/colecamplese/9905130435,https://creativecommons.org/licenses/by/2.0/,Cole Camplese +d75fe83e099d28d7,validation,https://open-images-dataset.s3.amazonaws.com/validation/d75fe83e099d28d7.jpg,https://www.flickr.com/photos/barbarabrannon/9261438893,https://creativecommons.org/licenses/by/2.0/,Barbara Brannon +d95939cbd51d8735,test,https://open-images-dataset.s3.amazonaws.com/test/d95939cbd51d8735.jpg,https://www.flickr.com/photos/bengallagher/3084227515,https://creativecommons.org/licenses/by/2.0/,ben.gallagher +d97b19a1a2ea3d33,test,https://open-images-dataset.s3.amazonaws.com/test/d97b19a1a2ea3d33.jpg,https://www.flickr.com/photos/ammichaels/7301831310,https://creativecommons.org/licenses/by/2.0/,cheeseslave +da25ed0c6a979cbf,validation,https://open-images-dataset.s3.amazonaws.com/validation/da25ed0c6a979cbf.jpg,https://www.flickr.com/photos/tenerife/2473977435,https://creativecommons.org/licenses/by/2.0/,secrettenerife.co.uk +daa5d98515e5d123,test,https://open-images-dataset.s3.amazonaws.com/test/daa5d98515e5d123.jpg,https://www.flickr.com/photos/chattingjason/11676383665,https://creativecommons.org/licenses/by/2.0/,Jason Paul Smith +daaa633dcd0c62d0,test,https://open-images-dataset.s3.amazonaws.com/test/daaa633dcd0c62d0.jpg,https://www.flickr.com/photos/mattjiggins/21447794475,https://creativecommons.org/licenses/by/2.0/,Matt Jiggins +dbff1ef31fc99e14,test,https://open-images-dataset.s3.amazonaws.com/test/dbff1ef31fc99e14.jpg,https://www.flickr.com/photos/luxtonnerre/57331251,https://creativecommons.org/licenses/by/2.0/,LuxTonnerre +e03cf18ad37fc277,test,https://open-images-dataset.s3.amazonaws.com/test/e03cf18ad37fc277.jpg,https://www.flickr.com/photos/olibac/5004313091,https://creativecommons.org/licenses/by/2.0/,OliBac +e072db99a571cbec,test,https://open-images-dataset.s3.amazonaws.com/test/e072db99a571cbec.jpg,https://www.flickr.com/photos/andreslimonescruz/16334871917,https://creativecommons.org/licenses/by/2.0/,Andres Limones Cruz +e099e128efc7a614,test,https://open-images-dataset.s3.amazonaws.com/test/e099e128efc7a614.jpg,https://www.flickr.com/photos/acosand/5215089308,https://creativecommons.org/licenses/by/2.0/,andrew_cosand +e0dbaee065ecb839,test,https://open-images-dataset.s3.amazonaws.com/test/e0dbaee065ecb839.jpg,https://www.flickr.com/photos/psd/1772079844,https://creativecommons.org/licenses/by/2.0/,Paul Downey +e1bacba7bc638e87,test,https://open-images-dataset.s3.amazonaws.com/test/e1bacba7bc638e87.jpg,https://www.flickr.com/photos/herzhaftx/14559138526,https://creativecommons.org/licenses/by/2.0/,herzhaftx +e39b0f2a2dee4187,test,https://open-images-dataset.s3.amazonaws.com/test/e39b0f2a2dee4187.jpg,https://www.flickr.com/photos/wengs/13853083,https://creativecommons.org/licenses/by/2.0/,WalkingGeek +e3c44b4feac42875,test,https://open-images-dataset.s3.amazonaws.com/test/e3c44b4feac42875.jpg,https://www.flickr.com/photos/trancemist/5861855200,https://creativecommons.org/licenses/by/2.0/,TranceMist +e3eeed0477eb397b,test,https://open-images-dataset.s3.amazonaws.com/test/e3eeed0477eb397b.jpg,https://www.flickr.com/photos/mikelehen/4513020749,https://creativecommons.org/licenses/by/2.0/,Michael Lehenbauer +e4ad2c63e1f9606c,test,https://open-images-dataset.s3.amazonaws.com/test/e4ad2c63e1f9606c.jpg,https://www.flickr.com/photos/zbellink/15848810242,https://creativecommons.org/licenses/by/2.0/,Alex Bellink +e59502cb17be9554,test,https://open-images-dataset.s3.amazonaws.com/test/e59502cb17be9554.jpg,https://www.flickr.com/photos/superadrianme/8642871736,https://creativecommons.org/licenses/by/2.0/,SUPERADRIANME +e75c980c218966f0,test,https://open-images-dataset.s3.amazonaws.com/test/e75c980c218966f0.jpg,https://www.flickr.com/photos/moochida/148588665,https://creativecommons.org/licenses/by/2.0/,moochida +e82ce6ab1fae5d21,validation,https://open-images-dataset.s3.amazonaws.com/validation/e82ce6ab1fae5d21.jpg,https://www.flickr.com/photos/kcjc/446422588,https://creativecommons.org/licenses/by/2.0/,Kevin Coles +e8a01cc0c97755d0,test,https://open-images-dataset.s3.amazonaws.com/test/e8a01cc0c97755d0.jpg,https://www.flickr.com/photos/ravedelay/2927407351,https://creativecommons.org/licenses/by/2.0/,Kelly DeLay +e98c4cb1c8729404,test,https://open-images-dataset.s3.amazonaws.com/test/e98c4cb1c8729404.jpg,https://www.flickr.com/photos/stefansundkvist/4532008224,https://creativecommons.org/licenses/by/2.0/,Stefan Sundkvist +e99e322eeeb0acb8,test,https://open-images-dataset.s3.amazonaws.com/test/e99e322eeeb0acb8.jpg,https://www.flickr.com/photos/tuba/3474494593,https://creativecommons.org/licenses/by/2.0/,Alex Shultz +e9deda3a93dc6243,test,https://open-images-dataset.s3.amazonaws.com/test/e9deda3a93dc6243.jpg,https://www.flickr.com/photos/125197173@N03/15356045069,https://creativecommons.org/licenses/by/2.0/,Martin Olsen +e9e072cd11c79ed3,test,https://open-images-dataset.s3.amazonaws.com/test/e9e072cd11c79ed3.jpg,https://www.flickr.com/photos/drivingthenortheast/6277351564,https://creativecommons.org/licenses/by/2.0/,DrivingtheNortheast +ea1c9b23ecffa2d2,validation,https://open-images-dataset.s3.amazonaws.com/validation/ea1c9b23ecffa2d2.jpg,https://www.flickr.com/photos/daveynin/14689607959,https://creativecommons.org/licenses/by/2.0/,daveynin +eb416e90140595c3,validation,https://open-images-dataset.s3.amazonaws.com/validation/eb416e90140595c3.jpg,https://www.flickr.com/photos/marktee/5869032545,https://creativecommons.org/licenses/by/2.0/,Mark Turnauckas +eb53e45e68fc298e,test,https://open-images-dataset.s3.amazonaws.com/test/eb53e45e68fc298e.jpg,https://www.flickr.com/photos/dainismatisons/11569682495,https://creativecommons.org/licenses/by/2.0/,Dainis Matisons +ebc3b4eac8d27102,test,https://open-images-dataset.s3.amazonaws.com/test/ebc3b4eac8d27102.jpg,https://www.flickr.com/photos/barbarabrannon/15201620771,https://creativecommons.org/licenses/by/2.0/,Barbara Brannon +ecc5148293fb7014,validation,https://open-images-dataset.s3.amazonaws.com/validation/ecc5148293fb7014.jpg,https://www.flickr.com/photos/87539589@N07/17131303492,https://creativecommons.org/licenses/by/2.0/,CA4dRemix +ecd846be76d8e2ad,test,https://open-images-dataset.s3.amazonaws.com/test/ecd846be76d8e2ad.jpg,https://www.flickr.com/photos/15132846@N00/2497826801,https://creativecommons.org/licenses/by/2.0/,Ray_LAC +ed10f9cf6fe5c83d,validation,https://open-images-dataset.s3.amazonaws.com/validation/ed10f9cf6fe5c83d.jpg,https://www.flickr.com/photos/quakquak/3279683256,https://creativecommons.org/licenses/by/2.0/,Patrick Pekal +eec6d050a12fec7d,validation,https://open-images-dataset.s3.amazonaws.com/validation/eec6d050a12fec7d.jpg,https://www.flickr.com/photos/34517490@N00/5565828590,https://creativecommons.org/licenses/by/2.0/,Nick +f0814a42798b0d2e,test,https://open-images-dataset.s3.amazonaws.com/test/f0814a42798b0d2e.jpg,https://www.flickr.com/photos/mtcgroup/6957764087,https://creativecommons.org/licenses/by/2.0/,MTC Group +f14846118d3e303b,test,https://open-images-dataset.s3.amazonaws.com/test/f14846118d3e303b.jpg,https://www.flickr.com/photos/mikeporesky/4564161872,https://creativecommons.org/licenses/by/2.0/,Mike Poresky +f2445004414177fa,validation,https://open-images-dataset.s3.amazonaws.com/validation/f2445004414177fa.jpg,https://www.flickr.com/photos/alternateparadise/149755293,https://creativecommons.org/licenses/by/2.0/,Jo N +f35cffed948fb1a8,test,https://open-images-dataset.s3.amazonaws.com/test/f35cffed948fb1a8.jpg,https://www.flickr.com/photos/glenng/162899024,https://creativecommons.org/licenses/by/2.0/,Glenn Gutierrez +f3a86bb5c54183ef,test,https://open-images-dataset.s3.amazonaws.com/test/f3a86bb5c54183ef.jpg,https://www.flickr.com/photos/apreche/4047624835,https://creativecommons.org/licenses/by/2.0/,Scott Rubin +f62edd6352757dfc,test,https://open-images-dataset.s3.amazonaws.com/test/f62edd6352757dfc.jpg,https://www.flickr.com/photos/pixel-displays/9121803273,https://creativecommons.org/licenses/by/2.0/,themozhi's pixel displays +f6b18f69ec5b4f5c,validation,https://open-images-dataset.s3.amazonaws.com/validation/f6b18f69ec5b4f5c.jpg,https://www.flickr.com/photos/smemon/4484295067,https://creativecommons.org/licenses/by/2.0/,Sean MacEntee +f6b4421916e69e77,validation,https://open-images-dataset.s3.amazonaws.com/validation/f6b4421916e69e77.jpg,https://www.flickr.com/photos/abarrelfull/3817860340,https://creativecommons.org/licenses/by/2.0/,abarrelfull +f6ef798b789d4878,test,https://open-images-dataset.s3.amazonaws.com/test/f6ef798b789d4878.jpg,https://www.flickr.com/photos/londonmatt/16975909421,https://creativecommons.org/licenses/by/2.0/,Matt Brown +f705e0815c3fa459,test,https://open-images-dataset.s3.amazonaws.com/test/f705e0815c3fa459.jpg,https://www.flickr.com/photos/grongar/5995574264,https://creativecommons.org/licenses/by/2.0/,Rebecca Siegel +f821c50b74ab0fa7,test,https://open-images-dataset.s3.amazonaws.com/test/f821c50b74ab0fa7.jpg,https://www.flickr.com/photos/ajy/9230993769,https://creativecommons.org/licenses/by/2.0/,Alistair Young +f87521aaee29e922,validation,https://open-images-dataset.s3.amazonaws.com/validation/f87521aaee29e922.jpg,https://www.flickr.com/photos/meg-z/8501009564,https://creativecommons.org/licenses/by/2.0/,mazaletel +f883d6916d40be7e,test,https://open-images-dataset.s3.amazonaws.com/test/f883d6916d40be7e.jpg,https://www.flickr.com/photos/seanfreese/6867159493,https://creativecommons.org/licenses/by/2.0/,Sean Freese +f8b4d5b258970b00,test,https://open-images-dataset.s3.amazonaws.com/test/f8b4d5b258970b00.jpg,https://www.flickr.com/photos/trondheim_byarkiv/16235092101,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +f95cc8d6dc6a10ae,test,https://open-images-dataset.s3.amazonaws.com/test/f95cc8d6dc6a10ae.jpg,https://www.flickr.com/photos/38009628@N08/8147744806,https://creativecommons.org/licenses/by/2.0/,curtainsbyjoanne +fa87ed5946c47bb1,validation,https://open-images-dataset.s3.amazonaws.com/validation/fa87ed5946c47bb1.jpg,https://www.flickr.com/photos/52098860@N03/12392888964,https://creativecommons.org/licenses/by/2.0/,Batto0 +fa8d6d40dac333ea,validation,https://open-images-dataset.s3.amazonaws.com/validation/fa8d6d40dac333ea.jpg,https://www.flickr.com/photos/shaneglobal/5725164649,https://creativecommons.org/licenses/by/2.0/,Shane Global +fb890c9bd6c98de9,validation,https://open-images-dataset.s3.amazonaws.com/validation/fb890c9bd6c98de9.jpg,https://www.flickr.com/photos/felipeskroski/4061231031/,https://creativecommons.org/licenses/by/2.0/,Felipe Skroski +fcfbd8e754fea64f,validation,https://open-images-dataset.s3.amazonaws.com/validation/fcfbd8e754fea64f.jpg,https://www.flickr.com/photos/virtualcourtney/3922945112,https://creativecommons.org/licenses/by/2.0/,Courtney Gibbons +fdec645bb24e5fd9,validation,https://open-images-dataset.s3.amazonaws.com/validation/fdec645bb24e5fd9.jpg,https://www.flickr.com/photos/127592731@N07/15644574619,https://creativecommons.org/licenses/by/2.0/,Mauricio Navarrete Contreras +fe7ca35356990449,validation,https://open-images-dataset.s3.amazonaws.com/validation/fe7ca35356990449.jpg,https://www.flickr.com/photos/pinkarman/2428786571,https://creativecommons.org/licenses/by/2.0/,Luca Ribichini +ff9bd9110c1c82c9,test,https://open-images-dataset.s3.amazonaws.com/test/ff9bd9110c1c82c9.jpg,https://www.flickr.com/photos/etiennepouvreau/14541405025,https://creativecommons.org/licenses/by/2.0/,Étienne Pouvreau +ffa90514f4ef3aa2,test,https://open-images-dataset.s3.amazonaws.com/test/ffa90514f4ef3aa2.jpg,https://www.flickr.com/photos/restlessglobetrotter/7485330956,https://creativecommons.org/licenses/by/2.0/,Jason Rogers +ffe5bc91bfb1dc0d,validation,https://open-images-dataset.s3.amazonaws.com/validation/ffe5bc91bfb1dc0d.jpg,https://www.flickr.com/photos/127346564@N08/14874853607,https://creativecommons.org/licenses/by/2.0/,Elite Balustrade +fff23a84a63a1acd,test,https://open-images-dataset.s3.amazonaws.com/test/fff23a84a63a1acd.jpg,https://www.flickr.com/photos/namho/1981022465,https://creativecommons.org/licenses/by/2.0/,Nam-ho Park diff --git a/experiments/autodetect/manifests/oi_train.csv b/experiments/autodetect/manifests/oi_train.csv new file mode 100644 index 000000000..eb7087074 --- /dev/null +++ b/experiments/autodetect/manifests/oi_train.csv @@ -0,0 +1,1341 @@ +image_id,split,source_url,landing_url,license,author +000002b97e5471a0,train,https://open-images-dataset.s3.amazonaws.com/train/000002b97e5471a0.jpg,https://www.flickr.com/photos/juggernautco/15335861457/,https://creativecommons.org/licenses/by/2.0/,Daniel X. O'Neil +0000727e23603def,train,https://open-images-dataset.s3.amazonaws.com/train/0000727e23603def.jpg,https://www.flickr.com/photos/homini/14690132300,https://creativecommons.org/licenses/by/2.0/,Homini:) +000093534b14d3f1,train,https://open-images-dataset.s3.amazonaws.com/train/000093534b14d3f1.jpg,https://www.flickr.com/photos/grassrootsgroundswell/9668887143,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell +00009e5b390986a0,train,https://open-images-dataset.s3.amazonaws.com/train/00009e5b390986a0.jpg,https://www.flickr.com/photos/rictor-and-david/3338003957,https://creativecommons.org/licenses/by/2.0/,Rictor Norton & David Allen +00011109c771d68d,train,https://open-images-dataset.s3.amazonaws.com/train/00011109c771d68d.jpg,https://www.flickr.com/photos/94693506@N00/1470281237,https://creativecommons.org/licenses/by/2.0/,Nina Hale +00014131957fa342,train,https://open-images-dataset.s3.amazonaws.com/train/00014131957fa342.jpg,https://www.flickr.com/photos/36647977@N07/3378081323,https://creativecommons.org/licenses/by/2.0/,www.visitfollo.no +000207320e5ea147,train,https://open-images-dataset.s3.amazonaws.com/train/000207320e5ea147.jpg,https://www.flickr.com/photos/dalbera/15046207329,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalbéra +000284a717e801dd,train,https://open-images-dataset.s3.amazonaws.com/train/000284a717e801dd.jpg,https://www.flickr.com/photos/jeronimo_palacios/9005783445,https://creativecommons.org/licenses/by/2.0/,Jeronimo Palacios +000325b47e09c6aa,train,https://open-images-dataset.s3.amazonaws.com/train/000325b47e09c6aa.jpg,https://www.flickr.com/photos/12394349@N06/11706961713,https://creativecommons.org/licenses/by/2.0/,Bryn Pinzgauer +00035165a711cf2c,train,https://open-images-dataset.s3.amazonaws.com/train/00035165a711cf2c.jpg,https://www.flickr.com/photos/toms/9784003843,https://creativecommons.org/licenses/by/2.0/,Toms Baugis +00035ecd5fa0418e,train,https://open-images-dataset.s3.amazonaws.com/train/00035ecd5fa0418e.jpg,https://www.flickr.com/photos/garyullah/16299449690,https://creativecommons.org/licenses/by/2.0/,Gary Ullah +0004fce1be5620ba,train,https://open-images-dataset.s3.amazonaws.com/train/0004fce1be5620ba.jpg,https://www.flickr.com/photos/picksfromoutthere/15515357870,https://creativecommons.org/licenses/by/2.0/,Picturepest +00056c76aa3dd52a,train,https://open-images-dataset.s3.amazonaws.com/train/00056c76aa3dd52a.jpg,https://www.flickr.com/photos/1000zen/6709772059,https://creativecommons.org/licenses/by/2.0/,1000zen +0005a348c681e8af,train,https://open-images-dataset.s3.amazonaws.com/train/0005a348c681e8af.jpg,https://www.flickr.com/photos/basibanget/2878378094,https://creativecommons.org/licenses/by/2.0/,basibanget +0005bba99e7b35e0,train,https://open-images-dataset.s3.amazonaws.com/train/0005bba99e7b35e0.jpg,https://www.flickr.com/photos/suln/4895042172/,https://creativecommons.org/licenses/by/2.0/,matias rothkopf +0005e76305d19ef6,train,https://open-images-dataset.s3.amazonaws.com/train/0005e76305d19ef6.jpg,https://www.flickr.com/photos/suzanneandsimon/207653949,https://creativecommons.org/licenses/by/2.0/,Simon Davison +000698b6a00772ac,train,https://open-images-dataset.s3.amazonaws.com/train/000698b6a00772ac.jpg,https://www.flickr.com/photos/hickey-fry/20253675755,https://creativecommons.org/licenses/by/2.0/,John Hickey-Fry +00074f5faa995145,train,https://open-images-dataset.s3.amazonaws.com/train/00074f5faa995145.jpg,https://www.flickr.com/photos/kuochuan0426/16270594221,https://creativecommons.org/licenses/by/2.0/,Chris Photography(王權) +0008d3f061bdb62e,train,https://open-images-dataset.s3.amazonaws.com/train/0008d3f061bdb62e.jpg,https://www.flickr.com/photos/striatic/4185024,https://creativecommons.org/licenses/by/2.0/,hobvias sudoneighm +000a033f5e356e88,train,https://open-images-dataset.s3.amazonaws.com/train/000a033f5e356e88.jpg,https://www.flickr.com/photos/quinet/6747416127/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine +000a0b93c3852d73,train,https://open-images-dataset.s3.amazonaws.com/train/000a0b93c3852d73.jpg,https://www.flickr.com/photos/trondheim_byarkiv/8293236947,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +000a55eef2fed455,train,https://open-images-dataset.s3.amazonaws.com/train/000a55eef2fed455.jpg,https://www.flickr.com/photos/nordique/57742346,https://creativecommons.org/licenses/by/2.0/,Peter Stevens +000b260e1f08a32a,train,https://open-images-dataset.s3.amazonaws.com/train/000b260e1f08a32a.jpg,https://www.flickr.com/photos/burge5000/2972368278/,https://creativecommons.org/licenses/by/2.0/,Peter Burgess +000c66e044e850f7,train,https://open-images-dataset.s3.amazonaws.com/train/000c66e044e850f7.jpg,https://www.flickr.com/photos/tboard/2970014939,https://creativecommons.org/licenses/by/2.0/,Teresa Boardman +000ceb7c62a21547,train,https://open-images-dataset.s3.amazonaws.com/train/000ceb7c62a21547.jpg,https://www.flickr.com/photos/vculibraries/6030240802,https://creativecommons.org/licenses/by/2.0/,VCU Libraries +000cf08de329f81b,train,https://open-images-dataset.s3.amazonaws.com/train/000cf08de329f81b.jpg,https://www.flickr.com/photos/rubelroy/8295101970,https://creativecommons.org/licenses/by/2.0/,rubel roy's photography +000d9c77f5749561,train,https://open-images-dataset.s3.amazonaws.com/train/000d9c77f5749561.jpg,https://www.flickr.com/photos/miamism/5575385086,https://creativecommons.org/licenses/by/2.0/,Ines Hegedus-Garcia +000ed3c4d2e19808,train,https://open-images-dataset.s3.amazonaws.com/train/000ed3c4d2e19808.jpg,https://www.flickr.com/photos/antoniseb/16354603569,https://creativecommons.org/licenses/by/2.0/,Jay Cross +000f0ecbb0efd57a,train,https://open-images-dataset.s3.amazonaws.com/train/000f0ecbb0efd57a.jpg,https://www.flickr.com/photos/zeevveez/6172076933,https://creativecommons.org/licenses/by/2.0/,zeevveez +000f2c1e2c9e0355,train,https://open-images-dataset.s3.amazonaws.com/train/000f2c1e2c9e0355.jpg,https://www.flickr.com/photos/trondheim_byarkiv/8719464371,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +000f323bfc539555,train,https://open-images-dataset.s3.amazonaws.com/train/000f323bfc539555.jpg,https://www.flickr.com/photos/28312366@N08/11487510366,https://creativecommons.org/licenses/by/2.0/,Juan Cristobal Zulueta +000f3705dd22926a,train,https://open-images-dataset.s3.amazonaws.com/train/000f3705dd22926a.jpg,https://www.flickr.com/photos/mulad/285325795,https://creativecommons.org/licenses/by/2.0/,Michael Hicks +000fbabdac448186,train,https://open-images-dataset.s3.amazonaws.com/train/000fbabdac448186.jpg,https://www.flickr.com/photos/buscounaplaya/5483048798,https://creativecommons.org/licenses/by/2.0/,pal72 +00103b9719cc1cda,train,https://open-images-dataset.s3.amazonaws.com/train/00103b9719cc1cda.jpg,https://www.flickr.com/photos/trondheim_byarkiv/6940990719,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +0010c235d284c275,train,https://open-images-dataset.s3.amazonaws.com/train/0010c235d284c275.jpg,https://www.flickr.com/photos/computerhotline/4588622642,https://creativecommons.org/licenses/by/2.0/,Thomas Bresson +00124c41b9f406d4,train,https://open-images-dataset.s3.amazonaws.com/train/00124c41b9f406d4.jpg,https://www.flickr.com/photos/104999392@N02/16799355978,https://creativecommons.org/licenses/by/2.0/,Gert Vandermosten +00127d4162b1f6ad,train,https://open-images-dataset.s3.amazonaws.com/train/00127d4162b1f6ad.jpg,https://www.flickr.com/photos/decor8/8717737061,https://creativecommons.org/licenses/by/2.0/,decor8 holly +00135471c798ca9e,train,https://open-images-dataset.s3.amazonaws.com/train/00135471c798ca9e.jpg,https://www.flickr.com/photos/scrittler/9131676018,https://creativecommons.org/licenses/by/2.0/,Steve Rittler +001423b6c1b5b07e,train,https://open-images-dataset.s3.amazonaws.com/train/001423b6c1b5b07e.jpg,https://www.flickr.com/photos/jumendes/14251589633,https://creativecommons.org/licenses/by/2.0/,Juliano Mendes +001471c044462e0e,train,https://open-images-dataset.s3.amazonaws.com/train/001471c044462e0e.jpg,https://www.flickr.com/photos/tahini/4100530993,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +0014aba0c53a60d6,train,https://open-images-dataset.s3.amazonaws.com/train/0014aba0c53a60d6.jpg,https://www.flickr.com/photos/alexander_mueller_photolover/20943843349,https://creativecommons.org/licenses/by/2.0/,Alexander Mueller +0014e3328dd5ca97,train,https://open-images-dataset.s3.amazonaws.com/train/0014e3328dd5ca97.jpg,https://www.flickr.com/photos/boboroshi/6094421572,https://creativecommons.org/licenses/by/2.0/,John Athayde +00150c19e2fd26a9,train,https://open-images-dataset.s3.amazonaws.com/train/00150c19e2fd26a9.jpg,https://www.flickr.com/photos/usdagov/6103581994,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture +00153cbc808f9bf1,train,https://open-images-dataset.s3.amazonaws.com/train/00153cbc808f9bf1.jpg,https://www.flickr.com/photos/vialbost/4647373680,https://creativecommons.org/licenses/by/2.0/,Frédérique Voisin-Demery +0015725e676a5066,train,https://open-images-dataset.s3.amazonaws.com/train/0015725e676a5066.jpg,https://www.flickr.com/photos/tnello/3494052470,https://creativecommons.org/licenses/by/2.0/,Tnello +00159f3e32b674f5,train,https://open-images-dataset.s3.amazonaws.com/train/00159f3e32b674f5.jpg,https://www.flickr.com/photos/joeshlabotnik/2419449133,https://creativecommons.org/licenses/by/2.0/,Joe Shlabotnik +00183a27cc87c75c,train,https://open-images-dataset.s3.amazonaws.com/train/00183a27cc87c75c.jpg,https://www.flickr.com/photos/newtown_grafitti/8235193954,https://creativecommons.org/licenses/by/2.0/,Newtown grafitti +00188136e2e00a9e,train,https://open-images-dataset.s3.amazonaws.com/train/00188136e2e00a9e.jpg,https://www.flickr.com/photos/anne-cathrine_nyberg/3451274388,https://creativecommons.org/licenses/by/2.0/,AnneCN +001a43c3cc7720ea,train,https://open-images-dataset.s3.amazonaws.com/train/001a43c3cc7720ea.jpg,https://www.flickr.com/photos/nyayahealth/6853121375,https://creativecommons.org/licenses/by/2.0/,Possible +001b70a3d1aca039,train,https://open-images-dataset.s3.amazonaws.com/train/001b70a3d1aca039.jpg,https://www.flickr.com/photos/antoniotajuelo/14801439095,https://creativecommons.org/licenses/by/2.0/,Antonio Tajuelo +001b943a9691fcc3,train,https://open-images-dataset.s3.amazonaws.com/train/001b943a9691fcc3.jpg,https://www.flickr.com/photos/topsteph53/14896589408,https://creativecommons.org/licenses/by/2.0/,Stephane Mignon +001e7f585c5f4d5f,train,https://open-images-dataset.s3.amazonaws.com/train/001e7f585c5f4d5f.jpg,https://www.flickr.com/photos/pixellou/15352253386,https://creativecommons.org/licenses/by/2.0/,Lisa Williams +001e8822059c21c5,train,https://open-images-dataset.s3.amazonaws.com/train/001e8822059c21c5.jpg,https://www.flickr.com/photos/snipergirl/5189687916,https://creativecommons.org/licenses/by/2.0/,Snipergirl +001f03b6e19549c6,train,https://open-images-dataset.s3.amazonaws.com/train/001f03b6e19549c6.jpg,https://www.flickr.com/photos/fischler/4151769577,https://creativecommons.org/licenses/by/2.0/,andreas_fischler +0021450a95eb11d4,train,https://open-images-dataset.s3.amazonaws.com/train/0021450a95eb11d4.jpg,https://www.flickr.com/photos/divinenephron/6820220414,https://creativecommons.org/licenses/by/2.0/,Devon Buchanan +00233b10746b565b,train,https://open-images-dataset.s3.amazonaws.com/train/00233b10746b565b.jpg,https://www.flickr.com/photos/adavey/3567549090,https://creativecommons.org/licenses/by/2.0/,A.Davey +00240903981cd456,train,https://open-images-dataset.s3.amazonaws.com/train/00240903981cd456.jpg,https://www.flickr.com/photos/132463933@N05/18946156319,https://creativecommons.org/licenses/by/2.0/,Marianne Southall +0024c6770cc06d83,train,https://open-images-dataset.s3.amazonaws.com/train/0024c6770cc06d83.jpg,https://www.flickr.com/photos/prayitnophotography/5547859423,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (9 millions +) views +0028aefe6ac77c10,train,https://open-images-dataset.s3.amazonaws.com/train/0028aefe6ac77c10.jpg,https://www.flickr.com/photos/vasile23/5924125382,https://creativecommons.org/licenses/by/2.0/,Vasile Cotovanu +002a6ceffbc2f037,train,https://open-images-dataset.s3.amazonaws.com/train/002a6ceffbc2f037.jpg,https://www.flickr.com/photos/trixer/8285927527,https://creativecommons.org/licenses/by/2.0/,Thomas Ricker +002af41256a6439a,train,https://open-images-dataset.s3.amazonaws.com/train/002af41256a6439a.jpg,https://www.flickr.com/photos/web-stark/14913610293,https://creativecommons.org/licenses/by/2.0/,daniel.stark +0030b2710519aced,train,https://open-images-dataset.s3.amazonaws.com/train/0030b2710519aced.jpg,https://www.flickr.com/photos/goldrunt/2483441,https://creativecommons.org/licenses/by/2.0/,Matt +0031e36c54ce9b27,train,https://open-images-dataset.s3.amazonaws.com/train/0031e36c54ce9b27.jpg,https://www.flickr.com/photos/trondheim_byarkiv/3903468010,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +00325488a347937c,train,https://open-images-dataset.s3.amazonaws.com/train/00325488a347937c.jpg,https://www.flickr.com/photos/andreadrago/4808185308,https://creativecommons.org/licenses/by/2.0/,andrea.drago +0032ed4636b7c531,train,https://open-images-dataset.s3.amazonaws.com/train/0032ed4636b7c531.jpg,https://www.flickr.com/photos/wagnertc/3220680268,https://creativecommons.org/licenses/by/2.0/,Wagner T. Cassimiro "Aranha" +00344137a698a7e1,train,https://open-images-dataset.s3.amazonaws.com/train/00344137a698a7e1.jpg,https://www.flickr.com/photos/janitors/8837968916,https://creativecommons.org/licenses/by/2.0/,Kārlis Dambrāns +00384dff06f42731,train,https://open-images-dataset.s3.amazonaws.com/train/00384dff06f42731.jpg,https://www.flickr.com/photos/felipelorente/2805876323,https://creativecommons.org/licenses/by/2.0/,Felipe Lorente +003d894164c61d71,train,https://open-images-dataset.s3.amazonaws.com/train/003d894164c61d71.jpg,https://www.flickr.com/photos/jeffwilcox/15953008251,https://creativecommons.org/licenses/by/2.0/,Jeff Wilcox +00458404c7d46e50,train,https://open-images-dataset.s3.amazonaws.com/train/00458404c7d46e50.jpg,https://www.flickr.com/photos/summonedbyfells/8112641920,https://creativecommons.org/licenses/by/2.0/,summonedbyfells +00486fcf858a10dc,train,https://open-images-dataset.s3.amazonaws.com/train/00486fcf858a10dc.jpg,https://www.flickr.com/photos/plings/7301152078,https://creativecommons.org/licenses/by/2.0/,Plings . +00492cbe644390a8,train,https://open-images-dataset.s3.amazonaws.com/train/00492cbe644390a8.jpg,https://www.flickr.com/photos/jaycross/8055329148,https://creativecommons.org/licenses/by/2.0/,Jay Cross +004a39badfc14cb4,train,https://open-images-dataset.s3.amazonaws.com/train/004a39badfc14cb4.jpg,https://www.flickr.com/photos/bitboy/6962164040,https://creativecommons.org/licenses/by/2.0/,Bit Boy +004d733b210847f8,train,https://open-images-dataset.s3.amazonaws.com/train/004d733b210847f8.jpg,https://www.flickr.com/photos/irishfireside/2265506130,https://creativecommons.org/licenses/by/2.0/,IrishFireside +0051a36a6286d415,train,https://open-images-dataset.s3.amazonaws.com/train/0051a36a6286d415.jpg,https://www.flickr.com/photos/franganillo/13909117593/in/pool-tarragona/,https://creativecommons.org/licenses/by/2.0/,Jorge Franganillo +00580fd8545e2efc,train,https://open-images-dataset.s3.amazonaws.com/train/00580fd8545e2efc.jpg,https://www.flickr.com/photos/knobil/285141949,https://creativecommons.org/licenses/by/2.0/,Mark Knobil +0061bb1f8eaff7e7,train,https://open-images-dataset.s3.amazonaws.com/train/0061bb1f8eaff7e7.jpg,https://www.flickr.com/photos/10925100@N07/14429146369,https://creativecommons.org/licenses/by/2.0/,Gyda Björg Elíasdóttir +0064f8a3ad83c1fe,train,https://open-images-dataset.s3.amazonaws.com/train/0064f8a3ad83c1fe.jpg,https://www.flickr.com/photos/quinet/8018727957,https://creativecommons.org/licenses/by/2.0/,Thomas Quine +006e7fe29dc681d8,train,https://open-images-dataset.s3.amazonaws.com/train/006e7fe29dc681d8.jpg,https://www.flickr.com/photos/drabikpany/10910562155,https://creativecommons.org/licenses/by/2.0/,Piotr Drabik +006e90f8ed54a631,train,https://open-images-dataset.s3.amazonaws.com/train/006e90f8ed54a631.jpg,https://www.flickr.com/photos/tahini/4196310665,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +00700791e4311b13,train,https://open-images-dataset.s3.amazonaws.com/train/00700791e4311b13.jpg,https://www.flickr.com/photos/marktee/5111238914,https://creativecommons.org/licenses/by/2.0/,Mark Turnauckas +00764b8f2610fc0c,train,https://open-images-dataset.s3.amazonaws.com/train/00764b8f2610fc0c.jpg,https://www.flickr.com/photos/paris_kyoto/6935114458,https://creativecommons.org/licenses/by/2.0/,Paris/Kyoto Yamamoto/Muto +007d858e698dd8e1,train,https://open-images-dataset.s3.amazonaws.com/train/007d858e698dd8e1.jpg,https://www.flickr.com/photos/joncallas/5083029388,https://creativecommons.org/licenses/by/2.0/,Jon Callas +007db32023951c75,train,https://open-images-dataset.s3.amazonaws.com/train/007db32023951c75.jpg,https://www.flickr.com/photos/eager/15763515307,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +007ef8920ede61bb,train,https://open-images-dataset.s3.amazonaws.com/train/007ef8920ede61bb.jpg,https://www.flickr.com/photos/mulad/6839915954,https://creativecommons.org/licenses/by/2.0/,Michael Hicks +007f8a90ff16a472,train,https://open-images-dataset.s3.amazonaws.com/train/007f8a90ff16a472.jpg,https://www.flickr.com/photos/brian-fitzgerald/190640074,https://creativecommons.org/licenses/by/2.0/,Brian Fitzgerald +008313077e4119f7,train,https://open-images-dataset.s3.amazonaws.com/train/008313077e4119f7.jpg,https://www.flickr.com/photos/psyberartist/16531524084,https://creativecommons.org/licenses/by/2.0/,psyberartist +0083b79c71a28a7f,train,https://open-images-dataset.s3.amazonaws.com/train/0083b79c71a28a7f.jpg,https://www.flickr.com/photos/morgiana1001/15028463591,https://creativecommons.org/licenses/by/2.0/,Elisabetta Stringhi +008f4aafa5142899,train,https://open-images-dataset.s3.amazonaws.com/train/008f4aafa5142899.jpg,https://www.flickr.com/photos/herry/4429765134,https://creativecommons.org/licenses/by/2.0/,Herry Lawford +009131f133baa3a2,train,https://open-images-dataset.s3.amazonaws.com/train/009131f133baa3a2.jpg,https://www.flickr.com/photos/computerhotline/6123462182,https://creativecommons.org/licenses/by/2.0/,Thomas Bresson +0098207b31dfac6c,train,https://open-images-dataset.s3.amazonaws.com/train/0098207b31dfac6c.jpg,https://www.flickr.com/photos/gonmi/7717542600,https://creativecommons.org/licenses/by/2.0/,Nacho +009bf104c3f0c59c,train,https://open-images-dataset.s3.amazonaws.com/train/009bf104c3f0c59c.jpg,https://www.flickr.com/photos/buterux/14022654344,https://creativecommons.org/licenses/by/2.0/,Wojtek Zając +00a19f412aa290af,train,https://open-images-dataset.s3.amazonaws.com/train/00a19f412aa290af.jpg,https://www.flickr.com/photos/jyri/514500318/,https://creativecommons.org/licenses/by/2.0/,Jyri Engestrom +00b08e610dd83c90,train,https://open-images-dataset.s3.amazonaws.com/train/00b08e610dd83c90.jpg,https://www.flickr.com/photos/kanegen/2114111319,https://creativecommons.org/licenses/by/2.0/,kanegen +00b3368eda0695cc,train,https://open-images-dataset.s3.amazonaws.com/train/00b3368eda0695cc.jpg,https://www.flickr.com/photos/herry/3412096132,https://creativecommons.org/licenses/by/2.0/,Herry Lawford +00b5f99ea812c19a,train,https://open-images-dataset.s3.amazonaws.com/train/00b5f99ea812c19a.jpg,https://www.flickr.com/photos/37553027@N02/5413910470,https://creativecommons.org/licenses/by/2.0/,Lucy Fisher +00db6b59d3880145,train,https://open-images-dataset.s3.amazonaws.com/train/00db6b59d3880145.jpg,https://www.flickr.com/photos/knittingajour/5627891182,https://creativecommons.org/licenses/by/2.0/,Ballee +00dbfb71d81618ea,train,https://open-images-dataset.s3.amazonaws.com/train/00dbfb71d81618ea.jpg,https://www.flickr.com/photos/tahini/7585765310,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +00e744c3b4e7e488,train,https://open-images-dataset.s3.amazonaws.com/train/00e744c3b4e7e488.jpg,https://www.flickr.com/photos/subraytan/6031129232,https://creativecommons.org/licenses/by/2.0/,Andypiper +00e844f581963e31,train,https://open-images-dataset.s3.amazonaws.com/train/00e844f581963e31.jpg,https://www.flickr.com/photos/bachmont/3061661380,https://creativecommons.org/licenses/by/2.0/,bachmont +00ef407e5b2ef618,train,https://open-images-dataset.s3.amazonaws.com/train/00ef407e5b2ef618.jpg,https://www.flickr.com/photos/grassrootsgroundswell/12308149273,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell +00f2a662e6def6b7,train,https://open-images-dataset.s3.amazonaws.com/train/00f2a662e6def6b7.jpg,https://www.flickr.com/photos/amal-fm/8611166928,https://creativecommons.org/licenses/by/2.0/,Amal FM +0102dc6caa2b9bda,train,https://open-images-dataset.s3.amazonaws.com/train/0102dc6caa2b9bda.jpg,https://www.flickr.com/photos/akras/11603989434,https://creativecommons.org/licenses/by/2.0/,Andrey +01036437f28692b3,train,https://open-images-dataset.s3.amazonaws.com/train/01036437f28692b3.jpg,https://www.flickr.com/photos/47283811@N06/7774008376,https://creativecommons.org/licenses/by/2.0/,Cornelia Kopp +0104818b1edbd83f,train,https://open-images-dataset.s3.amazonaws.com/train/0104818b1edbd83f.jpg,https://www.flickr.com/photos/pedrofcuk/21037524310,https://creativecommons.org/licenses/by/2.0/,Pete Griffiths +0113e7bc2bec7127,train,https://open-images-dataset.s3.amazonaws.com/train/0113e7bc2bec7127.jpg,https://www.flickr.com/photos/21524179@N08/2418650471,https://creativecommons.org/licenses/by/2.0/,nerissa's ring +0113ecd2c7328c6e,train,https://open-images-dataset.s3.amazonaws.com/train/0113ecd2c7328c6e.jpg,https://www.flickr.com/photos/psyberartist/8082852878,https://creativecommons.org/licenses/by/2.0/,psyberartist +011b15c7ebba4074,train,https://open-images-dataset.s3.amazonaws.com/train/011b15c7ebba4074.jpg,https://www.flickr.com/photos/mdpettitt/6354820559,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt +0138af1f18e47dda,train,https://open-images-dataset.s3.amazonaws.com/train/0138af1f18e47dda.jpg,https://www.flickr.com/photos/globochem/2566321522,https://creativecommons.org/licenses/by/2.0/,globochem3x1minus1 +013b39d80a003d28,train,https://open-images-dataset.s3.amazonaws.com/train/013b39d80a003d28.jpg,https://www.flickr.com/photos/alismith44/286864476,https://creativecommons.org/licenses/by/2.0/,Ali West +014426eae4f80d4d,train,https://open-images-dataset.s3.amazonaws.com/train/014426eae4f80d4d.jpg,https://www.flickr.com/photos/mauring/4700367427,https://creativecommons.org/licenses/by/2.0/,Tõnu Mauring +0149d52a3851d9c7,train,https://open-images-dataset.s3.amazonaws.com/train/0149d52a3851d9c7.jpg,https://www.flickr.com/photos/laura_vlzqz/19284819060,https://creativecommons.org/licenses/by/2.0/,Laura Velazquez +01502739e3f0810f,train,https://open-images-dataset.s3.amazonaws.com/train/01502739e3f0810f.jpg,https://www.flickr.com/photos/grand_canyon_nps/13205334353,https://creativecommons.org/licenses/by/2.0/,Grand Canyon National Park +015112c36fd52abd,train,https://open-images-dataset.s3.amazonaws.com/train/015112c36fd52abd.jpg,https://www.flickr.com/photos/laurenprofeta/4834106611,https://creativecommons.org/licenses/by/2.0/,Lauren Mitchell +015d2ebbc6db5edc,train,https://open-images-dataset.s3.amazonaws.com/train/015d2ebbc6db5edc.jpg,https://www.flickr.com/photos/cogdog/4728849505,https://creativecommons.org/licenses/by/2.0/,Alan Levine +015ed410c83ab0f7,train,https://open-images-dataset.s3.amazonaws.com/train/015ed410c83ab0f7.jpg,https://www.flickr.com/photos/rberteig/7217929118,https://creativecommons.org/licenses/by/2.0/,RBerteig +01666904af193808,train,https://open-images-dataset.s3.amazonaws.com/train/01666904af193808.jpg,https://www.flickr.com/photos/michaeljohnbutton/17026606430,https://creativecommons.org/licenses/by/2.0/,Michael Button +0178c388046539d6,train,https://open-images-dataset.s3.amazonaws.com/train/0178c388046539d6.jpg,https://www.flickr.com/photos/31038475@N04/4599607427,https://creativecommons.org/licenses/by/2.0/,Pierre Honeyman +017bfe0119931914,train,https://open-images-dataset.s3.amazonaws.com/train/017bfe0119931914.jpg,https://www.flickr.com/photos/eager/16359388806,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +017f9f41f7d80998,train,https://open-images-dataset.s3.amazonaws.com/train/017f9f41f7d80998.jpg,https://www.flickr.com/photos/neosnaps/2763686224,https://creativecommons.org/licenses/by/2.0/,Neosnaps +0184da7c4a8559e4,train,https://open-images-dataset.s3.amazonaws.com/train/0184da7c4a8559e4.jpg,https://www.flickr.com/photos/raaphorst/8747554011,https://creativecommons.org/licenses/by/2.0/,Marco Raaphorst +0187c8e4ecca84f6,train,https://open-images-dataset.s3.amazonaws.com/train/0187c8e4ecca84f6.jpg,https://www.flickr.com/photos/ruthanddave/16034476231,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup +018d11ada92ef4af,train,https://open-images-dataset.s3.amazonaws.com/train/018d11ada92ef4af.jpg,https://www.flickr.com/photos/arcanum75/14634209779,https://creativecommons.org/licenses/by/2.0/,Jan Bommes +018fa0ed7af72419,train,https://open-images-dataset.s3.amazonaws.com/train/018fa0ed7af72419.jpg,https://www.flickr.com/photos/katjato/4115959172,https://creativecommons.org/licenses/by/2.0/,Katja +019a88027a086219,train,https://open-images-dataset.s3.amazonaws.com/train/019a88027a086219.jpg,https://www.flickr.com/photos/fotos_dos_ornelas/516593530,https://creativecommons.org/licenses/by/2.0/,Rui Ornelas +01b7d850f5ee4805,train,https://open-images-dataset.s3.amazonaws.com/train/01b7d850f5ee4805.jpg,https://www.flickr.com/photos/okchomeseller/14000221129,https://creativecommons.org/licenses/by/2.0/,Bill Wilson +01bfcf6ef8f6175d,train,https://open-images-dataset.s3.amazonaws.com/train/01bfcf6ef8f6175d.jpg,https://www.flickr.com/photos/newtown_grafitti/5660303511,https://creativecommons.org/licenses/by/2.0/,Newtown grafitti +01c0386da54c4cac,train,https://open-images-dataset.s3.amazonaws.com/train/01c0386da54c4cac.jpg,https://www.flickr.com/photos/nishanthjois/7076450549,https://creativecommons.org/licenses/by/2.0/,Nishanth Jois +01c711407f5e4fbc,train,https://open-images-dataset.s3.amazonaws.com/train/01c711407f5e4fbc.jpg,https://www.flickr.com/photos/freenerd/6370685283,https://creativecommons.org/licenses/by/2.0/,Freenerd +01ce6f491c2f585c,train,https://open-images-dataset.s3.amazonaws.com/train/01ce6f491c2f585c.jpg,https://www.flickr.com/photos/ianphillips/6173644583,https://creativecommons.org/licenses/by/2.0/,Ian Phillips +01d0f6456c6b881b,train,https://open-images-dataset.s3.amazonaws.com/train/01d0f6456c6b881b.jpg,https://www.flickr.com/photos/perspective/45435173/,https://creativecommons.org/licenses/by/2.0/,Elvert Barnes +01d4886bd4267316,train,https://open-images-dataset.s3.amazonaws.com/train/01d4886bd4267316.jpg,https://www.flickr.com/photos/danramarch/8126322140,https://creativecommons.org/licenses/by/2.0/,Daniel Ramirez +01dd3291ed68d1be,train,https://open-images-dataset.s3.amazonaws.com/train/01dd3291ed68d1be.jpg,https://www.flickr.com/photos/respres/3612242644,https://creativecommons.org/licenses/by/2.0/,Jeff Turner +01defeea815cce11,train,https://open-images-dataset.s3.amazonaws.com/train/01defeea815cce11.jpg,https://www.flickr.com/photos/die_dou/8410113878,https://creativecommons.org/licenses/by/2.0/,2. +01f2fc35673a60ce,train,https://open-images-dataset.s3.amazonaws.com/train/01f2fc35673a60ce.jpg,https://www.flickr.com/photos/lydiashiningbrightly/7912595778,https://creativecommons.org/licenses/by/2.0/,Lydia +01f934a935cd73b2,train,https://open-images-dataset.s3.amazonaws.com/train/01f934a935cd73b2.jpg,https://www.flickr.com/photos/14218320@N02/1447872915,https://creativecommons.org/licenses/by/2.0/,valencia.com.ve +01f9be9824b83aff,train,https://open-images-dataset.s3.amazonaws.com/train/01f9be9824b83aff.jpg,https://www.flickr.com/photos/69747897@N00/550465437/,https://creativecommons.org/licenses/by/2.0/,krysta_karenina +01ff840b96fdf533,train,https://open-images-dataset.s3.amazonaws.com/train/01ff840b96fdf533.jpg,https://www.flickr.com/photos/nostri-imago/2857075904,https://creativecommons.org/licenses/by/2.0/,Cliff +0202ca32972b6f1b,train,https://open-images-dataset.s3.amazonaws.com/train/0202ca32972b6f1b.jpg,https://www.flickr.com/photos/dfey/4665153358,https://creativecommons.org/licenses/by/2.0/,Dave Fey +0205c2e2a0fb9687,train,https://open-images-dataset.s3.amazonaws.com/train/0205c2e2a0fb9687.jpg,https://www.flickr.com/photos/elevzeria/2142499514,https://creativecommons.org/licenses/by/2.0/,Macu Cristófol y Sel +02097eb5fae718bd,train,https://open-images-dataset.s3.amazonaws.com/train/02097eb5fae718bd.jpg,https://www.flickr.com/photos/southbeachcars/9428886144,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar +021532e6f26ae105,train,https://open-images-dataset.s3.amazonaws.com/train/021532e6f26ae105.jpg,https://www.flickr.com/photos/atoach/5387938229,https://creativecommons.org/licenses/by/2.0/,Tim Green +0217c877e41e77f5,train,https://open-images-dataset.s3.amazonaws.com/train/0217c877e41e77f5.jpg,https://www.flickr.com/photos/misskukoljac/9233490340,https://creativecommons.org/licenses/by/2.0/,nevena kukoljac +0218109f5c55eb99,train,https://open-images-dataset.s3.amazonaws.com/train/0218109f5c55eb99.jpg,https://www.flickr.com/photos/srgblog/501267669,https://creativecommons.org/licenses/by/2.0/,srgpicker +02287a58aa65937b,train,https://open-images-dataset.s3.amazonaws.com/train/02287a58aa65937b.jpg,https://www.flickr.com/photos/yamauchibukuro/15011761044,https://creativecommons.org/licenses/by/2.0/,yamauchi +022e6f8281b4bfb0,train,https://open-images-dataset.s3.amazonaws.com/train/022e6f8281b4bfb0.jpg,https://www.flickr.com/photos/southernfoodwaysalliance/12773118245,https://creativecommons.org/licenses/by/2.0/,Southern Foodways Alliance +024083e48a1bdc31,train,https://open-images-dataset.s3.amazonaws.com/train/024083e48a1bdc31.jpg,https://www.flickr.com/photos/sybarite48/10068372363,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet +0248ebedd01e8f18,train,https://open-images-dataset.s3.amazonaws.com/train/0248ebedd01e8f18.jpg,https://www.flickr.com/photos/yourbartender/3069297426,https://creativecommons.org/licenses/by/2.0/,Tomi Knuutila +0250206cc65f0595,train,https://open-images-dataset.s3.amazonaws.com/train/0250206cc65f0595.jpg,https://www.flickr.com/photos/hisgett/7248163846,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett +02569a8d683c89ef,train,https://open-images-dataset.s3.amazonaws.com/train/02569a8d683c89ef.jpg,https://www.flickr.com/photos/keithroper/2534177046,https://creativecommons.org/licenses/by/2.0/,Keith Roper +0275ac773735c11e,train,https://open-images-dataset.s3.amazonaws.com/train/0275ac773735c11e.jpg,https://www.flickr.com/photos/peter2010/16435870773,https://creativecommons.org/licenses/by/2.0/,Peter +027f0d405e43dc43,train,https://open-images-dataset.s3.amazonaws.com/train/027f0d405e43dc43.jpg,https://www.flickr.com/photos/cgpgrey/4889897401,https://creativecommons.org/licenses/by/2.0/,CGP Grey +02878aa117d7ada8,train,https://open-images-dataset.s3.amazonaws.com/train/02878aa117d7ada8.jpg,https://www.flickr.com/photos/aroberts/4827355852,https://creativecommons.org/licenses/by/2.0/,Andy Roberts +02a5a739c08a9f5d,train,https://open-images-dataset.s3.amazonaws.com/train/02a5a739c08a9f5d.jpg,https://www.flickr.com/photos/34517490@N00/4508309659/,https://creativecommons.org/licenses/by/2.0/,Nick +02ac0be40e666e1d,train,https://open-images-dataset.s3.amazonaws.com/train/02ac0be40e666e1d.jpg,https://www.flickr.com/photos/westher/7961126998,https://creativecommons.org/licenses/by/2.0/,Esther Westerveld +02baab53baf7fdca,train,https://open-images-dataset.s3.amazonaws.com/train/02baab53baf7fdca.jpg,https://www.flickr.com/photos/dalbera/1454116064,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalbéra +02bd16406d0dfd58,train,https://open-images-dataset.s3.amazonaws.com/train/02bd16406d0dfd58.jpg,https://www.flickr.com/photos/shoes_on_wires/4179833811,https://creativecommons.org/licenses/by/2.0/,Justus Hayes +02c4a51d6dbf05a4,train,https://open-images-dataset.s3.amazonaws.com/train/02c4a51d6dbf05a4.jpg,https://www.flickr.com/photos/cthulhuwho1/3804661604,https://creativecommons.org/licenses/by/2.0/,Will Hart +02caf38ea96ddbb0,train,https://open-images-dataset.s3.amazonaws.com/train/02caf38ea96ddbb0.jpg,https://www.flickr.com/photos/athomeinscottsdale/3081303456,https://creativecommons.org/licenses/by/2.0/,Dru Bloomfield +02d906b98611de7c,train,https://open-images-dataset.s3.amazonaws.com/train/02d906b98611de7c.jpg,https://www.flickr.com/photos/57412095@N05/5808139300,https://creativecommons.org/licenses/by/2.0/,A Yee +02dab39fea1a092b,train,https://open-images-dataset.s3.amazonaws.com/train/02dab39fea1a092b.jpg,https://www.flickr.com/photos/feserc/5492580941,https://creativecommons.org/licenses/by/2.0/,Chris Feser +02dbae76d89c9284,train,https://open-images-dataset.s3.amazonaws.com/train/02dbae76d89c9284.jpg,https://www.flickr.com/photos/stephenduncanjr/673178819,https://creativecommons.org/licenses/by/2.0/,Stephen Duncan +02deada716250e55,train,https://open-images-dataset.s3.amazonaws.com/train/02deada716250e55.jpg,https://www.flickr.com/photos/nahemoth/16093452230,https://creativecommons.org/licenses/by/2.0/,=Nahemoth= (absent for a while) +02e912fd5d5fa427,train,https://open-images-dataset.s3.amazonaws.com/train/02e912fd5d5fa427.jpg,https://www.flickr.com/photos/brisbanecitycouncil/8185984483,https://creativecommons.org/licenses/by/2.0/,Brisbane City Council +02efa5e743ebbf12,train,https://open-images-dataset.s3.amazonaws.com/train/02efa5e743ebbf12.jpg,https://www.flickr.com/photos/trondheim_byarkiv/13558519674,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +02fd765339dde84f,train,https://open-images-dataset.s3.amazonaws.com/train/02fd765339dde84f.jpg,https://www.flickr.com/photos/brockbuilders/4459796447,https://creativecommons.org/licenses/by/2.0/,Brock Builders +030c34750d1bfcd5,train,https://open-images-dataset.s3.amazonaws.com/train/030c34750d1bfcd5.jpg,https://www.flickr.com/photos/lovinkat/8883457598,https://creativecommons.org/licenses/by/2.0/,lovinkat +0311a9bebafae960,train,https://open-images-dataset.s3.amazonaws.com/train/0311a9bebafae960.jpg,https://www.flickr.com/photos/22711505@N05/8351280058,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell +0327137d0dda5870,train,https://open-images-dataset.s3.amazonaws.com/train/0327137d0dda5870.jpg,https://www.flickr.com/photos/62694216@N05/5712122497,https://creativecommons.org/licenses/by/2.0/,DAVINCI Haus +032fcef9c7c13201,train,https://open-images-dataset.s3.amazonaws.com/train/032fcef9c7c13201.jpg,https://www.flickr.com/photos/linusblanket17/15930955268,https://creativecommons.org/licenses/by/2.0/,Linusblanket17 +033d2c833a342e79,train,https://open-images-dataset.s3.amazonaws.com/train/033d2c833a342e79.jpg,https://www.flickr.com/photos/chezpitch/8731730928,https://creativecommons.org/licenses/by/2.0/,Chez Pitch +0341f2a9d3aa9ada,train,https://open-images-dataset.s3.amazonaws.com/train/0341f2a9d3aa9ada.jpg,https://www.flickr.com/photos/68158920@N08/20109825526,https://creativecommons.org/licenses/by/2.0/,pdjohnson +03531354205075ff,train,https://open-images-dataset.s3.amazonaws.com/train/03531354205075ff.jpg,https://www.flickr.com/photos/nicholassmale/4034788322,https://creativecommons.org/licenses/by/2.0/,Nicholas Smale +036d42c4dc54858e,train,https://open-images-dataset.s3.amazonaws.com/train/036d42c4dc54858e.jpg,https://www.flickr.com/photos/kipsoep/14482009114,https://creativecommons.org/licenses/by/2.0/,Kip Soep +0371253bca655c17,train,https://open-images-dataset.s3.amazonaws.com/train/0371253bca655c17.jpg,https://www.flickr.com/photos/madpai/320035793,https://creativecommons.org/licenses/by/2.0/,Madhav Pai +037833a5f7d57e76,train,https://open-images-dataset.s3.amazonaws.com/train/037833a5f7d57e76.jpg,https://www.flickr.com/photos/asfarley/6265283142,https://creativecommons.org/licenses/by/2.0/,Alexander Farley +03865c983d57bdb0,train,https://open-images-dataset.s3.amazonaws.com/train/03865c983d57bdb0.jpg,https://www.flickr.com/photos/cezzie901/14777663847,https://creativecommons.org/licenses/by/2.0/,cezzie901 +0386c14d2acbe601,train,https://open-images-dataset.s3.amazonaws.com/train/0386c14d2acbe601.jpg,https://www.flickr.com/photos/cogdog/1577634556,https://creativecommons.org/licenses/by/2.0/,Alan Levine +03a3abad4fc6ddd3,train,https://open-images-dataset.s3.amazonaws.com/train/03a3abad4fc6ddd3.jpg,https://www.flickr.com/photos/donaleen/8028328454,https://creativecommons.org/licenses/by/2.0/,Donaleen +03abc08016ca1687,train,https://open-images-dataset.s3.amazonaws.com/train/03abc08016ca1687.jpg,https://www.flickr.com/photos/wonderlane/1449041317,https://creativecommons.org/licenses/by/2.0/,Wonderlane +03ac838cfb848717,train,https://open-images-dataset.s3.amazonaws.com/train/03ac838cfb848717.jpg,https://www.flickr.com/photos/sherwood-real-estate/5946759037,https://creativecommons.org/licenses/by/2.0/,Sherwood CC +03b2e8d0872eab3d,train,https://open-images-dataset.s3.amazonaws.com/train/03b2e8d0872eab3d.jpg,https://www.flickr.com/photos/pandemonium/7629952882,https://creativecommons.org/licenses/by/2.0/,Dominuz +03b4d7758f6a8e35,train,https://open-images-dataset.s3.amazonaws.com/train/03b4d7758f6a8e35.jpg,https://www.flickr.com/photos/rtds/1466548654/,https://creativecommons.org/licenses/by/2.0/,Ruth Temple +03b73759dede7ae2,train,https://open-images-dataset.s3.amazonaws.com/train/03b73759dede7ae2.jpg,https://www.flickr.com/photos/barockschloss/16189269046,https://creativecommons.org/licenses/by/2.0/,barockschloss +03bc9aed9aad4074,train,https://open-images-dataset.s3.amazonaws.com/train/03bc9aed9aad4074.jpg,https://www.flickr.com/photos/rgallant/3868866139,https://creativecommons.org/licenses/by/2.0/,Robyn Gallant +03bdc9baf89c03f7,train,https://open-images-dataset.s3.amazonaws.com/train/03bdc9baf89c03f7.jpg,https://www.flickr.com/photos/samualpedrete/8685579149,https://creativecommons.org/licenses/by/2.0/,Samu +03c25ef35012b773,train,https://open-images-dataset.s3.amazonaws.com/train/03c25ef35012b773.jpg,https://www.flickr.com/photos/zwick-weitzner/470379538,https://creativecommons.org/licenses/by/2.0/,Danny Weitzner +03c53c9b5479d2ce,train,https://open-images-dataset.s3.amazonaws.com/train/03c53c9b5479d2ce.jpg,https://www.flickr.com/photos/crug/3720142220,https://creativecommons.org/licenses/by/2.0/,Chris Ruggles +03d7a8241370ff73,train,https://open-images-dataset.s3.amazonaws.com/train/03d7a8241370ff73.jpg,https://www.flickr.com/photos/prayitnophotography/8687850680,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (9 millions +) views +03de7954d485c7f7,train,https://open-images-dataset.s3.amazonaws.com/train/03de7954d485c7f7.jpg,https://www.flickr.com/photos/cepatri55/5050167539,https://creativecommons.org/licenses/by/2.0/,cepatri55 +03f81b5cab77f56a,train,https://open-images-dataset.s3.amazonaws.com/train/03f81b5cab77f56a.jpg,https://www.flickr.com/photos/tinyfroglet/19292873729,https://creativecommons.org/licenses/by/2.0/,tinyfroglet +040061c8ff1ba169,train,https://open-images-dataset.s3.amazonaws.com/train/040061c8ff1ba169.jpg,https://www.flickr.com/photos/nnova/3451719999,https://creativecommons.org/licenses/by/2.0/,Nicolas Nova +040323f33feec45a,train,https://open-images-dataset.s3.amazonaws.com/train/040323f33feec45a.jpg,https://www.flickr.com/photos/22333230@N08/4590233439/,https://creativecommons.org/licenses/by/2.0/,Brandon Hunt +0403fb6af727cd41,train,https://open-images-dataset.s3.amazonaws.com/train/0403fb6af727cd41.jpg,https://www.flickr.com/photos/mapurbanlinguisticlandscape/14900244013,https://creativecommons.org/licenses/by/2.0/,Map of the Urban Linguistic Landscape +0407efba8b425376,train,https://open-images-dataset.s3.amazonaws.com/train/0407efba8b425376.jpg,https://www.flickr.com/photos/kwarz/11675181183,https://creativecommons.org/licenses/by/2.0/,zeitfaenger.at +040c42e865c6c02c,train,https://open-images-dataset.s3.amazonaws.com/train/040c42e865c6c02c.jpg,https://www.flickr.com/photos/perspective/103366704,https://creativecommons.org/licenses/by/2.0/,Elvert Barnes +040e07027301173e,train,https://open-images-dataset.s3.amazonaws.com/train/040e07027301173e.jpg,https://www.flickr.com/photos/dordrecht-holland/14511303426,https://creativecommons.org/licenses/by/2.0/,Paul van de Velde +04164a264393ed5f,train,https://open-images-dataset.s3.amazonaws.com/train/04164a264393ed5f.jpg,https://www.flickr.com/photos/bradfordcoy/2268682854,https://creativecommons.org/licenses/by/2.0/,Brad Coy +0419e03d17fe7fcc,train,https://open-images-dataset.s3.amazonaws.com/train/0419e03d17fe7fcc.jpg,https://www.flickr.com/photos/unloveable/121339433,https://creativecommons.org/licenses/by/2.0/,Steve Berry +041ea14f4e8eff69,train,https://open-images-dataset.s3.amazonaws.com/train/041ea14f4e8eff69.jpg,https://www.flickr.com/photos/tahini/15500251313,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +0421ffb274153890,train,https://open-images-dataset.s3.amazonaws.com/train/0421ffb274153890.jpg,https://www.flickr.com/photos/faceme/3349955646,https://creativecommons.org/licenses/by/2.0/,FaceMePLS +0425befee2aa8da2,train,https://open-images-dataset.s3.amazonaws.com/train/0425befee2aa8da2.jpg,https://www.flickr.com/photos/nachoeuropa/5149994646,https://creativecommons.org/licenses/by/2.0/,Colores Mari +043186ed28e2ea8f,train,https://open-images-dataset.s3.amazonaws.com/train/043186ed28e2ea8f.jpg,https://www.flickr.com/photos/nyayahealth/6853089117,https://creativecommons.org/licenses/by/2.0/,Possible +043962236abf68b6,train,https://open-images-dataset.s3.amazonaws.com/train/043962236abf68b6.jpg,https://www.flickr.com/photos/stradablog/15178813342,https://creativecommons.org/licenses/by/2.0/,Tino Rossini +043a58c2fbe612d8,train,https://open-images-dataset.s3.amazonaws.com/train/043a58c2fbe612d8.jpg,https://www.flickr.com/photos/50826080@N00/15166758690,https://creativecommons.org/licenses/by/2.0/,Stephen Bowler +043ef8806ccf545d,train,https://open-images-dataset.s3.amazonaws.com/train/043ef8806ccf545d.jpg,https://www.flickr.com/photos/barrydahl/525454902,https://creativecommons.org/licenses/by/2.0/,Barry Dahl +0440e4e93e1d4dc2,train,https://open-images-dataset.s3.amazonaws.com/train/0440e4e93e1d4dc2.jpg,https://www.flickr.com/photos/calliope/3316878023,https://creativecommons.org/licenses/by/2.0/,liz west +0440eeca750f38a4,train,https://open-images-dataset.s3.amazonaws.com/train/0440eeca750f38a4.jpg,https://www.flickr.com/photos/eager/14927620523/,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +04517e8477da9c3d,train,https://open-images-dataset.s3.amazonaws.com/train/04517e8477da9c3d.jpg,https://www.flickr.com/photos/xkristinax/8897655708,https://creativecommons.org/licenses/by/2.0/,Kristina Servant +045681abbdef0404,train,https://open-images-dataset.s3.amazonaws.com/train/045681abbdef0404.jpg,https://www.flickr.com/photos/wengs/13853194,https://creativecommons.org/licenses/by/2.0/,WalkingGeek +0459dfe7fcb79b8a,train,https://open-images-dataset.s3.amazonaws.com/train/0459dfe7fcb79b8a.jpg,https://www.flickr.com/photos/twosevenoneonenineeightthreesevenatenzerosix/7960255830,https://creativecommons.org/licenses/by/2.0/,Adam Foster +04647c4be65bfe08,train,https://open-images-dataset.s3.amazonaws.com/train/04647c4be65bfe08.jpg,https://www.flickr.com/photos/upsticksngo/20546876756,https://creativecommons.org/licenses/by/2.0/,UpSticksNGo Crew +046a5651b0e4c38a,train,https://open-images-dataset.s3.amazonaws.com/train/046a5651b0e4c38a.jpg,https://www.flickr.com/photos/sherwood-real-estate/7178593924,https://creativecommons.org/licenses/by/2.0/,Sherwood CC +048ab2ce00712820,train,https://open-images-dataset.s3.amazonaws.com/train/048ab2ce00712820.jpg,https://www.flickr.com/photos/daverugby83/4390779288,https://creativecommons.org/licenses/by/2.0/,Davidlohr Bueso +049064bd13aa0291,train,https://open-images-dataset.s3.amazonaws.com/train/049064bd13aa0291.jpg,https://www.flickr.com/photos/34517490@N00/4212130902/,https://creativecommons.org/licenses/by/2.0/,Nick +049185e1f8741a95,train,https://open-images-dataset.s3.amazonaws.com/train/049185e1f8741a95.jpg,https://www.flickr.com/photos/derekskey/9536464325,https://creativecommons.org/licenses/by/2.0/,Derek Key +04a0801fe476c128,train,https://open-images-dataset.s3.amazonaws.com/train/04a0801fe476c128.jpg,https://www.flickr.com/photos/cmichel67/55086551,https://creativecommons.org/licenses/by/2.0/,Christopher Michel +04a547c47aef73ea,train,https://open-images-dataset.s3.amazonaws.com/train/04a547c47aef73ea.jpg,https://www.flickr.com/photos/marcin_libera/9928620994,https://creativecommons.org/licenses/by/2.0/,Marcin Libera +04ad720a8944aa08,train,https://open-images-dataset.s3.amazonaws.com/train/04ad720a8944aa08.jpg,https://www.flickr.com/photos/rejohnston/22066535903,https://creativecommons.org/licenses/by/2.0/,Ruth Johnston +04aee5d2b46b4041,train,https://open-images-dataset.s3.amazonaws.com/train/04aee5d2b46b4041.jpg,https://www.flickr.com/photos/wolfrage/6299391592,https://creativecommons.org/licenses/by/2.0/,Wolfrage +04afc9ace5b5be71,train,https://open-images-dataset.s3.amazonaws.com/train/04afc9ace5b5be71.jpg,https://www.flickr.com/photos/atbaker/4800024745,https://creativecommons.org/licenses/by/2.0/,Adam Baker +04dc4665ce1224a2,train,https://open-images-dataset.s3.amazonaws.com/train/04dc4665ce1224a2.jpg,https://www.flickr.com/photos/enixii/6782321721,https://creativecommons.org/licenses/by/2.0/,chia ying Yang +04ebfd657c2d2d6f,train,https://open-images-dataset.s3.amazonaws.com/train/04ebfd657c2d2d6f.jpg,https://www.flickr.com/photos/eager/15929867308,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +04efa214bd8b3762,train,https://open-images-dataset.s3.amazonaws.com/train/04efa214bd8b3762.jpg,https://www.flickr.com/photos/nahemoth/14334005662,https://creativecommons.org/licenses/by/2.0/,=Nahemoth= (absent for a while) +04f3b073e9128935,train,https://open-images-dataset.s3.amazonaws.com/train/04f3b073e9128935.jpg,https://www.flickr.com/photos/53497385@N07/14695825625,https://creativecommons.org/licenses/by/2.0/,wrightbrosfan +05117f4a4d24f6e7,train,https://open-images-dataset.s3.amazonaws.com/train/05117f4a4d24f6e7.jpg,https://www.flickr.com/photos/brosner/10179302,https://creativecommons.org/licenses/by/2.0/,Brian Rosner +0512bebbd50a670c,train,https://open-images-dataset.s3.amazonaws.com/train/0512bebbd50a670c.jpg,https://www.flickr.com/photos/barbarabrannon/16749655614,https://creativecommons.org/licenses/by/2.0/,Barbara Brannon +0512cd3344786e25,train,https://open-images-dataset.s3.amazonaws.com/train/0512cd3344786e25.jpg,https://www.flickr.com/photos/copa41/100868345,https://creativecommons.org/licenses/by/2.0/,Melissa +052b72332d8b337c,train,https://open-images-dataset.s3.amazonaws.com/train/052b72332d8b337c.jpg,https://www.flickr.com/photos/merec0/4815093632,https://creativecommons.org/licenses/by/2.0/,merec0 +053385aa7b9b5a6a,train,https://open-images-dataset.s3.amazonaws.com/train/053385aa7b9b5a6a.jpg,https://www.flickr.com/photos/ryannagelmann/10254891366,https://creativecommons.org/licenses/by/2.0/,Ryan Nagelmann +0538a7fffecdce33,train,https://open-images-dataset.s3.amazonaws.com/train/0538a7fffecdce33.jpg,https://www.flickr.com/photos/coachdanny/8509944969,https://creativecommons.org/licenses/by/2.0/,Danny Thompson +0538df8a1d27830e,train,https://open-images-dataset.s3.amazonaws.com/train/0538df8a1d27830e.jpg,https://www.flickr.com/photos/adavey/2755270720,https://creativecommons.org/licenses/by/2.0/,A.Davey +053a4d5f6d8a7cd7,train,https://open-images-dataset.s3.amazonaws.com/train/053a4d5f6d8a7cd7.jpg,https://www.flickr.com/photos/gerryscappaticci/4777415547/,https://creativecommons.org/licenses/by/2.0/,gerry.scappaticci +05471e52c8c41290,train,https://open-images-dataset.s3.amazonaws.com/train/05471e52c8c41290.jpg,https://www.flickr.com/photos/gonmi/8709843871,https://creativecommons.org/licenses/by/2.0/,Nacho +0547f47f80556296,train,https://open-images-dataset.s3.amazonaws.com/train/0547f47f80556296.jpg,https://www.flickr.com/photos/cote/4377566258,https://creativecommons.org/licenses/by/2.0/,Michael Coté +054c00e637d42377,train,https://open-images-dataset.s3.amazonaws.com/train/054c00e637d42377.jpg,https://www.flickr.com/photos/renatodpaula/15440615725,https://creativecommons.org/licenses/by/2.0/,Renato dPaula +054edb5b26817b36,train,https://open-images-dataset.s3.amazonaws.com/train/054edb5b26817b36.jpg,https://www.flickr.com/photos/psyberartist/8058175400,https://creativecommons.org/licenses/by/2.0/,psyberartist +05556500074ef0fd,train,https://open-images-dataset.s3.amazonaws.com/train/05556500074ef0fd.jpg,https://www.flickr.com/photos/athomeinscottsdale/5758354488,https://creativecommons.org/licenses/by/2.0/,Dru Bloomfield +055e1b0257f06f7d,train,https://open-images-dataset.s3.amazonaws.com/train/055e1b0257f06f7d.jpg,https://www.flickr.com/photos/luke-photography/7764235090,https://creativecommons.org/licenses/by/2.0/,Luke Lawreszuk +055ee4e3b563c5b1,train,https://open-images-dataset.s3.amazonaws.com/train/055ee4e3b563c5b1.jpg,https://www.flickr.com/photos/43436168@N00/6731117299,https://creativecommons.org/licenses/by/2.0/,Duane Burdick +05663cb78bd60669,train,https://open-images-dataset.s3.amazonaws.com/train/05663cb78bd60669.jpg,https://www.flickr.com/photos/alantrotter/10303976716,https://creativecommons.org/licenses/by/2.0/,Alan Trotter +057e88b48f940389,train,https://open-images-dataset.s3.amazonaws.com/train/057e88b48f940389.jpg,https://www.flickr.com/photos/ella_nicholson/4582374948,https://creativecommons.org/licenses/by/2.0/,ella_nicholson +058da0e936c23400,train,https://open-images-dataset.s3.amazonaws.com/train/058da0e936c23400.jpg,https://www.flickr.com/photos/consumerist/525216379,https://creativecommons.org/licenses/by/2.0/,Consumerist Dot Com +05936865e50968e6,train,https://open-images-dataset.s3.amazonaws.com/train/05936865e50968e6.jpg,https://www.flickr.com/photos/munir/15014490390,https://creativecommons.org/licenses/by/2.0/,Munir Squires +059a0e923e665f68,train,https://open-images-dataset.s3.amazonaws.com/train/059a0e923e665f68.jpg,https://www.flickr.com/photos/fimbrethil/37429378/,https://creativecommons.org/licenses/by/2.0/,Fimb +059c89e02f886edc,train,https://open-images-dataset.s3.amazonaws.com/train/059c89e02f886edc.jpg,https://www.flickr.com/photos/muanjai/2292902301,https://creativecommons.org/licenses/by/2.0/,chaiyawat p +05a46b228c3eb20b,train,https://open-images-dataset.s3.amazonaws.com/train/05a46b228c3eb20b.jpg,https://www.flickr.com/photos/imamon/2665408420,https://creativecommons.org/licenses/by/2.0/,Imamon +05a8e5f10e342e42,train,https://open-images-dataset.s3.amazonaws.com/train/05a8e5f10e342e42.jpg,https://www.flickr.com/photos/herry/5002636516,https://creativecommons.org/licenses/by/2.0/,Herry Lawford +05b1d9053fb49037,train,https://open-images-dataset.s3.amazonaws.com/train/05b1d9053fb49037.jpg,https://www.flickr.com/photos/pocius/5520678802,https://creativecommons.org/licenses/by/2.0/,Bryan Pocius +05b9dab116351ea2,train,https://open-images-dataset.s3.amazonaws.com/train/05b9dab116351ea2.jpg,https://www.flickr.com/photos/geishaboy500/104351063,https://creativecommons.org/licenses/by/2.0/,THOR +05ba7effad2cc234,train,https://open-images-dataset.s3.amazonaws.com/train/05ba7effad2cc234.jpg,https://www.flickr.com/photos/miguelvieira/6746349611,https://creativecommons.org/licenses/by/2.0/,Miguel Vieira +05c1919f6e367652,train,https://open-images-dataset.s3.amazonaws.com/train/05c1919f6e367652.jpg,https://www.flickr.com/photos/kamshots/251316398,https://creativecommons.org/licenses/by/2.0/,Kamyar Adl +05c4519d1bdf8c4a,train,https://open-images-dataset.s3.amazonaws.com/train/05c4519d1bdf8c4a.jpg,https://www.flickr.com/photos/luigi_and_linda/1688056009,https://creativecommons.org/licenses/by/2.0/,Luigi Guarino +05e512966bfe30ec,train,https://open-images-dataset.s3.amazonaws.com/train/05e512966bfe30ec.jpg,https://www.flickr.com/photos/lorakutty/3932567344,https://creativecommons.org/licenses/by/2.0/,Lora Rajah +05e64ee1d3e2210d,train,https://open-images-dataset.s3.amazonaws.com/train/05e64ee1d3e2210d.jpg,https://www.flickr.com/photos/mapurbanlinguisticlandscape/14001521720,https://creativecommons.org/licenses/by/2.0/,Map of the Urban Linguistic Landscape +05e9ff43baebee82,train,https://open-images-dataset.s3.amazonaws.com/train/05e9ff43baebee82.jpg,https://www.flickr.com/photos/tpholland/2287579713,https://creativecommons.org/licenses/by/2.0/,tpholland +05ea4fba5155c35c,train,https://open-images-dataset.s3.amazonaws.com/train/05ea4fba5155c35c.jpg,https://www.flickr.com/photos/pasa/7484545240,https://creativecommons.org/licenses/by/2.0/,Paul Sableman +06098b1f732b18fa,train,https://open-images-dataset.s3.amazonaws.com/train/06098b1f732b18fa.jpg,https://www.flickr.com/photos/46748110@N02/6457264453,https://creativecommons.org/licenses/by/2.0/,Danny Armstrong +062c692434673a62,train,https://open-images-dataset.s3.amazonaws.com/train/062c692434673a62.jpg,https://www.flickr.com/photos/integer_club/5579660985,https://creativecommons.org/licenses/by/2.0/,The Integer Club +0632558dc8081772,train,https://open-images-dataset.s3.amazonaws.com/train/0632558dc8081772.jpg,https://www.flickr.com/photos/aslakr/1935302594,https://creativecommons.org/licenses/by/2.0/,Aslak Raanes +0642c8d85492b4e0,train,https://open-images-dataset.s3.amazonaws.com/train/0642c8d85492b4e0.jpg,https://www.flickr.com/photos/betsyweber/3906043614,https://creativecommons.org/licenses/by/2.0/,Betsy Weber +06497030a88a9db7,train,https://open-images-dataset.s3.amazonaws.com/train/06497030a88a9db7.jpg,https://www.flickr.com/photos/glorycycles/9301283256,https://creativecommons.org/licenses/by/2.0/,Glory Cycles +064ef730003cfab2,train,https://open-images-dataset.s3.amazonaws.com/train/064ef730003cfab2.jpg,https://www.flickr.com/photos/mckaysavage/6570430441,https://creativecommons.org/licenses/by/2.0/,McKay Savage +066933d3d553297c,train,https://open-images-dataset.s3.amazonaws.com/train/066933d3d553297c.jpg,https://www.flickr.com/photos/hisgett/6214079309,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett +0687d512e9a7aef3,train,https://open-images-dataset.s3.amazonaws.com/train/0687d512e9a7aef3.jpg,https://www.flickr.com/photos/70118259@N00/4435788447,https://creativecommons.org/licenses/by/2.0/,Jeffrey Bary +068d413046bd562d,train,https://open-images-dataset.s3.amazonaws.com/train/068d413046bd562d.jpg,https://www.flickr.com/photos/eric_brechemier/3301744548,https://creativecommons.org/licenses/by/2.0/,Eric Bréchemier +06973caebc990ce0,train,https://open-images-dataset.s3.amazonaws.com/train/06973caebc990ce0.jpg,https://www.flickr.com/photos/sinordendeuso/8001218844/,https://creativecommons.org/licenses/by/2.0/,sin orden de uso +069a16026821d074,train,https://open-images-dataset.s3.amazonaws.com/train/069a16026821d074.jpg,https://www.flickr.com/photos/tofslie/27698906,https://creativecommons.org/licenses/by/2.0/,Edwin & Kelly Tofslie +06a7775733d1452e,train,https://open-images-dataset.s3.amazonaws.com/train/06a7775733d1452e.jpg,https://www.flickr.com/photos/summonedbyfells/6074405484,https://creativecommons.org/licenses/by/2.0/,summonedbyfells +06a82727f1467e8a,train,https://open-images-dataset.s3.amazonaws.com/train/06a82727f1467e8a.jpg,https://www.flickr.com/photos/pixelchecker/10040998065,https://creativecommons.org/licenses/by/2.0/,pixelchecker +06bca63a733fa625,train,https://open-images-dataset.s3.amazonaws.com/train/06bca63a733fa625.jpg,https://www.flickr.com/photos/nicksie2008/8692316609,https://creativecommons.org/licenses/by/2.0/,Nick Page +06e11d2f8dae6b38,train,https://open-images-dataset.s3.amazonaws.com/train/06e11d2f8dae6b38.jpg,https://www.flickr.com/photos/jonicdao/15234826447/,https://creativecommons.org/licenses/by/2.0/,jojo nicdao +06e25b6dc4f6a241,train,https://open-images-dataset.s3.amazonaws.com/train/06e25b6dc4f6a241.jpg,https://www.flickr.com/photos/91807507@N03/9889043334,https://creativecommons.org/licenses/by/2.0/,GPS 56 +06e7dbc7bbafb163,train,https://open-images-dataset.s3.amazonaws.com/train/06e7dbc7bbafb163.jpg,https://www.flickr.com/photos/seniju/15560093866,https://creativecommons.org/licenses/by/2.0/,Seniju +06e98c0ecc083ba0,train,https://open-images-dataset.s3.amazonaws.com/train/06e98c0ecc083ba0.jpg,https://www.flickr.com/photos/isengardt/7087393855,https://creativecommons.org/licenses/by/2.0/,Isengardt +06fc42b521f34aca,train,https://open-images-dataset.s3.amazonaws.com/train/06fc42b521f34aca.jpg,https://www.flickr.com/photos/wheatfields/4251945466,https://creativecommons.org/licenses/by/2.0/,allispossible.org.uk +07071fce2c492370,train,https://open-images-dataset.s3.amazonaws.com/train/07071fce2c492370.jpg,https://www.flickr.com/photos/mymetrostop/2787051591,https://creativecommons.org/licenses/by/2.0/,Metro Max +070c9e722ca47eb4,train,https://open-images-dataset.s3.amazonaws.com/train/070c9e722ca47eb4.jpg,https://www.flickr.com/photos/tinto/14788228173,https://creativecommons.org/licenses/by/2.0/,Jörg Schubert +071a917cd7016940,train,https://open-images-dataset.s3.amazonaws.com/train/071a917cd7016940.jpg,https://www.flickr.com/photos/japharl/17158483598,https://creativecommons.org/licenses/by/2.0/,japharl +0743db279af1f579,train,https://open-images-dataset.s3.amazonaws.com/train/0743db279af1f579.jpg,https://www.flickr.com/photos/tahini/14211867132,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +0749f763ea561bb8,train,https://open-images-dataset.s3.amazonaws.com/train/0749f763ea561bb8.jpg,https://www.flickr.com/photos/92682792@N00/211293524,https://creativecommons.org/licenses/by/2.0/,gravitat-OFF +074ebd6f634fb0c7,train,https://open-images-dataset.s3.amazonaws.com/train/074ebd6f634fb0c7.jpg,https://www.flickr.com/photos/freecat/1141118064,https://creativecommons.org/licenses/by/2.0/,José Antonio Gil Martínez +074ef83fa2a544b2,train,https://open-images-dataset.s3.amazonaws.com/train/074ef83fa2a544b2.jpg,https://www.flickr.com/photos/walkingsf/2775319055,https://creativecommons.org/licenses/by/2.0/,Eric Fischer +074f24c2d1b80e9e,train,https://open-images-dataset.s3.amazonaws.com/train/074f24c2d1b80e9e.jpg,https://www.flickr.com/photos/antonstetner/9504841160/,https://creativecommons.org/licenses/by/2.0/,Anton Stetner +07597b504fc05c3c,train,https://open-images-dataset.s3.amazonaws.com/train/07597b504fc05c3c.jpg,https://www.flickr.com/photos/jsolomon/2235190554,https://creativecommons.org/licenses/by/2.0/,john +075e90ea3c910541,train,https://open-images-dataset.s3.amazonaws.com/train/075e90ea3c910541.jpg,https://www.flickr.com/photos/nhayashida/9892977625,https://creativecommons.org/licenses/by/2.0/,nhayashida +0760331d772dad46,train,https://open-images-dataset.s3.amazonaws.com/train/0760331d772dad46.jpg,https://www.flickr.com/photos/pellesten/9636193307,https://creativecommons.org/licenses/by/2.0/,Pelle Sten +076c97472d6057d0,train,https://open-images-dataset.s3.amazonaws.com/train/076c97472d6057d0.jpg,https://www.flickr.com/photos/miamism/16094829757,https://creativecommons.org/licenses/by/2.0/,Ines Hegedus-Garcia +077d8e162deb3294,train,https://open-images-dataset.s3.amazonaws.com/train/077d8e162deb3294.jpg,https://www.flickr.com/photos/softsurfaces/7194953914,https://creativecommons.org/licenses/by/2.0/,Soft Surfaces Ltd +0793b97eeb63113a,train,https://open-images-dataset.s3.amazonaws.com/train/0793b97eeb63113a.jpg,https://www.flickr.com/photos/pantulis/20404375178,https://creativecommons.org/licenses/by/2.0/,Juan Lupión +079504f618541dfe,train,https://open-images-dataset.s3.amazonaws.com/train/079504f618541dfe.jpg,https://www.flickr.com/photos/aubergene/4555927123,https://creativecommons.org/licenses/by/2.0/,Julian Burgess +07978a48f2d20a10,train,https://open-images-dataset.s3.amazonaws.com/train/07978a48f2d20a10.jpg,https://www.flickr.com/photos/eager/8302048777,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +0798331558cd7b33,train,https://open-images-dataset.s3.amazonaws.com/train/0798331558cd7b33.jpg,https://www.flickr.com/photos/loestamosgrabando/2530488887,https://creativecommons.org/licenses/by/2.0/,loestamosgrabando +079afa1edb777fe6,train,https://open-images-dataset.s3.amazonaws.com/train/079afa1edb777fe6.jpg,https://www.flickr.com/photos/licht3pics/4757855024,https://creativecommons.org/licenses/by/2.0/,Licht3 +079dc70ea67d30d5,train,https://open-images-dataset.s3.amazonaws.com/train/079dc70ea67d30d5.jpg,https://www.flickr.com/photos/liddybits/768635408,https://creativecommons.org/licenses/by/2.0/,liddybits +079fc2281e79bf82,train,https://open-images-dataset.s3.amazonaws.com/train/079fc2281e79bf82.jpg,https://www.flickr.com/photos/supa_pedro/4038642966,https://creativecommons.org/licenses/by/2.0/,Daniel Means +07a5d00c6c808ecb,train,https://open-images-dataset.s3.amazonaws.com/train/07a5d00c6c808ecb.jpg,https://flickr.com/10390868@N07/17185142909,https://creativecommons.org/licenses/by/2.0/,bazzadaramblerimages +07a789b32254ccdd,train,https://open-images-dataset.s3.amazonaws.com/train/07a789b32254ccdd.jpg,https://www.flickr.com/photos/clairity/2018293350,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus +07c0e26d215601df,train,https://open-images-dataset.s3.amazonaws.com/train/07c0e26d215601df.jpg,https://www.flickr.com/photos/49889874@N05/15434805101,https://creativecommons.org/licenses/by/2.0/,marc falardeau +07c94d6df41a1dc5,train,https://open-images-dataset.s3.amazonaws.com/train/07c94d6df41a1dc5.jpg,https://www.flickr.com/photos/66992990@N00/6853375277/,https://creativecommons.org/licenses/by/2.0/,Joanna Bourne +07ca1d50fe17a4ea,train,https://open-images-dataset.s3.amazonaws.com/train/07ca1d50fe17a4ea.jpg,https://www.flickr.com/photos/allaboutgeorge/2628258329,https://creativecommons.org/licenses/by/2.0/,George Kelly +07ccc13fbe455c55,train,https://open-images-dataset.s3.amazonaws.com/train/07ccc13fbe455c55.jpg,https://www.flickr.com/photos/mister-e/393076785,https://creativecommons.org/licenses/by/2.0/,Chris Eason +07cf3711673ce588,train,https://open-images-dataset.s3.amazonaws.com/train/07cf3711673ce588.jpg,https://www.flickr.com/photos/hisgett/5133838796,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett +07d418b28e3882b0,train,https://open-images-dataset.s3.amazonaws.com/train/07d418b28e3882b0.jpg,https://www.flickr.com/photos/92682792@N00/5414630018,https://creativecommons.org/licenses/by/2.0/,gravitat-OFF +08095928f58d7df8,train,https://open-images-dataset.s3.amazonaws.com/train/08095928f58d7df8.jpg,https://www.flickr.com/photos/liferfe/4713531626,https://creativecommons.org/licenses/by/2.0/,Jose Mesa +081e110b58e9f85a,train,https://open-images-dataset.s3.amazonaws.com/train/081e110b58e9f85a.jpg,https://www.flickr.com/photos/rvc/8751321306,https://creativecommons.org/licenses/by/2.0/,rvcroffi +081e318b29e91d8f,train,https://open-images-dataset.s3.amazonaws.com/train/081e318b29e91d8f.jpg,https://www.flickr.com/photos/tboard/5616931675,https://creativecommons.org/licenses/by/2.0/,Teresa Boardman +08230f73db0b42e6,train,https://open-images-dataset.s3.amazonaws.com/train/08230f73db0b42e6.jpg,https://www.flickr.com/photos/talitaribeiro/3881925893,https://creativecommons.org/licenses/by/2.0/,Talita Ribeiro +0825406e6770f6f4,train,https://open-images-dataset.s3.amazonaws.com/train/0825406e6770f6f4.jpg,https://www.flickr.com/photos/pyride/12900357995,https://creativecommons.org/licenses/by/2.0/,Julie anne Johnson +082d5805e187de79,train,https://open-images-dataset.s3.amazonaws.com/train/082d5805e187de79.jpg,https://www.flickr.com/photos/mdpettitt/5099923506,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt +0855f550ac0c70f8,train,https://open-images-dataset.s3.amazonaws.com/train/0855f550ac0c70f8.jpg,https://www.flickr.com/photos/caspermoller/1629358396,https://creativecommons.org/licenses/by/2.0/,Casper Moller +08645f7e3a9641c1,train,https://open-images-dataset.s3.amazonaws.com/train/08645f7e3a9641c1.jpg,https://www.flickr.com/photos/eager/8341241333,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +087747b508af7a53,train,https://open-images-dataset.s3.amazonaws.com/train/087747b508af7a53.jpg,https://www.flickr.com/photos/tuba/4006760767/,https://creativecommons.org/licenses/by/2.0/,Alex Shultz +087edfb3d1797320,train,https://open-images-dataset.s3.amazonaws.com/train/087edfb3d1797320.jpg,https://www.flickr.com/photos/speculummundi/8674171617,https://creativecommons.org/licenses/by/2.0/,Amelia Wells +0889cc56f7629c82,train,https://open-images-dataset.s3.amazonaws.com/train/0889cc56f7629c82.jpg,https://www.flickr.com/photos/edvolunteers/5546946177,https://creativecommons.org/licenses/by/2.0/,International Disaster Volunteers +088bdd1705067783,train,https://open-images-dataset.s3.amazonaws.com/train/088bdd1705067783.jpg,https://www.flickr.com/photos/girl_named_fred/240810026,https://creativecommons.org/licenses/by/2.0/,Cynthia Donovan +088f878f10503d6a,train,https://open-images-dataset.s3.amazonaws.com/train/088f878f10503d6a.jpg,https://www.flickr.com/photos/tinou/116650740,https://creativecommons.org/licenses/by/2.0/,Tinou Bao +0899c5542bd8e7e9,train,https://open-images-dataset.s3.amazonaws.com/train/0899c5542bd8e7e9.jpg,https://www.flickr.com/photos/73416633@N00/297827882,https://creativecommons.org/licenses/by/2.0/,Sandra Cohen-Rose and Colin Rose +08c38e93b0c18d8c,train,https://open-images-dataset.s3.amazonaws.com/train/08c38e93b0c18d8c.jpg,https://www.flickr.com/photos/hisgett/8148790307,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett +08c59ab57a346657,train,https://open-images-dataset.s3.amazonaws.com/train/08c59ab57a346657.jpg,https://www.flickr.com/photos/bragadocchio/442811659,https://creativecommons.org/licenses/by/2.0/,Bill Slawski +08d059a542d49fdc,train,https://open-images-dataset.s3.amazonaws.com/train/08d059a542d49fdc.jpg,https://www.flickr.com/photos/jeepersmedia/13946010707,https://creativecommons.org/licenses/by/2.0/,Mike Mozart +08deac315f1527bf,train,https://open-images-dataset.s3.amazonaws.com/train/08deac315f1527bf.jpg,https://www.flickr.com/photos/auntylaurie/3271988893,https://creativecommons.org/licenses/by/2.0/,Laurie Avocado +08e1766c97677845,train,https://open-images-dataset.s3.amazonaws.com/train/08e1766c97677845.jpg,https://www.flickr.com/photos/28585409@N04/5225050541,https://creativecommons.org/licenses/by/2.0/,Sam Beebe +08e1aa8cf5618c18,train,https://open-images-dataset.s3.amazonaws.com/train/08e1aa8cf5618c18.jpg,https://www.flickr.com/photos/dok1/193408285,https://creativecommons.org/licenses/by/2.0/,Don O'Brien +08eb1daaab9d252a,train,https://open-images-dataset.s3.amazonaws.com/train/08eb1daaab9d252a.jpg,https://www.flickr.com/photos/77919343@N08/8571801424,https://creativecommons.org/licenses/by/2.0/,MrWooly71 +08ee3b1cb727b0fe,train,https://open-images-dataset.s3.amazonaws.com/train/08ee3b1cb727b0fe.jpg,https://www.flickr.com/photos/42360712@N04/7252831210,https://creativecommons.org/licenses/by/2.0/,Carlisle Reject +08fad881421a6257,train,https://open-images-dataset.s3.amazonaws.com/train/08fad881421a6257.jpg,https://www.flickr.com/photos/bonitalabanane/5155792589,https://creativecommons.org/licenses/by/2.0/,Bonita de Boer +0908d617a667957c,train,https://open-images-dataset.s3.amazonaws.com/train/0908d617a667957c.jpg,https://www.flickr.com/photos/37553027@N02/6253979558,https://creativecommons.org/licenses/by/2.0/,Lucy Fisher +092815bee1798100,train,https://open-images-dataset.s3.amazonaws.com/train/092815bee1798100.jpg,https://www.flickr.com/photos/fusion_of_horizons/6166203548,https://creativecommons.org/licenses/by/2.0/,fusion-of-horizons +093ed34207bc4c99,train,https://open-images-dataset.s3.amazonaws.com/train/093ed34207bc4c99.jpg,https://www.flickr.com/photos/remedy451/18276415250,https://creativecommons.org/licenses/by/2.0/,Peter Broster +094578429ee3da75,train,https://open-images-dataset.s3.amazonaws.com/train/094578429ee3da75.jpg,https://www.flickr.com/photos/pavdw/4054135048,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf +09480259601421cc,train,https://open-images-dataset.s3.amazonaws.com/train/09480259601421cc.jpg,https://www.flickr.com/photos/crabchick/2697183442,https://creativecommons.org/licenses/by/2.0/,crabchick +0948af7bfcf923e8,train,https://open-images-dataset.s3.amazonaws.com/train/0948af7bfcf923e8.jpg,https://www.flickr.com/photos/shadowgate/1232325140,https://creativecommons.org/licenses/by/2.0/,Shadowgate +094cdd416c95480c,train,https://open-images-dataset.s3.amazonaws.com/train/094cdd416c95480c.jpg,https://www.flickr.com/photos/snippetsofmydays/6259624309,https://creativecommons.org/licenses/by/2.0/,Saikat Sengupta +09594078dfba99fc,train,https://open-images-dataset.s3.amazonaws.com/train/09594078dfba99fc.jpg,https://www.flickr.com/photos/harshlight/2144931589,https://creativecommons.org/licenses/by/2.0/,HarshLight +095d6a16b365c9c8,train,https://open-images-dataset.s3.amazonaws.com/train/095d6a16b365c9c8.jpg,https://www.flickr.com/photos/flavouz/395626580,https://creativecommons.org/licenses/by/2.0/,Flavio Ensiki +095ef54f4130ae72,train,https://open-images-dataset.s3.amazonaws.com/train/095ef54f4130ae72.jpg,https://www.flickr.com/photos/erix/11370733546,https://creativecommons.org/licenses/by/2.0/,Erich Ferdinand +0969ceaa83d72bf4,train,https://open-images-dataset.s3.amazonaws.com/train/0969ceaa83d72bf4.jpg,https://www.flickr.com/photos/kendylyoung/7412610182,https://creativecommons.org/licenses/by/2.0/,Kendyl Young +096c69cb19dfa45c,train,https://open-images-dataset.s3.amazonaws.com/train/096c69cb19dfa45c.jpg,https://www.flickr.com/photos/technowannabe/332490535,https://creativecommons.org/licenses/by/2.0/,Todd Baker +09765e27a374a7b5,train,https://open-images-dataset.s3.amazonaws.com/train/09765e27a374a7b5.jpg,https://www.flickr.com/photos/modofodo/20306831404,https://creativecommons.org/licenses/by/2.0/,el-toro +097851e8e91f0034,train,https://open-images-dataset.s3.amazonaws.com/train/097851e8e91f0034.jpg,https://www.flickr.com/photos/foshie/87009555,https://creativecommons.org/licenses/by/2.0/,foshie +0988647ee85a2ac6,train,https://open-images-dataset.s3.amazonaws.com/train/0988647ee85a2ac6.jpg,https://www.flickr.com/photos/dottiemae/7827802482,https://creativecommons.org/licenses/by/2.0/,Jenn Durfey +098ad575c1683f1b,train,https://open-images-dataset.s3.amazonaws.com/train/098ad575c1683f1b.jpg,https://www.flickr.com/photos/jmrodri/7967130404,https://creativecommons.org/licenses/by/2.0/,Jesus Rodriguez +099b16de7c810005,train,https://open-images-dataset.s3.amazonaws.com/train/099b16de7c810005.jpg,https://www.flickr.com/photos/maggiejane/3487913946,https://creativecommons.org/licenses/by/2.0/,Maggie Hoffman +09a43f1cd729985a,train,https://open-images-dataset.s3.amazonaws.com/train/09a43f1cd729985a.jpg,https://www.flickr.com/photos/73416633@N00/86614065,https://creativecommons.org/licenses/by/2.0/,Sandra Cohen-Rose and Colin Rose +09a64fd351e32a14,train,https://open-images-dataset.s3.amazonaws.com/train/09a64fd351e32a14.jpg,https://www.flickr.com/photos/mister-e/393062548,https://creativecommons.org/licenses/by/2.0/,Chris Eason +09b5978003dcd3e6,train,https://open-images-dataset.s3.amazonaws.com/train/09b5978003dcd3e6.jpg,https://www.flickr.com/photos/flottenheimer/5365045657,https://creativecommons.org/licenses/by/2.0/,Kristian Thøgersen +09b6f2db3230b352,train,https://open-images-dataset.s3.amazonaws.com/train/09b6f2db3230b352.jpg,https://www.flickr.com/photos/acidka/4379779061,https://creativecommons.org/licenses/by/2.0/,Peter +09c7506f2eb1e26a,train,https://open-images-dataset.s3.amazonaws.com/train/09c7506f2eb1e26a.jpg,https://www.flickr.com/photos/73416633@N00/251913181,https://creativecommons.org/licenses/by/2.0/,Sandra Cohen-Rose and Colin Rose +09e632b9c1a4138e,train,https://open-images-dataset.s3.amazonaws.com/train/09e632b9c1a4138e.jpg,https://www.flickr.com/photos/thoseguys119/16453773819,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119 +09f9ea54b7fa5d41,train,https://open-images-dataset.s3.amazonaws.com/train/09f9ea54b7fa5d41.jpg,https://www.flickr.com/photos/volantra/5506487414,https://creativecommons.org/licenses/by/2.0/,Cheryl Brind +0a020e62c4f38dca,train,https://open-images-dataset.s3.amazonaws.com/train/0a020e62c4f38dca.jpg,https://www.flickr.com/photos/nanpalmero/14983944188,https://creativecommons.org/licenses/by/2.0/,Nan Palmero +0a0de40ac8e6e355,train,https://open-images-dataset.s3.amazonaws.com/train/0a0de40ac8e6e355.jpg,https://www.flickr.com/photos/marcus_hansson/3725720927,https://creativecommons.org/licenses/by/2.0/,Marcus Hansson +0a18e938b4e65c37,train,https://open-images-dataset.s3.amazonaws.com/train/0a18e938b4e65c37.jpg,https://www.flickr.com/photos/blakespot/4938989003,https://creativecommons.org/licenses/by/2.0/,Blake Patterson +0a1985eabf62ad9a,train,https://open-images-dataset.s3.amazonaws.com/train/0a1985eabf62ad9a.jpg,https://www.flickr.com/photos/fletcherprince/3118451624/,https://creativecommons.org/licenses/by/2.0/,Fletcher Prince +0a285fe7b986a00c,train,https://open-images-dataset.s3.amazonaws.com/train/0a285fe7b986a00c.jpg,https://www.flickr.com/photos/pauljill/6294730753,https://creativecommons.org/licenses/by/2.0/,Paul Asman and Jill Lenoble +0a28e1a30134eab7,train,https://open-images-dataset.s3.amazonaws.com/train/0a28e1a30134eab7.jpg,https://www.flickr.com/photos/schuerch-architekten/7837107050/,https://creativecommons.org/licenses/by/2.0/,Andreas Schuerch +0a2d8a70383c0f88,train,https://open-images-dataset.s3.amazonaws.com/train/0a2d8a70383c0f88.jpg,https://www.flickr.com/photos/31883499@N05/3522972965,https://creativecommons.org/licenses/by/2.0/,Yves Cosentino +0a38f628d9acd769,train,https://open-images-dataset.s3.amazonaws.com/train/0a38f628d9acd769.jpg,https://www.flickr.com/photos/paytonc/3719458,https://creativecommons.org/licenses/by/2.0/,Payton Chung +0a3cf5d9bfef0cad,train,https://open-images-dataset.s3.amazonaws.com/train/0a3cf5d9bfef0cad.jpg,https://www.flickr.com/photos/alexao/3523151749,https://creativecommons.org/licenses/by/2.0/,Alexander Ottesen +0a41f37258307ef8,train,https://open-images-dataset.s3.amazonaws.com/train/0a41f37258307ef8.jpg,https://www.flickr.com/photos/joccay/6250667621,https://creativecommons.org/licenses/by/2.0/,Joccay +0a4334cf2d21c7c1,train,https://open-images-dataset.s3.amazonaws.com/train/0a4334cf2d21c7c1.jpg,https://www.flickr.com/photos/jlascar/4577527173,https://creativecommons.org/licenses/by/2.0/,Jorge Láscar +0a5327ea12bc682d,train,https://open-images-dataset.s3.amazonaws.com/train/0a5327ea12bc682d.jpg,https://www.flickr.com/photos/astrooscar/8771194696,https://creativecommons.org/licenses/by/2.0/,Astro Oscar ||*|| +0a5d2c29a13d083e,train,https://open-images-dataset.s3.amazonaws.com/train/0a5d2c29a13d083e.jpg,https://www.flickr.com/photos/ricksmithshow/10190827405,https://creativecommons.org/licenses/by/2.0/,Rick Smith +0a6128fad8ca7fb9,train,https://open-images-dataset.s3.amazonaws.com/train/0a6128fad8ca7fb9.jpg,https://www.flickr.com/photos/pasa/9091913368,https://creativecommons.org/licenses/by/2.0/,Paul Sableman +0a63c9a49c4e0a72,train,https://open-images-dataset.s3.amazonaws.com/train/0a63c9a49c4e0a72.jpg,https://www.flickr.com/photos/futureshape/509957192,https://creativecommons.org/licenses/by/2.0/,Alexander Baxevanis +0a672685c0a78224,train,https://open-images-dataset.s3.amazonaws.com/train/0a672685c0a78224.jpg,https://www.flickr.com/photos/thomaspurves/4393126036,https://creativecommons.org/licenses/by/2.0/,Tom Purves +0a6abfc40839e1db,train,https://open-images-dataset.s3.amazonaws.com/train/0a6abfc40839e1db.jpg,https://www.flickr.com/photos/infrogmation/15055659554,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans +0a7004f19702b353,train,https://open-images-dataset.s3.amazonaws.com/train/0a7004f19702b353.jpg,https://www.flickr.com/photos/maxime-b/15777215621,https://creativecommons.org/licenses/by/2.0/,Maxime B +0a748f89bb743993,train,https://open-images-dataset.s3.amazonaws.com/train/0a748f89bb743993.jpg,https://www.flickr.com/photos/globetrotteri/4394308829,https://creativecommons.org/licenses/by/2.0/,Carrie Kellenberger +0a7eda86654d9333,train,https://open-images-dataset.s3.amazonaws.com/train/0a7eda86654d9333.jpg,https://www.flickr.com/photos/bedesign/8706798181,https://creativecommons.org/licenses/by/2.0/,Benito Condemi de Felice +0a836d67e9c855a3,train,https://open-images-dataset.s3.amazonaws.com/train/0a836d67e9c855a3.jpg,https://www.flickr.com/photos/nightwing_26/2337037339,https://creativecommons.org/licenses/by/2.0/,Harry Li +0a8be81037ff7a7e,train,https://open-images-dataset.s3.amazonaws.com/train/0a8be81037ff7a7e.jpg,https://www.flickr.com/photos/elvissa/2325155089,https://creativecommons.org/licenses/by/2.0/,Tricia +0a8c8fb83044e168,train,https://open-images-dataset.s3.amazonaws.com/train/0a8c8fb83044e168.jpg,https://www.flickr.com/photos/76474729@N02/7248248586,https://creativecommons.org/licenses/by/2.0/,Mario Fornasari +0a965c4c3e71280c,train,https://open-images-dataset.s3.amazonaws.com/train/0a965c4c3e71280c.jpg,https://www.flickr.com/photos/ombatak/6940461524,https://creativecommons.org/licenses/by/2.0/,Gabriel Sianturi +0aa39ab31425f38c,train,https://open-images-dataset.s3.amazonaws.com/train/0aa39ab31425f38c.jpg,https://www.flickr.com/photos/dale_ellerm/3403042949,https://creativecommons.org/licenses/by/2.0/,Dale Ellerm +0ab1bf0607e3e409,train,https://open-images-dataset.s3.amazonaws.com/train/0ab1bf0607e3e409.jpg,https://www.flickr.com/photos/lancerrevolution/4032223943,https://creativecommons.org/licenses/by/2.0/,LancerE +0ab67ad570b8712d,train,https://open-images-dataset.s3.amazonaws.com/train/0ab67ad570b8712d.jpg,https://www.flickr.com/photos/alsager/6103113612,https://creativecommons.org/licenses/by/2.0/,Ahmed Alsaqer +0ac3642f741f7b96,train,https://open-images-dataset.s3.amazonaws.com/train/0ac3642f741f7b96.jpg,https://www.flickr.com/photos/69091371@N00/4141546857,https://creativecommons.org/licenses/by/2.0/,Heather McCall +0ac43b1430ff8726,train,https://open-images-dataset.s3.amazonaws.com/train/0ac43b1430ff8726.jpg,https://www.flickr.com/photos/viaggioroutard/15103063040,https://creativecommons.org/licenses/by/2.0/,Viaggio Routard +0ad0b4919bd10928,train,https://open-images-dataset.s3.amazonaws.com/train/0ad0b4919bd10928.jpg,https://www.flickr.com/photos/calliope/1896984414,https://creativecommons.org/licenses/by/2.0/,liz west +0adca529cab8ad1e,train,https://open-images-dataset.s3.amazonaws.com/train/0adca529cab8ad1e.jpg,https://www.flickr.com/photos/jseita/5395118522,https://creativecommons.org/licenses/by/2.0/,Jun Seita +0addd44f322259ec,train,https://open-images-dataset.s3.amazonaws.com/train/0addd44f322259ec.jpg,https://www.flickr.com/photos/marko8904/279797369,https://creativecommons.org/licenses/by/2.0/,Marko Kudjerski +0ae3a7127d5a5ad9,train,https://open-images-dataset.s3.amazonaws.com/train/0ae3a7127d5a5ad9.jpg,https://www.flickr.com/photos/jetalone/16059199293,https://creativecommons.org/licenses/by/2.0/,Hajime NAKANO +0ae8781a0993b771,train,https://open-images-dataset.s3.amazonaws.com/train/0ae8781a0993b771.jpg,https://www.flickr.com/photos/zak/84084431,https://creativecommons.org/licenses/by/2.0/,Zak Greant +0aeadd19328b0b7a,train,https://open-images-dataset.s3.amazonaws.com/train/0aeadd19328b0b7a.jpg,https://www.flickr.com/photos/striatic/1693327059,https://creativecommons.org/licenses/by/2.0/,hobvias sudoneighm +0aec22915799dc2d,train,https://open-images-dataset.s3.amazonaws.com/train/0aec22915799dc2d.jpg,https://www.flickr.com/photos/63837784@N08/13721044843,https://creativecommons.org/licenses/by/2.0/,Ohio Redevelopment Projects - ODSA +0aec4040c9f16038,train,https://open-images-dataset.s3.amazonaws.com/train/0aec4040c9f16038.jpg,https://www.flickr.com/photos/53628283@N03/8620649025,https://creativecommons.org/licenses/by/2.0/,Niyaz Bakılı +0af2b6da9b529ccb,train,https://open-images-dataset.s3.amazonaws.com/train/0af2b6da9b529ccb.jpg,https://www.flickr.com/photos/psyberartist/8198241064/,https://creativecommons.org/licenses/by/2.0/,psyberartist +0b015a10d545d1bd,train,https://open-images-dataset.s3.amazonaws.com/train/0b015a10d545d1bd.jpg,https://www.flickr.com/photos/97480562@N03/10691539434,https://creativecommons.org/licenses/by/2.0/,Emily Gray +0b0ea341256cdb5f,train,https://open-images-dataset.s3.amazonaws.com/train/0b0ea341256cdb5f.jpg,https://www.flickr.com/photos/laurenprofeta/3815711253,https://creativecommons.org/licenses/by/2.0/,Lauren Mitchell +0b229d758ae7f5f0,train,https://open-images-dataset.s3.amazonaws.com/train/0b229d758ae7f5f0.jpg,https://www.flickr.com/photos/janahmontana/15448237717,https://creativecommons.org/licenses/by/2.0/,Jana-Sophie Lauer +0b25af2112edd08b,train,https://open-images-dataset.s3.amazonaws.com/train/0b25af2112edd08b.jpg,https://www.flickr.com/photos/boscdanjou/15319132035,https://creativecommons.org/licenses/by/2.0/,Bosc d'Anjou +0b2c96dcb9e5c556,train,https://open-images-dataset.s3.amazonaws.com/train/0b2c96dcb9e5c556.jpg,https://www.flickr.com/photos/palander/4700865855,https://creativecommons.org/licenses/by/2.0/,petter palander +0b36808aaab47820,train,https://open-images-dataset.s3.amazonaws.com/train/0b36808aaab47820.jpg,https://www.flickr.com/photos/renaissancechambara/21370706153,https://creativecommons.org/licenses/by/2.0/,Ged Carroll +0b38a4aefd877dd6,train,https://open-images-dataset.s3.amazonaws.com/train/0b38a4aefd877dd6.jpg,https://www.flickr.com/photos/ccordova/3108458587,https://creativecommons.org/licenses/by/2.0/,Christian Córdova +0b6a3ff28a3e5eb4,train,https://open-images-dataset.s3.amazonaws.com/train/0b6a3ff28a3e5eb4.jpg,https://www.flickr.com/photos/isthis4real/4232352239,https://creativecommons.org/licenses/by/2.0/,A QUIVERFUL OF FOTOS +0b6e2a31b1664d46,train,https://open-images-dataset.s3.amazonaws.com/train/0b6e2a31b1664d46.jpg,https://www.flickr.com/photos/stevan/41606968,https://creativecommons.org/licenses/by/2.0/,Stevan Sheets +0b7aaa03e1a3fc38,train,https://open-images-dataset.s3.amazonaws.com/train/0b7aaa03e1a3fc38.jpg,https://www.flickr.com/photos/subzonica/3390847610,https://creativecommons.org/licenses/by/2.0/,Hernán García Crespo +0b7c59ccb82fd3f9,train,https://open-images-dataset.s3.amazonaws.com/train/0b7c59ccb82fd3f9.jpg,https://www.flickr.com/photos/105884218@N08/15696516545/,https://creativecommons.org/licenses/by/2.0/,Sara Alaica +0b8b13e09b101936,train,https://open-images-dataset.s3.amazonaws.com/train/0b8b13e09b101936.jpg,https://www.flickr.com/photos/kikoz/8585015935,https://creativecommons.org/licenses/by/2.0/,gildas_f +0b8be8f9a43a8f83,train,https://open-images-dataset.s3.amazonaws.com/train/0b8be8f9a43a8f83.jpg,https://www.flickr.com/photos/nathalie_magniez/4711368772,https://creativecommons.org/licenses/by/2.0/,Nathalie Magniez +0b8f289d985b7607,train,https://open-images-dataset.s3.amazonaws.com/train/0b8f289d985b7607.jpg,https://www.flickr.com/photos/23056733@N05/15672790380,https://creativecommons.org/licenses/by/2.0/,jodelli +0b957a280496f6f5,train,https://open-images-dataset.s3.amazonaws.com/train/0b957a280496f6f5.jpg,https://www.flickr.com/photos/danmarksdesignskole/7463149002,https://creativecommons.org/licenses/by/2.0/,Kunstakademiets Designskole +0b989c64b563cc9a,train,https://open-images-dataset.s3.amazonaws.com/train/0b989c64b563cc9a.jpg,https://www.flickr.com/photos/briangiesen/4488283779,https://creativecommons.org/licenses/by/2.0/,Brian Giesen +0baa9a93d8fea75d,train,https://open-images-dataset.s3.amazonaws.com/train/0baa9a93d8fea75d.jpg,https://www.flickr.com/photos/dalbera/7974216684,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalbéra +0baab613f4572669,train,https://open-images-dataset.s3.amazonaws.com/train/0baab613f4572669.jpg,https://www.flickr.com/photos/wm_archiv/3317620820,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield +0bb78cec2768a1f0,train,https://open-images-dataset.s3.amazonaws.com/train/0bb78cec2768a1f0.jpg,https://www.flickr.com/photos/glynlowe/8415042596,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com +0bbea2cd35fe261d,train,https://open-images-dataset.s3.amazonaws.com/train/0bbea2cd35fe261d.jpg,https://www.flickr.com/photos/wengs/17328224,https://creativecommons.org/licenses/by/2.0/,WalkingGeek +0be849b02c044301,train,https://open-images-dataset.s3.amazonaws.com/train/0be849b02c044301.jpg,https://www.flickr.com/photos/capcase/15512063078,https://creativecommons.org/licenses/by/2.0/,James Case +0beb7aca6c55bc4e,train,https://open-images-dataset.s3.amazonaws.com/train/0beb7aca6c55bc4e.jpg,https://www.flickr.com/photos/hannahdonovan/3644649180/,https://creativecommons.org/licenses/by/2.0/,Hannah Donovan +0bf4138d0f052cf6,train,https://open-images-dataset.s3.amazonaws.com/train/0bf4138d0f052cf6.jpg,https://www.flickr.com/photos/pauljill/7146158025,https://creativecommons.org/licenses/by/2.0/,Paul Asman and Jill Lenoble +0bf588f9e87c71ff,train,https://open-images-dataset.s3.amazonaws.com/train/0bf588f9e87c71ff.jpg,https://www.flickr.com/photos/sergio94707/2424799976,https://creativecommons.org/licenses/by/2.0/,another sergio +0bf8a1dc0827950f,train,https://open-images-dataset.s3.amazonaws.com/train/0bf8a1dc0827950f.jpg,https://www.flickr.com/photos/othree/10927231536,https://creativecommons.org/licenses/by/2.0/,othree +0c004fa1557a1d49,train,https://open-images-dataset.s3.amazonaws.com/train/0c004fa1557a1d49.jpg,https://www.flickr.com/photos/kucinski/10548358114,https://creativecommons.org/licenses/by/2.0/,Ben Kucinski +0c0345f70a278559,train,https://open-images-dataset.s3.amazonaws.com/train/0c0345f70a278559.jpg,https://www.flickr.com/photos/57460141@N05/8587860050,https://creativecommons.org/licenses/by/2.0/,Thomas Long +0c07aa933834dbc1,train,https://open-images-dataset.s3.amazonaws.com/train/0c07aa933834dbc1.jpg,https://www.flickr.com/photos/rauckhaus/15476865709,https://creativecommons.org/licenses/by/2.0/,Jereme Rauckman +0c0a7b8b641aa601,train,https://open-images-dataset.s3.amazonaws.com/train/0c0a7b8b641aa601.jpg,https://www.flickr.com/photos/homestilo/8505223533,https://creativecommons.org/licenses/by/2.0/,homestilo +0c0edea113b641c3,train,https://open-images-dataset.s3.amazonaws.com/train/0c0edea113b641c3.jpg,https://www.flickr.com/photos/quinet/127796440,https://creativecommons.org/licenses/by/2.0/,Thomas Quine +0c10599382349e7e,train,https://open-images-dataset.s3.amazonaws.com/train/0c10599382349e7e.jpg,https://www.flickr.com/photos/kendoerr/13354532593,https://creativecommons.org/licenses/by/2.0/,Ken Doerr +0c134d543aa58495,train,https://open-images-dataset.s3.amazonaws.com/train/0c134d543aa58495.jpg,https://www.flickr.com/photos/harriyott/5713837390,https://creativecommons.org/licenses/by/2.0/,Simon Harriyott +0c1783b09ee05447,train,https://open-images-dataset.s3.amazonaws.com/train/0c1783b09ee05447.jpg,https://www.flickr.com/photos/walmart3/12442110605,https://creativecommons.org/licenses/by/2.0/,Random Retail +0c190b039c66efee,train,https://open-images-dataset.s3.amazonaws.com/train/0c190b039c66efee.jpg,https://www.flickr.com/photos/greenwichphotography/13581476813,https://creativecommons.org/licenses/by/2.0/,Surreal Name Given +0c1ab50b8c9c506b,train,https://open-images-dataset.s3.amazonaws.com/train/0c1ab50b8c9c506b.jpg,https://www.flickr.com/photos/sedonahiker/14731719760,https://creativecommons.org/licenses/by/2.0/,Sedona Hiker +0c2d6412fa30dbaa,train,https://open-images-dataset.s3.amazonaws.com/train/0c2d6412fa30dbaa.jpg,https://www.flickr.com/photos/olenkaolja/1426845453,https://creativecommons.org/licenses/by/2.0/,Olga Pavlovsky +0c3a4087ba01a5bc,train,https://open-images-dataset.s3.amazonaws.com/train/0c3a4087ba01a5bc.jpg,https://www.flickr.com/photos/pasa/10987384453,https://creativecommons.org/licenses/by/2.0/,Paul Sableman +0c40051d1c73fa59,train,https://open-images-dataset.s3.amazonaws.com/train/0c40051d1c73fa59.jpg,https://www.flickr.com/photos/kaeru/13977143403,https://creativecommons.org/licenses/by/2.0/,Kars Alfrink +0c40c79955aed671,train,https://open-images-dataset.s3.amazonaws.com/train/0c40c79955aed671.jpg,https://www.flickr.com/photos/jamescronin/4853188248,https://creativecommons.org/licenses/by/2.0/,James Cronin +0c4eb8de33034f6c,train,https://open-images-dataset.s3.amazonaws.com/train/0c4eb8de33034f6c.jpg,https://www.flickr.com/photos/jasoneppink/8532789962,https://creativecommons.org/licenses/by/2.0/,Jason Eppink +0c60baa351dbaaf3,train,https://open-images-dataset.s3.amazonaws.com/train/0c60baa351dbaaf3.jpg,https://www.flickr.com/photos/ell-r-brown/5232823310,https://creativecommons.org/licenses/by/2.0/,Elliott Brown +0c62ce6c7096f295,train,https://open-images-dataset.s3.amazonaws.com/train/0c62ce6c7096f295.jpg,https://www.flickr.com/photos/ell-r-brown/7006784756,https://creativecommons.org/licenses/by/2.0/,Elliott Brown +0c6d76c010c29ef5,train,https://open-images-dataset.s3.amazonaws.com/train/0c6d76c010c29ef5.jpg,https://www.flickr.com/photos/andypowe11/2750608115,https://creativecommons.org/licenses/by/2.0/,Andy Powell +0c6ebfa015012398,train,https://open-images-dataset.s3.amazonaws.com/train/0c6ebfa015012398.jpg,https://www.flickr.com/photos/cgpgrey/4887161003,https://creativecommons.org/licenses/by/2.0/,CGP Grey +0c77e49efb7daced,train,https://open-images-dataset.s3.amazonaws.com/train/0c77e49efb7daced.jpg,https://www.flickr.com/photos/eager/5591333113,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +0c89be4d66633ce4,train,https://open-images-dataset.s3.amazonaws.com/train/0c89be4d66633ce4.jpg,https://www.flickr.com/photos/gruenemann/5199401350,https://creativecommons.org/licenses/by/2.0/,John W. Schulze +0c8ebd9431edd552,train,https://open-images-dataset.s3.amazonaws.com/train/0c8ebd9431edd552.jpg,https://www.flickr.com/photos/oscardelrio/141872754/,https://creativecommons.org/licenses/by/2.0/,Óscar del Río +0c9089fb8e8c8e22,train,https://open-images-dataset.s3.amazonaws.com/train/0c9089fb8e8c8e22.jpg,https://www.flickr.com/photos/tomyto/5480350606,https://creativecommons.org/licenses/by/2.0/,Guillermo Tomoyose +0c90f3b66c2b02f2,train,https://open-images-dataset.s3.amazonaws.com/train/0c90f3b66c2b02f2.jpg,https://www.flickr.com/photos/chiaramarra/1220453252,https://creativecommons.org/licenses/by/2.0/,Chiara Marra +0c9c9892fcebeea9,train,https://open-images-dataset.s3.amazonaws.com/train/0c9c9892fcebeea9.jpg,https://www.flickr.com/photos/revstan/3581706751,https://creativecommons.org/licenses/by/2.0/,Rev Stan +0c9d28cd2da44ccf,train,https://open-images-dataset.s3.amazonaws.com/train/0c9d28cd2da44ccf.jpg,https://www.flickr.com/photos/shansby/290291829,https://creativecommons.org/licenses/by/2.0/,shansby +0ca1db52353feee8,train,https://open-images-dataset.s3.amazonaws.com/train/0ca1db52353feee8.jpg,https://www.flickr.com/photos/kelsey97/21401142884,https://creativecommons.org/licenses/by/2.0/,fernando butcher +0cb4a797c123d2cf,train,https://open-images-dataset.s3.amazonaws.com/train/0cb4a797c123d2cf.jpg,https://www.flickr.com/photos/bravenboer/5338636216/,https://creativecommons.org/licenses/by/2.0/,Martin Bravenboer +0cc1bbc28fe24df0,train,https://open-images-dataset.s3.amazonaws.com/train/0cc1bbc28fe24df0.jpg,https://www.flickr.com/photos/bootbearwdc/225720718,https://creativecommons.org/licenses/by/2.0/,David +0cc3d0c94666272e,train,https://open-images-dataset.s3.amazonaws.com/train/0cc3d0c94666272e.jpg,https://www.flickr.com/photos/leeco/4711606013,https://creativecommons.org/licenses/by/2.0/,Lee Coursey +0cdc0c4cb25bfbe6,train,https://open-images-dataset.s3.amazonaws.com/train/0cdc0c4cb25bfbe6.jpg,https://www.flickr.com/photos/yakobusan/8086859912,https://creativecommons.org/licenses/by/2.0/,Jakob Montrasio +0cddd3b472bc04cc,train,https://open-images-dataset.s3.amazonaws.com/train/0cddd3b472bc04cc.jpg,https://www.flickr.com/photos/morrissey/4234553482,https://creativecommons.org/licenses/by/2.0/,Jorge Gobbi +0ce830f1e03e9ec3,train,https://open-images-dataset.s3.amazonaws.com/train/0ce830f1e03e9ec3.jpg,https://www.flickr.com/photos/zeevveez/4411092970,https://creativecommons.org/licenses/by/2.0/,zeevveez +0ceb42b98417b88c,train,https://open-images-dataset.s3.amazonaws.com/train/0ceb42b98417b88c.jpg,https://www.flickr.com/photos/73416633@N00/250671947,https://creativecommons.org/licenses/by/2.0/,Sandra Cohen-Rose and Colin Rose +0cefd7fbbe725428,train,https://open-images-dataset.s3.amazonaws.com/train/0cefd7fbbe725428.jpg,https://www.flickr.com/photos/trishhhh/4377733758,https://creativecommons.org/licenses/by/2.0/,Trishhhh +0cf216bef1ec8e21,train,https://open-images-dataset.s3.amazonaws.com/train/0cf216bef1ec8e21.jpg,https://www.flickr.com/photos/choose_freewill/232084069,https://creativecommons.org/licenses/by/2.0/,Choose_Freewill +0cf925a1a3aed95e,train,https://open-images-dataset.s3.amazonaws.com/train/0cf925a1a3aed95e.jpg,https://www.flickr.com/photos/byzantiumbooks/14609807491,https://creativecommons.org/licenses/by/2.0/,Bill Smith +0d02acee5a7d169c,train,https://open-images-dataset.s3.amazonaws.com/train/0d02acee5a7d169c.jpg,https://www.flickr.com/photos/ddebold/16613584702,https://creativecommons.org/licenses/by/2.0/,Don DeBold +0d065e63cc8f31f6,train,https://open-images-dataset.s3.amazonaws.com/train/0d065e63cc8f31f6.jpg,https://www.flickr.com/photos/amsterdame/14579394675,https://creativecommons.org/licenses/by/2.0/,Helen Olney +0d086221900e1ce8,train,https://open-images-dataset.s3.amazonaws.com/train/0d086221900e1ce8.jpg,https://www.flickr.com/photos/joeshlabotnik/502019285,https://creativecommons.org/licenses/by/2.0/,Joe Shlabotnik +0d12746005baccc5,train,https://open-images-dataset.s3.amazonaws.com/train/0d12746005baccc5.jpg,https://www.flickr.com/photos/mecklenburg/5647718714/,https://creativecommons.org/licenses/by/2.0/,Thomas Kohler +0d13c9736e3b946a,train,https://open-images-dataset.s3.amazonaws.com/train/0d13c9736e3b946a.jpg,https://www.flickr.com/photos/trondheim_byarkiv/8725700604,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +0d1b8d2541c99a0a,train,https://open-images-dataset.s3.amazonaws.com/train/0d1b8d2541c99a0a.jpg,https://www.flickr.com/photos/frenchy/17205753033,https://creativecommons.org/licenses/by/2.0/,francois schnell +0d24ce32e3068ed1,train,https://open-images-dataset.s3.amazonaws.com/train/0d24ce32e3068ed1.jpg,https://www.flickr.com/photos/pasa/7805720302,https://creativecommons.org/licenses/by/2.0/,Paul Sableman +0d34c6ef6030ef6c,train,https://open-images-dataset.s3.amazonaws.com/train/0d34c6ef6030ef6c.jpg,https://www.flickr.com/photos/gtzecosan/4361657471,https://creativecommons.org/licenses/by/2.0/,SuSanA Secretariat +0d5c075e91b9309e,train,https://open-images-dataset.s3.amazonaws.com/train/0d5c075e91b9309e.jpg,https://www.flickr.com/photos/98983159@N00/79093915,https://creativecommons.org/licenses/by/2.0/,Lachlan Hardy +0d654af2af57c319,train,https://open-images-dataset.s3.amazonaws.com/train/0d654af2af57c319.jpg,https://www.flickr.com/photos/pasa/9518603543/?map=1,https://creativecommons.org/licenses/by/2.0/,Paul Sableman +0d6aabcff376e06a,train,https://open-images-dataset.s3.amazonaws.com/train/0d6aabcff376e06a.jpg,https://www.flickr.com/photos/ramella/6155358795,https://creativecommons.org/licenses/by/2.0/,Simone Ramella +0d6e778496f22df6,train,https://open-images-dataset.s3.amazonaws.com/train/0d6e778496f22df6.jpg,https://www.flickr.com/photos/12265657@N04/7110623993,https://creativecommons.org/licenses/by/2.0/,hillman54 +0d75f4d0712d4dd7,train,https://open-images-dataset.s3.amazonaws.com/train/0d75f4d0712d4dd7.jpg,https://www.flickr.com/photos/andypowe11/15044038184/,https://creativecommons.org/licenses/by/2.0/,Andy Powell +0d8bbabdfc256b7b,train,https://open-images-dataset.s3.amazonaws.com/train/0d8bbabdfc256b7b.jpg,https://www.flickr.com/photos/arenamontanus/551624661,https://creativecommons.org/licenses/by/2.0/,Anders Sandberg +0d94d277f79cc437,train,https://open-images-dataset.s3.amazonaws.com/train/0d94d277f79cc437.jpg,https://www.flickr.com/photos/coreforce/4796452940,https://creativecommons.org/licenses/by/2.0/,Falk Lademann +0d9a27555510c6c2,train,https://open-images-dataset.s3.amazonaws.com/train/0d9a27555510c6c2.jpg,https://www.flickr.com/photos/zigazou76/19647918739,https://creativecommons.org/licenses/by/2.0/,Frédéric BISSON +0dba02432495d47a,train,https://open-images-dataset.s3.amazonaws.com/train/0dba02432495d47a.jpg,https://www.flickr.com/photos/pepemartin/4507840049/,https://creativecommons.org/licenses/by/2.0/,Pepe Martin (Mário José Martins) +0e04b7fb9fa3c60c,train,https://open-images-dataset.s3.amazonaws.com/train/0e04b7fb9fa3c60c.jpg,https://www.flickr.com/photos/mbschlemmer/6872791976,https://creativecommons.org/licenses/by/2.0/,Mark B. Schlemmer +0e251034924e90e6,train,https://open-images-dataset.s3.amazonaws.com/train/0e251034924e90e6.jpg,https://www.flickr.com/photos/artwork_rebel/2548602056,https://creativecommons.org/licenses/by/2.0/,Rob Walker +0e338e88d8ca6c52,train,https://open-images-dataset.s3.amazonaws.com/train/0e338e88d8ca6c52.jpg,https://www.flickr.com/photos/cjmartin/5511140789,https://creativecommons.org/licenses/by/2.0/,Chris Martin +0e363618cb0f9bf8,train,https://open-images-dataset.s3.amazonaws.com/train/0e363618cb0f9bf8.jpg,https://www.flickr.com/photos/bazzadarambler/3856342917,https://creativecommons.org/licenses/by/2.0/,bazzadaramblerimages +0e47126559819116,train,https://open-images-dataset.s3.amazonaws.com/train/0e47126559819116.jpg,https://www.flickr.com/photos/pat00139/15061183168,https://creativecommons.org/licenses/by/2.0/,Pat Pilon +0e5136e572fda862,train,https://open-images-dataset.s3.amazonaws.com/train/0e5136e572fda862.jpg,https://www.flickr.com/photos/tjeerd/200910604,https://creativecommons.org/licenses/by/2.0/,Tjeerd Wiersma +0e67a66ac110da51,train,https://open-images-dataset.s3.amazonaws.com/train/0e67a66ac110da51.jpg,https://www.flickr.com/photos/lonewolf87/469785130,https://creativecommons.org/licenses/by/2.0/,LoneWolf87 +0e67ef6b111995ea,train,https://open-images-dataset.s3.amazonaws.com/train/0e67ef6b111995ea.jpg,https://www.flickr.com/photos/bumeister/20799020668,https://creativecommons.org/licenses/by/2.0/,John Buie +0e7007958c4ba791,train,https://open-images-dataset.s3.amazonaws.com/train/0e7007958c4ba791.jpg,https://www.flickr.com/photos/deepphoto/3939636213,https://creativecommons.org/licenses/by/2.0/,Dave Proffer +0e759e74589524b3,train,https://open-images-dataset.s3.amazonaws.com/train/0e759e74589524b3.jpg,https://www.flickr.com/photos/crabchick/7701499334,https://creativecommons.org/licenses/by/2.0/,crabchick +0e87814cbe9dd3c6,train,https://open-images-dataset.s3.amazonaws.com/train/0e87814cbe9dd3c6.jpg,https://www.flickr.com/photos/chrisdag/14316999756,https://creativecommons.org/licenses/by/2.0/,ChrisDag +0e95ed44c4d9d9a6,train,https://open-images-dataset.s3.amazonaws.com/train/0e95ed44c4d9d9a6.jpg,https://www.flickr.com/photos/europeanatech/6288528296,https://creativecommons.org/licenses/by/2.0/,EuropeanaTech +0ea71c0967f66a86,train,https://open-images-dataset.s3.amazonaws.com/train/0ea71c0967f66a86.jpg,https://www.flickr.com/photos/leonl/5688151850/,https://creativecommons.org/licenses/by/2.0/,Leon +0ea9346e23ff9032,train,https://open-images-dataset.s3.amazonaws.com/train/0ea9346e23ff9032.jpg,https://www.flickr.com/photos/blineconstruction/5198614461/,https://creativecommons.org/licenses/by/2.0/,Chris Lattuada +0eb2c146387764c3,train,https://open-images-dataset.s3.amazonaws.com/train/0eb2c146387764c3.jpg,https://www.flickr.com/photos/vialbost/6016966339,https://creativecommons.org/licenses/by/2.0/,Frédérique Voisin-Demery +0eb80289f63b0ea0,train,https://open-images-dataset.s3.amazonaws.com/train/0eb80289f63b0ea0.jpg,https://www.flickr.com/photos/5nap/14098423609,https://creativecommons.org/licenses/by/2.0/,Sergey Norin +0eb8c615983f8fde,train,https://open-images-dataset.s3.amazonaws.com/train/0eb8c615983f8fde.jpg,https://www.flickr.com/photos/squidormykid/5419601,https://creativecommons.org/licenses/by/2.0/,dustbin +0ed2e0651308a1e2,train,https://open-images-dataset.s3.amazonaws.com/train/0ed2e0651308a1e2.jpg,https://www.flickr.com/photos/trondheim_byarkiv/15080601318,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +0edb945c347d6709,train,https://open-images-dataset.s3.amazonaws.com/train/0edb945c347d6709.jpg,https://www.flickr.com/photos/torsten-behrens/9734295595,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens +0edf33241ae07d7e,train,https://open-images-dataset.s3.amazonaws.com/train/0edf33241ae07d7e.jpg,https://www.flickr.com/photos/bachmont/3528347511,https://creativecommons.org/licenses/by/2.0/,bachmont +0ee4033b194de462,train,https://open-images-dataset.s3.amazonaws.com/train/0ee4033b194de462.jpg,https://www.flickr.com/photos/londonmatt/5436508907,https://creativecommons.org/licenses/by/2.0/,Matt Brown +0efc611e14c92cb4,train,https://open-images-dataset.s3.amazonaws.com/train/0efc611e14c92cb4.jpg,https://www.flickr.com/photos/dalbera/5478758597,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalbéra +0efd741fc045966d,train,https://open-images-dataset.s3.amazonaws.com/train/0efd741fc045966d.jpg,https://www.flickr.com/photos/daquellamanera/317329457,https://creativecommons.org/licenses/by/2.0/,Daniel Lobo +0f016c383cf35fc2,train,https://open-images-dataset.s3.amazonaws.com/train/0f016c383cf35fc2.jpg,https://www.flickr.com/photos/markhillary/3662619947,https://creativecommons.org/licenses/by/2.0/,Mark Hillary +0f0727a2ef99fb93,train,https://open-images-dataset.s3.amazonaws.com/train/0f0727a2ef99fb93.jpg,https://www.flickr.com/photos/deanschreuder/3227263172,https://creativecommons.org/licenses/by/2.0/,Dean Schreuder +0f0ac12d4fab9b94,train,https://open-images-dataset.s3.amazonaws.com/train/0f0ac12d4fab9b94.jpg,https://www.flickr.com/photos/editor/5592280736,https://creativecommons.org/licenses/by/2.0/,Bart Everson +0f0f9ef95038d528,train,https://open-images-dataset.s3.amazonaws.com/train/0f0f9ef95038d528.jpg,https://www.flickr.com/photos/86624586@N00/12506423185,https://creativecommons.org/licenses/by/2.0/,Kevin Walsh +0f1688113c56290a,train,https://open-images-dataset.s3.amazonaws.com/train/0f1688113c56290a.jpg,https://www.flickr.com/photos/usaghumphreys/14601999082,https://creativecommons.org/licenses/by/2.0/,USAG- Humphreys +0f1d5d6e555f2c58,train,https://open-images-dataset.s3.amazonaws.com/train/0f1d5d6e555f2c58.jpg,https://www.flickr.com/photos/mos0711/15590374545,https://creativecommons.org/licenses/by/2.0/,MO S +0f23f0b768c0d495,train,https://open-images-dataset.s3.amazonaws.com/train/0f23f0b768c0d495.jpg,https://www.flickr.com/photos/stewdean/15295817833,https://creativecommons.org/licenses/by/2.0/,Stew Dean +0f2bcc6420a74138,train,https://open-images-dataset.s3.amazonaws.com/train/0f2bcc6420a74138.jpg,https://www.flickr.com/photos/watercolor121/4976363213,https://creativecommons.org/licenses/by/2.0/,Maham Tariq +0f32b48eb808d7ed,train,https://open-images-dataset.s3.amazonaws.com/train/0f32b48eb808d7ed.jpg,https://www.flickr.com/photos/cleochiara/358079415,https://creativecommons.org/licenses/by/2.0/,cleò +0f38e222c88bde76,train,https://open-images-dataset.s3.amazonaws.com/train/0f38e222c88bde76.jpg,https://www.flickr.com/photos/arunkatiyar/29739854,https://creativecommons.org/licenses/by/2.0/,Arun Katiyar +0f438eeae80b6e02,train,https://open-images-dataset.s3.amazonaws.com/train/0f438eeae80b6e02.jpg,https://www.flickr.com/photos/uscoastguardacademy/4013467505,https://creativecommons.org/licenses/by/2.0/,US Coast Guard Academy +0f4497c59b008023,train,https://open-images-dataset.s3.amazonaws.com/train/0f4497c59b008023.jpg,https://www.flickr.com/photos/kiasmamuseum/14280682546,https://creativecommons.org/licenses/by/2.0/,Museum of Contemporary Art Kiasma +0f48fa01add72b51,train,https://open-images-dataset.s3.amazonaws.com/train/0f48fa01add72b51.jpg,https://www.flickr.com/photos/miss_pupik/2734348605,https://creativecommons.org/licenses/by/2.0/,shira gal +0f4eae57dae5bec8,train,https://open-images-dataset.s3.amazonaws.com/train/0f4eae57dae5bec8.jpg,https://www.flickr.com/photos/annspan/3890848440,https://creativecommons.org/licenses/by/2.0/,Ann Baekken +0f5820e81d00b2f8,train,https://open-images-dataset.s3.amazonaws.com/train/0f5820e81d00b2f8.jpg,https://www.flickr.com/photos/newton/582042357,https://creativecommons.org/licenses/by/2.0/,Michael Newton +0f5d370f26780f80,train,https://open-images-dataset.s3.amazonaws.com/train/0f5d370f26780f80.jpg,https://www.flickr.com/photos/joeduck/6798657564,https://creativecommons.org/licenses/by/2.0/,Joseph Hunkins +0f6bb371c4f4ff4c,train,https://open-images-dataset.s3.amazonaws.com/train/0f6bb371c4f4ff4c.jpg,https://www.flickr.com/photos/paulkelley/9514269867,https://creativecommons.org/licenses/by/2.0/,Paul Kelley +0f7fb413472f54d6,train,https://open-images-dataset.s3.amazonaws.com/train/0f7fb413472f54d6.jpg,https://www.flickr.com/photos/jfanaian/13975496431,https://creativecommons.org/licenses/by/2.0/,Jamal Fanaian +0f895557d1bacfb2,train,https://open-images-dataset.s3.amazonaws.com/train/0f895557d1bacfb2.jpg,https://www.flickr.com/photos/consumerist/482844738,https://creativecommons.org/licenses/by/2.0/,Consumerist Dot Com +0f9b03328774d4ba,train,https://open-images-dataset.s3.amazonaws.com/train/0f9b03328774d4ba.jpg,https://www.flickr.com/photos/eltb/3111648097,https://creativecommons.org/licenses/by/2.0/,Enrique López-Tamayo Biosca +0fa5f98dd68c4b6d,train,https://open-images-dataset.s3.amazonaws.com/train/0fa5f98dd68c4b6d.jpg,https://www.flickr.com/photos/westher/4987686630,https://creativecommons.org/licenses/by/2.0/,Esther Westerveld +0fac35468ab13880,train,https://open-images-dataset.s3.amazonaws.com/train/0fac35468ab13880.jpg,https://www.flickr.com/photos/perspective/245443149,https://creativecommons.org/licenses/by/2.0/,Elvert Barnes +0fae5de352561972,train,https://open-images-dataset.s3.amazonaws.com/train/0fae5de352561972.jpg,https://www.flickr.com/photos/freecat/4391105367,https://creativecommons.org/licenses/by/2.0/,José Antonio Gil Martínez +0fbc758ec0ba85ff,train,https://open-images-dataset.s3.amazonaws.com/train/0fbc758ec0ba85ff.jpg,https://www.flickr.com/photos/everydaypants/4220699059,https://creativecommons.org/licenses/by/2.0/,ramsey beyer +0fccfcadd9dd3bb6,train,https://open-images-dataset.s3.amazonaws.com/train/0fccfcadd9dd3bb6.jpg,https://www.flickr.com/photos/trondheim_byarkiv/6988966552,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +0fcdc0ca45df8856,train,https://open-images-dataset.s3.amazonaws.com/train/0fcdc0ca45df8856.jpg,https://www.flickr.com/photos/walkingsf/18766049226,https://creativecommons.org/licenses/by/2.0/,Eric Fischer +0fd196e6030341e8,train,https://open-images-dataset.s3.amazonaws.com/train/0fd196e6030341e8.jpg,https://www.flickr.com/photos/75816597@N07/15425432890,https://creativecommons.org/licenses/by/2.0/,Bjarke Liboriussen +0fd5469660eb9e2d,train,https://open-images-dataset.s3.amazonaws.com/train/0fd5469660eb9e2d.jpg,https://www.flickr.com/photos/melisatg/9652231465,https://creativecommons.org/licenses/by/2.0/,MelisaTG +0fdbac2bea92fa8d,train,https://open-images-dataset.s3.amazonaws.com/train/0fdbac2bea92fa8d.jpg,https://www.flickr.com/photos/chrstphre/5815440131,https://creativecommons.org/licenses/by/2.0/,chrstphre ㋛ campbell +0fde1072888dba0f,train,https://open-images-dataset.s3.amazonaws.com/train/0fde1072888dba0f.jpg,https://www.flickr.com/photos/emme-dk/6533268469,https://creativecommons.org/licenses/by/2.0/,Katrine Thielke +0fec68f73048431c,train,https://open-images-dataset.s3.amazonaws.com/train/0fec68f73048431c.jpg,https://www.flickr.com/photos/minnellium/2188432934,https://creativecommons.org/licenses/by/2.0/,Dave Haygarth +0ff13465c4efe50b,train,https://open-images-dataset.s3.amazonaws.com/train/0ff13465c4efe50b.jpg,https://www.flickr.com/photos/jasonparis/21181481881,https://creativecommons.org/licenses/by/2.0/,JasonParis +0ff39a3bc8fead27,train,https://open-images-dataset.s3.amazonaws.com/train/0ff39a3bc8fead27.jpg,https://www.flickr.com/photos/freecat/2022947636,https://creativecommons.org/licenses/by/2.0/,José Antonio Gil Martínez +10083906d1c66928,train,https://open-images-dataset.s3.amazonaws.com/train/10083906d1c66928.jpg,https://www.flickr.com/photos/hankzby/6062145524,https://creativecommons.org/licenses/by/2.0/,Henry Zbyszynski +101bbbcbfde30d6a,train,https://open-images-dataset.s3.amazonaws.com/train/101bbbcbfde30d6a.jpg,https://www.flickr.com/photos/92833011@N00/1880396192,https://creativecommons.org/licenses/by/2.0/,Chris Breeze +101d233b7808c02d,train,https://open-images-dataset.s3.amazonaws.com/train/101d233b7808c02d.jpg,https://www.flickr.com/photos/gonmi/6419356959,https://creativecommons.org/licenses/by/2.0/,Nacho +1030061a4e735878,train,https://open-images-dataset.s3.amazonaws.com/train/1030061a4e735878.jpg,https://www.flickr.com/photos/albertoyoan/8782213272,https://creativecommons.org/licenses/by/2.0/,Alberto Yoan Arego Pulido +103a8c672b0a0ca0,train,https://open-images-dataset.s3.amazonaws.com/train/103a8c672b0a0ca0.jpg,https://www.flickr.com/photos/mamnaimie/16890652040,https://creativecommons.org/licenses/by/2.0/,piotr mamnaimie +1053de3c8b666dbd,train,https://open-images-dataset.s3.amazonaws.com/train/1053de3c8b666dbd.jpg,https://www.flickr.com/photos/28120556@N08/6999913102,https://creativecommons.org/licenses/by/2.0/,gnomonic +10569bdc3ce474d3,train,https://open-images-dataset.s3.amazonaws.com/train/10569bdc3ce474d3.jpg,https://www.flickr.com/photos/29233640@N07/13950935371,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker +1057890b58225a8d,train,https://open-images-dataset.s3.amazonaws.com/train/1057890b58225a8d.jpg,https://www.flickr.com/photos/joostmarkerink/16768980847,https://creativecommons.org/licenses/by/2.0/,Joost Markerink +106261a1909e8b65,train,https://open-images-dataset.s3.amazonaws.com/train/106261a1909e8b65.jpg,https://www.flickr.com/photos/78428166@N00/8259767996/,https://creativecommons.org/licenses/by/2.0/,Tony Alter +108d568d3a4d3fcd,train,https://open-images-dataset.s3.amazonaws.com/train/108d568d3a4d3fcd.jpg,https://www.flickr.com/photos/martius/18610337392,https://creativecommons.org/licenses/by/2.0/,Manuel +109fa8bf9adcdcbb,train,https://open-images-dataset.s3.amazonaws.com/train/109fa8bf9adcdcbb.jpg,https://www.flickr.com/photos/carolyncoles/7497980574,https://creativecommons.org/licenses/by/2.0/,Carolyn Coles +10a2a3303576c0f2,train,https://open-images-dataset.s3.amazonaws.com/train/10a2a3303576c0f2.jpg,https://www.flickr.com/photos/rasmusknutsson/2374319730,https://creativecommons.org/licenses/by/2.0/,Rasmus Zwickson +10af72829120cdbd,train,https://open-images-dataset.s3.amazonaws.com/train/10af72829120cdbd.jpg,https://www.flickr.com/photos/celsoabreu/16995408625,https://creativecommons.org/licenses/by/2.0/,Celso Abreu +10b5bf3f33046f84,train,https://open-images-dataset.s3.amazonaws.com/train/10b5bf3f33046f84.jpg,https://www.flickr.com/photos/lindaburnett/766584635,https://creativecommons.org/licenses/by/2.0/,Linda +10b6232b4d34206f,train,https://open-images-dataset.s3.amazonaws.com/train/10b6232b4d34206f.jpg,https://www.flickr.com/photos/donabelandewen/3909018038,https://creativecommons.org/licenses/by/2.0/,Ewen Roberts +10be0474d0e2b5c1,train,https://open-images-dataset.s3.amazonaws.com/train/10be0474d0e2b5c1.jpg,https://www.flickr.com/photos/jhnnsstnbrg/7241541976,https://creativecommons.org/licenses/by/2.0/,jhnnsstnbrg +10e3faaa870cc052,train,https://open-images-dataset.s3.amazonaws.com/train/10e3faaa870cc052.jpg,https://www.flickr.com/photos/trondheim_byarkiv/3876819231,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +10e5096f57d44182,train,https://open-images-dataset.s3.amazonaws.com/train/10e5096f57d44182.jpg,https://www.flickr.com/photos/bethness/6050711290,https://creativecommons.org/licenses/by/2.0/,beth h +10e7f8cf2b941d93,train,https://open-images-dataset.s3.amazonaws.com/train/10e7f8cf2b941d93.jpg,https://www.flickr.com/photos/psyberartist/8198238428/,https://creativecommons.org/licenses/by/2.0/,psyberartist +10ea074dd7ca39c2,train,https://open-images-dataset.s3.amazonaws.com/train/10ea074dd7ca39c2.jpg,https://www.flickr.com/photos/spine/495141598,https://creativecommons.org/licenses/by/2.0/,rick +10ea35fa4000e0f8,train,https://open-images-dataset.s3.amazonaws.com/train/10ea35fa4000e0f8.jpg,https://www.flickr.com/photos/centralasian/3655334656,https://creativecommons.org/licenses/by/2.0/,cea + +10fb91a39abb10e9,train,https://open-images-dataset.s3.amazonaws.com/train/10fb91a39abb10e9.jpg,https://www.flickr.com/photos/ifengsaelueang/15358681589,https://creativecommons.org/licenses/by/2.0/,Frank Berge +10fd5d7c4fc6b001,train,https://open-images-dataset.s3.amazonaws.com/train/10fd5d7c4fc6b001.jpg,https://www.flickr.com/photos/sherwood-real-estate/15449599056/,https://creativecommons.org/licenses/by/2.0/,Sherwood CC +11010e5358c03be1,train,https://open-images-dataset.s3.amazonaws.com/train/11010e5358c03be1.jpg,https://www.flickr.com/photos/66944824@N05/11110529843,https://creativecommons.org/licenses/by/2.0/,Denis Bocquet +1102a8ac09ba2cdf,train,https://open-images-dataset.s3.amazonaws.com/train/1102a8ac09ba2cdf.jpg,https://www.flickr.com/photos/1234abcd/6694056731,https://creativecommons.org/licenses/by/2.0/,thinboyfatter +11034afde232610c,train,https://open-images-dataset.s3.amazonaws.com/train/11034afde232610c.jpg,https://www.flickr.com/photos/diversey/15784155476,https://creativecommons.org/licenses/by/2.0/,Tony Webster +110b9bc2757d65f2,train,https://open-images-dataset.s3.amazonaws.com/train/110b9bc2757d65f2.jpg,https://www.flickr.com/photos/22865921@N07/2798459107/,https://creativecommons.org/licenses/by/2.0/,Nikki L. +111126cb30e02979,train,https://open-images-dataset.s3.amazonaws.com/train/111126cb30e02979.jpg,https://www.flickr.com/photos/ee_biggs/14255059234,https://creativecommons.org/licenses/by/2.0/,ebiggs vancouver +1118cdffc045e008,train,https://open-images-dataset.s3.amazonaws.com/train/1118cdffc045e008.jpg,https://www.flickr.com/photos/10413717@N08/5696990980,https://creativecommons.org/licenses/by/2.0/,Smabs Sputzer +111ba74486f71240,train,https://open-images-dataset.s3.amazonaws.com/train/111ba74486f71240.jpg,https://www.flickr.com/photos/133450284@N06/18036859549,https://creativecommons.org/licenses/by/2.0/,신일자동문 SWICO +111ccbc58a53fea5,train,https://open-images-dataset.s3.amazonaws.com/train/111ccbc58a53fea5.jpg,https://www.flickr.com/photos/shaneglobal/7038152275,https://creativecommons.org/licenses/by/2.0/,Shane Global +1122de4d19a9f540,train,https://open-images-dataset.s3.amazonaws.com/train/1122de4d19a9f540.jpg,https://www.flickr.com/photos/subraytan/6948946970,https://creativecommons.org/licenses/by/2.0/,Andypiper +1128f86c236f717b,train,https://open-images-dataset.s3.amazonaws.com/train/1128f86c236f717b.jpg,https://www.flickr.com/photos/sergemelki/5128343915,https://creativecommons.org/licenses/by/2.0/,Serge Melki +112d64b1c662f8cd,train,https://open-images-dataset.s3.amazonaws.com/train/112d64b1c662f8cd.jpg,https://www.flickr.com/photos/bradfordcoy/3120393033,https://creativecommons.org/licenses/by/2.0/,Brad Coy +112d6a63fc382636,train,https://open-images-dataset.s3.amazonaws.com/train/112d6a63fc382636.jpg,https://www.flickr.com/photos/gammaman/19383985355,https://creativecommons.org/licenses/by/2.0/,Eli Christman +112e9a23ea2d3ba3,train,https://open-images-dataset.s3.amazonaws.com/train/112e9a23ea2d3ba3.jpg,https://www.flickr.com/photos/94215313@N00/7897713636,https://creativecommons.org/licenses/by/2.0/,Joseph Kranak +1131ab8db4e93455,train,https://open-images-dataset.s3.amazonaws.com/train/1131ab8db4e93455.jpg,https://www.flickr.com/photos/jimmyharris/47683412,https://creativecommons.org/licenses/by/2.0/,Jimmy Harris +1134ace1a48207e2,train,https://open-images-dataset.s3.amazonaws.com/train/1134ace1a48207e2.jpg,https://www.flickr.com/photos/eli-duende/2969254144,https://creativecommons.org/licenses/by/2.0/,Elisabetta +113ece738d078586,train,https://open-images-dataset.s3.amazonaws.com/train/113ece738d078586.jpg,https://www.flickr.com/photos/hagel54/16813399268,https://creativecommons.org/licenses/by/2.0/,Hans Geldmacher - גרשום +1143672f8a89282f,train,https://open-images-dataset.s3.amazonaws.com/train/1143672f8a89282f.jpg,https://www.flickr.com/photos/dhilowitz/3186274200,https://creativecommons.org/licenses/by/2.0/,David Hilowitz +115101dd6d3e160c,train,https://open-images-dataset.s3.amazonaws.com/train/115101dd6d3e160c.jpg,https://www.flickr.com/photos/jakecaptive/7122280233/,https://creativecommons.org/licenses/by/2.0/,Jacob Bøtter +1156244dcbd3b3fc,train,https://open-images-dataset.s3.amazonaws.com/train/1156244dcbd3b3fc.jpg,https://www.flickr.com/photos/reupa/15137712883,https://creativecommons.org/licenses/by/2.0/,K.H.Reichert +116001a179e124b8,train,https://open-images-dataset.s3.amazonaws.com/train/116001a179e124b8.jpg,https://www.flickr.com/photos/alebonvini/17066614778,https://creativecommons.org/licenses/by/2.0/,Alessandro Bonvini +116dd58b7caab287,train,https://open-images-dataset.s3.amazonaws.com/train/116dd58b7caab287.jpg,https://www.flickr.com/photos/govim/10532457876,https://creativecommons.org/licenses/by/2.0/,Isle of Man Government +117146d731a63c7f,train,https://open-images-dataset.s3.amazonaws.com/train/117146d731a63c7f.jpg,https://www.flickr.com/photos/ticicardoso/3996565310,https://creativecommons.org/licenses/by/2.0/,Ticiana Cardoso +1189a13faa0006bd,train,https://open-images-dataset.s3.amazonaws.com/train/1189a13faa0006bd.jpg,https://www.flickr.com/photos/mont_aigoual_causses_cevennes/5953563221,https://creativecommons.org/licenses/by/2.0/,Office de Tourisme Mont Aigoual +11991abc4827ab80,train,https://open-images-dataset.s3.amazonaws.com/train/11991abc4827ab80.jpg,https://www.flickr.com/photos/ninian_reid/16846439865/,https://creativecommons.org/licenses/by/2.0/,Ninian Reid +119c928e745fa45b,train,https://open-images-dataset.s3.amazonaws.com/train/119c928e745fa45b.jpg,https://www.flickr.com/photos/hisgett/5550942874,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett +11a37358d90f48af,train,https://open-images-dataset.s3.amazonaws.com/train/11a37358d90f48af.jpg,https://www.flickr.com/photos/jblndl/10571713214,https://creativecommons.org/licenses/by/2.0/,Môsieur J. [version 9.1] +11b99e96ed5b12a2,train,https://open-images-dataset.s3.amazonaws.com/train/11b99e96ed5b12a2.jpg,https://www.flickr.com/photos/andreasbloch/14786517998,https://creativecommons.org/licenses/by/2.0/,Andreas Bloch +11bee313c4b4622b,train,https://open-images-dataset.s3.amazonaws.com/train/11bee313c4b4622b.jpg,https://www.flickr.com/photos/phideltatheta/14658727378,https://creativecommons.org/licenses/by/2.0/,pdtghq +11c573ed63e2a1c1,train,https://open-images-dataset.s3.amazonaws.com/train/11c573ed63e2a1c1.jpg,https://www.flickr.com/photos/lajolo/11457579934,https://creativecommons.org/licenses/by/2.0/,Roberto Lajolo +11da91191fa58f1f,train,https://open-images-dataset.s3.amazonaws.com/train/11da91191fa58f1f.jpg,https://www.flickr.com/photos/kzaral/4042821126,https://creativecommons.org/licenses/by/2.0/,Kzaral +11e80e6c55775282,train,https://open-images-dataset.s3.amazonaws.com/train/11e80e6c55775282.jpg,https://www.flickr.com/photos/eager/7533893786,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +11f26674f05d7f44,train,https://open-images-dataset.s3.amazonaws.com/train/11f26674f05d7f44.jpg,https://www.flickr.com/photos/ilgoico/8639086773,https://creativecommons.org/licenses/by/2.0/,iñaki lopez +11f49fca0795b7fb,train,https://open-images-dataset.s3.amazonaws.com/train/11f49fca0795b7fb.jpg,https://www.flickr.com/photos/tracyhunter/15753247542,https://creativecommons.org/licenses/by/2.0/,Tracy Hunter +11f7b026f2995c11,train,https://open-images-dataset.s3.amazonaws.com/train/11f7b026f2995c11.jpg,https://www.flickr.com/photos/garryknight/8438233475,https://creativecommons.org/licenses/by/2.0/,Garry Knight +11f9d915f0c5f5ec,train,https://open-images-dataset.s3.amazonaws.com/train/11f9d915f0c5f5ec.jpg,https://www.flickr.com/photos/jeremylevinedesign/3410068861,https://creativecommons.org/licenses/by/2.0/,Jeremy Levine +120ba0bb283fd7bb,train,https://open-images-dataset.s3.amazonaws.com/train/120ba0bb283fd7bb.jpg,https://www.flickr.com/photos/notthe1s/6147491400,https://creativecommons.org/licenses/by/2.0/,Eric Steuer +1210df3b3b8301a9,train,https://open-images-dataset.s3.amazonaws.com/train/1210df3b3b8301a9.jpg,https://www.flickr.com/photos/desmog/14524065390,https://creativecommons.org/licenses/by/2.0/,DeSmogCanada +1216dc848a91ef18,train,https://open-images-dataset.s3.amazonaws.com/train/1216dc848a91ef18.jpg,https://www.flickr.com/photos/xslim/6762802453,https://creativecommons.org/licenses/by/2.0/,Taras Kalapun +121737e20e2075ba,train,https://open-images-dataset.s3.amazonaws.com/train/121737e20e2075ba.jpg,https://www.flickr.com/photos/marksurman/3456867370,https://creativecommons.org/licenses/by/2.0/,Mark Surman +121bc6ed146d3273,train,https://open-images-dataset.s3.amazonaws.com/train/121bc6ed146d3273.jpg,https://www.flickr.com/photos/gatz125/5176666843,https://creativecommons.org/licenses/by/2.0/,Colleen McMahon +1225eb91cb8bc217,train,https://open-images-dataset.s3.amazonaws.com/train/1225eb91cb8bc217.jpg,https://www.flickr.com/photos/is_kyoto_jp/3880568149,https://creativecommons.org/licenses/by/2.0/,Ippei Suzuki +122a9d6fbe9a3430,train,https://open-images-dataset.s3.amazonaws.com/train/122a9d6fbe9a3430.jpg,https://www.flickr.com/photos/sue_elias/11776588633,https://creativecommons.org/licenses/by/2.0/,Sue +1234920f70349411,train,https://open-images-dataset.s3.amazonaws.com/train/1234920f70349411.jpg,https://www.flickr.com/photos/marghe_photos/3527521761,https://creativecommons.org/licenses/by/2.0/,-SayCheese- +124273a65605234d,train,https://open-images-dataset.s3.amazonaws.com/train/124273a65605234d.jpg,https://www.flickr.com/photos/ikermerodio/2905173136,https://creativecommons.org/licenses/by/2.0/,Iker Merodio +12787aa172ea815a,train,https://open-images-dataset.s3.amazonaws.com/train/12787aa172ea815a.jpg,https://www.flickr.com/photos/bosstweed/17202522626,https://creativecommons.org/licenses/by/2.0/,Boss Tweed +12839b891a933779,train,https://open-images-dataset.s3.amazonaws.com/train/12839b891a933779.jpg,https://www.flickr.com/photos/stas_r/15296036876,https://creativecommons.org/licenses/by/2.0/,Stas +1285a749f5eeb296,train,https://open-images-dataset.s3.amazonaws.com/train/1285a749f5eeb296.jpg,https://www.flickr.com/photos/janitors/9469060041,https://creativecommons.org/licenses/by/2.0/,Kārlis Dambrāns +128925b822e5f0f8,train,https://open-images-dataset.s3.amazonaws.com/train/128925b822e5f0f8.jpg,https://www.flickr.com/photos/jmv/15165149741,https://creativecommons.org/licenses/by/2.0/,jmv +1290714b034100c0,train,https://open-images-dataset.s3.amazonaws.com/train/1290714b034100c0.jpg,https://www.flickr.com/photos/ruthanddave/13916884474,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup +12914dbd0a4d7054,train,https://open-images-dataset.s3.amazonaws.com/train/12914dbd0a4d7054.jpg,https://www.flickr.com/photos/ksenia-sm/6721639503,https://creativecommons.org/licenses/by/2.0/,Ksenia Smirnova +1296aeacfcb0ef50,train,https://open-images-dataset.s3.amazonaws.com/train/1296aeacfcb0ef50.jpg,https://www.flickr.com/photos/63837784@N08/16801891052,https://creativecommons.org/licenses/by/2.0/,Ohio Redevelopment Projects - ODSA +129799e150740211,train,https://open-images-dataset.s3.amazonaws.com/train/129799e150740211.jpg,https://www.flickr.com/photos/massimobarbieri/153617324,https://creativecommons.org/licenses/by/2.0/,Massimo Barbieri +12a100361bb95b8b,train,https://open-images-dataset.s3.amazonaws.com/train/12a100361bb95b8b.jpg,https://www.flickr.com/photos/podere-casanova/4151101790,https://creativecommons.org/licenses/by/2.0/,Podere Casanova +12a3c725b824d424,train,https://open-images-dataset.s3.amazonaws.com/train/12a3c725b824d424.jpg,https://www.flickr.com/photos/mikebfotos/8311803099,https://creativecommons.org/licenses/by/2.0/,MICHAEL BROWN +12a6d726a66599db,train,https://open-images-dataset.s3.amazonaws.com/train/12a6d726a66599db.jpg,https://www.flickr.com/photos/celsoabreu/6038702189/,https://creativecommons.org/licenses/by/2.0/,Celso Abreu +12aad059aafe1147,train,https://open-images-dataset.s3.amazonaws.com/train/12aad059aafe1147.jpg,https://www.flickr.com/photos/fanofretail/9220747520,https://creativecommons.org/licenses/by/2.0/,Nicholas Eckhart +12b7ed43b6c6f1fb,train,https://open-images-dataset.s3.amazonaws.com/train/12b7ed43b6c6f1fb.jpg,https://www.flickr.com/photos/phil_fth/7985277137,https://creativecommons.org/licenses/by/2.0/,PFNKIS +12bed48ea35fe9dd,train,https://open-images-dataset.s3.amazonaws.com/train/12bed48ea35fe9dd.jpg,https://www.flickr.com/photos/56155476@N08/5916282074,https://creativecommons.org/licenses/by/2.0/,Brad Flickinger +12ceb0186b1652f2,train,https://open-images-dataset.s3.amazonaws.com/train/12ceb0186b1652f2.jpg,https://www.flickr.com/photos/awrose/7673160230,https://creativecommons.org/licenses/by/2.0/,Adam Rose +12dd957edbd24282,train,https://open-images-dataset.s3.amazonaws.com/train/12dd957edbd24282.jpg,https://www.flickr.com/photos/theonewithout/5486420987/,https://creativecommons.org/licenses/by/2.0/,Gerben Jacobs +12e30ff3b23a688e,train,https://open-images-dataset.s3.amazonaws.com/train/12e30ff3b23a688e.jpg,https://www.flickr.com/photos/therubyring/7489284548,https://creativecommons.org/licenses/by/2.0/,Alex Beattie +12ebd604504f1f09,train,https://open-images-dataset.s3.amazonaws.com/train/12ebd604504f1f09.jpg,https://www.flickr.com/photos/modofodo/16077826670,https://creativecommons.org/licenses/by/2.0/,el-toro +12f23a260f4b3e37,train,https://open-images-dataset.s3.amazonaws.com/train/12f23a260f4b3e37.jpg,https://www.flickr.com/photos/rasmusknutsson/9656713138,https://creativecommons.org/licenses/by/2.0/,Rasmus Zwickson +12ff4eaab1bae4c0,train,https://open-images-dataset.s3.amazonaws.com/train/12ff4eaab1bae4c0.jpg,https://www.flickr.com/photos/letlet/64155216,https://creativecommons.org/licenses/by/2.0/,let² +131d949754df51fc,train,https://open-images-dataset.s3.amazonaws.com/train/131d949754df51fc.jpg,https://www.flickr.com/photos/apreche/20794148431,https://creativecommons.org/licenses/by/2.0/,Scott Rubin +133f7c7f753b8bec,train,https://open-images-dataset.s3.amazonaws.com/train/133f7c7f753b8bec.jpg,https://www.flickr.com/photos/nanymata/496132890,https://creativecommons.org/licenses/by/2.0/,Nany Mata +13441f2738948ff1,train,https://open-images-dataset.s3.amazonaws.com/train/13441f2738948ff1.jpg,https://www.flickr.com/photos/tiarescott/33508159,https://creativecommons.org/licenses/by/2.0/,tiarescott +135ef6b0db10e31d,train,https://open-images-dataset.s3.amazonaws.com/train/135ef6b0db10e31d.jpg,https://www.flickr.com/photos/43557956@N00/2896588714,https://creativecommons.org/licenses/by/2.0/,sportsilliterate +13608aed49e58acb,train,https://open-images-dataset.s3.amazonaws.com/train/13608aed49e58acb.jpg,https://www.flickr.com/photos/balletonirico/7803781274,https://creativecommons.org/licenses/by/2.0/,Nuria Carballo +1360ff5d92d14488,train,https://open-images-dataset.s3.amazonaws.com/train/1360ff5d92d14488.jpg,https://www.flickr.com/photos/leshaines123/6659377603,https://creativecommons.org/licenses/by/2.0/,Les Haines +1364b5c2c60dfee7,train,https://open-images-dataset.s3.amazonaws.com/train/1364b5c2c60dfee7.jpg,https://www.flickr.com/photos/pkovacs/14925458486,https://creativecommons.org/licenses/by/2.0/,kovapete +1385fbde1c85f319,train,https://open-images-dataset.s3.amazonaws.com/train/1385fbde1c85f319.jpg,https://www.flickr.com/photos/666_is_money/6841538912,https://creativecommons.org/licenses/by/2.0/,Raquel Baranow +138921f51136dc91,train,https://open-images-dataset.s3.amazonaws.com/train/138921f51136dc91.jpg,https://www.flickr.com/photos/linobento/6476298781,https://creativecommons.org/licenses/by/2.0/,Lino Bento +1393e5c09cf484f4,train,https://open-images-dataset.s3.amazonaws.com/train/1393e5c09cf484f4.jpg,https://www.flickr.com/photos/psyberartist/7591964002,https://creativecommons.org/licenses/by/2.0/,psyberartist +139a7f0a93f89477,train,https://open-images-dataset.s3.amazonaws.com/train/139a7f0a93f89477.jpg,https://www.flickr.com/photos/30733371@N00/17127035033,https://creativecommons.org/licenses/by/2.0/,spotter_nl +139e4324cb71b3a8,train,https://open-images-dataset.s3.amazonaws.com/train/139e4324cb71b3a8.jpg,https://www.flickr.com/photos/onthewhiteline/8635763362,https://creativecommons.org/licenses/by/2.0/,Corey Taratuta +13a21b218129f79a,train,https://open-images-dataset.s3.amazonaws.com/train/13a21b218129f79a.jpg,https://www.flickr.com/photos/tahini/12954222054,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +13a40b40ed2c4f36,train,https://open-images-dataset.s3.amazonaws.com/train/13a40b40ed2c4f36.jpg,https://www.flickr.com/photos/trondheim_byarkiv/6988966144,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +13a4dc33c80c12f5,train,https://open-images-dataset.s3.amazonaws.com/train/13a4dc33c80c12f5.jpg,https://www.flickr.com/photos/kuruman/19230787691,https://creativecommons.org/licenses/by/2.0/,Kuruman +13ae7332516c6c3b,train,https://open-images-dataset.s3.amazonaws.com/train/13ae7332516c6c3b.jpg,https://www.flickr.com/photos/hisgett/4980059925,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett +13b534ed49b41b38,train,https://open-images-dataset.s3.amazonaws.com/train/13b534ed49b41b38.jpg,https://www.flickr.com/photos/karen_roe/4161898147,https://creativecommons.org/licenses/by/2.0/,Karen Roe +13c7c13fe0641285,train,https://open-images-dataset.s3.amazonaws.com/train/13c7c13fe0641285.jpg,https://www.flickr.com/photos/mdpettitt/7865897284,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt +13ce43216bfa3491,train,https://open-images-dataset.s3.amazonaws.com/train/13ce43216bfa3491.jpg,https://www.flickr.com/photos/rejfl/2689295611,https://creativecommons.org/licenses/by/2.0/,Raphael Schön +13cf69cfd86a2a66,train,https://open-images-dataset.s3.amazonaws.com/train/13cf69cfd86a2a66.jpg,https://www.flickr.com/photos/aubergene/380456522,https://creativecommons.org/licenses/by/2.0/,Julian Burgess +13d2b9441eabdcc2,train,https://open-images-dataset.s3.amazonaws.com/train/13d2b9441eabdcc2.jpg,https://www.flickr.com/photos/dalbera/8154074741,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalbéra +13dc05d1fcc83cd4,train,https://open-images-dataset.s3.amazonaws.com/train/13dc05d1fcc83cd4.jpg,https://www.flickr.com/photos/martl/2366644445,https://creativecommons.org/licenses/by/2.0/,heartbeaz +13e7f80d9280dd6f,train,https://open-images-dataset.s3.amazonaws.com/train/13e7f80d9280dd6f.jpg,https://www.flickr.com/photos/brostad/5819058706,https://creativecommons.org/licenses/by/2.0/,Bernt Rostad +13f2f9b7f37862e0,train,https://open-images-dataset.s3.amazonaws.com/train/13f2f9b7f37862e0.jpg,https://www.flickr.com/photos/projectart69/8482489696,https://creativecommons.org/licenses/by/2.0/,Artondra Hall +13fddd572074a012,train,https://open-images-dataset.s3.amazonaws.com/train/13fddd572074a012.jpg,https://www.flickr.com/photos/lisawilliams/882005568,https://creativecommons.org/licenses/by/2.0/,Lisa Williams +1411ff8461b59eeb,train,https://open-images-dataset.s3.amazonaws.com/train/1411ff8461b59eeb.jpg,https://www.flickr.com/photos/jordanschulz/8918746122,https://creativecommons.org/licenses/by/2.0/,Jordan Schulz +14289cd16128871e,train,https://open-images-dataset.s3.amazonaws.com/train/14289cd16128871e.jpg,https://www.flickr.com/photos/mcfadden1978/8277360375,https://creativecommons.org/licenses/by/2.0/,Mark McFadden +142ddd1065a648ce,train,https://open-images-dataset.s3.amazonaws.com/train/142ddd1065a648ce.jpg,https://www.flickr.com/photos/larrison/14053569738,https://creativecommons.org/licenses/by/2.0/,Jim Larrison +142ed86dd8070982,train,https://open-images-dataset.s3.amazonaws.com/train/142ed86dd8070982.jpg,https://www.flickr.com/photos/59923990@N05/15514313849,https://creativecommons.org/licenses/by/2.0/,Picturepest +14367cffe8bdaee2,train,https://open-images-dataset.s3.amazonaws.com/train/14367cffe8bdaee2.jpg,https://www.flickr.com/photos/62510442@N06/5717963635,https://creativecommons.org/licenses/by/2.0/,Erin van V +1449bb895a076efb,train,https://open-images-dataset.s3.amazonaws.com/train/1449bb895a076efb.jpg,https://www.flickr.com/photos/kendylyoung/9301182499,https://creativecommons.org/licenses/by/2.0/,Kendyl Young +144d0487fa7efa2f,train,https://open-images-dataset.s3.amazonaws.com/train/144d0487fa7efa2f.jpg,https://www.flickr.com/photos/hugocadavez/3097436143,https://creativecommons.org/licenses/by/2.0/,Hugo Cadavez +144f5774bfc273e6,train,https://open-images-dataset.s3.amazonaws.com/train/144f5774bfc273e6.jpg,https://www.flickr.com/photos/97877859@N03/14051920049,https://creativecommons.org/licenses/by/2.0/,Estorweb .com +144fe9e264d48181,train,https://open-images-dataset.s3.amazonaws.com/train/144fe9e264d48181.jpg,https://www.flickr.com/photos/fenwench/15266474059,https://creativecommons.org/licenses/by/2.0/,fenwench +14554384e83bb07d,train,https://open-images-dataset.s3.amazonaws.com/train/14554384e83bb07d.jpg,https://www.flickr.com/photos/77913019@N00/2331027705,https://creativecommons.org/licenses/by/2.0/,Rob Loftis +14729806f01d2ee8,train,https://open-images-dataset.s3.amazonaws.com/train/14729806f01d2ee8.jpg,https://www.flickr.com/photos/avramishin/15991654933,https://creativecommons.org/licenses/by/2.0/,avramishin33 +14755dea126e8391,train,https://open-images-dataset.s3.amazonaws.com/train/14755dea126e8391.jpg,https://www.flickr.com/photos/aloha75/4984867700,https://creativecommons.org/licenses/by/2.0/,Sam Howzit +148673c739a153d7,train,https://open-images-dataset.s3.amazonaws.com/train/148673c739a153d7.jpg,https://www.flickr.com/photos/uned/8703608973,https://creativecommons.org/licenses/by/2.0/,UNED Universidad Nacional de Educación a Distancia +149535f3c6556bea,train,https://open-images-dataset.s3.amazonaws.com/train/149535f3c6556bea.jpg,https://www.flickr.com/photos/eager/11831707554,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +149b512661b7ed41,train,https://open-images-dataset.s3.amazonaws.com/train/149b512661b7ed41.jpg,https://www.flickr.com/photos/calliope/3650677777,https://creativecommons.org/licenses/by/2.0/,liz west +14a19da86e946431,train,https://open-images-dataset.s3.amazonaws.com/train/14a19da86e946431.jpg,https://www.flickr.com/photos/pasa/8481005082,https://creativecommons.org/licenses/by/2.0/,Paul Sableman +14b9cb2d17d8d549,train,https://open-images-dataset.s3.amazonaws.com/train/14b9cb2d17d8d549.jpg,https://www.flickr.com/photos/martijnmunneke/4865768452,https://creativecommons.org/licenses/by/2.0/,Martijn.Munneke +14c3a797faccc715,train,https://open-images-dataset.s3.amazonaws.com/train/14c3a797faccc715.jpg,https://www.flickr.com/photos/jadis1958/4932112882,https://creativecommons.org/licenses/by/2.0/,Anja Disseldorp +14c57ecc2893fe4b,train,https://open-images-dataset.s3.amazonaws.com/train/14c57ecc2893fe4b.jpg,https://www.flickr.com/photos/fegavronski/16626917980,https://creativecommons.org/licenses/by/2.0/,Felipe Gavronski +14d43d7629360ba8,train,https://open-images-dataset.s3.amazonaws.com/train/14d43d7629360ba8.jpg,https://www.flickr.com/photos/94693506@N00/1470281131,https://creativecommons.org/licenses/by/2.0/,Nina Hale +14e16156f0d909ac,train,https://open-images-dataset.s3.amazonaws.com/train/14e16156f0d909ac.jpg,https://www.flickr.com/photos/harshlight/5003622248/,https://creativecommons.org/licenses/by/2.0/,HarshLight +14e1f3d8d404b9a8,train,https://open-images-dataset.s3.amazonaws.com/train/14e1f3d8d404b9a8.jpg,https://www.flickr.com/photos/16782093@N03/11825244736,https://creativecommons.org/licenses/by/2.0/,Metro Centric +14ecd015c99a6358,train,https://open-images-dataset.s3.amazonaws.com/train/14ecd015c99a6358.jpg,https://www.flickr.com/photos/78428166@N00/13965386617,https://creativecommons.org/licenses/by/2.0/,Tony Alter +14ed8e79f33f459c,train,https://open-images-dataset.s3.amazonaws.com/train/14ed8e79f33f459c.jpg,https://www.flickr.com/photos/bfs_man/6608634495,https://creativecommons.org/licenses/by/2.0/,Mike Fisher +14eee1911872efc7,train,https://open-images-dataset.s3.amazonaws.com/train/14eee1911872efc7.jpg,https://www.flickr.com/photos/yodudedan/148601203,https://creativecommons.org/licenses/by/2.0/,Dan +14f471a24ccfca9b,train,https://open-images-dataset.s3.amazonaws.com/train/14f471a24ccfca9b.jpg,https://www.flickr.com/photos/the-o/4226395921,https://creativecommons.org/licenses/by/2.0/,David Ohmer +14f793885165c958,train,https://open-images-dataset.s3.amazonaws.com/train/14f793885165c958.jpg,https://www.flickr.com/photos/loughboroughuniversitylibrary/8357916932,https://creativecommons.org/licenses/by/2.0/,Loughborough University Library +14fa2573165205e0,train,https://open-images-dataset.s3.amazonaws.com/train/14fa2573165205e0.jpg,https://www.flickr.com/photos/nagarjun/16877589888,https://creativecommons.org/licenses/by/2.0/,Nagarjun Kandukuru +1503a5ce2f0215e1,train,https://open-images-dataset.s3.amazonaws.com/train/1503a5ce2f0215e1.jpg,https://www.flickr.com/photos/georgeparrilla/2781014688,https://creativecommons.org/licenses/by/2.0/,George Parrilla +1515dbe04f9508a4,train,https://open-images-dataset.s3.amazonaws.com/train/1515dbe04f9508a4.jpg,https://www.flickr.com/photos/atoach/15271187085,https://creativecommons.org/licenses/by/2.0/,Tim Green +1518cfab4f837025,train,https://open-images-dataset.s3.amazonaws.com/train/1518cfab4f837025.jpg,https://www.flickr.com/photos/crown_molding/5456666193,https://creativecommons.org/licenses/by/2.0/,Brian Moloney +1521acfdba93e5a0,train,https://open-images-dataset.s3.amazonaws.com/train/1521acfdba93e5a0.jpg,https://www.flickr.com/photos/mihalorel/277576247,https://creativecommons.org/licenses/by/2.0/,Михал Орела +1534a59c949e177c,train,https://open-images-dataset.s3.amazonaws.com/train/1534a59c949e177c.jpg,https://www.flickr.com/photos/samcockman/4675052358,https://creativecommons.org/licenses/by/2.0/,Samuel Cockman +15465c892a658aae,train,https://open-images-dataset.s3.amazonaws.com/train/15465c892a658aae.jpg,https://www.flickr.com/photos/davidwilson1949/6444327605,https://creativecommons.org/licenses/by/2.0/,David Wilson +154c656a60c8e616,train,https://open-images-dataset.s3.amazonaws.com/train/154c656a60c8e616.jpg,https://www.flickr.com/photos/arileu/17811527249,https://creativecommons.org/licenses/by/2.0/,arileu +155b8749ac29377a,train,https://open-images-dataset.s3.amazonaws.com/train/155b8749ac29377a.jpg,https://www.flickr.com/photos/hills_alive/4781512559,https://creativecommons.org/licenses/by/2.0/,Caroline +155c245f90d476f0,train,https://open-images-dataset.s3.amazonaws.com/train/155c245f90d476f0.jpg,https://www.flickr.com/photos/mikolski/6823284563,https://creativecommons.org/licenses/by/2.0/,Milosz1 +155c33173b8c4bfc,train,https://open-images-dataset.s3.amazonaws.com/train/155c33173b8c4bfc.jpg,https://www.flickr.com/photos/etwood/5606374177,https://creativecommons.org/licenses/by/2.0/,Evan Wood +155fae8b8682bba7,train,https://open-images-dataset.s3.amazonaws.com/train/155fae8b8682bba7.jpg,https://www.flickr.com/photos/lianza/3724800628,https://creativecommons.org/licenses/by/2.0/,Tom Lianza +1562d6a7054627c0,train,https://open-images-dataset.s3.amazonaws.com/train/1562d6a7054627c0.jpg,https://www.flickr.com/photos/hmcramer/6583410119,https://creativecommons.org/licenses/by/2.0/,Hans_Martin +15734e07ffc554d1,train,https://open-images-dataset.s3.amazonaws.com/train/15734e07ffc554d1.jpg,https://www.flickr.com/photos/listento/11675645496/,https://creativecommons.org/licenses/by/2.0/,Karam Al-Ghossein +157e47e917fd846c,train,https://open-images-dataset.s3.amazonaws.com/train/157e47e917fd846c.jpg,https://www.flickr.com/photos/in_rainbows69/8092547835,https://creativecommons.org/licenses/by/2.0/,ღ ℂℏ℟ḯʂ ღ +1580c6567d5a9015,train,https://open-images-dataset.s3.amazonaws.com/train/1580c6567d5a9015.jpg,https://www.flickr.com/photos/southbeachcars/13768275743,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar +158ab8858f7c424e,train,https://open-images-dataset.s3.amazonaws.com/train/158ab8858f7c424e.jpg,https://www.flickr.com/photos/51417107@N03/5063715235,https://creativecommons.org/licenses/by/2.0/,LaurPhil +1592605732059d34,train,https://open-images-dataset.s3.amazonaws.com/train/1592605732059d34.jpg,https://www.flickr.com/photos/heretakis/7014707591/,https://creativecommons.org/licenses/by/2.0/,Lefteris Heretakis +15944f4df377239a,train,https://open-images-dataset.s3.amazonaws.com/train/15944f4df377239a.jpg,https://www.flickr.com/photos/cogdog/8763608710,https://creativecommons.org/licenses/by/2.0/,Alan Levine +15b2590e312ff4a5,train,https://open-images-dataset.s3.amazonaws.com/train/15b2590e312ff4a5.jpg,https://www.flickr.com/photos/24429031@N06/17383548455,https://creativecommons.org/licenses/by/2.0/,nschouterden +15b474f54a348dd0,train,https://open-images-dataset.s3.amazonaws.com/train/15b474f54a348dd0.jpg,https://www.flickr.com/photos/tipsfortravellers/2082960634,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge +15b4f3a6c8edb922,train,https://open-images-dataset.s3.amazonaws.com/train/15b4f3a6c8edb922.jpg,https://www.flickr.com/photos/selmer/5371268236,https://creativecommons.org/licenses/by/2.0/,Selmer van Alten +15b657ee40312b9c,train,https://open-images-dataset.s3.amazonaws.com/train/15b657ee40312b9c.jpg,https://www.flickr.com/photos/mbschlemmer/6176110101,https://creativecommons.org/licenses/by/2.0/,Mark B. Schlemmer +15e938643a48aee6,train,https://open-images-dataset.s3.amazonaws.com/train/15e938643a48aee6.jpg,https://www.flickr.com/photos/tinkerszone/4969503117/,https://creativecommons.org/licenses/by/2.0/,tinkerbrad +15fac38e63d994e5,train,https://open-images-dataset.s3.amazonaws.com/train/15fac38e63d994e5.jpg,https://www.flickr.com/photos/huwt/5579639793,https://creativecommons.org/licenses/by/2.0/,Huw Thomas +15fb12ebecfd0283,train,https://open-images-dataset.s3.amazonaws.com/train/15fb12ebecfd0283.jpg,https://www.flickr.com/photos/wordridden/6357647403,https://creativecommons.org/licenses/by/2.0/,Jessica Spengler +15fd6bd957338029,train,https://open-images-dataset.s3.amazonaws.com/train/15fd6bd957338029.jpg,https://www.flickr.com/photos/gabycamaton/9420329726,https://creativecommons.org/licenses/by/2.0/,Gabriela Camaton +1607460487ede109,train,https://open-images-dataset.s3.amazonaws.com/train/1607460487ede109.jpg,https://www.flickr.com/photos/cayobo/7811808598,https://creativecommons.org/licenses/by/2.0/,Cayobo +160fb38b2a652164,train,https://open-images-dataset.s3.amazonaws.com/train/160fb38b2a652164.jpg,https://www.flickr.com/photos/osseous/983396182,https://creativecommons.org/licenses/by/2.0/,osseous +161d7a305377e67c,train,https://open-images-dataset.s3.amazonaws.com/train/161d7a305377e67c.jpg,https://www.flickr.com/photos/hisgett/5544089643,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett +1626085967bceeb8,train,https://open-images-dataset.s3.amazonaws.com/train/1626085967bceeb8.jpg,https://www.flickr.com/photos/panr/4529230450,https://creativecommons.org/licenses/by/2.0/,Robert Cutts +163500befc176b51,train,https://open-images-dataset.s3.amazonaws.com/train/163500befc176b51.jpg,https://www.flickr.com/photos/karen_roe/15527155364,https://creativecommons.org/licenses/by/2.0/,Karen Roe +1637138db0948e17,train,https://open-images-dataset.s3.amazonaws.com/train/1637138db0948e17.jpg,https://www.flickr.com/photos/90664717@N00/331859249,https://creativecommons.org/licenses/by/2.0/,Akuppa John Wigham +1638631b0f5b5d6b,train,https://open-images-dataset.s3.amazonaws.com/train/1638631b0f5b5d6b.jpg,https://www.flickr.com/photos/danja/132892921,https://creativecommons.org/licenses/by/2.0/,Danny Ayers +1640c4deecd54a8d,train,https://open-images-dataset.s3.amazonaws.com/train/1640c4deecd54a8d.jpg,https://www.flickr.com/photos/micronova/4550150676,https://creativecommons.org/licenses/by/2.0/,Afshin Darian +16449f432c08138f,train,https://open-images-dataset.s3.amazonaws.com/train/16449f432c08138f.jpg,https://www.flickr.com/photos/mackinac/14701034447,https://creativecommons.org/licenses/by/2.0/,Mary McGuire | Mackinac Design +16483717a6764805,train,https://open-images-dataset.s3.amazonaws.com/train/16483717a6764805.jpg,https://www.flickr.com/photos/jedimentat/5012846516,https://creativecommons.org/licenses/by/2.0/,Jedimentat44 +16543b24d3c50b55,train,https://open-images-dataset.s3.amazonaws.com/train/16543b24d3c50b55.jpg,https://www.flickr.com/photos/83015819@N00/5786391191,https://creativecommons.org/licenses/by/2.0/,Jon Worth +165dc153b1ffb6ef,train,https://open-images-dataset.s3.amazonaws.com/train/165dc153b1ffb6ef.jpg,https://www.flickr.com/photos/dberry/2860101847,https://creativecommons.org/licenses/by/2.0/,David Berry +1662cc6a20fade7c,train,https://open-images-dataset.s3.amazonaws.com/train/1662cc6a20fade7c.jpg,https://www.flickr.com/photos/futuredu/11564096955,https://creativecommons.org/licenses/by/2.0/,Marcin Polak +16751b11672a4ebf,train,https://open-images-dataset.s3.amazonaws.com/train/16751b11672a4ebf.jpg,https://www.flickr.com/photos/mauring/4695634282,https://creativecommons.org/licenses/by/2.0/,Tõnu Mauring +16767d9b5d98f7ae,train,https://open-images-dataset.s3.amazonaws.com/train/16767d9b5d98f7ae.jpg,https://www.flickr.com/photos/en321/2407141781,https://creativecommons.org/licenses/by/2.0/,Susan Sermoneta +168032cb2086ea9d,train,https://open-images-dataset.s3.amazonaws.com/train/168032cb2086ea9d.jpg,https://www.flickr.com/photos/paytonc/15431992759,https://creativecommons.org/licenses/by/2.0/,Payton Chung +1681299a6fae1206,train,https://open-images-dataset.s3.amazonaws.com/train/1681299a6fae1206.jpg,https://www.flickr.com/photos/127399779@N06/16801323932,https://creativecommons.org/licenses/by/2.0/,Quinten Van Hoecke +16895afdfccb5904,train,https://open-images-dataset.s3.amazonaws.com/train/16895afdfccb5904.jpg,https://www.flickr.com/photos/26101489@N00/8336231725,https://creativecommons.org/licenses/by/2.0/,Say-no +16938725df3e7bde,train,https://open-images-dataset.s3.amazonaws.com/train/16938725df3e7bde.jpg,https://www.flickr.com/photos/crabchick/2550698537,https://creativecommons.org/licenses/by/2.0/,crabchick +16a383d7d1c88f71,train,https://open-images-dataset.s3.amazonaws.com/train/16a383d7d1c88f71.jpg,https://www.flickr.com/photos/amal-fm/8915650789,https://creativecommons.org/licenses/by/2.0/,Amal FM +16b7be7b4ab8a237,train,https://open-images-dataset.s3.amazonaws.com/train/16b7be7b4ab8a237.jpg,https://www.flickr.com/photos/rainsong/16625112949,https://creativecommons.org/licenses/by/2.0/,Ali from Riyadh : ) +16bc5ce3c8e0fbd1,train,https://open-images-dataset.s3.amazonaws.com/train/16bc5ce3c8e0fbd1.jpg,https://www.flickr.com/photos/126473520@N07/20586397722,https://creativecommons.org/licenses/by/2.0/,Camino Granado +16bcf6f3d9d2c917,train,https://open-images-dataset.s3.amazonaws.com/train/16bcf6f3d9d2c917.jpg,https://www.flickr.com/photos/annahape-gallery/3683046433,https://creativecommons.org/licenses/by/2.0/,Anna Hape +16bff61f94890f07,train,https://open-images-dataset.s3.amazonaws.com/train/16bff61f94890f07.jpg,https://www.flickr.com/photos/steenbergs/7455757100,https://creativecommons.org/licenses/by/2.0/,Steenbergs +16c7adb6a8e28488,train,https://open-images-dataset.s3.amazonaws.com/train/16c7adb6a8e28488.jpg,https://www.flickr.com/photos/gonmi/15773169982,https://creativecommons.org/licenses/by/2.0/,Nacho +16d29dbb95b9a3f9,train,https://open-images-dataset.s3.amazonaws.com/train/16d29dbb95b9a3f9.jpg,https://www.flickr.com/photos/miamism/6963513175,https://creativecommons.org/licenses/by/2.0/,Ines Hegedus-Garcia +16d9ff372cd6f1c2,train,https://open-images-dataset.s3.amazonaws.com/train/16d9ff372cd6f1c2.jpg,https://www.flickr.com/photos/eager/13951167987,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +16e8cbd246dd1137,train,https://open-images-dataset.s3.amazonaws.com/train/16e8cbd246dd1137.jpg,https://www.flickr.com/photos/sensinct/6866077421,https://creativecommons.org/licenses/by/2.0/,Brian Pirie +16ecfc2083dbe580,train,https://open-images-dataset.s3.amazonaws.com/train/16ecfc2083dbe580.jpg,https://www.flickr.com/photos/mdpettitt/1775007292,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt +16ee8c7305d75037,train,https://open-images-dataset.s3.amazonaws.com/train/16ee8c7305d75037.jpg,https://www.flickr.com/photos/hankzby/8492404984,https://creativecommons.org/licenses/by/2.0/,Henry Zbyszynski +173944a713c161b8,train,https://open-images-dataset.s3.amazonaws.com/train/173944a713c161b8.jpg,https://www.flickr.com/photos/damo1977/4398216713,https://creativecommons.org/licenses/by/2.0/,damo1977 +173bc4a7fc2a4d42,train,https://open-images-dataset.s3.amazonaws.com/train/173bc4a7fc2a4d42.jpg,https://www.flickr.com/photos/ruthsphotos/12902092293,https://creativecommons.org/licenses/by/2.0/,skniht_em +17675c40ab4d0d3c,train,https://open-images-dataset.s3.amazonaws.com/train/17675c40ab4d0d3c.jpg,https://www.flickr.com/photos/21524179@N08/4360919174,https://creativecommons.org/licenses/by/2.0/,nerissa's ring +17690bb929be47ed,train,https://open-images-dataset.s3.amazonaws.com/train/17690bb929be47ed.jpg,https://www.flickr.com/photos/reddevilaustria/5775533366,https://creativecommons.org/licenses/by/2.0/,reddevilaustria +176d10afa1b7b525,train,https://open-images-dataset.s3.amazonaws.com/train/176d10afa1b7b525.jpg,https://www.flickr.com/photos/ffg/5068962406,https://creativecommons.org/licenses/by/2.0/,Dave Walker +176e1462149ae3d7,train,https://open-images-dataset.s3.amazonaws.com/train/176e1462149ae3d7.jpg,https://www.flickr.com/photos/mister-e/1788033663,https://creativecommons.org/licenses/by/2.0/,Chris Eason +1780273ce8b8201f,train,https://open-images-dataset.s3.amazonaws.com/train/1780273ce8b8201f.jpg,https://www.flickr.com/photos/16782093@N03/10351622424,https://creativecommons.org/licenses/by/2.0/,Metro Centric +1781e65b46670dee,train,https://open-images-dataset.s3.amazonaws.com/train/1781e65b46670dee.jpg,https://www.flickr.com/photos/eager/4918152757,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +17884f73202b990a,train,https://open-images-dataset.s3.amazonaws.com/train/17884f73202b990a.jpg,https://www.flickr.com/photos/rafaelrobles/3656344469,https://creativecommons.org/licenses/by/2.0/,Rafael Robles +178e1e3bb7a03ca6,train,https://open-images-dataset.s3.amazonaws.com/train/178e1e3bb7a03ca6.jpg,https://www.flickr.com/photos/superadrianme/15760358039,https://creativecommons.org/licenses/by/2.0/,SUPERADRIANME +178e4945b46fd447,train,https://open-images-dataset.s3.amazonaws.com/train/178e4945b46fd447.jpg,https://www.flickr.com/photos/21655750@N00/26837179,https://creativecommons.org/licenses/by/2.0/,_details_ +1790017b26f9d5f0,train,https://open-images-dataset.s3.amazonaws.com/train/1790017b26f9d5f0.jpg,https://www.flickr.com/photos/rob-young/9410035076,https://creativecommons.org/licenses/by/2.0/,Rob Young +1790d285250139b9,train,https://open-images-dataset.s3.amazonaws.com/train/1790d285250139b9.jpg,https://www.flickr.com/photos/lucagalli/9306086885,https://creativecommons.org/licenses/by/2.0/,Luca Galli +17b020c95802041a,train,https://open-images-dataset.s3.amazonaws.com/train/17b020c95802041a.jpg,https://www.flickr.com/photos/okfn/6471565787,https://creativecommons.org/licenses/by/2.0/,Open Knowledge +17bf1c4deb8d84c0,train,https://open-images-dataset.s3.amazonaws.com/train/17bf1c4deb8d84c0.jpg,https://www.flickr.com/photos/gregerravik/16168943298,https://creativecommons.org/licenses/by/2.0/,Greger Ravik +17c5410016a75457,train,https://open-images-dataset.s3.amazonaws.com/train/17c5410016a75457.jpg,https://www.flickr.com/photos/oatsy40/10382007503,https://creativecommons.org/licenses/by/2.0/,oatsy40 +17c79b1293e46c85,train,https://open-images-dataset.s3.amazonaws.com/train/17c79b1293e46c85.jpg,https://www.flickr.com/photos/robertlylebolton/7804702936,https://creativecommons.org/licenses/by/2.0/,Robert Lyle Bolton +17c8604437697c9b,train,https://open-images-dataset.s3.amazonaws.com/train/17c8604437697c9b.jpg,https://www.flickr.com/photos/ukanda/518980242,https://creativecommons.org/licenses/by/2.0/,Upendra Kanda +17d27a8cf69083ae,train,https://open-images-dataset.s3.amazonaws.com/train/17d27a8cf69083ae.jpg,https://www.flickr.com/photos/skin_ubx/5465843415,https://creativecommons.org/licenses/by/2.0/,Skin - ubx +17d3bc4ee030c1d5,train,https://open-images-dataset.s3.amazonaws.com/train/17d3bc4ee030c1d5.jpg,https://www.flickr.com/photos/brighton/7549636932,https://creativecommons.org/licenses/by/2.0/,Jim Linwood +17d4ad6f6b46db2f,train,https://open-images-dataset.s3.amazonaws.com/train/17d4ad6f6b46db2f.jpg,https://www.flickr.com/photos/gcourbis/371113707,https://creativecommons.org/licenses/by/2.0/,Grace +17d649575dd48970,train,https://open-images-dataset.s3.amazonaws.com/train/17d649575dd48970.jpg,https://www.flickr.com/photos/is_kyoto_jp/8646832225,https://creativecommons.org/licenses/by/2.0/,Ippei Suzuki +17dd6f65a44edafa,train,https://open-images-dataset.s3.amazonaws.com/train/17dd6f65a44edafa.jpg,https://www.flickr.com/photos/uudenkaupunginmuseo/21080520280,https://creativecommons.org/licenses/by/2.0/,Museo Uusikaupunki +17e5887f3147f13a,train,https://open-images-dataset.s3.amazonaws.com/train/17e5887f3147f13a.jpg,https://www.flickr.com/photos/21804434@N02/3210325906,https://creativecommons.org/licenses/by/2.0/,mira66 +17f65b937f017d0e,train,https://open-images-dataset.s3.amazonaws.com/train/17f65b937f017d0e.jpg,https://www.flickr.com/photos/rubenholthuijsen/11843013363,https://creativecommons.org/licenses/by/2.0/,Ruben Holthuijsen +181219ac338b1049,train,https://open-images-dataset.s3.amazonaws.com/train/181219ac338b1049.jpg,https://www.flickr.com/photos/frankieroberto/3396092198,https://creativecommons.org/licenses/by/2.0/,Frankie Roberto +1818c383981a2000,train,https://open-images-dataset.s3.amazonaws.com/train/1818c383981a2000.jpg,https://www.flickr.com/photos/109536074@N05/14455464999,https://creativecommons.org/licenses/by/2.0/,tetedelart1855 +1818f8296586feb8,train,https://open-images-dataset.s3.amazonaws.com/train/1818f8296586feb8.jpg,https://www.flickr.com/photos/locosteve/5392633899,https://creativecommons.org/licenses/by/2.0/,Loco Steve +1819c471aa08d923,train,https://open-images-dataset.s3.amazonaws.com/train/1819c471aa08d923.jpg,https://www.flickr.com/photos/uriba/18626040,https://creativecommons.org/licenses/by/2.0/,Uri Baruchin +1826143d511c78e3,train,https://open-images-dataset.s3.amazonaws.com/train/1826143d511c78e3.jpg,https://www.flickr.com/photos/eguidetravel/6098818785,https://creativecommons.org/licenses/by/2.0/,eGuide Travel +18292cf8ef465813,train,https://open-images-dataset.s3.amazonaws.com/train/18292cf8ef465813.jpg,https://www.flickr.com/photos/tanaka_juuyoh/5419136087,https://creativecommons.org/licenses/by/2.0/,TANAKA Juuyoh (田中十洋) +182c8e199e5dea29,train,https://open-images-dataset.s3.amazonaws.com/train/182c8e199e5dea29.jpg,https://www.flickr.com/photos/galfred/145720430,https://creativecommons.org/licenses/by/2.0/,Gail Frederick +1831d273a6f0ee34,train,https://open-images-dataset.s3.amazonaws.com/train/1831d273a6f0ee34.jpg,https://www.flickr.com/photos/39908901@N06/7206986494,https://creativecommons.org/licenses/by/2.0/,m01229 +1836d33528e5f9f1,train,https://open-images-dataset.s3.amazonaws.com/train/1836d33528e5f9f1.jpg,https://www.flickr.com/photos/markhillary/13577898473,https://creativecommons.org/licenses/by/2.0/,Mark Hillary +1837dc26c684ec20,train,https://open-images-dataset.s3.amazonaws.com/train/1837dc26c684ec20.jpg,https://www.flickr.com/photos/brostad/8722930942,https://creativecommons.org/licenses/by/2.0/,Bernt Rostad +1842b9f5dc220048,train,https://open-images-dataset.s3.amazonaws.com/train/1842b9f5dc220048.jpg,https://www.flickr.com/photos/heatheronhertravels/2405928078,https://creativecommons.org/licenses/by/2.0/,Heather Cowper +18532495fa7d6f3d,train,https://open-images-dataset.s3.amazonaws.com/train/18532495fa7d6f3d.jpg,https://www.flickr.com/photos/14519665@N05/11880068175/,https://creativecommons.org/licenses/by/2.0/,Adam Lehman +185f03883af3b1c8,train,https://open-images-dataset.s3.amazonaws.com/train/185f03883af3b1c8.jpg,https://www.flickr.com/photos/ell-r-brown/5441194223,https://creativecommons.org/licenses/by/2.0/,Elliott Brown +185ff692d1e7e34a,train,https://open-images-dataset.s3.amazonaws.com/train/185ff692d1e7e34a.jpg,https://www.flickr.com/photos/fotorita/73215777,https://creativecommons.org/licenses/by/2.0/,Rita M. +18826262e5c685c2,train,https://open-images-dataset.s3.amazonaws.com/train/18826262e5c685c2.jpg,https://www.flickr.com/photos/gastev/4337563250,https://creativecommons.org/licenses/by/2.0/,Mirko Tobias Schäfer +1884b94f04486992,train,https://open-images-dataset.s3.amazonaws.com/train/1884b94f04486992.jpg,https://www.flickr.com/photos/kenarroni/12684967693,https://creativecommons.org/licenses/by/2.0/,Ken M +18856ba1bd53a6e3,train,https://open-images-dataset.s3.amazonaws.com/train/18856ba1bd53a6e3.jpg,https://www.flickr.com/photos/nahemoth/12547101403,https://creativecommons.org/licenses/by/2.0/,=Nahemoth= (absent for a while) +188d4f5ac3381062,train,https://open-images-dataset.s3.amazonaws.com/train/188d4f5ac3381062.jpg,https://www.flickr.com/photos/lisa_yarost/210032647,https://creativecommons.org/licenses/by/2.0/,Lisa Yarost +1890e24e2c1c70f9,train,https://open-images-dataset.s3.amazonaws.com/train/1890e24e2c1c70f9.jpg,https://www.flickr.com/photos/45909111@N00/10883224646,https://creativecommons.org/licenses/by/2.0/,Gwydion M. Williams +18abd084b3382d97,train,https://open-images-dataset.s3.amazonaws.com/train/18abd084b3382d97.jpg,https://www.flickr.com/photos/bilk/2736765748,https://creativecommons.org/licenses/by/2.0/,Leszek Kozlowski +18ba5a9f610b41bc,train,https://open-images-dataset.s3.amazonaws.com/train/18ba5a9f610b41bc.jpg,https://www.flickr.com/photos/triplemimg/7384623288,https://creativecommons.org/licenses/by/2.0/,Muhammad Mansour +18bfbacde1383818,train,https://open-images-dataset.s3.amazonaws.com/train/18bfbacde1383818.jpg,https://www.flickr.com/photos/trondheim_byarkiv/6917796458,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +18d08133c517a9e1,train,https://open-images-dataset.s3.amazonaws.com/train/18d08133c517a9e1.jpg,https://www.flickr.com/photos/panr/4189441353,https://creativecommons.org/licenses/by/2.0/,Robert Cutts +18e47b8139925474,train,https://open-images-dataset.s3.amazonaws.com/train/18e47b8139925474.jpg,https://www.flickr.com/photos/alphalex/20382136139,https://creativecommons.org/licenses/by/2.0/,Alessandro Caneve +18edd129bb741382,train,https://open-images-dataset.s3.amazonaws.com/train/18edd129bb741382.jpg,https://www.flickr.com/photos/conanil/3002838276,https://creativecommons.org/licenses/by/2.0/,Conan +1900833715d9de15,train,https://open-images-dataset.s3.amazonaws.com/train/1900833715d9de15.jpg,https://www.flickr.com/photos/joebielawa/3692998946,https://creativecommons.org/licenses/by/2.0/,Joe Bielawa +190878b1f1d0c25e,train,https://open-images-dataset.s3.amazonaws.com/train/190878b1f1d0c25e.jpg,https://www.flickr.com/photos/eager/7406502282,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +190fc3b73ea6798e,train,https://open-images-dataset.s3.amazonaws.com/train/190fc3b73ea6798e.jpg,https://www.flickr.com/photos/trondheim_byarkiv/16051981949,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +1918d770dfbca325,train,https://open-images-dataset.s3.amazonaws.com/train/1918d770dfbca325.jpg,https://www.flickr.com/photos/loestamosgrabando/2083170102,https://creativecommons.org/licenses/by/2.0/,loestamosgrabando +1921fd00261af75c,train,https://open-images-dataset.s3.amazonaws.com/train/1921fd00261af75c.jpg,https://www.flickr.com/photos/ell-r-brown/8723398325,https://creativecommons.org/licenses/by/2.0/,Elliott Brown +1923c0c2d945a5bc,train,https://open-images-dataset.s3.amazonaws.com/train/1923c0c2d945a5bc.jpg,https://www.flickr.com/photos/92682792@N00/4700395835,https://creativecommons.org/licenses/by/2.0/,gravitat-OFF +192ef0284a8a7490,train,https://open-images-dataset.s3.amazonaws.com/train/192ef0284a8a7490.jpg,https://www.flickr.com/photos/27892629@N04/6008329822,https://creativecommons.org/licenses/by/2.0/,Caroline Léna Becker +193d1741d00ce3fe,train,https://open-images-dataset.s3.amazonaws.com/train/193d1741d00ce3fe.jpg,https://www.flickr.com/photos/jries/3409145521,https://creativecommons.org/licenses/by/2.0/,Jean & Nathalie +194145284df7a299,train,https://open-images-dataset.s3.amazonaws.com/train/194145284df7a299.jpg,https://www.flickr.com/photos/moe/165727740,https://creativecommons.org/licenses/by/2.0/,Stephan Mosel +195f89ed0b9a1b02,train,https://open-images-dataset.s3.amazonaws.com/train/195f89ed0b9a1b02.jpg,https://www.flickr.com/photos/gillyberlin/2345432474/,https://creativecommons.org/licenses/by/2.0/,GillyBerlin +1963b2856999e56f,train,https://open-images-dataset.s3.amazonaws.com/train/1963b2856999e56f.jpg,https://www.flickr.com/photos/94693506@N00/442798666,https://creativecommons.org/licenses/by/2.0/,Nina Hale +19684faacf824a50,train,https://open-images-dataset.s3.amazonaws.com/train/19684faacf824a50.jpg,https://www.flickr.com/photos/katiebordner/6746741649,https://creativecommons.org/licenses/by/2.0/,katiebordner +197328ad5638aeda,train,https://open-images-dataset.s3.amazonaws.com/train/197328ad5638aeda.jpg,https://www.flickr.com/photos/roland/383875775,https://creativecommons.org/licenses/by/2.0/,Roland Tanglao +198daa0cb6008996,train,https://open-images-dataset.s3.amazonaws.com/train/198daa0cb6008996.jpg,https://www.flickr.com/photos/edwin11/491287288,https://creativecommons.org/licenses/by/2.0/,edwin.11 +19af786524f141f0,train,https://open-images-dataset.s3.amazonaws.com/train/19af786524f141f0.jpg,https://www.flickr.com/photos/37553027@N02/6389755109,https://creativecommons.org/licenses/by/2.0/,Lucy Fisher +19b9a23038b658c8,train,https://open-images-dataset.s3.amazonaws.com/train/19b9a23038b658c8.jpg,https://www.flickr.com/photos/southbeachcars/16683602104,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar +19d020cc3625812c,train,https://open-images-dataset.s3.amazonaws.com/train/19d020cc3625812c.jpg,https://www.flickr.com/photos/ipeguy/7386718012,https://creativecommons.org/licenses/by/2.0/,Jeff Hart +19d7f46d9dd582d7,train,https://open-images-dataset.s3.amazonaws.com/train/19d7f46d9dd582d7.jpg,https://www.flickr.com/photos/23609673@N05/15322625507,https://creativecommons.org/licenses/by/2.0/,Alejandro Zürcher +19d9bacd5c56d05d,train,https://open-images-dataset.s3.amazonaws.com/train/19d9bacd5c56d05d.jpg,https://www.flickr.com/photos/jamiejohn/5747617297,https://creativecommons.org/licenses/by/2.0/,Jamie Davies +19df1f463b313d75,train,https://open-images-dataset.s3.amazonaws.com/train/19df1f463b313d75.jpg,https://www.flickr.com/photos/torsten-behrens/6170555468/,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens +19e1a13ea269c931,train,https://open-images-dataset.s3.amazonaws.com/train/19e1a13ea269c931.jpg,https://www.flickr.com/photos/bmiphone/10035185154,https://creativecommons.org/licenses/by/2.0/,bm.iphone +19e9007336be0400,train,https://open-images-dataset.s3.amazonaws.com/train/19e9007336be0400.jpg,https://www.flickr.com/photos/39965300@N07/14879654860,https://creativecommons.org/licenses/by/2.0/,Mike +19ea8f99e6ba17de,train,https://open-images-dataset.s3.amazonaws.com/train/19ea8f99e6ba17de.jpg,https://www.flickr.com/photos/harlequeen/4204788128,https://creativecommons.org/licenses/by/2.0/,Neil McIntosh +19ee174488ed3691,train,https://open-images-dataset.s3.amazonaws.com/train/19ee174488ed3691.jpg,https://www.flickr.com/photos/rezlab/2400386510/,https://creativecommons.org/licenses/by/2.0/,Greg Balzer +19efbef3344ac1c4,train,https://open-images-dataset.s3.amazonaws.com/train/19efbef3344ac1c4.jpg,https://www.flickr.com/photos/luigi-barone/14331661914,https://creativecommons.org/licenses/by/2.0/,Luigi Barone +19f0bb0376ab6d82,train,https://open-images-dataset.s3.amazonaws.com/train/19f0bb0376ab6d82.jpg,https://www.flickr.com/photos/haijue_pokka/4664860954,https://creativecommons.org/licenses/by/2.0/,haikal Othman +19fd3843a1d9958e,train,https://open-images-dataset.s3.amazonaws.com/train/19fd3843a1d9958e.jpg,https://www.flickr.com/photos/58964293@N00/3860428773,https://creativecommons.org/licenses/by/2.0/,David Miller +1a035d8054b4a915,train,https://open-images-dataset.s3.amazonaws.com/train/1a035d8054b4a915.jpg,https://www.flickr.com/photos/eshank/10738781276,https://creativecommons.org/licenses/by/2.0/,Eshank Sehgal +1a0de11ff19a4bc3,train,https://open-images-dataset.s3.amazonaws.com/train/1a0de11ff19a4bc3.jpg,https://www.flickr.com/photos/rubbermaid/4525784414,https://creativecommons.org/licenses/by/2.0/,Rubbermaid Products +1a166e5fde726ab7,train,https://open-images-dataset.s3.amazonaws.com/train/1a166e5fde726ab7.jpg,https://www.flickr.com/photos/gonmi/8682432725,https://creativecommons.org/licenses/by/2.0/,Nacho +1a1fd8f9355f0298,train,https://open-images-dataset.s3.amazonaws.com/train/1a1fd8f9355f0298.jpg,https://www.flickr.com/photos/erwinrommel/4624521195,https://creativecommons.org/licenses/by/2.0/,Torsten Maue +1a2192efd06462ea,train,https://open-images-dataset.s3.amazonaws.com/train/1a2192efd06462ea.jpg,https://www.flickr.com/photos/32421400@N04/6041175775,https://creativecommons.org/licenses/by/2.0/,Eladio Anxo Fernández Manso +1a260df96d2b31f9,train,https://open-images-dataset.s3.amazonaws.com/train/1a260df96d2b31f9.jpg,https://www.flickr.com/photos/63837784@N08/11571426704,https://creativecommons.org/licenses/by/2.0/,Ohio Redevelopment Projects - ODSA +1a29800305bf1331,train,https://open-images-dataset.s3.amazonaws.com/train/1a29800305bf1331.jpg,https://www.flickr.com/photos/studiospecialplace/2824306697,https://creativecommons.org/licenses/by/2.0/,Michael Herzog +1a3360a53ee1a186,train,https://open-images-dataset.s3.amazonaws.com/train/1a3360a53ee1a186.jpg,https://www.flickr.com/photos/rob-young/8264533086,https://creativecommons.org/licenses/by/2.0/,Rob Young +1a3c106ff64ae13f,train,https://open-images-dataset.s3.amazonaws.com/train/1a3c106ff64ae13f.jpg,https://www.flickr.com/photos/groovysoup/7734074650,https://creativecommons.org/licenses/by/2.0/,Dave Newman +1a3ddf5ea8bbf7ee,train,https://open-images-dataset.s3.amazonaws.com/train/1a3ddf5ea8bbf7ee.jpg,https://www.flickr.com/photos/lordcolus/3947152193,https://creativecommons.org/licenses/by/2.0/,Lordcolus +1a4dc5fd93a9525b,train,https://open-images-dataset.s3.amazonaws.com/train/1a4dc5fd93a9525b.jpg,https://www.flickr.com/photos/27149250@N00/2396416286,https://creativecommons.org/licenses/by/2.0/,CFAGELNYC +1a69495bb7ad0be6,train,https://open-images-dataset.s3.amazonaws.com/train/1a69495bb7ad0be6.jpg,https://www.flickr.com/photos/oclcpar/3619240123/,https://creativecommons.org/licenses/by/2.0/,OCLC Research +1a7c0f61692e04e9,train,https://open-images-dataset.s3.amazonaws.com/train/1a7c0f61692e04e9.jpg,https://www.flickr.com/photos/schmilblick/4802208278,https://creativecommons.org/licenses/by/2.0/,schmilblick +1a7eee3106ea1b0d,train,https://open-images-dataset.s3.amazonaws.com/train/1a7eee3106ea1b0d.jpg,https://www.flickr.com/photos/alfsan/4833261382,https://creativecommons.org/licenses/by/2.0/,kuma chan +1a89d774017a3617,train,https://open-images-dataset.s3.amazonaws.com/train/1a89d774017a3617.jpg,https://www.flickr.com/photos/southbeachcars/14490363403,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar +1a8e51662a62a5f5,train,https://open-images-dataset.s3.amazonaws.com/train/1a8e51662a62a5f5.jpg,https://www.flickr.com/photos/bortescristian/2358557659,https://creativecommons.org/licenses/by/2.0/,Cristian Bortes +1a8ec78a66126322,train,https://open-images-dataset.s3.amazonaws.com/train/1a8ec78a66126322.jpg,https://www.flickr.com/photos/frankieroberto/3396124798,https://creativecommons.org/licenses/by/2.0/,Frankie Roberto +1a92a536ea1083dd,train,https://open-images-dataset.s3.amazonaws.com/train/1a92a536ea1083dd.jpg,https://www.flickr.com/photos/emme-dk/2507483283,https://creativecommons.org/licenses/by/2.0/,Katrine Thielke +1a98a294cbace03c,train,https://open-images-dataset.s3.amazonaws.com/train/1a98a294cbace03c.jpg,https://www.flickr.com/photos/vanceypants/4896087286,https://creativecommons.org/licenses/by/2.0/,vanceypants +1ab02d33966cc194,train,https://open-images-dataset.s3.amazonaws.com/train/1ab02d33966cc194.jpg,https://www.flickr.com/photos/eltb/6151958212,https://creativecommons.org/licenses/by/2.0/,Enrique López-Tamayo Biosca +1ab167834800fdbe,train,https://open-images-dataset.s3.amazonaws.com/train/1ab167834800fdbe.jpg,https://www.flickr.com/photos/tanaka_juuyoh/2468364631,https://creativecommons.org/licenses/by/2.0/,TANAKA Juuyoh (田中十洋) +1ab87e04415864f8,train,https://open-images-dataset.s3.amazonaws.com/train/1ab87e04415864f8.jpg,https://www.flickr.com/photos/kendoerr/7188057743,https://creativecommons.org/licenses/by/2.0/,Ken Doerr +1ac8ae3d14b2acf7,train,https://open-images-dataset.s3.amazonaws.com/train/1ac8ae3d14b2acf7.jpg,https://www.flickr.com/photos/brostad/5939426825,https://creativecommons.org/licenses/by/2.0/,Bernt Rostad +1ac92d4b22aaad00,train,https://open-images-dataset.s3.amazonaws.com/train/1ac92d4b22aaad00.jpg,https://www.flickr.com/photos/ersupalermo/6168852006,https://creativecommons.org/licenses/by/2.0/,ersupalermo +1ad4d7f840031822,train,https://open-images-dataset.s3.amazonaws.com/train/1ad4d7f840031822.jpg,https://www.flickr.com/photos/freecat/427222053,https://creativecommons.org/licenses/by/2.0/,José Antonio Gil Martínez +1ae20e1b61fb2fea,train,https://open-images-dataset.s3.amazonaws.com/train/1ae20e1b61fb2fea.jpg,https://www.flickr.com/photos/cflava/232105634,https://creativecommons.org/licenses/by/2.0/,cheryl flava +1ae48ce441d287f3,train,https://open-images-dataset.s3.amazonaws.com/train/1ae48ce441d287f3.jpg,https://www.flickr.com/photos/walschots/11812306724,https://creativecommons.org/licenses/by/2.0/,Pascal Walschots +1ae7f766a90b46b4,train,https://open-images-dataset.s3.amazonaws.com/train/1ae7f766a90b46b4.jpg,https://www.flickr.com/photos/butterflysha/93361759,https://creativecommons.org/licenses/by/2.0/,fly +1aebfed59c870b63,train,https://open-images-dataset.s3.amazonaws.com/train/1aebfed59c870b63.jpg,https://www.flickr.com/photos/momentfoto/11174073186,https://creativecommons.org/licenses/by/2.0/,Alex Muller +1aff1a221934fb13,train,https://open-images-dataset.s3.amazonaws.com/train/1aff1a221934fb13.jpg,https://www.flickr.com/photos/kyz/11982867,https://creativecommons.org/licenses/by/2.0/,Stuart Caie +1b021a190111c714,train,https://open-images-dataset.s3.amazonaws.com/train/1b021a190111c714.jpg,https://www.flickr.com/photos/14528084@N02/11414213516,https://creativecommons.org/licenses/by/2.0/,Fernando Cordova +1b0799b83550d1bb,train,https://open-images-dataset.s3.amazonaws.com/train/1b0799b83550d1bb.jpg,https://www.flickr.com/photos/danbricklin/14795235185,https://creativecommons.org/licenses/by/2.0/,Dan Bricklin +1b0ec7cadf8015b2,train,https://open-images-dataset.s3.amazonaws.com/train/1b0ec7cadf8015b2.jpg,https://www.flickr.com/photos/bazzadarambler/3965617644,https://creativecommons.org/licenses/by/2.0/,bazzadaramblerimages +1b155fa6cf5d831d,train,https://open-images-dataset.s3.amazonaws.com/train/1b155fa6cf5d831d.jpg,https://www.flickr.com/photos/ell-r-brown/4877314964,https://creativecommons.org/licenses/by/2.0/,Elliott Brown +1b18dd2677e391e8,train,https://open-images-dataset.s3.amazonaws.com/train/1b18dd2677e391e8.jpg,https://www.flickr.com/photos/23024164@N06/4683208755/,https://creativecommons.org/licenses/by/2.0/,Damian Gadal +1b23a50b2c278b6b,train,https://open-images-dataset.s3.amazonaws.com/train/1b23a50b2c278b6b.jpg,https://www.flickr.com/photos/marlondias/5045030488,https://creativecommons.org/licenses/by/2.0/,Marlon Dias +1b2849c2f283f132,train,https://open-images-dataset.s3.amazonaws.com/train/1b2849c2f283f132.jpg,https://www.flickr.com/photos/timwilson/7007833113,https://creativecommons.org/licenses/by/2.0/,Tim Wilson +1b38a0ec773f20bc,train,https://open-images-dataset.s3.amazonaws.com/train/1b38a0ec773f20bc.jpg,https://www.flickr.com/photos/jfanaian/5405382052,https://creativecommons.org/licenses/by/2.0/,Jamal Fanaian +1b3e088749927766,train,https://open-images-dataset.s3.amazonaws.com/train/1b3e088749927766.jpg,https://www.flickr.com/photos/rictor-and-david/8750719209,https://creativecommons.org/licenses/by/2.0/,Rictor Norton & David Allen +1b4ffeb50315fb7a,train,https://open-images-dataset.s3.amazonaws.com/train/1b4ffeb50315fb7a.jpg,https://www.flickr.com/photos/lazymonkey/293803304,https://creativecommons.org/licenses/by/2.0/,Bess Sadler +1b55a39426148104,train,https://open-images-dataset.s3.amazonaws.com/train/1b55a39426148104.jpg,https://www.flickr.com/photos/ileohidalgo/12330395344,https://creativecommons.org/licenses/by/2.0/,Leo Hidalgo +1b55ebeefe095d4e,train,https://open-images-dataset.s3.amazonaws.com/train/1b55ebeefe095d4e.jpg,https://www.flickr.com/photos/huhezi/16642050091,https://creativecommons.org/licenses/by/2.0/,HUHEZI (Mondragon Unibertsitatea) +1b5fcab5f1dc55db,train,https://open-images-dataset.s3.amazonaws.com/train/1b5fcab5f1dc55db.jpg,https://www.flickr.com/photos/fillmorephotography/293618716,https://creativecommons.org/licenses/by/2.0/,Michael Chen +1b6bcb5558642696,train,https://open-images-dataset.s3.amazonaws.com/train/1b6bcb5558642696.jpg,https://www.flickr.com/photos/kaffeeringe/14437964162,https://creativecommons.org/licenses/by/2.0/,Steffen Voß +1b7d5c5b4de48a46,train,https://open-images-dataset.s3.amazonaws.com/train/1b7d5c5b4de48a46.jpg,https://www.flickr.com/photos/michaeljohnbutton/11671038206,https://creativecommons.org/licenses/by/2.0/,Michael Button +1b7fbe1e229fd9d3,train,https://open-images-dataset.s3.amazonaws.com/train/1b7fbe1e229fd9d3.jpg,https://www.flickr.com/photos/smemon/9556311231,https://creativecommons.org/licenses/by/2.0/,Sean MacEntee +1b83b0a34fb24098,train,https://open-images-dataset.s3.amazonaws.com/train/1b83b0a34fb24098.jpg,https://www.flickr.com/photos/cogdog/5493690229,https://creativecommons.org/licenses/by/2.0/,Alan Levine +1b8ac3dbcd3824c4,train,https://open-images-dataset.s3.amazonaws.com/train/1b8ac3dbcd3824c4.jpg,https://www.flickr.com/photos/18091975@N00/4071317421,https://creativecommons.org/licenses/by/2.0/,Eoin Gardiner +1b9e6900648b1cc3,train,https://open-images-dataset.s3.amazonaws.com/train/1b9e6900648b1cc3.jpg,https://www.flickr.com/photos/cynthiacloskey/3023378431,https://creativecommons.org/licenses/by/2.0/,Cynthia Closkey +1bbb62e560467215,train,https://open-images-dataset.s3.amazonaws.com/train/1bbb62e560467215.jpg,https://www.flickr.com/photos/gonmi/14867595347/,https://creativecommons.org/licenses/by/2.0/,Nacho +1bd132f28fbf38eb,train,https://open-images-dataset.s3.amazonaws.com/train/1bd132f28fbf38eb.jpg,https://www.flickr.com/photos/southbeachcars/4911660492,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar +1be290011d9cb398,train,https://open-images-dataset.s3.amazonaws.com/train/1be290011d9cb398.jpg,https://www.flickr.com/photos/brighton/16031913973,https://creativecommons.org/licenses/by/2.0/,Jim Linwood +1be36518ba775e78,train,https://open-images-dataset.s3.amazonaws.com/train/1be36518ba775e78.jpg,https://www.flickr.com/photos/komunews/15373546157,https://creativecommons.org/licenses/by/2.0/,KOMUnews +1c031b76dd0aeded,train,https://open-images-dataset.s3.amazonaws.com/train/1c031b76dd0aeded.jpg,https://www.flickr.com/photos/mountjoy/9661723943,https://creativecommons.org/licenses/by/2.0/,Jon Mountjoy +1c0bd5259fe81888,train,https://open-images-dataset.s3.amazonaws.com/train/1c0bd5259fe81888.jpg,https://www.flickr.com/photos/corporatienl/16388023221,https://creativecommons.org/licenses/by/2.0/,CorporatieNL +1c0fd2d4f4620c07,train,https://open-images-dataset.s3.amazonaws.com/train/1c0fd2d4f4620c07.jpg,https://www.flickr.com/photos/jfairbairn/389750871,https://creativecommons.org/licenses/by/2.0/,James Fairbairn +1c0fe7b3e0078d70,train,https://open-images-dataset.s3.amazonaws.com/train/1c0fe7b3e0078d70.jpg,https://www.flickr.com/photos/fotoblasete/5647127099/,https://creativecommons.org/licenses/by/2.0/,José Antonio Alonso +1c116556f57bb931,train,https://open-images-dataset.s3.amazonaws.com/train/1c116556f57bb931.jpg,https://www.flickr.com/photos/stevendepolo/1076734073,https://creativecommons.org/licenses/by/2.0/,Steven Depolo +1c1f29b12a2365e8,train,https://open-images-dataset.s3.amazonaws.com/train/1c1f29b12a2365e8.jpg,https://www.flickr.com/photos/wikimapa/6220704249,https://creativecommons.org/licenses/by/2.0/,Wikimapa +1c1f36a53ac75115,train,https://open-images-dataset.s3.amazonaws.com/train/1c1f36a53ac75115.jpg,https://www.flickr.com/photos/faceme/4334398815,https://creativecommons.org/licenses/by/2.0/,FaceMePLS +1c3960e8fe0a50b8,train,https://open-images-dataset.s3.amazonaws.com/train/1c3960e8fe0a50b8.jpg,https://www.flickr.com/photos/bortescristian/3926954140/,https://creativecommons.org/licenses/by/2.0/,Cristian Bortes +1c3b4a9fa6577daa,train,https://open-images-dataset.s3.amazonaws.com/train/1c3b4a9fa6577daa.jpg,https://www.flickr.com/photos/leomei/6971750660,https://creativecommons.org/licenses/by/2.0/,Lin Mei +1c423b83ceac1324,train,https://open-images-dataset.s3.amazonaws.com/train/1c423b83ceac1324.jpg,https://www.flickr.com/photos/dalbera/8150677456,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalbéra +1c4262fcceb0e523,train,https://open-images-dataset.s3.amazonaws.com/train/1c4262fcceb0e523.jpg,https://www.flickr.com/photos/26675187@N03/3279931883,https://creativecommons.org/licenses/by/2.0/,danzil raines +1c443527a9bb27f7,train,https://open-images-dataset.s3.amazonaws.com/train/1c443527a9bb27f7.jpg,https://www.flickr.com/photos/26834393@N04/16520884746,https://creativecommons.org/licenses/by/2.0/,jjandchris +1c4e4d75d9092fc7,train,https://open-images-dataset.s3.amazonaws.com/train/1c4e4d75d9092fc7.jpg,https://www.flickr.com/photos/londonmatt/18233499169,https://creativecommons.org/licenses/by/2.0/,Matt Brown +1c50fdf58640b57b,train,https://open-images-dataset.s3.amazonaws.com/train/1c50fdf58640b57b.jpg,https://www.flickr.com/photos/73416633@N00/298301778,https://creativecommons.org/licenses/by/2.0/,Sandra Cohen-Rose and Colin Rose +1c663e6f8ae07caa,train,https://open-images-dataset.s3.amazonaws.com/train/1c663e6f8ae07caa.jpg,https://www.flickr.com/photos/tahini/17046590910,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +1c6ac8cbcdbbb1cd,train,https://open-images-dataset.s3.amazonaws.com/train/1c6ac8cbcdbbb1cd.jpg,https://www.flickr.com/photos/decorativeconcrete/21381584629,https://creativecommons.org/licenses/by/2.0/,Decorative Concrete Kingdom +1c6fbe79b9440d01,train,https://open-images-dataset.s3.amazonaws.com/train/1c6fbe79b9440d01.jpg,https://www.flickr.com/photos/scaredykat/16001422579,https://creativecommons.org/licenses/by/2.0/,Krista +1c729a81e7657801,train,https://open-images-dataset.s3.amazonaws.com/train/1c729a81e7657801.jpg,https://www.flickr.com/photos/diloz/9898884545,https://creativecommons.org/licenses/by/2.0/,Azlan DuPree +1c87fe994ad4ee6b,train,https://open-images-dataset.s3.amazonaws.com/train/1c87fe994ad4ee6b.jpg,https://www.flickr.com/photos/49889874@N05/8291855463,https://creativecommons.org/licenses/by/2.0/,marc falardeau +1c907c1c8439c669,train,https://open-images-dataset.s3.amazonaws.com/train/1c907c1c8439c669.jpg,https://www.flickr.com/photos/gordon_watt/7312864396,https://creativecommons.org/licenses/by/2.0/,Gordon Watt +1c909cede62e1624,train,https://open-images-dataset.s3.amazonaws.com/train/1c909cede62e1624.jpg,https://www.flickr.com/photos/128275472@N07/16783350766/,https://creativecommons.org/licenses/by/2.0/,Raita Futo +1c91fc460094a53f,train,https://open-images-dataset.s3.amazonaws.com/train/1c91fc460094a53f.jpg,https://www.flickr.com/photos/cosimo-roams/4550186302,https://creativecommons.org/licenses/by/2.0/,Cosimo Roams +1c9c07460a72dd69,train,https://open-images-dataset.s3.amazonaws.com/train/1c9c07460a72dd69.jpg,https://www.flickr.com/photos/39908901@N06/7318046614,https://creativecommons.org/licenses/by/2.0/,m01229 +1c9ecd2a9e83c932,train,https://open-images-dataset.s3.amazonaws.com/train/1c9ecd2a9e83c932.jpg,https://www.flickr.com/photos/jlastras/2710481594/,https://creativecommons.org/licenses/by/2.0/,Javier Lastras +1ca132ffcf81607a,train,https://open-images-dataset.s3.amazonaws.com/train/1ca132ffcf81607a.jpg,https://www.flickr.com/photos/apreche/232790449,https://creativecommons.org/licenses/by/2.0/,Scott Rubin +1cb4bda7e65a86fb,train,https://open-images-dataset.s3.amazonaws.com/train/1cb4bda7e65a86fb.jpg,https://www.flickr.com/photos/ken_mayer/3637797175,https://creativecommons.org/licenses/by/2.0/,Ken Mayer +1cbc82156579f5dd,train,https://open-images-dataset.s3.amazonaws.com/train/1cbc82156579f5dd.jpg,https://www.flickr.com/photos/blondinrikard/14760723065/,https://creativecommons.org/licenses/by/2.0/,Blondinrikard Fröberg +1cbe010d49efa3be,train,https://open-images-dataset.s3.amazonaws.com/train/1cbe010d49efa3be.jpg,https://www.flickr.com/photos/nnova/3335254225,https://creativecommons.org/licenses/by/2.0/,Nicolas Nova +1cc919e1ed5a71e1,train,https://open-images-dataset.s3.amazonaws.com/train/1cc919e1ed5a71e1.jpg,https://www.flickr.com/photos/tupwanders/1936599117,https://creativecommons.org/licenses/by/2.0/,tup wanders +1ccd10e9526511d0,train,https://open-images-dataset.s3.amazonaws.com/train/1ccd10e9526511d0.jpg,https://www.flickr.com/photos/behdad/20450746,https://creativecommons.org/licenses/by/2.0/,Behdad Esfahbod +1cd53056b2eec0df,train,https://open-images-dataset.s3.amazonaws.com/train/1cd53056b2eec0df.jpg,https://www.flickr.com/photos/ben124/11014191934,https://creativecommons.org/licenses/by/2.0/,Berit Watkin +1ce87bd118ce7ce8,train,https://open-images-dataset.s3.amazonaws.com/train/1ce87bd118ce7ce8.jpg,https://www.flickr.com/photos/eekim/4798347040,https://creativecommons.org/licenses/by/2.0/,Eugene Kim +1d01e2a7bebbb07f,train,https://open-images-dataset.s3.amazonaws.com/train/1d01e2a7bebbb07f.jpg,https://www.flickr.com/photos/kylaborg/11295925766,https://creativecommons.org/licenses/by/2.0/,KylaBorg +1d05f63fa8d0b663,train,https://open-images-dataset.s3.amazonaws.com/train/1d05f63fa8d0b663.jpg,https://www.flickr.com/photos/20940650@N07/10641661435,https://creativecommons.org/licenses/by/2.0/,Geoffrey Rhodes +1d0e6bb123befc16,train,https://open-images-dataset.s3.amazonaws.com/train/1d0e6bb123befc16.jpg,https://www.flickr.com/photos/trondheim_byarkiv/4922968930,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +1d190b833510a89e,train,https://open-images-dataset.s3.amazonaws.com/train/1d190b833510a89e.jpg,https://www.flickr.com/photos/pavdw/4064093937/,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf +1d34c160662e21f8,train,https://open-images-dataset.s3.amazonaws.com/train/1d34c160662e21f8.jpg,https://www.flickr.com/photos/herry/5309620826,https://creativecommons.org/licenses/by/2.0/,Herry Lawford +1d351356aae9166d,train,https://open-images-dataset.s3.amazonaws.com/train/1d351356aae9166d.jpg,https://www.flickr.com/photos/gordon_watt/16043026577,https://creativecommons.org/licenses/by/2.0/,Gordon Watt +1d4dfb8c9d7e0855,train,https://open-images-dataset.s3.amazonaws.com/train/1d4dfb8c9d7e0855.jpg,https://www.flickr.com/photos/crdot/7245813350,https://creativecommons.org/licenses/by/2.0/,Caleb Roenigk +1d4ed98c3e40ee5e,train,https://open-images-dataset.s3.amazonaws.com/train/1d4ed98c3e40ee5e.jpg,https://www.flickr.com/photos/washingtoncanard/7780783378,https://creativecommons.org/licenses/by/2.0/,William Beutler +1d6c4b46b2760bf8,train,https://open-images-dataset.s3.amazonaws.com/train/1d6c4b46b2760bf8.jpg,https://www.flickr.com/photos/ulift/19729598598,https://creativecommons.org/licenses/by/2.0/,WEi WEi +1d9fde5535d88224,train,https://open-images-dataset.s3.amazonaws.com/train/1d9fde5535d88224.jpg,https://www.flickr.com/photos/bootbearwdc/215388576,https://creativecommons.org/licenses/by/2.0/,David +1da3e2d76039109b,train,https://open-images-dataset.s3.amazonaws.com/train/1da3e2d76039109b.jpg,https://www.flickr.com/photos/126673529@N02/15038376057,https://creativecommons.org/licenses/by/2.0/,hmmmayor +1daf1be31f383a06,train,https://open-images-dataset.s3.amazonaws.com/train/1daf1be31f383a06.jpg,https://www.flickr.com/photos/uair01/8501376590,https://creativecommons.org/licenses/by/2.0/,P K +1dbd25069c5d5a55,train,https://open-images-dataset.s3.amazonaws.com/train/1dbd25069c5d5a55.jpg,https://www.flickr.com/photos/tahini/11497821986,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +1dc29a692234829b,train,https://open-images-dataset.s3.amazonaws.com/train/1dc29a692234829b.jpg,https://www.flickr.com/photos/andymag/8740721439,https://creativecommons.org/licenses/by/2.0/,Andy Maguire +1dc89c4dfc048cda,train,https://open-images-dataset.s3.amazonaws.com/train/1dc89c4dfc048cda.jpg,https://www.flickr.com/photos/sandipb/8926850,https://creativecommons.org/licenses/by/2.0/,Sandip Bhattacharya +1dd0ad7c0c11f9f5,train,https://open-images-dataset.s3.amazonaws.com/train/1dd0ad7c0c11f9f5.jpg,https://www.flickr.com/photos/hintsa/12205187486,https://creativecommons.org/licenses/by/2.0/,Mark Hintsa +1dd0f1694a398290,train,https://open-images-dataset.s3.amazonaws.com/train/1dd0f1694a398290.jpg,https://www.flickr.com/photos/freecat/7378736994,https://creativecommons.org/licenses/by/2.0/,José Antonio Gil Martínez +1dd41d099a497005,train,https://open-images-dataset.s3.amazonaws.com/train/1dd41d099a497005.jpg,https://www.flickr.com/photos/84554176@N00/8613305989,https://creativecommons.org/licenses/by/2.0/,Guillaume Baviere +1dd52f2b5fc3b6aa,train,https://open-images-dataset.s3.amazonaws.com/train/1dd52f2b5fc3b6aa.jpg,https://www.flickr.com/photos/rrrtem/7013581583,https://creativecommons.org/licenses/by/2.0/,Zaytsev Artem +1dd909d86b8b5c76,train,https://open-images-dataset.s3.amazonaws.com/train/1dd909d86b8b5c76.jpg,https://www.flickr.com/photos/slashdots/8211400995,https://creativecommons.org/licenses/by/2.0/,Peeranat Thongyotee +1de4c74d4e8a3dfc,train,https://open-images-dataset.s3.amazonaws.com/train/1de4c74d4e8a3dfc.jpg,https://www.flickr.com/photos/flissphil/6866943,https://creativecommons.org/licenses/by/2.0/,Phillip Capper +1de50c462ae44af6,train,https://open-images-dataset.s3.amazonaws.com/train/1de50c462ae44af6.jpg,https://www.flickr.com/photos/cletch/5369784279,https://creativecommons.org/licenses/by/2.0/,Pat (Cletch) Williams +1de95df29dcf825d,train,https://open-images-dataset.s3.amazonaws.com/train/1de95df29dcf825d.jpg,https://www.flickr.com/photos/primejunta/475267906,https://creativecommons.org/licenses/by/2.0/,Petteri Sulonen +1df11071b6842136,train,https://open-images-dataset.s3.amazonaws.com/train/1df11071b6842136.jpg,https://www.flickr.com/photos/marts-pics/3878619098,https://creativecommons.org/licenses/by/2.0/,Martin F +1df1b6cffad3909a,train,https://open-images-dataset.s3.amazonaws.com/train/1df1b6cffad3909a.jpg,https://www.flickr.com/photos/joshdubya/4146342364,https://creativecommons.org/licenses/by/2.0/,josh +1df57b811575ee9d,train,https://open-images-dataset.s3.amazonaws.com/train/1df57b811575ee9d.jpg,https://www.flickr.com/photos/degu_andre/5451639472,https://creativecommons.org/licenses/by/2.0/,André Gustavo Stumpf +1df681b2e937bc0b,train,https://open-images-dataset.s3.amazonaws.com/train/1df681b2e937bc0b.jpg,https://www.flickr.com/photos/biscotte/11685723353/,https://creativecommons.org/licenses/by/2.0/,sophie & cie +1e066fd6da32807c,train,https://open-images-dataset.s3.amazonaws.com/train/1e066fd6da32807c.jpg,https://www.flickr.com/photos/eager/13599967414,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +1e0e44af644da651,train,https://open-images-dataset.s3.amazonaws.com/train/1e0e44af644da651.jpg,https://www.flickr.com/photos/lisajocook/3010018087,https://creativecommons.org/licenses/by/2.0/,Lisa Cook +1e216b6c12d0d9b0,train,https://open-images-dataset.s3.amazonaws.com/train/1e216b6c12d0d9b0.jpg,https://www.flickr.com/photos/oregondot/5531974751,https://creativecommons.org/licenses/by/2.0/,Oregon Department of Transportation +1e230e230b97cf4d,train,https://open-images-dataset.s3.amazonaws.com/train/1e230e230b97cf4d.jpg,https://www.flickr.com/photos/126467405@N07/14784848405,https://creativecommons.org/licenses/by/2.0/,Jana Svarova +1e2566890acb4584,train,https://open-images-dataset.s3.amazonaws.com/train/1e2566890acb4584.jpg,https://www.flickr.com/photos/100308777@N07/9624943292,https://creativecommons.org/licenses/by/2.0/,Tom Babich +1e35d1d116d81e30,train,https://open-images-dataset.s3.amazonaws.com/train/1e35d1d116d81e30.jpg,https://www.flickr.com/photos/16782093@N03/10351610855,https://creativecommons.org/licenses/by/2.0/,Metro Centric +1e3af28a953e355d,train,https://open-images-dataset.s3.amazonaws.com/train/1e3af28a953e355d.jpg,https://www.flickr.com/photos/63837784@N08/16315252249,https://creativecommons.org/licenses/by/2.0/,Ohio Redevelopment Projects - ODSA +1e3fcc5778b50b05,train,https://open-images-dataset.s3.amazonaws.com/train/1e3fcc5778b50b05.jpg,https://www.flickr.com/photos/colecamplese/12235639645,https://creativecommons.org/licenses/by/2.0/,Cole Camplese +1e491a24262e1d75,train,https://open-images-dataset.s3.amazonaws.com/train/1e491a24262e1d75.jpg,https://www.flickr.com/photos/76767740@N08/12119045284,https://creativecommons.org/licenses/by/2.0/,Curtis Abert +1e5e2064fdce5b48,train,https://open-images-dataset.s3.amazonaws.com/train/1e5e2064fdce5b48.jpg,https://www.flickr.com/photos/luigi_and_linda/15616895096,https://creativecommons.org/licenses/by/2.0/,Luigi Guarino +1e8259c8bbd33b43,train,https://open-images-dataset.s3.amazonaws.com/train/1e8259c8bbd33b43.jpg,https://www.flickr.com/photos/harshlight/15024821322,https://creativecommons.org/licenses/by/2.0/,HarshLight +1e8860421ad11f99,train,https://open-images-dataset.s3.amazonaws.com/train/1e8860421ad11f99.jpg,https://www.flickr.com/photos/lorenkerns/10649123143,https://creativecommons.org/licenses/by/2.0/,Loren Kerns +1ea7ef65fe68e2de,train,https://open-images-dataset.s3.amazonaws.com/train/1ea7ef65fe68e2de.jpg,https://www.flickr.com/photos/sparklig/5803362275,https://creativecommons.org/licenses/by/2.0/,sprklg +1eab898c096ad01c,train,https://open-images-dataset.s3.amazonaws.com/train/1eab898c096ad01c.jpg,https://www.flickr.com/photos/victoriophoto/5418754312,https://creativecommons.org/licenses/by/2.0/,Victório Almeida +1eae244970a7460a,train,https://open-images-dataset.s3.amazonaws.com/train/1eae244970a7460a.jpg,https://www.flickr.com/photos/eager/7624329376,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +1eb5f6491ebb9949,train,https://open-images-dataset.s3.amazonaws.com/train/1eb5f6491ebb9949.jpg,https://www.flickr.com/photos/toprankblog/10573468774,https://creativecommons.org/licenses/by/2.0/,TopRank Online Marketing +1eb81be89f6a9989,train,https://open-images-dataset.s3.amazonaws.com/train/1eb81be89f6a9989.jpg,https://www.flickr.com/photos/fabiogrison/12070832626,https://creativecommons.org/licenses/by/2.0/,Fábio Grison +1eb9d5e521c15e5a,train,https://open-images-dataset.s3.amazonaws.com/train/1eb9d5e521c15e5a.jpg,https://www.flickr.com/photos/rusty_clark/6858102646,https://creativecommons.org/licenses/by/2.0/,Rusty Clark - On the Air M-F 8am-noon +1ebaf27d19e67237,train,https://open-images-dataset.s3.amazonaws.com/train/1ebaf27d19e67237.jpg,https://www.flickr.com/photos/topsteph53/19212142146,https://creativecommons.org/licenses/by/2.0/,Stephane Mignon +1ebb4c643d29d46b,train,https://open-images-dataset.s3.amazonaws.com/train/1ebb4c643d29d46b.jpg,https://www.flickr.com/photos/freelancerallent/16639887523,https://creativecommons.org/licenses/by/2.0/,Tang Allen +1ebd8a6d5951e7f6,train,https://open-images-dataset.s3.amazonaws.com/train/1ebd8a6d5951e7f6.jpg,https://www.flickr.com/photos/brood_wich/5378670428,https://creativecommons.org/licenses/by/2.0/,Brood_wich +1ec34d5d38b994d1,train,https://open-images-dataset.s3.amazonaws.com/train/1ec34d5d38b994d1.jpg,https://www.flickr.com/photos/interzone00/2047365480,https://creativecommons.org/licenses/by/2.0/,OTTAVI Alain +1ec73cb9951dcf58,train,https://open-images-dataset.s3.amazonaws.com/train/1ec73cb9951dcf58.jpg,https://www.flickr.com/photos/lourdes_fisio/16306543510,https://creativecommons.org/licenses/by/2.0/,Lou Haach +1ec9f08d0373eaaa,train,https://open-images-dataset.s3.amazonaws.com/train/1ec9f08d0373eaaa.jpg,https://www.flickr.com/photos/zapthedingbat/5532281368,https://creativecommons.org/licenses/by/2.0/,Sam Greenhalgh +1ede63d9ade0d016,train,https://open-images-dataset.s3.amazonaws.com/train/1ede63d9ade0d016.jpg,https://www.flickr.com/photos/creative_stock/3423115132,https://creativecommons.org/licenses/by/2.0/,Creativity103 +1edeb46a8c15497a,train,https://open-images-dataset.s3.amazonaws.com/train/1edeb46a8c15497a.jpg,https://www.flickr.com/photos/24763767@N03/4445637323,https://creativecommons.org/licenses/by/2.0/,Ben Freedman +1f206e0f48a4833d,train,https://open-images-dataset.s3.amazonaws.com/train/1f206e0f48a4833d.jpg,https://www.flickr.com/photos/cthulhuwho1/3828225415,https://creativecommons.org/licenses/by/2.0/,Will Hart +1f256e3103c07cb5,train,https://open-images-dataset.s3.amazonaws.com/train/1f256e3103c07cb5.jpg,https://www.flickr.com/photos/dbgg1979/3475599578,https://creativecommons.org/licenses/by/2.0/,dbgg1979 +1f272d77b4e54067,train,https://open-images-dataset.s3.amazonaws.com/train/1f272d77b4e54067.jpg,https://www.flickr.com/photos/dsf/7982346,https://creativecommons.org/licenses/by/2.0/,Darren Foreman +1f2f69ec821d8ef3,train,https://open-images-dataset.s3.amazonaws.com/train/1f2f69ec821d8ef3.jpg,https://www.flickr.com/photos/robbophotos/5271003159,https://creativecommons.org/licenses/by/2.0/,John Robinson +1f403daa6382eaca,train,https://open-images-dataset.s3.amazonaws.com/train/1f403daa6382eaca.jpg,https://www.flickr.com/photos/martin_nikolaj/5628906318,https://creativecommons.org/licenses/by/2.0/,Martin Nikolaj Christensen +1f455fbe10bdf269,train,https://open-images-dataset.s3.amazonaws.com/train/1f455fbe10bdf269.jpg,https://www.flickr.com/photos/paulkelley/9519099485,https://creativecommons.org/licenses/by/2.0/,Paul Kelley +1f461c79d805027c,train,https://open-images-dataset.s3.amazonaws.com/train/1f461c79d805027c.jpg,https://www.flickr.com/photos/fanofretail/11788153355,https://creativecommons.org/licenses/by/2.0/,Nicholas Eckhart +1f5645121f7464e2,train,https://open-images-dataset.s3.amazonaws.com/train/1f5645121f7464e2.jpg,https://www.flickr.com/photos/respenda/8251108106,https://creativecommons.org/licenses/by/2.0/,Miguel Ángel García. +1f57e902808b8281,train,https://open-images-dataset.s3.amazonaws.com/train/1f57e902808b8281.jpg,https://www.flickr.com/photos/kellypuffs/8438501967,https://creativecommons.org/licenses/by/2.0/,kellypuffs +1f61dbe085c65989,train,https://open-images-dataset.s3.amazonaws.com/train/1f61dbe085c65989.jpg,https://www.flickr.com/photos/tracyelaine/3265315284/,https://creativecommons.org/licenses/by/2.0/,TracyElaine +1f647beb9b965e49,train,https://open-images-dataset.s3.amazonaws.com/train/1f647beb9b965e49.jpg,https://www.flickr.com/photos/maximeraphael/14909990329,https://creativecommons.org/licenses/by/2.0/,Maxime Raphael +1f6ad4f00ad11801,train,https://open-images-dataset.s3.amazonaws.com/train/1f6ad4f00ad11801.jpg,https://www.flickr.com/photos/oimax/171976731,https://creativecommons.org/licenses/by/2.0/,OiMax +1f6b4707f200c65e,train,https://open-images-dataset.s3.amazonaws.com/train/1f6b4707f200c65e.jpg,https://www.flickr.com/photos/mlazarow/9672981404/,https://creativecommons.org/licenses/by/2.0/,Melanie Lazarow +1f7640086fc10dcc,train,https://open-images-dataset.s3.amazonaws.com/train/1f7640086fc10dcc.jpg,https://www.flickr.com/photos/75662964@N00/14351707133,https://creativecommons.org/licenses/by/2.0/,Doc +1f79f50dbd308162,train,https://open-images-dataset.s3.amazonaws.com/train/1f79f50dbd308162.jpg,https://www.flickr.com/photos/michaeljohnbutton/8674791005,https://creativecommons.org/licenses/by/2.0/,Michael Button +1f7c37b0a576026d,train,https://open-images-dataset.s3.amazonaws.com/train/1f7c37b0a576026d.jpg,https://www.flickr.com/photos/denise_mayumi/5331864228,https://creativecommons.org/licenses/by/2.0/,Denise Mayumi +1f7e03df1f76fbfd,train,https://open-images-dataset.s3.amazonaws.com/train/1f7e03df1f76fbfd.jpg,https://www.flickr.com/photos/camay/10223910786,https://creativecommons.org/licenses/by/2.0/,camay +1f9e6399933dd690,train,https://open-images-dataset.s3.amazonaws.com/train/1f9e6399933dd690.jpg,https://www.flickr.com/photos/oldrebel/5291496625,https://creativecommons.org/licenses/by/2.0/,Donald Lee Pardue +1fa5487482d67837,train,https://open-images-dataset.s3.amazonaws.com/train/1fa5487482d67837.jpg,https://www.flickr.com/photos/neshuma/4511169453,https://creativecommons.org/licenses/by/2.0/,Daviddje +1fc0a12e6edee7d5,train,https://open-images-dataset.s3.amazonaws.com/train/1fc0a12e6edee7d5.jpg,https://www.flickr.com/photos/stebulus/5048444659,https://creativecommons.org/licenses/by/2.0/,Steven Taschuk +1fc6ad43a822f48e,train,https://open-images-dataset.s3.amazonaws.com/train/1fc6ad43a822f48e.jpg,https://www.flickr.com/photos/frugan/442366147,https://creativecommons.org/licenses/by/2.0/,Frugan +1fe66fc34d78c588,train,https://open-images-dataset.s3.amazonaws.com/train/1fe66fc34d78c588.jpg,https://www.flickr.com/photos/arenamontanus/2292257224,https://creativecommons.org/licenses/by/2.0/,Anders Sandberg +1fe94f71f500036e,train,https://open-images-dataset.s3.amazonaws.com/train/1fe94f71f500036e.jpg,https://www.flickr.com/photos/arenamontanus/3101343470,https://creativecommons.org/licenses/by/2.0/,Anders Sandberg +1fefe03698bcd6f2,train,https://open-images-dataset.s3.amazonaws.com/train/1fefe03698bcd6f2.jpg,https://www.flickr.com/photos/vannispen/16636095726,https://creativecommons.org/licenses/by/2.0/,Guido van Nispen +1ff3d87a1125009e,train,https://open-images-dataset.s3.amazonaws.com/train/1ff3d87a1125009e.jpg,https://www.flickr.com/photos/hsabetto/8691601888,https://creativecommons.org/licenses/by/2.0/,Hirotomo.SABETTO +1ffb203f5213cfae,train,https://open-images-dataset.s3.amazonaws.com/train/1ffb203f5213cfae.jpg,https://www.flickr.com/photos/grongar/181853973,https://creativecommons.org/licenses/by/2.0/,Rebecca Siegel +1fff4c4ed41b344f,train,https://open-images-dataset.s3.amazonaws.com/train/1fff4c4ed41b344f.jpg,https://www.flickr.com/photos/ell-r-brown/3826147874,https://creativecommons.org/licenses/by/2.0/,Elliott Brown +201fdbac4a6c73d1,train,https://open-images-dataset.s3.amazonaws.com/train/201fdbac4a6c73d1.jpg,https://www.flickr.com/photos/pixelchecker/8214673642,https://creativecommons.org/licenses/by/2.0/,pixelchecker +203036f4126d769d,train,https://open-images-dataset.s3.amazonaws.com/train/203036f4126d769d.jpg,https://www.flickr.com/photos/chiaramarra/490338653,https://creativecommons.org/licenses/by/2.0/,Chiara Marra +203e049c897ee2bf,train,https://open-images-dataset.s3.amazonaws.com/train/203e049c897ee2bf.jpg,https://www.flickr.com/photos/dalbera/10679527044,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalbéra +2041f2e2fcfb33b0,train,https://open-images-dataset.s3.amazonaws.com/train/2041f2e2fcfb33b0.jpg,https://www.flickr.com/photos/markusspiske/15788737332,https://creativecommons.org/licenses/by/2.0/,Markus Spiske +20485139e526d5b4,train,https://open-images-dataset.s3.amazonaws.com/train/20485139e526d5b4.jpg,https://www.flickr.com/photos/31591736@N07/15158819960,https://creativecommons.org/licenses/by/2.0/,Flckr Photo Display +20537de9e73061b3,train,https://open-images-dataset.s3.amazonaws.com/train/20537de9e73061b3.jpg,https://www.flickr.com/photos/robertlylebolton/9279047821/,https://creativecommons.org/licenses/by/2.0/,Robert Lyle Bolton +2060c66873a8df5d,train,https://open-images-dataset.s3.amazonaws.com/train/2060c66873a8df5d.jpg,https://www.flickr.com/photos/bonnerlibrary/3710543534/,https://creativecommons.org/licenses/by/2.0/,Bonner Springs Library +20653d118f601e28,train,https://open-images-dataset.s3.amazonaws.com/train/20653d118f601e28.jpg,https://www.flickr.com/photos/dantaylor/17331101902,https://creativecommons.org/licenses/by/2.0/,Dan Taylor-Watt +206896d4d8a5297f,train,https://open-images-dataset.s3.amazonaws.com/train/206896d4d8a5297f.jpg,https://www.flickr.com/photos/hutchike/460785486,https://creativecommons.org/licenses/by/2.0/,Kevin Hutchinson +20710d454bac41ef,train,https://open-images-dataset.s3.amazonaws.com/train/20710d454bac41ef.jpg,https://www.flickr.com/photos/_yuki_k_/5085427301,https://creativecommons.org/licenses/by/2.0/,Masayuki (Yuki) Kawagishi +209515fc67204ffc,train,https://open-images-dataset.s3.amazonaws.com/train/209515fc67204ffc.jpg,https://www.flickr.com/photos/lachlanhardy/10697632813,https://creativecommons.org/licenses/by/2.0/,Lachlan Hardy +209c444ad841b5f5,train,https://open-images-dataset.s3.amazonaws.com/train/209c444ad841b5f5.jpg,https://www.flickr.com/photos/109249103@N05/12120883734,https://creativecommons.org/licenses/by/2.0/,outreachr.com +209d61ea94ce8985,train,https://open-images-dataset.s3.amazonaws.com/train/209d61ea94ce8985.jpg,https://www.flickr.com/photos/sergejf/8707985634,https://creativecommons.org/licenses/by/2.0/,sergejf +20a301c4b2e518e6,train,https://open-images-dataset.s3.amazonaws.com/train/20a301c4b2e518e6.jpg,https://www.flickr.com/photos/viaggioroutard/17980905311,https://creativecommons.org/licenses/by/2.0/,Viaggio Routard +20c098e1aeefe55d,train,https://open-images-dataset.s3.amazonaws.com/train/20c098e1aeefe55d.jpg,https://www.flickr.com/photos/mkepto/20695130001,https://creativecommons.org/licenses/by/2.0/,Jean-christophe Bruneau +20cd554f083786a6,train,https://open-images-dataset.s3.amazonaws.com/train/20cd554f083786a6.jpg,https://www.flickr.com/photos/jerryluo0520/5524945925/,https://creativecommons.org/licenses/by/2.0/,Jerry Luo +20d67adade9e6cd4,train,https://open-images-dataset.s3.amazonaws.com/train/20d67adade9e6cd4.jpg,https://www.flickr.com/photos/darioalvarez/9483634623,https://creativecommons.org/licenses/by/2.0/,Dario Alvarez +20e6da78ac2bb595,train,https://open-images-dataset.s3.amazonaws.com/train/20e6da78ac2bb595.jpg,https://www.flickr.com/photos/gonmi/8746779009,https://creativecommons.org/licenses/by/2.0/,Nacho +20f1b0fac8e23657,train,https://open-images-dataset.s3.amazonaws.com/train/20f1b0fac8e23657.jpg,https://www.flickr.com/photos/annak/5618632576,https://creativecommons.org/licenses/by/2.0/,Anna +20f36bc63eebcd1d,train,https://open-images-dataset.s3.amazonaws.com/train/20f36bc63eebcd1d.jpg,https://www.flickr.com/photos/tracyhunter/107897988,https://creativecommons.org/licenses/by/2.0/,Tracy Hunter +2100b6e47c61a129,train,https://open-images-dataset.s3.amazonaws.com/train/2100b6e47c61a129.jpg,https://www.flickr.com/photos/andyatzert/16118000683,https://creativecommons.org/licenses/by/2.0/,Andy Atzert +210a0f1af20b7255,train,https://open-images-dataset.s3.amazonaws.com/train/210a0f1af20b7255.jpg,https://www.flickr.com/photos/kirstenloza/4849437111,https://creativecommons.org/licenses/by/2.0/,Kirsten Loza +211978a7eada000c,train,https://open-images-dataset.s3.amazonaws.com/train/211978a7eada000c.jpg,https://www.flickr.com/photos/pasa/4672001451,https://creativecommons.org/licenses/by/2.0/,Paul Sableman +211cb3ccecc8d216,train,https://open-images-dataset.s3.amazonaws.com/train/211cb3ccecc8d216.jpg,https://www.flickr.com/photos/11581993@N06/1141313680,https://creativecommons.org/licenses/by/2.0/,Ellen Trane Nørby +21259720d191d9c2,train,https://open-images-dataset.s3.amazonaws.com/train/21259720d191d9c2.jpg,https://www.flickr.com/photos/usdagov/15157719833,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture +2126754e6bd09c14,train,https://open-images-dataset.s3.amazonaws.com/train/2126754e6bd09c14.jpg,https://www.flickr.com/photos/johnloo/10118652905,https://creativecommons.org/licenses/by/2.0/,John Loo +21291a97e97162bb,train,https://open-images-dataset.s3.amazonaws.com/train/21291a97e97162bb.jpg,https://www.flickr.com/photos/moverelbigote/6459435183,https://creativecommons.org/licenses/by/2.0/,Mover el Bigote +213a8b69c74dced2,train,https://open-images-dataset.s3.amazonaws.com/train/213a8b69c74dced2.jpg,https://www.flickr.com/photos/reibai/4689953254,https://creativecommons.org/licenses/by/2.0/,reibai +214f89bd132457eb,train,https://open-images-dataset.s3.amazonaws.com/train/214f89bd132457eb.jpg,https://www.flickr.com/photos/anonymouscollective/8274679551,https://creativecommons.org/licenses/by/2.0/,Anonymous Account +215fd81c02f2d833,train,https://open-images-dataset.s3.amazonaws.com/train/215fd81c02f2d833.jpg,https://www.flickr.com/photos/mattmurf/1284019033,https://creativecommons.org/licenses/by/2.0/,Matt Murphy +21635b1fb5a52818,train,https://open-images-dataset.s3.amazonaws.com/train/21635b1fb5a52818.jpg,https://www.flickr.com/photos/hinnosaar/4472974499,https://creativecommons.org/licenses/by/2.0/,Marit & Toomas Hinnosaar +216e880b2404187b,train,https://open-images-dataset.s3.amazonaws.com/train/216e880b2404187b.jpg,https://www.flickr.com/photos/69965207@N03/6520101021,https://creativecommons.org/licenses/by/2.0/,Balmain +2174e7e2f2341747,train,https://open-images-dataset.s3.amazonaws.com/train/2174e7e2f2341747.jpg,https://www.flickr.com/photos/nicole_beauchamp/5458161667,https://creativecommons.org/licenses/by/2.0/,Nicole Beauchamp +217d6443ebaa0691,train,https://open-images-dataset.s3.amazonaws.com/train/217d6443ebaa0691.jpg,https://www.flickr.com/photos/faircompanies/20436354855,https://creativecommons.org/licenses/by/2.0/,Nicolás Boullosa +2185cdae7bb1d0ce,train,https://open-images-dataset.s3.amazonaws.com/train/2185cdae7bb1d0ce.jpg,https://www.flickr.com/photos/tareqsalahuddin/2869454983,https://creativecommons.org/licenses/by/2.0/,Tareq Salahuddin +21919aee715687b6,train,https://open-images-dataset.s3.amazonaws.com/train/21919aee715687b6.jpg,https://www.flickr.com/photos/infrogmation/3215852450,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans +2197c0ceecc191cf,train,https://open-images-dataset.s3.amazonaws.com/train/2197c0ceecc191cf.jpg,https://www.flickr.com/photos/brandonbandy/16738356045,https://creativecommons.org/licenses/by/2.0/,Brandon Bandy +219fcc1aae5bf5bb,train,https://open-images-dataset.s3.amazonaws.com/train/219fcc1aae5bf5bb.jpg,https://www.flickr.com/photos/weather-systems/16565795812,https://creativecommons.org/licenses/by/2.0/,weather-systems +21ae28e1ccd4277a,train,https://open-images-dataset.s3.amazonaws.com/train/21ae28e1ccd4277a.jpg,https://www.flickr.com/photos/eager/5140904925,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +21b93636cb33a46b,train,https://open-images-dataset.s3.amazonaws.com/train/21b93636cb33a46b.jpg,https://www.flickr.com/photos/edkohler/4218701905,https://creativecommons.org/licenses/by/2.0/,edkohler +21bd05ea8b6e272a,train,https://open-images-dataset.s3.amazonaws.com/train/21bd05ea8b6e272a.jpg,https://www.flickr.com/photos/vastateparksstaff/14984539309,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks +21c62aa00d944c69,train,https://open-images-dataset.s3.amazonaws.com/train/21c62aa00d944c69.jpg,https://www.flickr.com/photos/viewfrom52/4984709032,https://creativecommons.org/licenses/by/2.0/,Mandy Goldberg +21cb06f6cce5cea7,train,https://open-images-dataset.s3.amazonaws.com/train/21cb06f6cce5cea7.jpg,https://www.flickr.com/photos/antmoose/24508794,https://creativecommons.org/licenses/by/2.0/,Anthony Majanlahti +21cd30a2acc70fbe,train,https://open-images-dataset.s3.amazonaws.com/train/21cd30a2acc70fbe.jpg,https://www.flickr.com/photos/netpalantir/2564598453,https://creativecommons.org/licenses/by/2.0/,netpalantir +21d158c677acbf03,train,https://open-images-dataset.s3.amazonaws.com/train/21d158c677acbf03.jpg,https://www.flickr.com/photos/ronalmog/697713472,https://creativecommons.org/licenses/by/2.0/,RonAlmog +21e893ea4b890fa1,train,https://open-images-dataset.s3.amazonaws.com/train/21e893ea4b890fa1.jpg,https://www.flickr.com/photos/fibonacciblue/6227391690,https://creativecommons.org/licenses/by/2.0/,Fibonacci Blue +21ea5f96eece9b1a,train,https://open-images-dataset.s3.amazonaws.com/train/21ea5f96eece9b1a.jpg,https://www.flickr.com/photos/shadowgate/15872087898,https://creativecommons.org/licenses/by/2.0/,Shadowgate +21f0dc60b01a8340,train,https://open-images-dataset.s3.amazonaws.com/train/21f0dc60b01a8340.jpg,https://www.flickr.com/photos/12986848@N00/3137979567,https://creativecommons.org/licenses/by/2.0/,Robynne Blume +21f21eda8238ab78,train,https://open-images-dataset.s3.amazonaws.com/train/21f21eda8238ab78.jpg,https://www.flickr.com/photos/38607288@N03/4088458720/,https://creativecommons.org/licenses/by/2.0/,EURIST e.V. +21f99a9cab26f268,train,https://open-images-dataset.s3.amazonaws.com/train/21f99a9cab26f268.jpg,https://www.flickr.com/photos/eekim/6375177693,https://creativecommons.org/licenses/by/2.0/,Eugene Kim +21ff75d18f528e56,train,https://open-images-dataset.s3.amazonaws.com/train/21ff75d18f528e56.jpg,https://www.flickr.com/photos/ell-r-brown/4923913829/,https://creativecommons.org/licenses/by/2.0/,Elliott Brown +2200bcee9804f42f,train,https://open-images-dataset.s3.amazonaws.com/train/2200bcee9804f42f.jpg,https://www.flickr.com/photos/welix/5030458623,https://creativecommons.org/licenses/by/2.0/,Weli'mi'nakwan +2201cd915d5408d7,train,https://open-images-dataset.s3.amazonaws.com/train/2201cd915d5408d7.jpg,https://www.flickr.com/photos/markdoliner/8431123867,https://creativecommons.org/licenses/by/2.0/,Mark Doliner +221cde17211ae4ac,train,https://open-images-dataset.s3.amazonaws.com/train/221cde17211ae4ac.jpg,https://www.flickr.com/photos/sydneyhistory/6787436213,https://creativecommons.org/licenses/by/2.0/,Governor Macquarie +221d545ea9489efc,train,https://open-images-dataset.s3.amazonaws.com/train/221d545ea9489efc.jpg,https://www.flickr.com/photos/teddysphotos/5222540088,https://creativecommons.org/licenses/by/2.0/,Ted Hodges +221e68dffc5ab46a,train,https://open-images-dataset.s3.amazonaws.com/train/221e68dffc5ab46a.jpg,https://www.flickr.com/photos/coreforce/4272032277,https://creativecommons.org/licenses/by/2.0/,Falk Lademann +223460ae1167464f,train,https://open-images-dataset.s3.amazonaws.com/train/223460ae1167464f.jpg,https://www.flickr.com/photos/ptwo/17189776782,https://creativecommons.org/licenses/by/2.0/,ptwo +22481cb38a5cceb2,train,https://open-images-dataset.s3.amazonaws.com/train/22481cb38a5cceb2.jpg,https://www.flickr.com/photos/51195110@N00/8181386242,https://creativecommons.org/licenses/by/2.0/,Steve +22535e27984e0e54,train,https://open-images-dataset.s3.amazonaws.com/train/22535e27984e0e54.jpg,https://www.flickr.com/photos/tylerhoff/5253107695,https://creativecommons.org/licenses/by/2.0/,tylerhoff +22580fd179111c93,train,https://open-images-dataset.s3.amazonaws.com/train/22580fd179111c93.jpg,https://www.flickr.com/photos/gonmi/9537751884,https://creativecommons.org/licenses/by/2.0/,Nacho +2259fde64e034d5a,train,https://open-images-dataset.s3.amazonaws.com/train/2259fde64e034d5a.jpg,https://www.flickr.com/photos/rahulshah/4573714709,https://creativecommons.org/licenses/by/2.0/,Rahul shah +225ebb0dd92f300e,train,https://open-images-dataset.s3.amazonaws.com/train/225ebb0dd92f300e.jpg,https://www.flickr.com/photos/tommypayne/8487303129,https://creativecommons.org/licenses/by/2.0/,tommypjr +226651f9553e7f1f,train,https://open-images-dataset.s3.amazonaws.com/train/226651f9553e7f1f.jpg,https://www.flickr.com/photos/antoniolana/5760820951,https://creativecommons.org/licenses/by/2.0/,Antonio Lana Dïaz de Espada +226703f97d26058e,train,https://open-images-dataset.s3.amazonaws.com/train/226703f97d26058e.jpg,https://www.flickr.com/photos/tinfoilraccoon/269273802,https://creativecommons.org/licenses/by/2.0/,rochelle hartman +22676bfe4605c8d7,train,https://open-images-dataset.s3.amazonaws.com/train/22676bfe4605c8d7.jpg,https://www.flickr.com/photos/deanmeyers/4466476913,https://creativecommons.org/licenses/by/2.0/,Dean Meyers +2287e91d35a725fe,train,https://open-images-dataset.s3.amazonaws.com/train/2287e91d35a725fe.jpg,https://www.flickr.com/photos/infrogmation/6705081957,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans +228ada236c685319,train,https://open-images-dataset.s3.amazonaws.com/train/228ada236c685319.jpg,https://www.flickr.com/photos/ell-r-brown/4197671703,https://creativecommons.org/licenses/by/2.0/,Elliott Brown +22bf0dbaa85e67aa,train,https://open-images-dataset.s3.amazonaws.com/train/22bf0dbaa85e67aa.jpg,https://www.flickr.com/photos/strelitzia/286696422,https://creativecommons.org/licenses/by/2.0/,strelitzia --- +22bfb3a379fa8f3e,train,https://open-images-dataset.s3.amazonaws.com/train/22bfb3a379fa8f3e.jpg,https://www.flickr.com/photos/13514463@N06/14503851456,https://creativecommons.org/licenses/by/2.0/,Ley +22cd35d4f2f64913,train,https://open-images-dataset.s3.amazonaws.com/train/22cd35d4f2f64913.jpg,https://www.flickr.com/photos/parisonponce/9409238103,https://creativecommons.org/licenses/by/2.0/,Paris on Ponce & Le Maison Rouge +22cd8997a1421ae8,train,https://open-images-dataset.s3.amazonaws.com/train/22cd8997a1421ae8.jpg,https://www.flickr.com/photos/nahemoth/14219075911,https://creativecommons.org/licenses/by/2.0/,=Nahemoth= (absent for a while) +22e1b3b5473b60a8,train,https://open-images-dataset.s3.amazonaws.com/train/22e1b3b5473b60a8.jpg,https://www.flickr.com/photos/jametiks/5996124654,https://creativecommons.org/licenses/by/2.0/,James +22eefbc60a3cc2aa,train,https://open-images-dataset.s3.amazonaws.com/train/22eefbc60a3cc2aa.jpg,https://www.flickr.com/photos/jeremylevinedesign/2815638056,https://creativecommons.org/licenses/by/2.0/,Jeremy Levine +22f3888940664ccf,train,https://open-images-dataset.s3.amazonaws.com/train/22f3888940664ccf.jpg,https://www.flickr.com/photos/cgpgrey/4888595936,https://creativecommons.org/licenses/by/2.0/,CGP Grey +22fc927f9a2cecc7,train,https://open-images-dataset.s3.amazonaws.com/train/22fc927f9a2cecc7.jpg,https://www.flickr.com/photos/chokingsun/6137185803,https://creativecommons.org/licenses/by/2.0/,choking sun +230fc18d2bb4114e,train,https://open-images-dataset.s3.amazonaws.com/train/230fc18d2bb4114e.jpg,https://www.flickr.com/photos/jackdorsey/142881484,https://creativecommons.org/licenses/by/2.0/,Jack Dorsey +23201305694d4f67,train,https://open-images-dataset.s3.amazonaws.com/train/23201305694d4f67.jpg,https://www.flickr.com/photos/ilovemypit/3727447582,https://creativecommons.org/licenses/by/2.0/,Kari Sullivan +2322150cc9167f2b,train,https://open-images-dataset.s3.amazonaws.com/train/2322150cc9167f2b.jpg,https://www.flickr.com/photos/theboth/7227478268,https://creativecommons.org/licenses/by/2.0/,Ian Bothwell +232c729c86f15487,train,https://open-images-dataset.s3.amazonaws.com/train/232c729c86f15487.jpg,https://www.flickr.com/photos/tahini/6268538925,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +233923d71778a018,train,https://open-images-dataset.s3.amazonaws.com/train/233923d71778a018.jpg,https://www.flickr.com/photos/pasa/8365748365,https://creativecommons.org/licenses/by/2.0/,Paul Sableman +2356324d226ec5a1,train,https://open-images-dataset.s3.amazonaws.com/train/2356324d226ec5a1.jpg,https://www.flickr.com/photos/jamiecat/3797958192,https://creativecommons.org/licenses/by/2.0/,Jamiecat * +235a6f5eb53515d0,train,https://open-images-dataset.s3.amazonaws.com/train/235a6f5eb53515d0.jpg,https://www.flickr.com/photos/marktee/18356209579,https://creativecommons.org/licenses/by/2.0/,Mark Turnauckas +235daec05309c2ed,train,https://open-images-dataset.s3.amazonaws.com/train/235daec05309c2ed.jpg,https://www.flickr.com/photos/brian395/5825682064,https://creativecommons.org/licenses/by/2.0/,Brian Eager +2360f91c4cf4eb5e,train,https://open-images-dataset.s3.amazonaws.com/train/2360f91c4cf4eb5e.jpg,https://www.flickr.com/photos/secretlyironic/2515185386,https://creativecommons.org/licenses/by/2.0/,Aaron Weber +2363e5415f0e1683,train,https://open-images-dataset.s3.amazonaws.com/train/2363e5415f0e1683.jpg,https://www.flickr.com/photos/sinbiphone/8383667154,https://creativecommons.org/licenses/by/2.0/,어쩌면 프로젝트 +236e323e76b2dc75,train,https://open-images-dataset.s3.amazonaws.com/train/236e323e76b2dc75.jpg,https://www.flickr.com/photos/italintheheart/9692112579,https://creativecommons.org/licenses/by/2.0/,Jorge Elías +2370f09a692fab83,train,https://open-images-dataset.s3.amazonaws.com/train/2370f09a692fab83.jpg,https://www.flickr.com/photos/y_ogagaga/6992454601,https://creativecommons.org/licenses/by/2.0/,y_ogagaga +2375fc8b6bd69bb3,train,https://open-images-dataset.s3.amazonaws.com/train/2375fc8b6bd69bb3.jpg,https://www.flickr.com/photos/rachelmargaret/16367081456,https://creativecommons.org/licenses/by/2.0/,Rachel Zack +2389394389ac3e38,train,https://open-images-dataset.s3.amazonaws.com/train/2389394389ac3e38.jpg,https://www.flickr.com/photos/upyernoz/5613162749,https://creativecommons.org/licenses/by/2.0/,upyernoz +2398d0a415acb427,train,https://open-images-dataset.s3.amazonaws.com/train/2398d0a415acb427.jpg,https://www.flickr.com/photos/16782093@N03/4538144709,https://creativecommons.org/licenses/by/2.0/,Metro Centric +23b20e049e82fd86,train,https://open-images-dataset.s3.amazonaws.com/train/23b20e049e82fd86.jpg,https://www.flickr.com/photos/35492603@N02/3328696424,https://creativecommons.org/licenses/by/2.0/,WWW ? +23b5be0dfa014d2a,train,https://open-images-dataset.s3.amazonaws.com/train/23b5be0dfa014d2a.jpg,https://www.flickr.com/photos/satguru/5407586563,https://creativecommons.org/licenses/by/2.0/,David Howard +23c63276985d40ef,train,https://open-images-dataset.s3.amazonaws.com/train/23c63276985d40ef.jpg,https://www.flickr.com/photos/dalbera/6335758642,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalbéra +23ce4ef8730ab3cb,train,https://open-images-dataset.s3.amazonaws.com/train/23ce4ef8730ab3cb.jpg,https://www.flickr.com/photos/qfzz/15018898812,https://creativecommons.org/licenses/by/2.0/,BODHICITTA +23d408799ea4f767,train,https://open-images-dataset.s3.amazonaws.com/train/23d408799ea4f767.jpg,https://www.flickr.com/photos/69353231@N02/8150284398,https://creativecommons.org/licenses/by/2.0/,shes_so_high +23d5e91e68772fc1,train,https://open-images-dataset.s3.amazonaws.com/train/23d5e91e68772fc1.jpg,https://www.flickr.com/photos/nazareth_college/16794435455,https://creativecommons.org/licenses/by/2.0/,Nazareth College +23e75c26a87c7f31,train,https://open-images-dataset.s3.amazonaws.com/train/23e75c26a87c7f31.jpg,https://www.flickr.com/photos/ephotography29/3259000438,https://creativecommons.org/licenses/by/2.0/,Erin +23f482e728abc8fb,train,https://open-images-dataset.s3.amazonaws.com/train/23f482e728abc8fb.jpg,https://www.flickr.com/photos/55694622@N00/431903398,https://creativecommons.org/licenses/by/2.0/,cervezones +240431ee2d2dbebd,train,https://open-images-dataset.s3.amazonaws.com/train/240431ee2d2dbebd.jpg,https://www.flickr.com/photos/local_louisville/4376360855,https://creativecommons.org/licenses/by/2.0/,local louisville +241730ad84066616,train,https://open-images-dataset.s3.amazonaws.com/train/241730ad84066616.jpg,https://www.flickr.com/photos/byzantiumbooks/16063496210,https://creativecommons.org/licenses/by/2.0/,Bill Smith +242b3888cfad8ec2,train,https://open-images-dataset.s3.amazonaws.com/train/242b3888cfad8ec2.jpg,https://www.flickr.com/photos/tamworthboroughcouncil/14465384560,https://creativecommons.org/licenses/by/2.0/,Tamworth Council +242da56aca53484d,train,https://open-images-dataset.s3.amazonaws.com/train/242da56aca53484d.jpg,https://www.flickr.com/photos/g4gti/4623122703,https://creativecommons.org/licenses/by/2.0/,Ryohei Noda +24320deecc745cb8,train,https://open-images-dataset.s3.amazonaws.com/train/24320deecc745cb8.jpg,https://www.flickr.com/photos/pigpilot/5179026050,https://creativecommons.org/licenses/by/2.0/,Stuart Grout +24340471e07c61dd,train,https://open-images-dataset.s3.amazonaws.com/train/24340471e07c61dd.jpg,https://www.flickr.com/photos/pedrosimoes7/14877851359,https://creativecommons.org/licenses/by/2.0/,Pedro Ribeiro Simões +24676f5d3edfccc4,train,https://open-images-dataset.s3.amazonaws.com/train/24676f5d3edfccc4.jpg,https://www.flickr.com/photos/tahini/12466336983,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +246900e01a076bb8,train,https://open-images-dataset.s3.amazonaws.com/train/246900e01a076bb8.jpg,https://www.flickr.com/photos/starlitlunch/15609935122,https://creativecommons.org/licenses/by/2.0/,ftchris +2473c3559b3fd5f4,train,https://open-images-dataset.s3.amazonaws.com/train/2473c3559b3fd5f4.jpg,https://www.flickr.com/photos/smays/17136229579,https://creativecommons.org/licenses/by/2.0/,Steve Mays +2479448efeadcb18,train,https://open-images-dataset.s3.amazonaws.com/train/2479448efeadcb18.jpg,https://www.flickr.com/photos/martl/2893830779,https://creativecommons.org/licenses/by/2.0/,heartbeaz +2492d5acbb6d4884,train,https://open-images-dataset.s3.amazonaws.com/train/2492d5acbb6d4884.jpg,https://www.flickr.com/photos/scjn/2414437108,https://creativecommons.org/licenses/by/2.0/,~Pawsitive~Candie_N +2499dd6d767b8bf7,train,https://open-images-dataset.s3.amazonaws.com/train/2499dd6d767b8bf7.jpg,https://www.flickr.com/photos/hitchster/4123891116,https://creativecommons.org/licenses/by/2.0/,Hitchster +24a18a957c690e86,train,https://open-images-dataset.s3.amazonaws.com/train/24a18a957c690e86.jpg,https://www.flickr.com/photos/decorativeconcrete/14234551363,https://creativecommons.org/licenses/by/2.0/,Decorative Concrete Kingdom +24a2372f009f6c19,train,https://open-images-dataset.s3.amazonaws.com/train/24a2372f009f6c19.jpg,https://www.flickr.com/photos/michael_mayer/5945325879,https://creativecommons.org/licenses/by/2.0/,Michael Mayer +24aac5cbe00cd0ae,train,https://open-images-dataset.s3.amazonaws.com/train/24aac5cbe00cd0ae.jpg,https://www.flickr.com/photos/morikenstyle/2301431883,https://creativecommons.org/licenses/by/2.0/,kenji mori +24b8a41722584ff4,train,https://open-images-dataset.s3.amazonaws.com/train/24b8a41722584ff4.jpg,https://www.flickr.com/photos/ell-r-brown/8321927170,https://creativecommons.org/licenses/by/2.0/,Elliott Brown +24ba72e1d9f5a5e7,train,https://open-images-dataset.s3.amazonaws.com/train/24ba72e1d9f5a5e7.jpg,https://www.flickr.com/photos/terry_wha/90625813,https://creativecommons.org/licenses/by/2.0/,Terry Whalebone +24c108d8e4ba8d76,train,https://open-images-dataset.s3.amazonaws.com/train/24c108d8e4ba8d76.jpg,https://www.flickr.com/photos/cepatri55/5536978584,https://creativecommons.org/licenses/by/2.0/,cepatri55 +24c28f2342a37b4f,train,https://open-images-dataset.s3.amazonaws.com/train/24c28f2342a37b4f.jpg,https://www.flickr.com/photos/lachlanhardy/3683106424,https://creativecommons.org/licenses/by/2.0/,Lachlan Hardy +24c7c74b1d927897,train,https://open-images-dataset.s3.amazonaws.com/train/24c7c74b1d927897.jpg,https://www.flickr.com/photos/nahemoth/14204738948,https://creativecommons.org/licenses/by/2.0/,=Nahemoth= (absent for a while) +24cb4f08b85cfaf7,train,https://open-images-dataset.s3.amazonaws.com/train/24cb4f08b85cfaf7.jpg,https://www.flickr.com/photos/quinet/17544047552,https://creativecommons.org/licenses/by/2.0/,Thomas Quine +24d22e8b78ae3689,train,https://open-images-dataset.s3.amazonaws.com/train/24d22e8b78ae3689.jpg,https://www.flickr.com/photos/trondheim_byarkiv/20945029579,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +24e3131a365fd7b7,train,https://open-images-dataset.s3.amazonaws.com/train/24e3131a365fd7b7.jpg,https://www.flickr.com/photos/betsyweber/370413100,https://creativecommons.org/licenses/by/2.0/,Betsy Weber +24e46dcbe17f7f72,train,https://open-images-dataset.s3.amazonaws.com/train/24e46dcbe17f7f72.jpg,https://www.flickr.com/photos/taqumi/4715712682,https://creativecommons.org/licenses/by/2.0/,Takumi Yoshida +24eca53da9acc3d3,train,https://open-images-dataset.s3.amazonaws.com/train/24eca53da9acc3d3.jpg,https://www.flickr.com/photos/budellison/16412827383,https://creativecommons.org/licenses/by/2.0/,Bud Ellison +24f7e752aca1fd8f,train,https://open-images-dataset.s3.amazonaws.com/train/24f7e752aca1fd8f.jpg,https://www.flickr.com/photos/brokersaunders/3500203037,https://creativecommons.org/licenses/by/2.0/,Nannette Turner +24fe303603491590,train,https://open-images-dataset.s3.amazonaws.com/train/24fe303603491590.jpg,https://www.flickr.com/photos/budellison/16289319397,https://creativecommons.org/licenses/by/2.0/,Bud Ellison +2506436cfd8eefc0,train,https://open-images-dataset.s3.amazonaws.com/train/2506436cfd8eefc0.jpg,https://www.flickr.com/photos/lakemartinvoice/20859885579,https://creativecommons.org/licenses/by/2.0/,John Coley +2514b2c097119670,train,https://open-images-dataset.s3.amazonaws.com/train/2514b2c097119670.jpg,https://www.flickr.com/photos/psyberartist/8198399154,https://creativecommons.org/licenses/by/2.0/,psyberartist +25158ec2b4353807,train,https://open-images-dataset.s3.amazonaws.com/train/25158ec2b4353807.jpg,https://www.flickr.com/photos/nicholassmale/15418184711,https://creativecommons.org/licenses/by/2.0/,Nicholas Smale +251a3afa067866fc,train,https://open-images-dataset.s3.amazonaws.com/train/251a3afa067866fc.jpg,https://www.flickr.com/photos/scaredykat/11389671786,https://creativecommons.org/licenses/by/2.0/,Krista +252286df1e3544e4,train,https://open-images-dataset.s3.amazonaws.com/train/252286df1e3544e4.jpg,https://www.flickr.com/photos/18614695@N00/449402602,https://creativecommons.org/licenses/by/2.0/,Xavi +2527abe4cbd5c1f5,train,https://open-images-dataset.s3.amazonaws.com/train/2527abe4cbd5c1f5.jpg,https://www.flickr.com/photos/34517490@N00/7772765644/,https://creativecommons.org/licenses/by/2.0/,Nick +2540b36a8d7f6e66,train,https://open-images-dataset.s3.amazonaws.com/train/2540b36a8d7f6e66.jpg,https://www.flickr.com/photos/rubygoes/8745736141,https://creativecommons.org/licenses/by/2.0/,RubyGoes +256e648742510720,train,https://open-images-dataset.s3.amazonaws.com/train/256e648742510720.jpg,https://www.flickr.com/photos/ell-r-brown/8691963801,https://creativecommons.org/licenses/by/2.0/,Elliott Brown +2589af3afc7824c3,train,https://open-images-dataset.s3.amazonaws.com/train/2589af3afc7824c3.jpg,https://www.flickr.com/photos/redvers/532181021,https://creativecommons.org/licenses/by/2.0/,R/DV/RS +258e976822f24e56,train,https://open-images-dataset.s3.amazonaws.com/train/258e976822f24e56.jpg,https://www.flickr.com/photos/85189122@N00/4086491946,https://creativecommons.org/licenses/by/2.0/,sheetal saini +25bc84419c314757,train,https://open-images-dataset.s3.amazonaws.com/train/25bc84419c314757.jpg,https://www.flickr.com/photos/aroberts/2557326,https://creativecommons.org/licenses/by/2.0/,Andy Roberts +25d11df51db2548a,train,https://open-images-dataset.s3.amazonaws.com/train/25d11df51db2548a.jpg,https://www.flickr.com/photos/41569813@N03/4805557405,https://creativecommons.org/licenses/by/2.0/,Uwe Kaufmann +25d7e97aaf51ca99,train,https://open-images-dataset.s3.amazonaws.com/train/25d7e97aaf51ca99.jpg,https://www.flickr.com/photos/tahini/7617473010,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +25dbec981d97cda3,train,https://open-images-dataset.s3.amazonaws.com/train/25dbec981d97cda3.jpg,https://www.flickr.com/photos/dierken/8561529444,https://creativecommons.org/licenses/by/2.0/,Mike +25de84276711c4f1,train,https://open-images-dataset.s3.amazonaws.com/train/25de84276711c4f1.jpg,https://www.flickr.com/photos/dhwright/6993785756,https://creativecommons.org/licenses/by/2.0/,David Wright +25f6ab142053153b,train,https://open-images-dataset.s3.amazonaws.com/train/25f6ab142053153b.jpg,https://www.flickr.com/photos/ainhoap/460637844,https://creativecommons.org/licenses/by/2.0/,PCB75 +26287010199c93b0,train,https://open-images-dataset.s3.amazonaws.com/train/26287010199c93b0.jpg,https://www.flickr.com/photos/49651517@N02/6935607779,https://creativecommons.org/licenses/by/2.0/,Colleen Benelli +263573815e85dc96,train,https://open-images-dataset.s3.amazonaws.com/train/263573815e85dc96.jpg,https://www.flickr.com/photos/96755550@N07/11934588313,https://creativecommons.org/licenses/by/2.0/,The Blasf +264c0fa929145142,train,https://open-images-dataset.s3.amazonaws.com/train/264c0fa929145142.jpg,https://www.flickr.com/photos/akras/3461435561,https://creativecommons.org/licenses/by/2.0/,Andrey +265cb83c1e8e10fa,train,https://open-images-dataset.s3.amazonaws.com/train/265cb83c1e8e10fa.jpg,https://www.flickr.com/photos/hans-westbeek/3798157325,https://creativecommons.org/licenses/by/2.0/,Hans Westbeek +2662bc1fcbeb4925,train,https://open-images-dataset.s3.amazonaws.com/train/2662bc1fcbeb4925.jpg,https://www.flickr.com/photos/eager/15329806693,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +2670b83d874be382,train,https://open-images-dataset.s3.amazonaws.com/train/2670b83d874be382.jpg,https://www.flickr.com/photos/jessica_franke/19508270389,https://creativecommons.org/licenses/by/2.0/,Jessica Franke +26718d59043a5b7a,train,https://open-images-dataset.s3.amazonaws.com/train/26718d59043a5b7a.jpg,https://www.flickr.com/photos/63837784@N08/7845337320,https://creativecommons.org/licenses/by/2.0/,Ohio Redevelopment Projects - ODSA +268031c28beaf559,train,https://open-images-dataset.s3.amazonaws.com/train/268031c28beaf559.jpg,https://www.flickr.com/photos/bookabee_tours_australia/4892298507,https://creativecommons.org/licenses/by/2.0/,Haydyn Bromley +268042f21866d6ef,train,https://open-images-dataset.s3.amazonaws.com/train/268042f21866d6ef.jpg,https://www.flickr.com/photos/servus_du/2952838600,https://creativecommons.org/licenses/by/2.0/,Auslandsoesterreicherflickraccountinhaber +26848b6c177d50be,train,https://open-images-dataset.s3.amazonaws.com/train/26848b6c177d50be.jpg,https://www.flickr.com/photos/cmichel67/187762523/,https://creativecommons.org/licenses/by/2.0/,Christopher Michel +26978a425ef20480,train,https://open-images-dataset.s3.amazonaws.com/train/26978a425ef20480.jpg,https://www.flickr.com/photos/themiamistory/4179147904/,https://creativecommons.org/licenses/by/2.0/,Janie Coffey +2698f3b28434d375,train,https://open-images-dataset.s3.amazonaws.com/train/2698f3b28434d375.jpg,https://www.flickr.com/photos/gnilenkov/7333811218,https://creativecommons.org/licenses/by/2.0/,Aleksey Gnilenkov +26b7d00560531d79,train,https://open-images-dataset.s3.amazonaws.com/train/26b7d00560531d79.jpg,https://www.flickr.com/photos/12394349@N06/18193163963,https://creativecommons.org/licenses/by/2.0/,Bryn Pinzgauer +26b9a5a7163e2f1f,train,https://open-images-dataset.s3.amazonaws.com/train/26b9a5a7163e2f1f.jpg,https://www.flickr.com/photos/julioenriquez/4088366848,https://creativecommons.org/licenses/by/2.0/,Julio Enriquez +26c3f97979df7ad3,train,https://open-images-dataset.s3.amazonaws.com/train/26c3f97979df7ad3.jpg,https://www.flickr.com/photos/lindatrawnik/4020776794,https://creativecommons.org/licenses/by/2.0/,kinwart +26c6152ab3fb6db0,train,https://open-images-dataset.s3.amazonaws.com/train/26c6152ab3fb6db0.jpg,https://www.flickr.com/photos/trondheim_byarkiv/7041422215,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +26c93ac87f5cca97,train,https://open-images-dataset.s3.amazonaws.com/train/26c93ac87f5cca97.jpg,https://www.flickr.com/photos/optikfluffel/4799734196,https://creativecommons.org/licenses/by/2.0/,Udo +26ccb5f4c0c8bfe4,train,https://open-images-dataset.s3.amazonaws.com/train/26ccb5f4c0c8bfe4.jpg,https://www.flickr.com/photos/glynlowe/8413946491,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com +26d0267db5e9afb7,train,https://open-images-dataset.s3.amazonaws.com/train/26d0267db5e9afb7.jpg,https://www.flickr.com/photos/smaentz/5212414345,https://creativecommons.org/licenses/by/2.0/,Scott Maentz +26dfe5ff49f36ca9,train,https://open-images-dataset.s3.amazonaws.com/train/26dfe5ff49f36ca9.jpg,https://www.flickr.com/photos/eager/16052095816,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +26e492981b11562e,train,https://open-images-dataset.s3.amazonaws.com/train/26e492981b11562e.jpg,https://www.flickr.com/photos/flissphil/11563179,https://creativecommons.org/licenses/by/2.0/,Phillip Capper +26ec358fe6dfa0df,train,https://open-images-dataset.s3.amazonaws.com/train/26ec358fe6dfa0df.jpg,https://www.flickr.com/photos/hisgett/3916013843,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett +26ee3ede87360a3b,train,https://open-images-dataset.s3.amazonaws.com/train/26ee3ede87360a3b.jpg,https://www.flickr.com/photos/clearlyambiguous/136149119,https://creativecommons.org/licenses/by/2.0/,Scott Robinson +26fa6a8071f85c08,train,https://open-images-dataset.s3.amazonaws.com/train/26fa6a8071f85c08.jpg,https://www.flickr.com/photos/666_is_money/4005631997,https://creativecommons.org/licenses/by/2.0/,Raquel Baranow +26fd77505ec7cf9e,train,https://open-images-dataset.s3.amazonaws.com/train/26fd77505ec7cf9e.jpg,https://www.flickr.com/photos/harshlight/15603166921/,https://creativecommons.org/licenses/by/2.0/,HarshLight +27006105b21d1c0e,train,https://open-images-dataset.s3.amazonaws.com/train/27006105b21d1c0e.jpg,https://www.flickr.com/photos/andrewbain/3621892061,https://creativecommons.org/licenses/by/2.0/,Taber Andrew Bain +270313690941865c,train,https://open-images-dataset.s3.amazonaws.com/train/270313690941865c.jpg,https://www.flickr.com/photos/vasenka/6846505124,https://creativecommons.org/licenses/by/2.0/,VasenkaPhotography +2703deb7c04e1d37,train,https://open-images-dataset.s3.amazonaws.com/train/2703deb7c04e1d37.jpg,https://www.flickr.com/photos/nostri-imago/7504661012,https://creativecommons.org/licenses/by/2.0/,Cliff +270a94ba95371933,train,https://open-images-dataset.s3.amazonaws.com/train/270a94ba95371933.jpg,https://www.flickr.com/photos/lonelypine/14581933060/,https://creativecommons.org/licenses/by/2.0/,Lonely Pine +270ccab4173a2712,train,https://open-images-dataset.s3.amazonaws.com/train/270ccab4173a2712.jpg,https://www.flickr.com/photos/jirka_matousek/8462849550,https://creativecommons.org/licenses/by/2.0/,Jirka Matousek +2735b5f2d5635c1d,train,https://open-images-dataset.s3.amazonaws.com/train/2735b5f2d5635c1d.jpg,https://www.flickr.com/photos/smemon/12697838564,https://creativecommons.org/licenses/by/2.0/,Sean MacEntee +273d8a22cfe2f5a8,train,https://open-images-dataset.s3.amazonaws.com/train/273d8a22cfe2f5a8.jpg,https://www.flickr.com/photos/73416633@N00/249989349,https://creativecommons.org/licenses/by/2.0/,Sandra Cohen-Rose and Colin Rose +274d13e0218b4618,train,https://open-images-dataset.s3.amazonaws.com/train/274d13e0218b4618.jpg,https://www.flickr.com/photos/orinrobertjohn/505465149/,https://creativecommons.org/licenses/by/2.0/,Orin Zebest +276100dd1272dfdc,train,https://open-images-dataset.s3.amazonaws.com/train/276100dd1272dfdc.jpg,https://www.flickr.com/photos/aaronpk/6800072611,https://creativecommons.org/licenses/by/2.0/,Aaron Parecki +2772673167cadba6,train,https://open-images-dataset.s3.amazonaws.com/train/2772673167cadba6.jpg,https://www.flickr.com/photos/klovovi/7833603696,https://creativecommons.org/licenses/by/2.0/,Klovovi +277517f81944526e,train,https://open-images-dataset.s3.amazonaws.com/train/277517f81944526e.jpg,https://www.flickr.com/photos/augustksphotos/18740990758,https://creativecommons.org/licenses/by/2.0/,August Kelm +277cdcd2cbfa3aeb,train,https://open-images-dataset.s3.amazonaws.com/train/277cdcd2cbfa3aeb.jpg,https://www.flickr.com/photos/matalyn/351606538/,https://creativecommons.org/licenses/by/2.0/,Maurizio Zanetti +27855d88418ad97a,train,https://open-images-dataset.s3.amazonaws.com/train/27855d88418ad97a.jpg,https://www.flickr.com/photos/kjgarbutt/8545679440,https://creativecommons.org/licenses/by/2.0/,Kurtis Garbutt +278f9410f4329798,train,https://open-images-dataset.s3.amazonaws.com/train/278f9410f4329798.jpg,https://www.flickr.com/photos/andreaosti/4681117665,https://creativecommons.org/licenses/by/2.0/,Andrea Osti +2790c8d423f7dcf1,train,https://open-images-dataset.s3.amazonaws.com/train/2790c8d423f7dcf1.jpg,https://www.flickr.com/photos/phoenixwolfray/5492179980,https://creativecommons.org/licenses/by/2.0/,Phoenix Wolf-Ray +279e143d052378ac,train,https://open-images-dataset.s3.amazonaws.com/train/279e143d052378ac.jpg,https://www.flickr.com/photos/disenoyarquitectura/5516830620,https://creativecommons.org/licenses/by/2.0/,Corona Mejora Tu Vida CORONA +27b4409890bdd630,train,https://open-images-dataset.s3.amazonaws.com/train/27b4409890bdd630.jpg,https://www.flickr.com/photos/hydropeek/684098393,https://creativecommons.org/licenses/by/2.0/,hydropeek +27c18e1f0609520a,train,https://open-images-dataset.s3.amazonaws.com/train/27c18e1f0609520a.jpg,https://www.flickr.com/photos/adavey/2091014419,https://creativecommons.org/licenses/by/2.0/,A.Davey +27cfb0f4eab87083,train,https://open-images-dataset.s3.amazonaws.com/train/27cfb0f4eab87083.jpg,https://www.flickr.com/photos/fiskarhedenvillan/3100377652,https://creativecommons.org/licenses/by/2.0/,Fiskarhedenvillan +27e2178d95c633f0,train,https://open-images-dataset.s3.amazonaws.com/train/27e2178d95c633f0.jpg,https://www.flickr.com/photos/hanspoldoja/6342091872,https://creativecommons.org/licenses/by/2.0/,Hans Põldoja +27e5c64bbfc6dc04,train,https://open-images-dataset.s3.amazonaws.com/train/27e5c64bbfc6dc04.jpg,https://www.flickr.com/photos/lost__in__spain/4119838452,https://creativecommons.org/licenses/by/2.0/,Adriano Agulló +27e89d65eff0bcec,train,https://open-images-dataset.s3.amazonaws.com/train/27e89d65eff0bcec.jpg,https://www.flickr.com/photos/daquellamanera/107613513,https://creativecommons.org/licenses/by/2.0/,Daniel Lobo +27eee6bcb710a5b4,train,https://open-images-dataset.s3.amazonaws.com/train/27eee6bcb710a5b4.jpg,https://www.flickr.com/photos/brostad/5818482777,https://creativecommons.org/licenses/by/2.0/,Bernt Rostad +27f04789eb5319af,train,https://open-images-dataset.s3.amazonaws.com/train/27f04789eb5319af.jpg,https://www.flickr.com/photos/51417107@N03/7147763087,https://creativecommons.org/licenses/by/2.0/,LaurPhil +27f24aeea66d602b,train,https://open-images-dataset.s3.amazonaws.com/train/27f24aeea66d602b.jpg,https://www.flickr.com/photos/aroberts/8020677735,https://creativecommons.org/licenses/by/2.0/,Andy Roberts +27f9660ed2e3121e,train,https://open-images-dataset.s3.amazonaws.com/train/27f9660ed2e3121e.jpg,https://www.flickr.com/photos/hankenstein/14694378766,https://creativecommons.org/licenses/by/2.0/,hank Mitchell +280dd3ea749d5548,train,https://open-images-dataset.s3.amazonaws.com/train/280dd3ea749d5548.jpg,https://www.flickr.com/photos/pasa/9219269013,https://creativecommons.org/licenses/by/2.0/,Paul Sableman +280eac8aa82af053,train,https://open-images-dataset.s3.amazonaws.com/train/280eac8aa82af053.jpg,https://www.flickr.com/photos/mujitra/2445309232,https://creativecommons.org/licenses/by/2.0/,MIKI Yoshihito +280ef0a0db22ea92,train,https://open-images-dataset.s3.amazonaws.com/train/280ef0a0db22ea92.jpg,https://www.flickr.com/photos/quinet/16585901284,https://creativecommons.org/licenses/by/2.0/,Thomas Quine +28103d85dabcf51d,train,https://open-images-dataset.s3.amazonaws.com/train/28103d85dabcf51d.jpg,https://www.flickr.com/photos/uniform-studio/4462492783,https://creativecommons.org/licenses/by/2.0/,Martha W McQuade +281ec36a60e2cd30,train,https://open-images-dataset.s3.amazonaws.com/train/281ec36a60e2cd30.jpg,https://www.flickr.com/photos/mploco/4219882324,https://creativecommons.org/licenses/by/2.0/,Roberto Cacho Toca +2821bdb12ce36ae9,train,https://open-images-dataset.s3.amazonaws.com/train/2821bdb12ce36ae9.jpg,https://www.flickr.com/photos/cogdog/16810966749,https://creativecommons.org/licenses/by/2.0/,Alan Levine +2823c3dbbc796b05,train,https://open-images-dataset.s3.amazonaws.com/train/2823c3dbbc796b05.jpg,https://www.flickr.com/photos/ian_wilson_49/16908595970,https://creativecommons.org/licenses/by/2.0/,Ian McFegan +2825e22a7c151bc8,train,https://open-images-dataset.s3.amazonaws.com/train/2825e22a7c151bc8.jpg,https://www.flickr.com/photos/gails_pictures/11423558253,https://creativecommons.org/licenses/by/2.0/,gailhampshire +2830e779150aebb7,train,https://open-images-dataset.s3.amazonaws.com/train/2830e779150aebb7.jpg,https://www.flickr.com/photos/bootbearwdc/215164417,https://creativecommons.org/licenses/by/2.0/,David +2838091894ec95b4,train,https://open-images-dataset.s3.amazonaws.com/train/2838091894ec95b4.jpg,https://www.flickr.com/photos/scatto_felino/6921844204,https://creativecommons.org/licenses/by/2.0/,Marco +284c23660fdc61d8,train,https://open-images-dataset.s3.amazonaws.com/train/284c23660fdc61d8.jpg,https://www.flickr.com/photos/kennejima/277010844,https://creativecommons.org/licenses/by/2.0/,kennejima +2852bffe5cd603b0,train,https://open-images-dataset.s3.amazonaws.com/train/2852bffe5cd603b0.jpg,https://www.flickr.com/photos/22964099@N05/2972483451,https://creativecommons.org/licenses/by/2.0/,bottled_void +28546f6b639f928d,train,https://open-images-dataset.s3.amazonaws.com/train/28546f6b639f928d.jpg,https://www.flickr.com/photos/vxla/4535247582,https://creativecommons.org/licenses/by/2.0/,vxla +285b3ca152a831a8,train,https://open-images-dataset.s3.amazonaws.com/train/285b3ca152a831a8.jpg,https://www.flickr.com/photos/zieak/5495861681,https://creativecommons.org/licenses/by/2.0/,Ryan McFarland +2869802b25a3f134,train,https://open-images-dataset.s3.amazonaws.com/train/2869802b25a3f134.jpg,https://www.flickr.com/photos/joanet/14824933447,https://creativecommons.org/licenses/by/2.0/,Joan Campderrós-i-Canas +286a1307ca75ac66,train,https://open-images-dataset.s3.amazonaws.com/train/286a1307ca75ac66.jpg,https://www.flickr.com/photos/quinet/6920824086,https://creativecommons.org/licenses/by/2.0/,Thomas Quine +286cf1a30f8dd4c7,train,https://open-images-dataset.s3.amazonaws.com/train/286cf1a30f8dd4c7.jpg,https://www.flickr.com/photos/kendylyoung/8164238059,https://creativecommons.org/licenses/by/2.0/,Kendyl Young +28705b1874c35d33,train,https://open-images-dataset.s3.amazonaws.com/train/28705b1874c35d33.jpg,https://www.flickr.com/photos/jetfuel/11092704553,https://creativecommons.org/licenses/by/2.0/,7th Groove +28796c7d78b2d027,train,https://open-images-dataset.s3.amazonaws.com/train/28796c7d78b2d027.jpg,https://www.flickr.com/photos/9084427@N07/7893825442,https://creativecommons.org/licenses/by/2.0/,Yellow.Cat +2888139ba64a8b23,train,https://open-images-dataset.s3.amazonaws.com/train/2888139ba64a8b23.jpg,https://www.flickr.com/photos/aaronpk/13854002525,https://creativecommons.org/licenses/by/2.0/,Aaron Parecki +2895b37bd0293879,train,https://open-images-dataset.s3.amazonaws.com/train/2895b37bd0293879.jpg,https://www.flickr.com/photos/fellowcreative/4632758038,https://creativecommons.org/licenses/by/2.0/,Carl @FellowCreative +28a0b4407695c767,train,https://open-images-dataset.s3.amazonaws.com/train/28a0b4407695c767.jpg,https://www.flickr.com/photos/flirst/7643233228,https://creativecommons.org/licenses/by/2.0/,andrea floris +28b308f088615f14,train,https://open-images-dataset.s3.amazonaws.com/train/28b308f088615f14.jpg,https://www.flickr.com/photos/kiaura/3974323203,https://creativecommons.org/licenses/by/2.0/,Chiara +28b658e8d3f35eac,train,https://open-images-dataset.s3.amazonaws.com/train/28b658e8d3f35eac.jpg,https://www.flickr.com/photos/wreck/4505588964,https://creativecommons.org/licenses/by/2.0/,@wreckandsalvage Salvage +28cdab2cd6848e5f,train,https://open-images-dataset.s3.amazonaws.com/train/28cdab2cd6848e5f.jpg,https://www.flickr.com/photos/nanpalmero/12759694835,https://creativecommons.org/licenses/by/2.0/,Nan Palmero +28fcc278f7e0a5d6,train,https://open-images-dataset.s3.amazonaws.com/train/28fcc278f7e0a5d6.jpg,https://www.flickr.com/photos/hansthijs/1788493549,https://creativecommons.org/licenses/by/2.0/,Piano Piano! +290cf189b20ede31,train,https://open-images-dataset.s3.amazonaws.com/train/290cf189b20ede31.jpg,https://www.flickr.com/photos/philliecasablanca/6327817296,https://creativecommons.org/licenses/by/2.0/,Phil Whitehouse +290d7c8bbc2a5548,train,https://open-images-dataset.s3.amazonaws.com/train/290d7c8bbc2a5548.jpg,https://www.flickr.com/photos/cityfoodsters/12734416753,https://creativecommons.org/licenses/by/2.0/,City Foodsters +290f1a4c07e411fb,train,https://open-images-dataset.s3.amazonaws.com/train/290f1a4c07e411fb.jpg,https://www.flickr.com/photos/lianza/33901633/,https://creativecommons.org/licenses/by/2.0/,Tom Lianza +291db729242667f6,train,https://open-images-dataset.s3.amazonaws.com/train/291db729242667f6.jpg,https://www.flickr.com/photos/theslowlane/1455919365,https://creativecommons.org/licenses/by/2.0/,Robert Ashworth +29277f0d525b6c9c,train,https://open-images-dataset.s3.amazonaws.com/train/29277f0d525b6c9c.jpg,https://www.flickr.com/photos/mdpettitt/6829521061,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt +292b03fca8f3509d,train,https://open-images-dataset.s3.amazonaws.com/train/292b03fca8f3509d.jpg,https://www.flickr.com/photos/jlastras/2240583442/,https://creativecommons.org/licenses/by/2.0/,Javier Lastras +2930673a35f79615,train,https://open-images-dataset.s3.amazonaws.com/train/2930673a35f79615.jpg,https://www.flickr.com/photos/tinto/18062920316,https://creativecommons.org/licenses/by/2.0/,Jörg Schubert +29455397120c9157,train,https://open-images-dataset.s3.amazonaws.com/train/29455397120c9157.jpg,https://www.flickr.com/photos/psd/87149053,https://creativecommons.org/licenses/by/2.0/,Paul Downey +2946740646c82e27,train,https://open-images-dataset.s3.amazonaws.com/train/2946740646c82e27.jpg,https://www.flickr.com/photos/mattkrause/14363691021,https://creativecommons.org/licenses/by/2.0/,Matt Krause +29505f1557b1d208,train,https://open-images-dataset.s3.amazonaws.com/train/29505f1557b1d208.jpg,https://www.flickr.com/photos/gonmi/15610252649,https://creativecommons.org/licenses/by/2.0/,Nacho +29797d28b5a4cda8,train,https://open-images-dataset.s3.amazonaws.com/train/29797d28b5a4cda8.jpg,https://www.flickr.com/photos/tahini/7988833572,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank +297af3a4b98c38b5,train,https://open-images-dataset.s3.amazonaws.com/train/297af3a4b98c38b5.jpg,https://www.flickr.com/photos/pandemonium/5577245545,https://creativecommons.org/licenses/by/2.0/,Dominuz +297bf1ca918a74a2,train,https://open-images-dataset.s3.amazonaws.com/train/297bf1ca918a74a2.jpg,https://www.flickr.com/photos/reibai/2480775318,https://creativecommons.org/licenses/by/2.0/,reibai +297f62100d92f41f,train,https://open-images-dataset.s3.amazonaws.com/train/297f62100d92f41f.jpg,https://www.flickr.com/photos/peter2010/14778283183,https://creativecommons.org/licenses/by/2.0/,Peter +298bf67fb4cfaa51,train,https://open-images-dataset.s3.amazonaws.com/train/298bf67fb4cfaa51.jpg,https://www.flickr.com/photos/yuko_ppp/2122017111,https://creativecommons.org/licenses/by/2.0/,Yuko Hara +299f5eb41525a97b,train,https://open-images-dataset.s3.amazonaws.com/train/299f5eb41525a97b.jpg,https://www.flickr.com/photos/noahbulgaria/98776253/,https://creativecommons.org/licenses/by/2.0/,Noah +29a4d3203a8fb4c0,train,https://open-images-dataset.s3.amazonaws.com/train/29a4d3203a8fb4c0.jpg,https://www.flickr.com/photos/veisto/4238375332,https://creativecommons.org/licenses/by/2.0/,Antti T. Nissinen +29b925c2a7834da0,train,https://open-images-dataset.s3.amazonaws.com/train/29b925c2a7834da0.jpg,https://www.flickr.com/photos/gregloby/3014564671,https://creativecommons.org/licenses/by/2.0/,Greg Lobinski +29c3ae2ddf9c4ee3,train,https://open-images-dataset.s3.amazonaws.com/train/29c3ae2ddf9c4ee3.jpg,https://www.flickr.com/photos/newfave/5898754587,https://creativecommons.org/licenses/by/2.0/,Bill Nicolich +29d5618477ba04c4,train,https://open-images-dataset.s3.amazonaws.com/train/29d5618477ba04c4.jpg,https://www.flickr.com/photos/ricote/5550272297,https://creativecommons.org/licenses/by/2.0/,Ricardo Ricote Rodríguez +29dad637553660d9,train,https://open-images-dataset.s3.amazonaws.com/train/29dad637553660d9.jpg,https://www.flickr.com/photos/smoses/3412297229,https://creativecommons.org/licenses/by/2.0/,Steve Moses +29ddb24f1938da8a,train,https://open-images-dataset.s3.amazonaws.com/train/29ddb24f1938da8a.jpg,https://www.flickr.com/photos/eyeno/43576104,https://creativecommons.org/licenses/by/2.0/,Ken Mist +29ea4ea45f833f16,train,https://open-images-dataset.s3.amazonaws.com/train/29ea4ea45f833f16.jpg,https://www.flickr.com/photos/brendanadkins/6959111526,https://creativecommons.org/licenses/by/2.0/,Brendan Adkins +2a00323ab456232d,train,https://open-images-dataset.s3.amazonaws.com/train/2a00323ab456232d.jpg,https://www.flickr.com/photos/otge/3586710244,https://creativecommons.org/licenses/by/2.0/,a.otge +2a012ce1a9d47ce9,train,https://open-images-dataset.s3.amazonaws.com/train/2a012ce1a9d47ce9.jpg,https://www.flickr.com/photos/aforero/343100401,https://creativecommons.org/licenses/by/2.0/,Alejandro Forero Cuervo +2a0bc9df44cbbdf7,train,https://open-images-dataset.s3.amazonaws.com/train/2a0bc9df44cbbdf7.jpg,https://www.flickr.com/photos/pixelm/18244850845,https://creativecommons.org/licenses/by/2.0/,iamdanw +2a0eb37b5ad4f854,train,https://open-images-dataset.s3.amazonaws.com/train/2a0eb37b5ad4f854.jpg,https://www.flickr.com/photos/infrogmation/21287122840,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans +2a1a7c1683b4f1f7,train,https://open-images-dataset.s3.amazonaws.com/train/2a1a7c1683b4f1f7.jpg,https://www.flickr.com/photos/12567713@N00/6729207335,https://creativecommons.org/licenses/by/2.0/,born1945 +2a2371a5a1897479,train,https://open-images-dataset.s3.amazonaws.com/train/2a2371a5a1897479.jpg,https://www.flickr.com/photos/joeshlabotnik/819580808,https://creativecommons.org/licenses/by/2.0/,Joe Shlabotnik +2a282a697a7c24ba,train,https://open-images-dataset.s3.amazonaws.com/train/2a282a697a7c24ba.jpg,https://www.flickr.com/photos/zyllan/4511729315,https://creativecommons.org/licenses/by/2.0/,Zyllan Fotografía +2a2aaabc6c67a2e4,train,https://open-images-dataset.s3.amazonaws.com/train/2a2aaabc6c67a2e4.jpg,https://www.flickr.com/photos/renata_a_pinto/3600029221,https://creativecommons.org/licenses/by/2.0/,Renata Avila +2a2b7b98f406fca0,train,https://open-images-dataset.s3.amazonaws.com/train/2a2b7b98f406fca0.jpg,https://www.flickr.com/photos/jeffwilcox/14625033043,https://creativecommons.org/licenses/by/2.0/,Jeff Wilcox +2a353968f443a21f,train,https://open-images-dataset.s3.amazonaws.com/train/2a353968f443a21f.jpg,https://www.flickr.com/photos/dalbera/4959051567,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalbéra +2a38b05bddd6d189,train,https://open-images-dataset.s3.amazonaws.com/train/2a38b05bddd6d189.jpg,https://www.flickr.com/photos/tekniskamuseet/8111980458,https://creativecommons.org/licenses/by/2.0/,Tekniska museet +2a482c3c6594578a,train,https://open-images-dataset.s3.amazonaws.com/train/2a482c3c6594578a.jpg,https://www.flickr.com/photos/pazit/197864626,https://creativecommons.org/licenses/by/2.0/,Pazit Polak +2a5226f4c992eae8,train,https://open-images-dataset.s3.amazonaws.com/train/2a5226f4c992eae8.jpg,https://www.flickr.com/photos/eperales/124687830,https://creativecommons.org/licenses/by/2.0/,eperales +2a54c12c0d654e8e,train,https://open-images-dataset.s3.amazonaws.com/train/2a54c12c0d654e8e.jpg,https://www.flickr.com/photos/erinmahollitz/5174303079,https://creativecommons.org/licenses/by/2.0/,erinmahollitz +2a555f0c37af0288,train,https://open-images-dataset.s3.amazonaws.com/train/2a555f0c37af0288.jpg,https://www.flickr.com/photos/cristiano_betta/432818602,https://creativecommons.org/licenses/by/2.0/,Cristiano Betta +2a56d2629001ac51,train,https://open-images-dataset.s3.amazonaws.com/train/2a56d2629001ac51.jpg,https://www.flickr.com/photos/barockschloss/6143182181,https://creativecommons.org/licenses/by/2.0/,barockschloss +2a5bf4689b39e2d8,train,https://open-images-dataset.s3.amazonaws.com/train/2a5bf4689b39e2d8.jpg,https://www.flickr.com/photos/92682792@N00/6065656981,https://creativecommons.org/licenses/by/2.0/,gravitat-OFF +2a5f9d2dc0b1f1b7,train,https://open-images-dataset.s3.amazonaws.com/train/2a5f9d2dc0b1f1b7.jpg,https://www.flickr.com/photos/karenandbrademerson/8786444828,https://creativecommons.org/licenses/by/2.0/,Karen and Brad Emerson +2a68f90615989a6a,train,https://open-images-dataset.s3.amazonaws.com/train/2a68f90615989a6a.jpg,https://www.flickr.com/photos/digitizedchaos/5508655179,https://creativecommons.org/licenses/by/2.0/,Rian Castillo +2a71c31ce788d9dd,train,https://open-images-dataset.s3.amazonaws.com/train/2a71c31ce788d9dd.jpg,https://www.flickr.com/photos/hanspoldoja/268075699,https://creativecommons.org/licenses/by/2.0/,Hans Põldoja +2a8295ddb550be14,train,https://open-images-dataset.s3.amazonaws.com/train/2a8295ddb550be14.jpg,https://www.flickr.com/photos/22711505@N05/8649673360,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell +2a9077a7abb33072,train,https://open-images-dataset.s3.amazonaws.com/train/2a9077a7abb33072.jpg,https://www.flickr.com/photos/zeevveez/3585293874,https://creativecommons.org/licenses/by/2.0/,zeevveez +2a96f6732347fb5c,train,https://open-images-dataset.s3.amazonaws.com/train/2a96f6732347fb5c.jpg,https://www.flickr.com/photos/128345822@N05/15356923053,https://creativecommons.org/licenses/by/2.0/,Lauren Quataert +2a9716cea4de6714,train,https://open-images-dataset.s3.amazonaws.com/train/2a9716cea4de6714.jpg,https://www.flickr.com/photos/rainsong/7264034410,https://creativecommons.org/licenses/by/2.0/,Ali from Riyadh : ) +2a9803cd34e8395e,train,https://open-images-dataset.s3.amazonaws.com/train/2a9803cd34e8395e.jpg,https://www.flickr.com/photos/dnamichaud/4628346138,https://creativecommons.org/licenses/by/2.0/,Dean Michaud +2aa47546a2b19513,train,https://open-images-dataset.s3.amazonaws.com/train/2aa47546a2b19513.jpg,https://www.flickr.com/photos/davef3138/3983046473,https://creativecommons.org/licenses/by/2.0/,davef3138 +2aa8bdb77a589836,train,https://open-images-dataset.s3.amazonaws.com/train/2aa8bdb77a589836.jpg,https://www.flickr.com/photos/londonmatt/12324897055,https://creativecommons.org/licenses/by/2.0/,Matt Brown +2aac419b660bd87b,train,https://open-images-dataset.s3.amazonaws.com/train/2aac419b660bd87b.jpg,https://www.flickr.com/photos/ayk/12855776,https://creativecommons.org/licenses/by/2.0/,ayako +2ac0bd4747ddd354,train,https://open-images-dataset.s3.amazonaws.com/train/2ac0bd4747ddd354.jpg,https://www.flickr.com/photos/bassibaba/2515603277,https://creativecommons.org/licenses/by/2.0/,Bassi Baba +2ac7e7e3b32988f8,train,https://open-images-dataset.s3.amazonaws.com/train/2ac7e7e3b32988f8.jpg,https://www.flickr.com/photos/26023255@N03/9181789708,https://creativecommons.org/licenses/by/2.0/,Jenifer Corrêa +2ad213fba62bba1c,train,https://open-images-dataset.s3.amazonaws.com/train/2ad213fba62bba1c.jpg,https://www.flickr.com/photos/tbwb/7625308462,https://creativecommons.org/licenses/by/2.0/,Unskinny Boppy +2addc7ad1e4a9138,train,https://open-images-dataset.s3.amazonaws.com/train/2addc7ad1e4a9138.jpg,https://www.flickr.com/photos/40987321@N02/5949829702,https://creativecommons.org/licenses/by/2.0/,Alex +2af12fcd771c1cab,train,https://open-images-dataset.s3.amazonaws.com/train/2af12fcd771c1cab.jpg,https://www.flickr.com/photos/depenbusch/5808536344,https://creativecommons.org/licenses/by/2.0/,Thomas Depenbusch +2af47353bb706b2d,train,https://open-images-dataset.s3.amazonaws.com/train/2af47353bb706b2d.jpg,https://www.flickr.com/photos/dipu87/2614666364,https://creativecommons.org/licenses/by/2.0/,Dipanker Dutta +2b004fdc69a4b79b,train,https://open-images-dataset.s3.amazonaws.com/train/2b004fdc69a4b79b.jpg,https://www.flickr.com/photos/psyberartist/16551461433,https://creativecommons.org/licenses/by/2.0/,psyberartist +2b03265c825fdfb8,train,https://open-images-dataset.s3.amazonaws.com/train/2b03265c825fdfb8.jpg,https://www.flickr.com/photos/khalidalbaih/5100962594,https://creativecommons.org/licenses/by/2.0/,Khalid Albaih +2b0ce05df43d2186,train,https://open-images-dataset.s3.amazonaws.com/train/2b0ce05df43d2186.jpg,https://www.flickr.com/photos/99667320@N06/14004444110,https://creativecommons.org/licenses/by/2.0/,Pixelteufel +2b137f5f95d3c696,train,https://open-images-dataset.s3.amazonaws.com/train/2b137f5f95d3c696.jpg,https://www.flickr.com/photos/eager/5961270036,https://creativecommons.org/licenses/by/2.0/,準建築人手札網站 Forgemind ArchiMedia +2b13af0d8ab4512d,train,https://open-images-dataset.s3.amazonaws.com/train/2b13af0d8ab4512d.jpg,https://www.flickr.com/photos/rob-young/926041169,https://creativecommons.org/licenses/by/2.0/,Rob Young +2b233295ab6c4d01,train,https://open-images-dataset.s3.amazonaws.com/train/2b233295ab6c4d01.jpg,https://www.flickr.com/photos/akras/4696218324,https://creativecommons.org/licenses/by/2.0/,Andrey +2b3213c2b6f248d3,train,https://open-images-dataset.s3.amazonaws.com/train/2b3213c2b6f248d3.jpg,https://www.flickr.com/photos/supermendikute/2970657253,https://creativecommons.org/licenses/by/2.0/,Josu Mendicute +2b373db40c7cec33,train,https://open-images-dataset.s3.amazonaws.com/train/2b373db40c7cec33.jpg,https://www.flickr.com/photos/gylesglover/15748077155,https://creativecommons.org/licenses/by/2.0/,Gyles Glover +2b3979c91d7989d1,train,https://open-images-dataset.s3.amazonaws.com/train/2b3979c91d7989d1.jpg,https://www.flickr.com/photos/uetliberg/9933684404,https://creativecommons.org/licenses/by/2.0/,Uetliberg +2b3a479a18257000,train,https://open-images-dataset.s3.amazonaws.com/train/2b3a479a18257000.jpg,https://www.flickr.com/photos/73494402@N00/244692865,https://creativecommons.org/licenses/by/2.0/,Arnie J +2b3fd5cb2e6951b0,train,https://open-images-dataset.s3.amazonaws.com/train/2b3fd5cb2e6951b0.jpg,https://www.flickr.com/photos/24701549@N07/18052844135,https://creativecommons.org/licenses/by/2.0/,Spudgun67 +2b44877236519b9f,train,https://open-images-dataset.s3.amazonaws.com/train/2b44877236519b9f.jpg,https://www.flickr.com/photos/jf10/2829001034,https://creativecommons.org/licenses/by/2.0/,JF10 +2b45c54c13c96aa4,train,https://open-images-dataset.s3.amazonaws.com/train/2b45c54c13c96aa4.jpg,https://www.flickr.com/photos/15422259@N05/16173928765/,https://creativecommons.org/licenses/by/2.0/,Huỳnh Tấn Phát +2b5065fd3f71212c,train,https://open-images-dataset.s3.amazonaws.com/train/2b5065fd3f71212c.jpg,https://www.flickr.com/photos/92795775@N00/5444900666,https://creativecommons.org/licenses/by/2.0/,Gavin Tapp +2b7243a7b768ea2a,train,https://open-images-dataset.s3.amazonaws.com/train/2b7243a7b768ea2a.jpg,https://www.flickr.com/photos/davidececcarelli/13247561795,https://creativecommons.org/licenses/by/2.0/,Davide Ceccarelli +2b867edd138e4293,train,https://open-images-dataset.s3.amazonaws.com/train/2b867edd138e4293.jpg,https://www.flickr.com/photos/dierkschaefer/4423005132,https://creativecommons.org/licenses/by/2.0/,dierk schaefer +2b8c0f23c8e515f4,train,https://open-images-dataset.s3.amazonaws.com/train/2b8c0f23c8e515f4.jpg,https://www.flickr.com/photos/graniers/7334495666,https://creativecommons.org/licenses/by/2.0/,Graniers +2b912791ab5a61fe,train,https://open-images-dataset.s3.amazonaws.com/train/2b912791ab5a61fe.jpg,https://www.flickr.com/photos/alainalele/5610020573,https://creativecommons.org/licenses/by/2.0/,alainalele +2b9482e4dbc2e1e8,train,https://open-images-dataset.s3.amazonaws.com/train/2b9482e4dbc2e1e8.jpg,https://www.flickr.com/photos/rheumatictangle/3766813707,https://creativecommons.org/licenses/by/2.0/,Mike Rugnetta +2b960ef8f2088646,train,https://open-images-dataset.s3.amazonaws.com/train/2b960ef8f2088646.jpg,https://www.flickr.com/photos/respres/2166993854,https://creativecommons.org/licenses/by/2.0/,Jeff Turner +2bae2feefc004a76,train,https://open-images-dataset.s3.amazonaws.com/train/2bae2feefc004a76.jpg,https://www.flickr.com/photos/rnugraha/3419323590,https://creativecommons.org/licenses/by/2.0/,Riza Nugraha +2bb39bcfcfbdfc66,train,https://open-images-dataset.s3.amazonaws.com/train/2bb39bcfcfbdfc66.jpg,https://www.flickr.com/photos/63837784@N08/9705370000,https://creativecommons.org/licenses/by/2.0/,Ohio Redevelopment Projects - ODSA +2bb6aba3e86a05e5,train,https://open-images-dataset.s3.amazonaws.com/train/2bb6aba3e86a05e5.jpg,https://www.flickr.com/photos/jeremylevinedesign/3640107485,https://creativecommons.org/licenses/by/2.0/,Jeremy Levine +2bc635ecefb9d1ff,train,https://open-images-dataset.s3.amazonaws.com/train/2bc635ecefb9d1ff.jpg,https://www.flickr.com/photos/73416633@N00/250391022,https://creativecommons.org/licenses/by/2.0/,Sandra Cohen-Rose and Colin Rose +2bd3c7222419f7f2,train,https://open-images-dataset.s3.amazonaws.com/train/2bd3c7222419f7f2.jpg,https://www.flickr.com/photos/uberculture/3873199530,https://creativecommons.org/licenses/by/2.0/,Jeremy Noble +2be0256f676372a9,train,https://open-images-dataset.s3.amazonaws.com/train/2be0256f676372a9.jpg,https://www.flickr.com/photos/flowcomm/14065355166,https://creativecommons.org/licenses/by/2.0/,flowcomm +2bf841ea4bdfaab7,train,https://open-images-dataset.s3.amazonaws.com/train/2bf841ea4bdfaab7.jpg,https://www.flickr.com/photos/vamcmag/4835191298,https://creativecommons.org/licenses/by/2.0/,Maggie McCain +2bfcaad9b23da352,train,https://open-images-dataset.s3.amazonaws.com/train/2bfcaad9b23da352.jpg,https://www.flickr.com/photos/cristianocani/2847663321,https://creativecommons.org/licenses/by/2.0/,Cristiano Cani +2c05e793f00a0e18,train,https://open-images-dataset.s3.amazonaws.com/train/2c05e793f00a0e18.jpg,https://www.flickr.com/photos/clanlife/2127957013,https://creativecommons.org/licenses/by/2.0/,Phil Campbell +2c0b4deaec3a96ac,train,https://open-images-dataset.s3.amazonaws.com/train/2c0b4deaec3a96ac.jpg,https://www.flickr.com/photos/topsteph53/5605544261,https://creativecommons.org/licenses/by/2.0/,Stephane Mignon +2c121ce9bbff677c,train,https://open-images-dataset.s3.amazonaws.com/train/2c121ce9bbff677c.jpg,https://www.flickr.com/photos/johnthescone/1964885069,https://creativecommons.org/licenses/by/2.0/,johnthescone +2c1b00e1ba432a78,train,https://open-images-dataset.s3.amazonaws.com/train/2c1b00e1ba432a78.jpg,https://www.flickr.com/photos/notionscapital/13770890595,https://creativecommons.org/licenses/by/2.0/,Mike Licht +2c284f0d8e87fae5,train,https://open-images-dataset.s3.amazonaws.com/train/2c284f0d8e87fae5.jpg,https://www.flickr.com/photos/tommy_pariah/3482279223,https://creativecommons.org/licenses/by/2.0/,Tommaso Meli +2c2d6e002bee492c,train,https://open-images-dataset.s3.amazonaws.com/train/2c2d6e002bee492c.jpg,https://www.flickr.com/photos/uitdragerij/3636024385,https://creativecommons.org/licenses/by/2.0/,Hans Dinkelberg +2c39d0eef876ebea,train,https://open-images-dataset.s3.amazonaws.com/train/2c39d0eef876ebea.jpg,https://www.flickr.com/photos/84554176@N00/7409672200,https://creativecommons.org/licenses/by/2.0/,Guillaume Baviere +2c464cba8ce77797,train,https://open-images-dataset.s3.amazonaws.com/train/2c464cba8ce77797.jpg,https://www.flickr.com/photos/eugeniopetrov/15001995687,https://creativecommons.org/licenses/by/2.0/,Eugénio Petrov +2c5f1677d38ca5b3,train,https://open-images-dataset.s3.amazonaws.com/train/2c5f1677d38ca5b3.jpg,https://www.flickr.com/photos/ken_mayer/7367284336,https://creativecommons.org/licenses/by/2.0/,Ken Mayer +2c64e591e1e6b8e0,train,https://open-images-dataset.s3.amazonaws.com/train/2c64e591e1e6b8e0.jpg,https://www.flickr.com/photos/127592731@N07/15510422615,https://creativecommons.org/licenses/by/2.0/,Mauricio Navarrete Contreras +2c6bdb716fd30a37,train,https://open-images-dataset.s3.amazonaws.com/train/2c6bdb716fd30a37.jpg,https://www.flickr.com/photos/kmore/18422301295,https://creativecommons.org/licenses/by/2.0/,kerry morrison +2c6e7f74aa2b4679,train,https://open-images-dataset.s3.amazonaws.com/train/2c6e7f74aa2b4679.jpg,https://www.flickr.com/photos/jenniferboyer/5892281472,https://creativecommons.org/licenses/by/2.0/,Jennifer Boyer +2c74df5a2bbb487a,train,https://open-images-dataset.s3.amazonaws.com/train/2c74df5a2bbb487a.jpg,https://www.flickr.com/photos/alancleaver/3457076436,https://creativecommons.org/licenses/by/2.0/,Alan Cleaver +2c7d7858a622755d,train,https://open-images-dataset.s3.amazonaws.com/train/2c7d7858a622755d.jpg,https://www.flickr.com/photos/yto/4339932694,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita +2cacbbb52c7a09a9,train,https://open-images-dataset.s3.amazonaws.com/train/2cacbbb52c7a09a9.jpg,https://www.flickr.com/photos/pacificairforces/8542183574,https://creativecommons.org/licenses/by/2.0/,PACAF +2cb1910cbbc0cbee,train,https://open-images-dataset.s3.amazonaws.com/train/2cb1910cbbc0cbee.jpg,https://www.flickr.com/photos/emmandevin/5893852097,https://creativecommons.org/licenses/by/2.0/,Britt Reints +2cbd3443b7ecf1a3,train,https://open-images-dataset.s3.amazonaws.com/train/2cbd3443b7ecf1a3.jpg,https://www.flickr.com/photos/andymangold/5100498165,https://creativecommons.org/licenses/by/2.0/,Andy Mangold +2cc65f0a7ffb2ada,train,https://open-images-dataset.s3.amazonaws.com/train/2cc65f0a7ffb2ada.jpg,https://www.flickr.com/photos/httpwwwflickrcomphotostopend/3618268806,https://creativecommons.org/licenses/by/2.0/,Stephen Michael Barnett +2cdb6776168b58be,train,https://open-images-dataset.s3.amazonaws.com/train/2cdb6776168b58be.jpg,https://www.flickr.com/photos/ceciliaheinen/8604901506,https://creativecommons.org/licenses/by/2.0/,Cecilia Heinen +2cddd138853e291a,train,https://open-images-dataset.s3.amazonaws.com/train/2cddd138853e291a.jpg,https://www.flickr.com/photos/doc_ugo/3024141099,https://creativecommons.org/licenses/by/2.0/,hugo esteves +2ce4cbfe94971c54,train,https://open-images-dataset.s3.amazonaws.com/train/2ce4cbfe94971c54.jpg,https://www.flickr.com/photos/nordique/17934559,https://creativecommons.org/licenses/by/2.0/,Peter Stevens +2ce5a7423e8f7fb1,train,https://open-images-dataset.s3.amazonaws.com/train/2ce5a7423e8f7fb1.jpg,https://www.flickr.com/photos/james-gunn/14851105590,https://creativecommons.org/licenses/by/2.0/,James Gunn +2d0e708bfa0860f8,train,https://open-images-dataset.s3.amazonaws.com/train/2d0e708bfa0860f8.jpg,https://www.flickr.com/photos/5nap/11387740875/in/pool-architecture/,https://creativecommons.org/licenses/by/2.0/,Sergey Norin +2d2ba896b05158ce,train,https://open-images-dataset.s3.amazonaws.com/train/2d2ba896b05158ce.jpg,https://www.flickr.com/photos/124016496@N07/15991650672,https://creativecommons.org/licenses/by/2.0/,Rachel Chapdelaine +2d366ee4635aba0b,train,https://open-images-dataset.s3.amazonaws.com/train/2d366ee4635aba0b.jpg,https://www.flickr.com/photos/yamauchibukuro/15602454350,https://creativecommons.org/licenses/by/2.0/,yamauchi +2d4244fa1ce459c3,train,https://open-images-dataset.s3.amazonaws.com/train/2d4244fa1ce459c3.jpg,https://www.flickr.com/photos/45131642@N00/4232353700,https://creativecommons.org/licenses/by/2.0/,Phil Parker +2d4b6cb96d5983a2,train,https://open-images-dataset.s3.amazonaws.com/train/2d4b6cb96d5983a2.jpg,https://www.flickr.com/photos/pellesten/3941230379,https://creativecommons.org/licenses/by/2.0/,Pelle Sten +2d50f0f8fbf86e00,train,https://open-images-dataset.s3.amazonaws.com/train/2d50f0f8fbf86e00.jpg,https://www.flickr.com/photos/snigl3t/2228775800,https://creativecommons.org/licenses/by/2.0/,Anne-Lise Heinrichs +2d52adfca7e8ca89,train,https://open-images-dataset.s3.amazonaws.com/train/2d52adfca7e8ca89.jpg,https://www.flickr.com/photos/31216636@N00/21157188555,https://creativecommons.org/licenses/by/2.0/,David Evers +2d77abeaafb83448,train,https://open-images-dataset.s3.amazonaws.com/train/2d77abeaafb83448.jpg,https://www.flickr.com/photos/buridan/14613746673,https://creativecommons.org/licenses/by/2.0/,Jeremy hunsinger +2d8d6307314afe5a,train,https://open-images-dataset.s3.amazonaws.com/train/2d8d6307314afe5a.jpg,https://www.flickr.com/photos/zeldman/19409871406,https://creativecommons.org/licenses/by/2.0/,Jeffrey Zeldman +2d91739e4bc860c3,train,https://open-images-dataset.s3.amazonaws.com/train/2d91739e4bc860c3.jpg,https://www.flickr.com/photos/everydaypants/6783380903,https://creativecommons.org/licenses/by/2.0/,ramsey beyer +2d96a66cfd637d06,train,https://open-images-dataset.s3.amazonaws.com/train/2d96a66cfd637d06.jpg,https://www.flickr.com/photos/leshaines123/7789001308,https://creativecommons.org/licenses/by/2.0/,Les Haines +2da0bc35c3f722e6,train,https://open-images-dataset.s3.amazonaws.com/train/2da0bc35c3f722e6.jpg,https://www.flickr.com/photos/v1ctor/20005951664,https://creativecommons.org/licenses/by/2.0/,Victor +2dbefdb6a11a9825,train,https://open-images-dataset.s3.amazonaws.com/train/2dbefdb6a11a9825.jpg,https://www.flickr.com/photos/andreasduess/14961354357,https://creativecommons.org/licenses/by/2.0/,Andreas Duess +2dc3e1525cb7a184,train,https://open-images-dataset.s3.amazonaws.com/train/2dc3e1525cb7a184.jpg,https://www.flickr.com/photos/maong/1998193113,https://creativecommons.org/licenses/by/2.0/,Monica Arellano-Ongpin +2dd0edf1e2702eb6,train,https://open-images-dataset.s3.amazonaws.com/train/2dd0edf1e2702eb6.jpg,https://www.flickr.com/photos/xerostomia/325280230,https://creativecommons.org/licenses/by/2.0/,Rob! +2dd13ab9d780184c,train,https://open-images-dataset.s3.amazonaws.com/train/2dd13ab9d780184c.jpg,https://www.flickr.com/photos/63837784@N08/14683281345,https://creativecommons.org/licenses/by/2.0/,Ohio Redevelopment Projects - ODSA +2de0db950fd976c4,train,https://open-images-dataset.s3.amazonaws.com/train/2de0db950fd976c4.jpg,https://www.flickr.com/photos/itstimetoriseup/5396430649/,https://creativecommons.org/licenses/by/2.0/,Stop the Tar Sands +2deb9d0860c1e8d9,train,https://open-images-dataset.s3.amazonaws.com/train/2deb9d0860c1e8d9.jpg,https://www.flickr.com/photos/kevinkrejci/18538191439,https://creativecommons.org/licenses/by/2.0/,Kevin Krejci +2ded2149901323e0,train,https://open-images-dataset.s3.amazonaws.com/train/2ded2149901323e0.jpg,https://www.flickr.com/photos/krasava/8627080341/,https://creativecommons.org/licenses/by/2.0/,Alex Krasavtsev +2e02fc854bbdee58,train,https://open-images-dataset.s3.amazonaws.com/train/2e02fc854bbdee58.jpg,https://www.flickr.com/photos/gonmi/7555388202,https://creativecommons.org/licenses/by/2.0/,Nacho +2e0a508dbeaa21e1,train,https://open-images-dataset.s3.amazonaws.com/train/2e0a508dbeaa21e1.jpg,https://www.flickr.com/photos/malcolmtredinnick/5332538616,https://creativecommons.org/licenses/by/2.0/,Malcolm Tredinnick +2e19a9e6b021a8f4,train,https://open-images-dataset.s3.amazonaws.com/train/2e19a9e6b021a8f4.jpg,https://www.flickr.com/photos/martinduerr/20466355213,https://creativecommons.org/licenses/by/2.0/,Martin Dürr +2e28ff38d8963c63,train,https://open-images-dataset.s3.amazonaws.com/train/2e28ff38d8963c63.jpg,https://www.flickr.com/photos/loughboroughuniversitylibrary/5388190505,https://creativecommons.org/licenses/by/2.0/,Loughborough University Library +2e2d06f0d28e9ef2,train,https://open-images-dataset.s3.amazonaws.com/train/2e2d06f0d28e9ef2.jpg,https://www.flickr.com/photos/enixii/4289817551,https://creativecommons.org/licenses/by/2.0/,chia ying Yang +2e2e41612fd33ce5,train,https://open-images-dataset.s3.amazonaws.com/train/2e2e41612fd33ce5.jpg,https://www.flickr.com/photos/23727257@N00/5236349105,https://creativecommons.org/licenses/by/2.0/,Suzie Tremmel +2e352fb31df09664,train,https://open-images-dataset.s3.amazonaws.com/train/2e352fb31df09664.jpg,https://www.flickr.com/photos/endogamia/20568463869,https://creativecommons.org/licenses/by/2.0/,Feans +2e3e8e5b611f4a49,train,https://open-images-dataset.s3.amazonaws.com/train/2e3e8e5b611f4a49.jpg,https://www.flickr.com/photos/trondheim_byarkiv/4706693850,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim +2e411ff3b4e72cd7,train,https://open-images-dataset.s3.amazonaws.com/train/2e411ff3b4e72cd7.jpg,https://www.flickr.com/photos/15959192@N02/3776122410,https://creativecommons.org/licenses/by/2.0/,ANU PADMA IYANGAR +2e41d627420c50cf,train,https://open-images-dataset.s3.amazonaws.com/train/2e41d627420c50cf.jpg,https://www.flickr.com/photos/nslashdot/14691479237/,https://creativecommons.org/licenses/by/2.0/,Deeped Niclas & Amanda Strandh +2e422341ac7d6c33,train,https://open-images-dataset.s3.amazonaws.com/train/2e422341ac7d6c33.jpg,https://www.flickr.com/photos/ninara/8649523856,https://creativecommons.org/licenses/by/2.0/,Ninara +2e45c903c149d345,train,https://open-images-dataset.s3.amazonaws.com/train/2e45c903c149d345.jpg,https://www.flickr.com/photos/rezapci/21717589608,https://creativecommons.org/licenses/by/2.0/,Lion Multimedia Production U.S.A. +2e46d048c7cc0729,train,https://open-images-dataset.s3.amazonaws.com/train/2e46d048c7cc0729.jpg,https://www.flickr.com/photos/ameriswede/6561598713,https://creativecommons.org/licenses/by/2.0/,_Dinkel_ +2e57562a36a56a69,train,https://open-images-dataset.s3.amazonaws.com/train/2e57562a36a56a69.jpg,https://www.flickr.com/photos/laurenprofeta/2395946724,https://creativecommons.org/licenses/by/2.0/,Lauren Mitchell +2e5bb923a3f8fdf4,train,https://open-images-dataset.s3.amazonaws.com/train/2e5bb923a3f8fdf4.jpg,https://www.flickr.com/photos/gonmi/15489251254,https://creativecommons.org/licenses/by/2.0/,Nacho +2e81af425bcce5c6,train,https://open-images-dataset.s3.amazonaws.com/train/2e81af425bcce5c6.jpg,https://www.flickr.com/photos/fanofretail/9029414567,https://creativecommons.org/licenses/by/2.0/,Nicholas Eckhart +2e937efd33858a65,train,https://open-images-dataset.s3.amazonaws.com/train/2e937efd33858a65.jpg,https://www.flickr.com/photos/laffy4k/457349148,https://creativecommons.org/licenses/by/2.0/,chrismetcalfTV +2e949c2ed0e4e7a4,train,https://open-images-dataset.s3.amazonaws.com/train/2e949c2ed0e4e7a4.jpg,https://www.flickr.com/photos/stignygaard/18966305930,https://creativecommons.org/licenses/by/2.0/,Stig Nygaard +2e94bfb7a019e186,train,https://open-images-dataset.s3.amazonaws.com/train/2e94bfb7a019e186.jpg,https://www.flickr.com/photos/pussnboots/8027654511,https://creativecommons.org/licenses/by/2.0/,Isabel +2ea31162cd2706a1,train,https://open-images-dataset.s3.amazonaws.com/train/2ea31162cd2706a1.jpg,https://www.flickr.com/photos/sarchi/496539166/,https://creativecommons.org/licenses/by/2.0/,_sarchi +2eaaf0eb13b0162a,train,https://open-images-dataset.s3.amazonaws.com/train/2eaaf0eb13b0162a.jpg,https://www.flickr.com/photos/fifikins/3618801461,https://creativecommons.org/licenses/by/2.0/,Fiona Henderson +2eb9ca6f173921f8,train,https://open-images-dataset.s3.amazonaws.com/train/2eb9ca6f173921f8.jpg,https://www.flickr.com/photos/pcambra/3958405019,https://creativecommons.org/licenses/by/2.0/,Pedro Cambra +2ebf78bd74f887f8,train,https://open-images-dataset.s3.amazonaws.com/train/2ebf78bd74f887f8.jpg,https://www.flickr.com/photos/spycherf/10722013695,https://creativecommons.org/licenses/by/2.0/,Frederic Spycher +2ec7167bc4f0261d,train,https://open-images-dataset.s3.amazonaws.com/train/2ec7167bc4f0261d.jpg,https://www.flickr.com/photos/caspermoller/2674923698,https://creativecommons.org/licenses/by/2.0/,Casper Moller +2eedacb1aea229c6,train,https://open-images-dataset.s3.amazonaws.com/train/2eedacb1aea229c6.jpg,https://www.flickr.com/photos/y2bk/2525265704,https://creativecommons.org/licenses/by/2.0/,brian kelly +2ef1502c32756112,train,https://open-images-dataset.s3.amazonaws.com/train/2ef1502c32756112.jpg,https://www.flickr.com/photos/zigazou76/10860859246,https://creativecommons.org/licenses/by/2.0/,Frédéric BISSON +2ef500716f41d866,train,https://open-images-dataset.s3.amazonaws.com/train/2ef500716f41d866.jpg,https://www.flickr.com/photos/jordanwoods/8539126301,https://creativecommons.org/licenses/by/2.0/,Jordan Woods +2f05de4c51e54944,train,https://open-images-dataset.s3.amazonaws.com/train/2f05de4c51e54944.jpg,https://www.flickr.com/photos/waferboard/9378713817/,https://creativecommons.org/licenses/by/2.0/,waferboard +2f0b58f097c29808,train,https://open-images-dataset.s3.amazonaws.com/train/2f0b58f097c29808.jpg,https://www.flickr.com/photos/pasa/8655533247,https://creativecommons.org/licenses/by/2.0/,Paul Sableman +2f2462545f07a385,train,https://open-images-dataset.s3.amazonaws.com/train/2f2462545f07a385.jpg,https://www.flickr.com/photos/atoach/7358747564,https://creativecommons.org/licenses/by/2.0/,Tim Green +2f259b8ce5ae2846,train,https://open-images-dataset.s3.amazonaws.com/train/2f259b8ce5ae2846.jpg,https://www.flickr.com/photos/sfj/88749671,https://creativecommons.org/licenses/by/2.0/,iMorpheus +2f3b817b008fced6,train,https://open-images-dataset.s3.amazonaws.com/train/2f3b817b008fced6.jpg,https://www.flickr.com/photos/alishav/4447727537,https://creativecommons.org/licenses/by/2.0/,Alisha Vargas +2f3c8825c9b49fe1,train,https://open-images-dataset.s3.amazonaws.com/train/2f3c8825c9b49fe1.jpg,https://www.flickr.com/photos/amyphotoe/15912011284,https://creativecommons.org/licenses/by/2.0/,amy catherine +2f41bf4985440324,train,https://open-images-dataset.s3.amazonaws.com/train/2f41bf4985440324.jpg,https://www.flickr.com/photos/jaycross/3250202881,https://creativecommons.org/licenses/by/2.0/,Jay Cross +2f50680cb9173e91,train,https://open-images-dataset.s3.amazonaws.com/train/2f50680cb9173e91.jpg,https://www.flickr.com/photos/oakleyoriginals/8224865876,https://creativecommons.org/licenses/by/2.0/,OakleyOriginals diff --git a/experiments/autodetect/manifests/oi_tune.csv b/experiments/autodetect/manifests/oi_tune.csv new file mode 100644 index 000000000..1e51fda4e --- /dev/null +++ b/experiments/autodetect/manifests/oi_tune.csv @@ -0,0 +1,151 @@ +image_id,split,source_url,landing_url,license,author +0134f2780183e5b9,test,https://open-images-dataset.s3.amazonaws.com/test/0134f2780183e5b9.jpg,https://www.flickr.com/photos/juhansonin/318623998,https://creativecommons.org/licenses/by/2.0/,Juhan Sonin +01f110a4290f3df0,test,https://open-images-dataset.s3.amazonaws.com/test/01f110a4290f3df0.jpg,https://www.flickr.com/photos/michaelrperry/9491660013,https://creativecommons.org/licenses/by/2.0/,Michael R Perry +02608695ddead637,validation,https://open-images-dataset.s3.amazonaws.com/validation/02608695ddead637.jpg,https://www.flickr.com/photos/35632217@N05/12737278815,https://creativecommons.org/licenses/by/2.0/,dvdmnk +02c221b14cbcc489,test,https://open-images-dataset.s3.amazonaws.com/test/02c221b14cbcc489.jpg,https://www.flickr.com/photos/limaoscarjuliet/15657181832,https://creativecommons.org/licenses/by/2.0/,Pawel Loj +03fa9b3bec860271,test,https://open-images-dataset.s3.amazonaws.com/test/03fa9b3bec860271.jpg,https://www.flickr.com/photos/kenspix/51878737,https://creativecommons.org/licenses/by/2.0/,Ken Ratcliff +04e69733fd83aa83,test,https://open-images-dataset.s3.amazonaws.com/test/04e69733fd83aa83.jpg,https://www.flickr.com/photos/noaaphotolib/9715913097,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library +05758addf1bf4dcf,validation,https://open-images-dataset.s3.amazonaws.com/validation/05758addf1bf4dcf.jpg,https://www.flickr.com/photos/alainalele/14916691525,https://creativecommons.org/licenses/by/2.0/,alainalele +0738bab1cf81a052,test,https://open-images-dataset.s3.amazonaws.com/test/0738bab1cf81a052.jpg,https://www.flickr.com/photos/cleverclevergirl/8328184688,https://creativecommons.org/licenses/by/2.0/,cleverclevergirl +07d46fef3eadea5b,test,https://open-images-dataset.s3.amazonaws.com/test/07d46fef3eadea5b.jpg,https://www.flickr.com/photos/huggleperson/8126035623,https://creativecommons.org/licenses/by/2.0/,Matthew Britton +08bc0a04429593d5,test,https://open-images-dataset.s3.amazonaws.com/test/08bc0a04429593d5.jpg,https://www.flickr.com/photos/timquijano/4874638707,https://creativecommons.org/licenses/by/2.0/,timquijano +0a2cf53024e61c5c,test,https://open-images-dataset.s3.amazonaws.com/test/0a2cf53024e61c5c.jpg,https://www.flickr.com/photos/sddunne/4106307287,https://creativecommons.org/licenses/by/2.0/,Sean Dunne +0ce960b8d36cc629,validation,https://open-images-dataset.s3.amazonaws.com/validation/0ce960b8d36cc629.jpg,https://www.flickr.com/photos/57574030@N08/19851384311,https://creativecommons.org/licenses/by/2.0/,Raúl Arias +1229d5e203956ac6,validation,https://open-images-dataset.s3.amazonaws.com/validation/1229d5e203956ac6.jpg,https://www.flickr.com/photos/heatheronhertravels/2276798529,https://creativecommons.org/licenses/by/2.0/,Heather Cowper +13d3833c98ab3d3e,test,https://open-images-dataset.s3.amazonaws.com/test/13d3833c98ab3d3e.jpg,https://www.flickr.com/photos/dimnikolov/3775350793/,https://creativecommons.org/licenses/by/2.0/,Dimitar Nikolov +1420d7e09988db90,test,https://open-images-dataset.s3.amazonaws.com/test/1420d7e09988db90.jpg,https://www.flickr.com/photos/diversey/460103946/,https://creativecommons.org/licenses/by/2.0/,Tony Webster +1699f9150f5b86d9,test,https://open-images-dataset.s3.amazonaws.com/test/1699f9150f5b86d9.jpg,https://www.flickr.com/photos/acebal/3803690117,https://creativecommons.org/licenses/by/2.0/,acebal +16afaa3f9170ce43,test,https://open-images-dataset.s3.amazonaws.com/test/16afaa3f9170ce43.jpg,https://www.flickr.com/photos/gerard_colombat/14475872577,https://creativecommons.org/licenses/by/2.0/,Gérard Colombat +189faddbdffef535,test,https://open-images-dataset.s3.amazonaws.com/test/189faddbdffef535.jpg,https://www.flickr.com/photos/jimmy_macdonald/19916474534,https://creativecommons.org/licenses/by/2.0/,James MacDonald +1a91493d82d02f41,validation,https://open-images-dataset.s3.amazonaws.com/validation/1a91493d82d02f41.jpg,https://www.flickr.com/photos/tekaybe/7951307286,https://creativecommons.org/licenses/by/2.0/,tekaybe +1ab03e024f48c23d,test,https://open-images-dataset.s3.amazonaws.com/test/1ab03e024f48c23d.jpg,https://www.flickr.com/photos/vancour/8172701465,https://creativecommons.org/licenses/by/2.0/,Vanessa Vancour +1b32c573daac7982,test,https://open-images-dataset.s3.amazonaws.com/test/1b32c573daac7982.jpg,https://www.flickr.com/photos/mdpettitt/1678899017,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt +1b6ef41ff63e94e7,test,https://open-images-dataset.s3.amazonaws.com/test/1b6ef41ff63e94e7.jpg,https://www.flickr.com/photos/ginnylgorman/4698542480,https://creativecommons.org/licenses/by/2.0/,Ginny Lacey Gorman +1c0e64ba72ff8a71,test,https://open-images-dataset.s3.amazonaws.com/test/1c0e64ba72ff8a71.jpg,https://www.flickr.com/photos/marismith/16123074385,https://creativecommons.org/licenses/by/2.0/,Mari Smith +1f60b3da9413c839,test,https://open-images-dataset.s3.amazonaws.com/test/1f60b3da9413c839.jpg,https://www.flickr.com/photos/danielhargrave/9473722455,https://creativecommons.org/licenses/by/2.0/,Daniel Hargrave +1fc6d80f8cb3494a,validation,https://open-images-dataset.s3.amazonaws.com/validation/1fc6d80f8cb3494a.jpg,https://www.flickr.com/photos/yellowbookltd/3646580813,https://creativecommons.org/licenses/by/2.0/,John Lord +2316f65a43254b27,test,https://open-images-dataset.s3.amazonaws.com/test/2316f65a43254b27.jpg,https://www.flickr.com/photos/duncanh1/8067849940,https://creativecommons.org/licenses/by/2.0/,DncnH +248fe7db7f7c631f,test,https://open-images-dataset.s3.amazonaws.com/test/248fe7db7f7c631f.jpg,https://www.flickr.com/photos/25165196@N08/7087438247,https://creativecommons.org/licenses/by/2.0/,Nitram242 +25349f8128fcb899,test,https://open-images-dataset.s3.amazonaws.com/test/25349f8128fcb899.jpg,https://www.flickr.com/photos/puptoes74/4781150390,https://creativecommons.org/licenses/by/2.0/,Shelley Rodrigo +255044491f5a7583,validation,https://open-images-dataset.s3.amazonaws.com/validation/255044491f5a7583.jpg,https://www.flickr.com/photos/inmyflippiefloppies/5678410366,https://creativecommons.org/licenses/by/2.0/,Athena Lao +27d981f62241e3b5,test,https://open-images-dataset.s3.amazonaws.com/test/27d981f62241e3b5.jpg,https://www.flickr.com/photos/carlosluna/2340966486,https://creativecommons.org/licenses/by/2.0/,Carlos Luna +2c987e288bf37916,test,https://open-images-dataset.s3.amazonaws.com/test/2c987e288bf37916.jpg,https://www.flickr.com/photos/rdecom/19388704649,https://creativecommons.org/licenses/by/2.0/,U.S. Army RDECOM +2da44155aa979668,test,https://open-images-dataset.s3.amazonaws.com/test/2da44155aa979668.jpg,https://www.flickr.com/photos/paparutzi/175616626,https://creativecommons.org/licenses/by/2.0/,christina rutz +2ed000d799794d71,validation,https://open-images-dataset.s3.amazonaws.com/validation/2ed000d799794d71.jpg,https://www.flickr.com/photos/65119345@N00/3509693130,https://creativecommons.org/licenses/by/2.0/,Suzanne LaGasa +2f6ce20f6f244efe,test,https://open-images-dataset.s3.amazonaws.com/test/2f6ce20f6f244efe.jpg,https://www.flickr.com/photos/see-through-the-eye-of-g/5311897607,https://creativecommons.org/licenses/by/2.0/,GollyGforce - Living My Worst Nightmare +307e1c5a744030a1,validation,https://open-images-dataset.s3.amazonaws.com/validation/307e1c5a744030a1.jpg,https://www.flickr.com/photos/jerrroen/2437735651,https://creativecommons.org/licenses/by/2.0/,Jeroen +316480418ddc8792,test,https://open-images-dataset.s3.amazonaws.com/test/316480418ddc8792.jpg,https://www.flickr.com/photos/cvilletomorrow/2414121694,https://creativecommons.org/licenses/by/2.0/,Charlottesville Tomorrow +341d77a8f5bb354b,validation,https://open-images-dataset.s3.amazonaws.com/validation/341d77a8f5bb354b.jpg,https://www.flickr.com/photos/beckysnyder/3964694615,https://creativecommons.org/licenses/by/2.0/,Becky Snyder +385b2ec824e8994e,test,https://open-images-dataset.s3.amazonaws.com/test/385b2ec824e8994e.jpg,https://www.flickr.com/photos/linsinchen/6932439538/,https://creativecommons.org/licenses/by/2.0/,Sinchen.Lin +38c3add00ff3575f,test,https://open-images-dataset.s3.amazonaws.com/test/38c3add00ff3575f.jpg,https://www.flickr.com/photos/00dann/162651542,https://creativecommons.org/licenses/by/2.0/,dann toliver +396b3a50373daad4,validation,https://open-images-dataset.s3.amazonaws.com/validation/396b3a50373daad4.jpg,https://www.flickr.com/photos/sivvamyndir/13226571803,https://creativecommons.org/licenses/by/2.0/,Sivva Eysteins +3f300c38cdc770f0,test,https://open-images-dataset.s3.amazonaws.com/test/3f300c38cdc770f0.jpg,https://www.flickr.com/photos/mickyshoots/16818539447,https://creativecommons.org/licenses/by/2.0/,Ethan McCandless +40da7d2ae3dfe2c1,test,https://open-images-dataset.s3.amazonaws.com/test/40da7d2ae3dfe2c1.jpg,https://www.flickr.com/photos/listingslab/10834653535,https://creativecommons.org/licenses/by/2.0/,Chris Dorward +455d86cae47f90fb,test,https://open-images-dataset.s3.amazonaws.com/test/455d86cae47f90fb.jpg,https://www.flickr.com/photos/folkehjelp/14955727112,https://creativecommons.org/licenses/by/2.0/,Norsk Folkehjelp Norwegian People's Aid +45d22258771be4e6,test,https://open-images-dataset.s3.amazonaws.com/test/45d22258771be4e6.jpg,https://www.flickr.com/photos/nukeit1/354446814,https://creativecommons.org/licenses/by/2.0/,James McCauley +45f754298d5a912a,validation,https://open-images-dataset.s3.amazonaws.com/validation/45f754298d5a912a.jpg,https://www.flickr.com/photos/starwells/7004334868,https://creativecommons.org/licenses/by/2.0/,Tara Wells +45fc396755bccbfc,validation,https://open-images-dataset.s3.amazonaws.com/validation/45fc396755bccbfc.jpg,https://www.flickr.com/photos/deidrew/6724208921,https://creativecommons.org/licenses/by/2.0/,Deidre Woollard +46d92c63bac4fbb3,validation,https://open-images-dataset.s3.amazonaws.com/validation/46d92c63bac4fbb3.jpg,https://www.flickr.com/photos/wlcutler/7340365028,https://creativecommons.org/licenses/by/2.0/,Wendy Cutler +49567019a665a27b,validation,https://open-images-dataset.s3.amazonaws.com/validation/49567019a665a27b.jpg,https://www.flickr.com/photos/alan-light/5846509966,https://creativecommons.org/licenses/by/2.0/,Alan Light +49dd1d651d50df52,test,https://open-images-dataset.s3.amazonaws.com/test/49dd1d651d50df52.jpg,https://www.flickr.com/photos/conbon/2253532664,https://creativecommons.org/licenses/by/2.0/,Connie +4aa6f8e23bbaf89c,validation,https://open-images-dataset.s3.amazonaws.com/validation/4aa6f8e23bbaf89c.jpg,https://www.flickr.com/photos/arjun/9594038267/,https://creativecommons.org/licenses/by/2.0/,Arjun Singh +4c24b6dbd820e52b,validation,https://open-images-dataset.s3.amazonaws.com/validation/4c24b6dbd820e52b.jpg,https://www.flickr.com/photos/jasoneppink/199337842,https://creativecommons.org/licenses/by/2.0/,Jason Eppink +4ef25467bc5660ad,test,https://open-images-dataset.s3.amazonaws.com/test/4ef25467bc5660ad.jpg,https://www.flickr.com/photos/34517490@N00/6136810623,https://creativecommons.org/licenses/by/2.0/,Nick +4f69cc4fe7ba0b42,test,https://open-images-dataset.s3.amazonaws.com/test/4f69cc4fe7ba0b42.jpg,https://www.flickr.com/photos/fdecomite/15082676606,https://creativecommons.org/licenses/by/2.0/,fdecomite +4f8085f1a9fc3bb7,validation,https://open-images-dataset.s3.amazonaws.com/validation/4f8085f1a9fc3bb7.jpg,https://www.flickr.com/photos/hombit/9860008455,https://creativecommons.org/licenses/by/2.0/,Konstantin Malanchev +52f38994b183f105,validation,https://open-images-dataset.s3.amazonaws.com/validation/52f38994b183f105.jpg,https://www.flickr.com/photos/pedrosimoes7/5126757243,https://creativecommons.org/licenses/by/2.0/,Pedro Ribeiro Simões +5353800ad09ae19c,validation,https://open-images-dataset.s3.amazonaws.com/validation/5353800ad09ae19c.jpg,https://www.flickr.com/photos/sttammany/16616540169,https://creativecommons.org/licenses/by/2.0/,Saint Tammany +56c2867cd3bf62c6,validation,https://open-images-dataset.s3.amazonaws.com/validation/56c2867cd3bf62c6.jpg,https://www.flickr.com/photos/martin_thomas/7047923769,https://creativecommons.org/licenses/by/2.0/,Martin Thomas +5807548c98054d4b,test,https://open-images-dataset.s3.amazonaws.com/test/5807548c98054d4b.jpg,https://www.flickr.com/photos/andrewbain/774875515,https://creativecommons.org/licenses/by/2.0/,Taber Andrew Bain +58115705825b929b,test,https://open-images-dataset.s3.amazonaws.com/test/58115705825b929b.jpg,https://www.flickr.com/photos/the_tahoe_guy/3182849497,https://creativecommons.org/licenses/by/2.0/,the_tahoe_guy +5936ba52f8a2dab6,test,https://open-images-dataset.s3.amazonaws.com/test/5936ba52f8a2dab6.jpg,https://www.flickr.com/photos/piitaaraq/3345166065,https://creativecommons.org/licenses/by/2.0/,Peter Løvstrøm +59ecf5f646729eb4,test,https://open-images-dataset.s3.amazonaws.com/test/59ecf5f646729eb4.jpg,https://www.flickr.com/photos/28686077@N06/14409767060,https://creativecommons.org/licenses/by/2.0/,mj.ostergren +5a8d9af59865bd00,test,https://open-images-dataset.s3.amazonaws.com/test/5a8d9af59865bd00.jpg,https://www.flickr.com/photos/reemul/8106570891,https://creativecommons.org/licenses/by/2.0/,Iain A Wanless +5cc1704944b81440,test,https://open-images-dataset.s3.amazonaws.com/test/5cc1704944b81440.jpg,https://www.flickr.com/photos/thinksaurabh/4780644841,https://creativecommons.org/licenses/by/2.0/,Saurabh Tewari +61d3666c8fee93ce,test,https://open-images-dataset.s3.amazonaws.com/test/61d3666c8fee93ce.jpg,https://www.flickr.com/photos/roryfinneren/15245778543,https://creativecommons.org/licenses/by/2.0/,Rory Finneren +630247b99c25edb8,test,https://open-images-dataset.s3.amazonaws.com/test/630247b99c25edb8.jpg,https://www.flickr.com/photos/seo2/266967024,https://creativecommons.org/licenses/by/2.0/,Cristian Borquez +63b95ba4a7b8393b,validation,https://open-images-dataset.s3.amazonaws.com/validation/63b95ba4a7b8393b.jpg,https://www.flickr.com/photos/yancy9a/3624548752,https://creativecommons.org/licenses/by/2.0/,yancy9 +6bce20b38c67c651,test,https://open-images-dataset.s3.amazonaws.com/test/6bce20b38c67c651.jpg,https://www.flickr.com/photos/johnny_d_mitchell/2259328386,https://creativecommons.org/licenses/by/2.0/,John Mitchell +6ebfc50dc21e613c,test,https://open-images-dataset.s3.amazonaws.com/test/6ebfc50dc21e613c.jpg,https://www.flickr.com/photos/arenamontanus/3497238466,https://creativecommons.org/licenses/by/2.0/,Anders Sandberg +6ef668c9a50c988e,test,https://open-images-dataset.s3.amazonaws.com/test/6ef668c9a50c988e.jpg,https://www.flickr.com/photos/tylerbell/14497727445,https://creativecommons.org/licenses/by/2.0/,Tyler Bell +7140652c903769a8,test,https://open-images-dataset.s3.amazonaws.com/test/7140652c903769a8.jpg,https://www.flickr.com/photos/crondeau/14984296672,https://creativecommons.org/licenses/by/2.0/,Christine Rondeau +72ff88ebf2f73386,test,https://open-images-dataset.s3.amazonaws.com/test/72ff88ebf2f73386.jpg,https://www.flickr.com/photos/tvnewsbadge/8088858957,https://creativecommons.org/licenses/by/2.0/,tvnewsbadge +74625aa1f3df88bc,test,https://open-images-dataset.s3.amazonaws.com/test/74625aa1f3df88bc.jpg,https://www.flickr.com/photos/tostie14/157445434,https://creativecommons.org/licenses/by/2.0/,Kevin Tostado +74843c1fbab05395,test,https://open-images-dataset.s3.amazonaws.com/test/74843c1fbab05395.jpg,https://www.flickr.com/photos/abracoceara/6039191704,https://creativecommons.org/licenses/by/2.0/,Abraço Ceará +75546abc3fa8e5d6,validation,https://open-images-dataset.s3.amazonaws.com/validation/75546abc3fa8e5d6.jpg,https://www.flickr.com/photos/pandemia/525267713,https://creativecommons.org/licenses/by/2.0/,Luca Conti +788742c96a8f2fc5,test,https://open-images-dataset.s3.amazonaws.com/test/788742c96a8f2fc5.jpg,https://www.flickr.com/photos/noisecollusion/211438318,https://creativecommons.org/licenses/by/2.0/,Matthew Robinson +7b25926948b1a8bc,validation,https://open-images-dataset.s3.amazonaws.com/validation/7b25926948b1a8bc.jpg,https://www.flickr.com/photos/visitfingerlakes/5241861826,https://creativecommons.org/licenses/by/2.0/,Visit Finger Lakes +7da201ff76fe53fd,test,https://open-images-dataset.s3.amazonaws.com/test/7da201ff76fe53fd.jpg,https://www.flickr.com/photos/trixer/4398821122,https://creativecommons.org/licenses/by/2.0/,Thomas Ricker +7e01b3324b0d8fff,test,https://open-images-dataset.s3.amazonaws.com/test/7e01b3324b0d8fff.jpg,https://www.flickr.com/photos/hmrcgovuk/10673672153,https://creativecommons.org/licenses/by/2.0/,HM Revenue & Customs +809fda59d61908d1,test,https://open-images-dataset.s3.amazonaws.com/test/809fda59d61908d1.jpg,https://www.flickr.com/photos/feriavalladolid/16297940227,https://creativecommons.org/licenses/by/2.0/,Feria de Valladolid +82ea27fe418454b8,test,https://open-images-dataset.s3.amazonaws.com/test/82ea27fe418454b8.jpg,https://www.flickr.com/photos/124229118@N04/14402773071/,https://creativecommons.org/licenses/by/2.0/,Briget Murphy +856c000622d66bd9,test,https://open-images-dataset.s3.amazonaws.com/test/856c000622d66bd9.jpg,https://www.flickr.com/photos/mdpettitt/4068897399,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt +88fa97be6812e95c,test,https://open-images-dataset.s3.amazonaws.com/test/88fa97be6812e95c.jpg,https://www.flickr.com/photos/katinalynn/6160481724,https://creativecommons.org/licenses/by/2.0/,Katina Rogers +893c0faa944a869e,validation,https://open-images-dataset.s3.amazonaws.com/validation/893c0faa944a869e.jpg,https://www.flickr.com/photos/kasio69/10074137963,https://creativecommons.org/licenses/by/2.0/,Boris Kasimov +895aba91c4984127,test,https://open-images-dataset.s3.amazonaws.com/test/895aba91c4984127.jpg,https://www.flickr.com/photos/michael_mayer/7999468880,https://creativecommons.org/licenses/by/2.0/,Michael Mayer +8971c395b839d64f,test,https://open-images-dataset.s3.amazonaws.com/test/8971c395b839d64f.jpg,https://www.flickr.com/photos/37034324@N05/7232458062,https://creativecommons.org/licenses/by/2.0/,Adam Smok +89fb4f3b001d677e,validation,https://open-images-dataset.s3.amazonaws.com/validation/89fb4f3b001d677e.jpg,https://www.flickr.com/photos/amylovesyah/4434546018,https://creativecommons.org/licenses/by/2.0/,Amy +8da3d7c3edb36065,validation,https://open-images-dataset.s3.amazonaws.com/validation/8da3d7c3edb36065.jpg,https://www.flickr.com/photos/peterhess/9308532259,https://creativecommons.org/licenses/by/2.0/,Peter Alfred Hess +8f89b92788e23374,test,https://open-images-dataset.s3.amazonaws.com/test/8f89b92788e23374.jpg,https://www.flickr.com/photos/bunmun/4231018264,https://creativecommons.org/licenses/by/2.0/,Benjamin Wong +9233ea299e7d8629,test,https://open-images-dataset.s3.amazonaws.com/test/9233ea299e7d8629.jpg,https://www.flickr.com/photos/--sam--/16224158453,https://creativecommons.org/licenses/by/2.0/,Sam +94003f097439d999,validation,https://open-images-dataset.s3.amazonaws.com/validation/94003f097439d999.jpg,https://www.flickr.com/photos/governosp/15572858289,https://creativecommons.org/licenses/by/2.0/,Governo do Estado de São Paulo +96b573942e14da60,validation,https://open-images-dataset.s3.amazonaws.com/validation/96b573942e14da60.jpg,https://www.flickr.com/photos/kokorowa/2313373752,https://creativecommons.org/licenses/by/2.0/,kokorowashinjin +9a93c46479732559,test,https://open-images-dataset.s3.amazonaws.com/test/9a93c46479732559.jpg,https://www.flickr.com/photos/lavenderstreak/3028779542,https://creativecommons.org/licenses/by/2.0/,Cheryl Marland +9b05930340507dab,test,https://open-images-dataset.s3.amazonaws.com/test/9b05930340507dab.jpg,https://www.flickr.com/photos/gagarinone/11362695973,https://creativecommons.org/licenses/by/2.0/,Gagarin Miljkovich +9ba50cb2198a23d8,validation,https://open-images-dataset.s3.amazonaws.com/validation/9ba50cb2198a23d8.jpg,https://www.flickr.com/photos/rusty_clark/6235558536,https://creativecommons.org/licenses/by/2.0/,Rusty Clark - On the Air M-F 8am-noon +9d22b143ebbbb5c5,validation,https://open-images-dataset.s3.amazonaws.com/validation/9d22b143ebbbb5c5.jpg,https://www.flickr.com/photos/thesingingsailor/6919547627,https://creativecommons.org/licenses/by/2.0/,erules123 +9f7f9572a18c47c3,validation,https://open-images-dataset.s3.amazonaws.com/validation/9f7f9572a18c47c3.jpg,https://www.flickr.com/photos/69807185@N02/11000966886,https://creativecommons.org/licenses/by/2.0/,Spittle Gauze +a03eb9f6ab163674,test,https://open-images-dataset.s3.amazonaws.com/test/a03eb9f6ab163674.jpg,https://www.flickr.com/photos/78752351@N03/11776348494,https://creativecommons.org/licenses/by/2.0/,Xenja Santarelli +a1d4fe8e382c66fe,test,https://open-images-dataset.s3.amazonaws.com/test/a1d4fe8e382c66fe.jpg,https://www.flickr.com/photos/tiarescott/33599658,https://creativecommons.org/licenses/by/2.0/,tiarescott +a31f8256bfdda98b,test,https://open-images-dataset.s3.amazonaws.com/test/a31f8256bfdda98b.jpg,https://www.flickr.com/photos/karenandbrademerson/8319328367,https://creativecommons.org/licenses/by/2.0/,Karen and Brad Emerson +a34fdece031851d7,test,https://open-images-dataset.s3.amazonaws.com/test/a34fdece031851d7.jpg,https://www.flickr.com/photos/vladimir04/5533799896,https://creativecommons.org/licenses/by/2.0/,vl04 +a9270d2f94489b7e,test,https://open-images-dataset.s3.amazonaws.com/test/a9270d2f94489b7e.jpg,https://www.flickr.com/photos/nasablueshift/5926888901,https://creativecommons.org/licenses/by/2.0/,NASA Blueshift +aa0fc9d6f82cee66,test,https://open-images-dataset.s3.amazonaws.com/test/aa0fc9d6f82cee66.jpg,https://www.flickr.com/photos/89991287@N00/6344550099,https://creativecommons.org/licenses/by/2.0/,acn1485 +acaebc6ee1264976,test,https://open-images-dataset.s3.amazonaws.com/test/acaebc6ee1264976.jpg,https://www.flickr.com/photos/dantaylor/3140540707,https://creativecommons.org/licenses/by/2.0/,Dan Taylor-Watt +ad2467fae731ef39,test,https://open-images-dataset.s3.amazonaws.com/test/ad2467fae731ef39.jpg,https://www.flickr.com/photos/16801915@N06/6915622138,https://creativecommons.org/licenses/by/2.0/,Reading Tom +ad71c03f761e1072,test,https://open-images-dataset.s3.amazonaws.com/test/ad71c03f761e1072.jpg,https://www.flickr.com/photos/fuzzcat/5818757665/,https://creativecommons.org/licenses/by/2.0/,Kate Haskell +adac246189bc1c7c,test,https://open-images-dataset.s3.amazonaws.com/test/adac246189bc1c7c.jpg,https://www.flickr.com/photos/idea-saras/16493718532,https://creativecommons.org/licenses/by/2.0/,Jenny Ondioline +aeda46e483d1059e,validation,https://open-images-dataset.s3.amazonaws.com/validation/aeda46e483d1059e.jpg,https://www.flickr.com/photos/y6y6y6/5503846098,https://creativecommons.org/licenses/by/2.0/,y6y6y6 +b2d1ac0e5e2e509d,test,https://open-images-dataset.s3.amazonaws.com/test/b2d1ac0e5e2e509d.jpg,https://www.flickr.com/photos/jesser5/2875367815,https://creativecommons.org/licenses/by/2.0/,Jesús Serrano +b531ab71175fd253,test,https://open-images-dataset.s3.amazonaws.com/test/b531ab71175fd253.jpg,https://www.flickr.com/photos/cicciogattaccio/5303198013,https://creativecommons.org/licenses/by/2.0/,Edmondo Lopez +b92d1fe82584c280,test,https://open-images-dataset.s3.amazonaws.com/test/b92d1fe82584c280.jpg,https://www.flickr.com/photos/lakemartinvoice/4311797751,https://creativecommons.org/licenses/by/2.0/,John Coley +bafd24ec4ba280cb,test,https://open-images-dataset.s3.amazonaws.com/test/bafd24ec4ba280cb.jpg,https://www.flickr.com/photos/denisecarbonell/9566174914,https://creativecommons.org/licenses/by/2.0/,denise carbonell +bb16e7bc803db178,test,https://open-images-dataset.s3.amazonaws.com/test/bb16e7bc803db178.jpg,https://www.flickr.com/photos/124251906@N04/14282385556,https://creativecommons.org/licenses/by/2.0/,CW Content Works +bc3e02290cb9509e,test,https://open-images-dataset.s3.amazonaws.com/test/bc3e02290cb9509e.jpg,https://www.flickr.com/photos/cindyfunk/2399678968,https://creativecommons.org/licenses/by/2.0/,Cindy Funk +be58d72e60579ab2,test,https://open-images-dataset.s3.amazonaws.com/test/be58d72e60579ab2.jpg,https://www.flickr.com/photos/brendanadkins/488202739,https://creativecommons.org/licenses/by/2.0/,Brendan Adkins +bee88baf87961730,test,https://open-images-dataset.s3.amazonaws.com/test/bee88baf87961730.jpg,https://www.flickr.com/photos/usfwspacific/7440726280,https://creativecommons.org/licenses/by/2.0/,USFWS - Pacific Region +bf66f91af557ad59,validation,https://open-images-dataset.s3.amazonaws.com/validation/bf66f91af557ad59.jpg,https://www.flickr.com/photos/pjsissi/15310976026,https://creativecommons.org/licenses/by/2.0/,pj.sissi +c1528484142877df,test,https://open-images-dataset.s3.amazonaws.com/test/c1528484142877df.jpg,https://www.flickr.com/photos/miguelvieira/2734635772,https://creativecommons.org/licenses/by/2.0/,Miguel Vieira +c391787c0bf288a5,test,https://open-images-dataset.s3.amazonaws.com/test/c391787c0bf288a5.jpg,https://www.flickr.com/photos/crug/3726412486,https://creativecommons.org/licenses/by/2.0/,Chris Ruggles +c39ea2a4b179b9d6,test,https://open-images-dataset.s3.amazonaws.com/test/c39ea2a4b179b9d6.jpg,https://www.flickr.com/photos/zombie/444122603,https://creativecommons.org/licenses/by/2.0/,Richard King +c4412bf89e38606f,validation,https://open-images-dataset.s3.amazonaws.com/validation/c4412bf89e38606f.jpg,https://www.flickr.com/photos/chesterbr/10671690255,https://creativecommons.org/licenses/by/2.0/,Chester +c4a1b431011b2177,test,https://open-images-dataset.s3.amazonaws.com/test/c4a1b431011b2177.jpg,https://www.flickr.com/photos/andyarthur/15096478304,https://creativecommons.org/licenses/by/2.0/,Andy Arthur +c530492497626579,test,https://open-images-dataset.s3.amazonaws.com/test/c530492497626579.jpg,https://www.flickr.com/photos/martl/2837372343,https://creativecommons.org/licenses/by/2.0/,heartbeaz +ca100fdb289b88fe,test,https://open-images-dataset.s3.amazonaws.com/test/ca100fdb289b88fe.jpg,https://www.flickr.com/photos/ewan_traveler/15468742967,https://creativecommons.org/licenses/by/2.0/,ewan traveler +ca47b04db265fb15,test,https://open-images-dataset.s3.amazonaws.com/test/ca47b04db265fb15.jpg,https://www.flickr.com/photos/11921146@N03/11708555835,https://creativecommons.org/licenses/by/2.0/,Rachel Tayse +cac8f4e0afcd9d35,test,https://open-images-dataset.s3.amazonaws.com/test/cac8f4e0afcd9d35.jpg,https://www.flickr.com/photos/mah_japan/5473467536,https://creativecommons.org/licenses/by/2.0/,Masahiko OHKUBO +cb51a3daed7d4c29,test,https://open-images-dataset.s3.amazonaws.com/test/cb51a3daed7d4c29.jpg,https://www.flickr.com/photos/rpgmaster94/4530010556,https://creativecommons.org/licenses/by/2.0/,Matthew Fauver +cc3b5b6ef4d1a7d0,test,https://open-images-dataset.s3.amazonaws.com/test/cc3b5b6ef4d1a7d0.jpg,https://www.flickr.com/photos/genvessel/118951344,https://creativecommons.org/licenses/by/2.0/,klndonnelly +cff93fa0b87c8c54,test,https://open-images-dataset.s3.amazonaws.com/test/cff93fa0b87c8c54.jpg,https://www.flickr.com/photos/donaleen/4676254173,https://creativecommons.org/licenses/by/2.0/,Donaleen +d2c83407e36e2c71,validation,https://open-images-dataset.s3.amazonaws.com/validation/d2c83407e36e2c71.jpg,https://www.flickr.com/photos/tomsaint/2503598308,https://creativecommons.org/licenses/by/2.0/,Rennett Stowe +d437e9434d4ff032,test,https://open-images-dataset.s3.amazonaws.com/test/d437e9434d4ff032.jpg,https://www.flickr.com/photos/mescon/2974867823,https://creativecommons.org/licenses/by/2.0/,Erik Söderström +d4b64bf87ca0d34a,validation,https://open-images-dataset.s3.amazonaws.com/validation/d4b64bf87ca0d34a.jpg,https://www.flickr.com/photos/t_ferringer/3850866480,https://creativecommons.org/licenses/by/2.0/,Theodore Ferringer +d93d9b6928e4aca4,test,https://open-images-dataset.s3.amazonaws.com/test/d93d9b6928e4aca4.jpg,https://www.flickr.com/photos/olibac/15606290595,https://creativecommons.org/licenses/by/2.0/,OliBac +e0814573a6fafc3a,test,https://open-images-dataset.s3.amazonaws.com/test/e0814573a6fafc3a.jpg,https://www.flickr.com/photos/direitosurbanos/7119843327,https://creativecommons.org/licenses/by/2.0/,Direitos Urbanos +e5c8d21e5260fdee,validation,https://open-images-dataset.s3.amazonaws.com/validation/e5c8d21e5260fdee.jpg,https://www.flickr.com/photos/woodhead/11376501846,https://creativecommons.org/licenses/by/2.0/,jasonwoodhead23 +e5e2aa59e301672e,test,https://open-images-dataset.s3.amazonaws.com/test/e5e2aa59e301672e.jpg,https://www.flickr.com/photos/www_ukberri_net/7026335453/,https://creativecommons.org/licenses/by/2.0/,UKBERRI.NET Uribe Kosta eta Erandioko agerkari digitala +e8bdae92243fa5b9,test,https://open-images-dataset.s3.amazonaws.com/test/e8bdae92243fa5b9.jpg,https://www.flickr.com/photos/fridayinla/3119046797,https://creativecommons.org/licenses/by/2.0/,Stephen Friday +e8f966b42918443f,test,https://open-images-dataset.s3.amazonaws.com/test/e8f966b42918443f.jpg,https://www.flickr.com/photos/paulsimpson1976/2324774315,https://creativecommons.org/licenses/by/2.0/,Paul Simpson +e92c3fbe575226b7,test,https://open-images-dataset.s3.amazonaws.com/test/e92c3fbe575226b7.jpg,https://www.flickr.com/photos/27665395@N05/18008657172,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence +ebc1005c0588d7e7,test,https://open-images-dataset.s3.amazonaws.com/test/ebc1005c0588d7e7.jpg,https://www.flickr.com/photos/87079797@N02/12541424724,https://creativecommons.org/licenses/by/2.0/,hakzelf +ec49340c563448fa,test,https://open-images-dataset.s3.amazonaws.com/test/ec49340c563448fa.jpg,https://www.flickr.com/photos/netzpolitik/8744033438,https://creativecommons.org/licenses/by/2.0/,netzpolitik.org +ec82f08ad9d2aadb,test,https://open-images-dataset.s3.amazonaws.com/test/ec82f08ad9d2aadb.jpg,https://www.flickr.com/photos/cmichel67/8988811042,https://creativecommons.org/licenses/by/2.0/,Christopher Michel +ee57bbfb0ebab0a7,validation,https://open-images-dataset.s3.amazonaws.com/validation/ee57bbfb0ebab0a7.jpg,https://www.flickr.com/photos/treydanger/3311157164/,https://creativecommons.org/licenses/by/2.0/,Xeusy +ef40e3891a5b52a2,validation,https://open-images-dataset.s3.amazonaws.com/validation/ef40e3891a5b52a2.jpg,https://www.flickr.com/photos/yukikomatsuoka/8763983342,https://creativecommons.org/licenses/by/2.0/,Yukiko Matsuoka +f0dfd9923f53505d,test,https://open-images-dataset.s3.amazonaws.com/test/f0dfd9923f53505d.jpg,https://www.flickr.com/photos/47957400@N03/7596541236,https://creativecommons.org/licenses/by/2.0/,Alec Luhn +f4fdcb766939c0dd,test,https://open-images-dataset.s3.amazonaws.com/test/f4fdcb766939c0dd.jpg,https://www.flickr.com/photos/8593340@N04/4259072963,https://creativecommons.org/licenses/by/2.0/,GeraldPG +f763db801dff6430,test,https://open-images-dataset.s3.amazonaws.com/test/f763db801dff6430.jpg,https://www.flickr.com/photos/vydd/15515997800,https://creativecommons.org/licenses/by/2.0/,Danilo Vidovic +f865b4c9162f2bc5,validation,https://open-images-dataset.s3.amazonaws.com/validation/f865b4c9162f2bc5.jpg,https://www.flickr.com/photos/mikeemesser/6130655549/,https://creativecommons.org/licenses/by/2.0/,Michael Eisenriegler +fb87456bc4ac8d9d,validation,https://open-images-dataset.s3.amazonaws.com/validation/fb87456bc4ac8d9d.jpg,https://www.flickr.com/photos/57768042@N00/4707774931,https://creativecommons.org/licenses/by/2.0/,Sydney Oats +fc5c1b76314e5136,test,https://open-images-dataset.s3.amazonaws.com/test/fc5c1b76314e5136.jpg,https://www.flickr.com/photos/europedistrict/8260991640,https://creativecommons.org/licenses/by/2.0/,U.S. Army Corps of Engineers Europe District +fea234629eea3827,validation,https://open-images-dataset.s3.amazonaws.com/validation/fea234629eea3827.jpg,https://www.flickr.com/photos/cliniquebeaulieu/4345910813,https://creativecommons.org/licenses/by/2.0/,Clinique Beaulieu diff --git a/experiments/autodetect/meter_brand/README.md b/experiments/autodetect/meter_brand/README.md new file mode 100644 index 000000000..4c98d889d --- /dev/null +++ b/experiments/autodetect/meter_brand/README.md @@ -0,0 +1,20 @@ +# Meter brand + +Can the phone read the meter's maker from the close-up it already reads the number from? It reuses #16's photos and #16's cached Vision output (`~/house-scanning-data/meter/ocr/clean.jsonl`, revision 3, `accurate`, no language correction), so its numbers compare directly with #16's. + +`brands.py` lists 36 meter makers and matches each recognised line against them. `score.py` picks the listed maker on the tallest line that names one. No pass bar was set before the run. + +**Labels.** A Claude Sonnet reader recorded the brand as printed on each photo and how it is printed. It agrees with the maker #16's reader named in its notes on 61 of the 71 photos with a brand in letters. The first pass had shifted rows m18 to m26 by four photos; the reader redid them before the scores below. + +**Result** (`results/brand.md`, agreed photos): the maker is named correctly on 17 of 19 photos with plain letters and 22 of 42 with a logo. Vision doesn't read Tatung's round badge or GE's script monogram. The list rule named nothing on the 9 photos without a brand. Its one wrong pick is a plate printed with both Aclara and Landis & Gyr. Brand right and number in #16's top three together: 27 of 56. + +**Changed after the first score.** Fuzzy matching now needs 6 letters, because GENUS matched a note reading "GE (US)"; accents fold to plain letters, because that change stopped `Itrón` matching; agreement now asks whether #16's note names the brand, so makers missing from the list can agree. + +```sh +git show origin/t3/meter-closeup:experiments/meter-closeup/manifest.csv > /tmp/m16_manifest.csv +git show origin/t3/meter-closeup:experiments/meter-closeup/results/locate_per_image.csv > /tmp/m16_locate.csv +python3 score.py --manifest /tmp/m16_manifest.csv --numbers /tmp/m16_locate.csv \ + --rows results/brand_per_image.csv > results/brand.md +``` + +Most photos are Taiwanese and European meters. On the 16 US-style meters with an agreed brand, it names 11 correctly (`results/brand.md`), too few for a confident US figure. diff --git a/experiments/autodetect/meter_brand/brands.py b/experiments/autodetect/meter_brand/brands.py new file mode 100644 index 000000000..67091cfc6 --- /dev/null +++ b/experiments/autodetect/meter_brand/brands.py @@ -0,0 +1,128 @@ +"""Meter makers the brand reader looks for, and how their names are normalised. + +The list names electricity-meter makers in general, not the ones in the photo set: the US +residential market (Itron, Landis+Gyr, Aclara and GE, Honeywell and Elster, Sensus, and the +older Sangamo, Westinghouse, Duncan and Schlumberger) plus the large European and Asian makers. +It was committed before any brand was scored. A photo whose maker is missing here counts as a +miss for the dictionary rule, so the rule's recall is what an app shipping this list would get. +""" + +import re +import unicodedata + +# Canonical name -> spellings as they appear on meters. Each printed name is its own brand, even +# where one company later bought another (Elster and Honeywell, Actaris and Itron), because the +# test is whether the phone reads what is printed. A spelling of 4 characters or fewer +# must match a whole OCR token exactly; one of 6 letters or more may be one edit away (see match_brand). +BRANDS: dict[str, tuple[str, ...]] = { + "ITRON": ("ITRON",), + "ACTARIS": ("ACTARIS",), + "SCHLUMBERGER": ("SCHLUMBERGER",), + "LANDIS+GYR": ("LANDIS+GYR", "LANDIS GYR", "LANDIS & GYR", "LANDIS&GYR", "L+G", "LANDIS"), + "GE": ("GE", "GENERAL ELECTRIC"), + "ACLARA": ("ACLARA",), + "ELSTER": ("ELSTER",), + "HONEYWELL": ("HONEYWELL",), + "ABB": ("ABB",), + "SENSUS": ("SENSUS",), + "SANGAMO": ("SANGAMO",), + "WESTINGHOUSE": ("WESTINGHOUSE",), + "DUNCAN": ("DUNCAN",), + "SIEMENS": ("SIEMENS",), + "AEG": ("AEG",), + "ISKRA": ("ISKRA", "ISKRAEMECO"), + "EMH": ("EMH",), + "DZG": ("DZG",), + "KAMSTRUP": ("KAMSTRUP",), + "EDMI": ("EDMI",), + "ZIV": ("ZIV",), + "SAGEMCOM": ("SAGEMCOM", "SAGEM"), + "HEXING": ("HEXING",), + "HOLLEY": ("HOLLEY",), + "GENUS": ("GENUS",), + "SECURE": ("SECURE METERS",), + "TOSHIBA": ("TOSHIBA",), + "MITSUBISHI": ("MITSUBISHI",), + "OSAKI": ("OSAKI",), + "TATUNG": ("TATUNG",), + "CHUNGHSIN": ("CHUNGHSIN", "CHUNG HSIN", "CHUNG-HSIN"), + "CGE": ("CGE",), + "ENERMET": ("ENERMET",), + "AMPY": ("AMPY",), + "LOGAREX": ("LOGAREX",), + "ECHELON": ("ECHELON",), +} + +ALIASES: list[tuple[str, str]] = sorted( + ((alias, canon) for canon, spellings in BRANDS.items() for alias in spellings), + key=lambda pair: -len(pair[0]), +) + +# Lines that describe the meter rather than name its maker, for the rule without a list. +SPEC = re.compile( + r"KWH|VOLT|\bCL\s*\d|\bFORM|TYPE|\bHZ\b|\bKH\b|\bWH\b|AMP|PHASE|WIRE|CLASS|\bTA\b|\d", +) + + +def normalise(text: str) -> str: + """Upper case, accents folded (`Itrón` reads as ITRON), `&` and `+` kept, other punctuation to spaces.""" + text = unicodedata.normalize("NFKD", text).encode("ascii", "ignore").decode() + text = text.upper().replace("+", "+") + text = re.sub(r"[^A-Z0-9+& ]+", " ", text) + return re.sub(r"\s+", " ", text).strip() + + +def within_one_edit(a: str, b: str) -> bool: + if a == b: + return True + if abs(len(a) - len(b)) > 1: + return False + if len(a) > len(b): + a, b = b, a + i = j = 0 + edited = False + while i < len(a) and j < len(b): + if a[i] == b[j]: + i += 1 + j += 1 + continue + if edited: + return False + edited = True + if len(a) == len(b): + i += 1 + j += 1 + return True + + +def match_brand(line: str) -> str | None: + """The canonical maker named in one recognised line, or None. + + Long spellings match as a substring of the line, or one edit from a token or a pair of + adjacent tokens (OCR drops or swaps a letter, or splits `LANDIS+GYR`). Short spellings such + as `GE` must be a whole token, because they occur inside unrelated words. + """ + norm = normalise(line) + if not norm: + return None + tokens = norm.split(" ") + windows = tokens + [a + b for a, b in zip(tokens, tokens[1:])] + [" ".join(p) for p in zip(tokens, tokens[1:])] + for alias, canon in ALIASES: + if len(alias) <= 4: + if alias in tokens: + return canon + continue + if re.search(rf"(^| ){re.escape(alias)}($| )", norm) or alias.replace(" ", "") in norm.replace(" ", ""): + return canon + # One edit is allowed from 6 letters up: at 5, GENUS is one edit from "GE US". + if len(alias.replace(" ", "")) >= 6 and any(within_one_edit(alias.replace(" ", ""), w.replace(" ", "")) for w in windows): + return canon + return None + + +def canonical(name: str) -> str | None: + """A label's maker name mapped onto the list, or its normalised text when not listed.""" + name = name.strip() + if not name: + return None + return match_brand(name) or normalise(name) diff --git a/experiments/autodetect/meter_brand/results/brand.md b/experiments/autodetect/meter_brand/results/brand.md new file mode 100644 index 000000000..befc7673b --- /dev/null +++ b/experiments/autodetect/meter_brand/results/brand.md @@ -0,0 +1,80 @@ +# Meter brand reading + +Usable photos: 80. Reader A named a brand on 72; printed in letters and legible on 71; the two readers agree on 61 of those. + +| Brand form | Legible | Photos | +|---|---|---| +| logo_only | no | 7 | +| logo_only | partial | 1 | +| logo_text | yes | 47 | +| none | no | 1 | +| text | partial | 3 | +| text | yes | 21 | + +## Vision `accurate` + +| Photos | Brand in any line | List rule: right | List rule: wrong maker | List rule: none | No-list rule: right | +|---|---|---|---|---|---| +| brand printed in letters, both readers agree (61) | 44/61 = 72% (60%–82%) | 39/61 = 64% (51%–75%) | 1 | 21 | 20/61 = 33% (22%–45%) | +| brand printed in letters, reader A (71) | 52/71 = 73% (62%–82%) | 44/71 = 62% (50%–72%) | 1 | 26 | 22/71 = 31% (21%–42%) | +| US-style meters, brand printed, agreed (16) | 15/16 = 94% (72%–99%) | 11/16 = 69% (44%–86%) | 1 | 4 | 6/16 = 38% (18%–61%) | + +## Vision `accurate_lc` + +| Photos | Brand in any line | List rule: right | List rule: wrong maker | List rule: none | No-list rule: right | +|---|---|---|---|---|---| +| brand printed in letters, both readers agree (61) | 43/61 = 70% (58%–80%) | 38/61 = 62% (50%–73%) | 1 | 22 | 23/61 = 38% (27%–50%) | +| brand printed in letters, reader A (71) | 51/71 = 72% (60%–81%) | 43/71 = 61% (49%–71%) | 1 | 27 | 25/71 = 35% (25%–47%) | +| US-style meters, brand printed, agreed (16) | 14/16 = 88% (64%–97%) | 10/16 = 62% (39%–82%) | 1 | 5 | 6/16 = 38% (18%–61%) | + +## Vision `fast` + +| Photos | Brand in any line | List rule: right | List rule: wrong maker | List rule: none | No-list rule: right | +|---|---|---|---|---|---| +| brand printed in letters, both readers agree (61) | 34/61 = 56% (43%–67%) | 31/61 = 51% (39%–63%) | 0 | 30 | 10/61 = 16% (9%–28%) | +| brand printed in letters, reader A (71) | 39/71 = 55% (43%–66%) | 34/71 = 48% (37%–59%) | 0 | 37 | 11/71 = 15% (9%–26%) | +| US-style meters, brand printed, agreed (16) | 9/16 = 56% (33%–77%) | 7/16 = 44% (23%–67%) | 0 | 9 | 5/16 = 31% (14%–56%) | + +## By how the brand is printed (`accurate`, both readers agree) + +| Printed as | Photos | Brand in any line | List rule: right | List rule: wrong maker | +|---|---|---|---|---| +| plain letters | 19 | 19/19 = 100% (83%–100%) | 17/19 = 89% (69%–97%) | 1 | +| letters inside a logo or wordmark | 42 | 25/42 = 60% (44%–73%) | 22/42 = 52% (38%–67%) | 0 | + +Photos without a brand printed in legible letters: 9. The list rule (`accurate`) named a maker on 0 of them. + +## Brand and number together (`accurate`, #16's ranking for the number) + +| Photos | Brand right (list rule) | Number in #16's top three | Both | +|---|---|---|---| +| brand printed in letters, both readers agree (56) | 34/56 = 61% (48%–72%) | 48/56 = 86% (74%–93%) | 27/56 = 48% (36%–61%) | +| brand printed in letters, reader A (65) | 38/65 = 58% (46%–70%) | 57/65 = 88% (78%–94%) | 31/65 = 48% (36%–60%) | +| US-style meters, brand printed, agreed (13) | 8/13 = 62% (36%–82%) | 10/13 = 77% (50%–92%) | 5/13 = 38% (18%–64%) | + +## Misses, `accurate`, agreed set + +| Photo | Label | Picked | Form | Legible | Brand in any line | +|---|---|---|---|---|---| +| m01 | TATUNG | – | logo_text | yes | 0 | +| m02 | TATUNG | – | logo_text | yes | 0 | +| m03 | TATUNG | – | logo_text | yes | 0 | +| m04 | TATUNG | – | logo_text | yes | 0 | +| m07 | TATUNG | – | logo_text | yes | 0 | +| m08 | TATUNG | – | logo_text | yes | 0 | +| m13 | TATUNG | – | logo_text | yes | 0 | +| m14 | TATUNG | – | logo_text | yes | 0 | +| m21 | SEOCHANG | – | logo_text | yes | 1 | +| m22 | ACLARA | LANDIS+GYR | text | yes | 1 | +| m27 | CHUNGHSIN | – | logo_text | yes | 0 | +| m31 | GE | – | logo_text | yes | 1 | +| m39 | ITRON | – | logo_text | yes | 0 | +| m43 | CHUNGHSIN | – | logo_text | yes | 0 | +| m48 | TATUNG | – | logo_text | yes | 0 | +| m51 | TATUNG | – | logo_text | yes | 0 | +| m52 | TATUNG | – | logo_text | yes | 0 | +| m53 | TATUNG | – | logo_text | yes | 0 | +| m55 | TATUNG | – | logo_text | yes | 0 | +| m56 | GE | – | logo_text | yes | 1 | +| m74 | MAXWELL | – | text | yes | 1 | +| m80 | TOSHIBA | – | logo_text | yes | 0 | diff --git a/experiments/autodetect/meter_brand/results/brand_per_image.csv b/experiments/autodetect/meter_brand/results/brand_per_image.csv new file mode 100644 index 000000000..bc2737929 --- /dev/null +++ b/experiments/autodetect/meter_brand/results/brand_per_image.csv @@ -0,0 +1,81 @@ +id,brand,form,legible,second_reader,agreed,us_style,number_read,number_rank,accurate_listed,accurate_several,accurate_any_line,accurate_unlisted,accurate_unlisted_right,accurate_lc_listed,accurate_lc_several,accurate_lc_any_line,accurate_lc_unlisted,accurate_lc_unlisted_right,fast_listed,fast_several,fast_any_line,fast_unlisted,fast_unlisted_right +m01,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,,0,0,KILOWATTHOURS,0,,0,0,KILOWATTHOURS,0,,0,0,K l L O W A T T H O U R S,0 +m02,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,,0,0,FDPNeRK,0,,0,0,FDPNeRK,0,,0,0,ioooo,0 +m03,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,,0,0,TUNG,0,,0,0,TUNG,0,,0,0,K l L O W A T T H O U R S,0 +m04,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,,0,0,E #$ Ht,0,,0,0,E #$ Ht,0,,0,0,. V•HzllZ,0 +m05,LANDIS+GYR,text,yes,LANDIS+GYR,yes,1,1,1,LANDIS+GYR,0,1,MERALCO,0,LANDIS+GYR,0,1,MERALCO,0,LANDIS+GYR,0,1,FOCUS RXR,0 +m06,LANDIS+GYR,text,partial,LANDIS+GYR,yes,1,1,1,LANDIS+GYR,0,1,MERALCO,0,LANDIS+GYR,0,1,MERALCO,0,,0,0,FOCUS RXR,0 +m07,TATUNG,logo_text,yes,TATUNG,yes,0,1,2,,0,0,ROTEAKETXNANO,0,,0,0,ROTEAKETXNANO,0,,0,0,"Y'toNrA TTHOUR""S",0 +m08,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,,0,0,KILOVARH,0,,0,0,KILOVARH,0,,0,0,"K I L OVA R H,O",0 +m09,,logo_only,no,CHUNGHSIN,no,0,1,1,,0,0,KILOWATTHOURS,0,,0,0,KILOWATTHOURS,0,,0,0,KILOWATTHOURS,0 +m10,,logo_only,no,,no,0,1,1,,0,0,ADJUSTMENS,0,,0,0,ADJUSTMEN,0,,0,0,KILOWATTHOURS,0 +m11,,logo_only,no,GE,no,1,1,2,,0,0,Mult by,0,,0,0,Mult by,0,,0,0,MOt.b¥-,0 +m12,,logo_only,no,GE,no,0,,,,0,0,FITZALL™,0,,0,0,FITZALL™,0,,0,0,I i-Ir,0 +m13,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,,0,0,PTUNG,0,,0,0,TUNG,0,,0,0,K I L O WA T T H O U R S,0 +m14,TATUNG,logo_text,yes,TATUNG,yes,0,1,2,,0,0,,0,,0,0,,0,,0,0,,0 +m15,,logo_only,no,GE,no,1,1,1,,0,0,Mult by,0,,0,0,Mult by,0,,0,0,JJLILI,0 +m16,ELSTER,text,yes,ELSTER,yes,0,1,,ELSTER,0,1,ELSTER,1,ELSTER,0,1,ELSTER,1,,0,0,CATD,0 +m17,,logo_only,no,TATUNG,no,0,1,1,,0,0,RESE,0,,0,0,RESE,0,,0,0,llllllllllllMlllllllllllllllllll,0 +m18,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,TATUNG,0,1,EЗIEHE,0,TATUNG,0,1,A TUNG,1,,0,0,imp,0 +m19,LANDIS+GYR,text,yes,LANDIS+GYR,yes,1,1,1,LANDIS+GYR,0,1,MERALCO,0,LANDIS+GYR,0,1,MERALCO,0,LANDIS+GYR,0,1,FOCUS RXR,0 +m21,SEOCHANG,logo_text,yes,,yes,1,1,1,,0,1,SEOCHANG,1,,0,1,SEOCHANG,1,,0,1,SÈocHANG,1 +m22,ACLARA,text,yes,ACLARA,yes,1,1,1,LANDIS+GYR,1,1,LANDIS & GYR,0,LANDIS+GYR,1,1,LANDIS & GYR,0,ACLARA,0,1,AclaraS,1 +m23,ACLARA,text,yes,GE,no,1,1,2,ACLARA,0,1,NRL&P,0,ACLARA,0,1,NRL&P,0,,0,0,NEW R LIGHT & POWER,0 +m25,SANGAMO,text,yes,SANGAMO,yes,1,1,1,SANGAMO,0,1,SANGAMO ELECTRIC,1,SANGAMO,0,1,SANGAMO ELECTRIC,1,SANGAMO,0,1,SANGAMO ELECTRIC,1 +m26,SANGAMO,text,yes,SANGAMO,yes,0,1,1,SANGAMO,0,1,SANGAMO,1,SANGAMO,0,1,SANGAMO,1,SANGAMO,0,1,ULTxIO,0 +m27,CHUNGHSIN,logo_text,yes,CHUNGHSIN,yes,0,1,1,,0,0,KILOWATTHOURS,0,,0,0,KILOWATTHOURS,0,,0,0,KILOWATTHOURS,0 +m28,ITRON,text,yes,ITRON,yes,1,,,ITRON,0,1,nh MILBANK®,0,,0,0,nh MILBANK®,0,,0,0,"flAMILBANK""",0 +m29,LANDIS+GYR,logo_text,yes,LANDIS+GYR,yes,1,1,1,LANDIS+GYR,0,1,Landis+ GROSTR RF,1,LANDIS+GYR,0,1,Landis+ GROSTRA RF,1,LANDIS+GYR,0,1,", FOCUS RXR-SD",0 +m30,GE,logo_text,yes,CGE,yes,0,1,1,GE,0,1,CANADIAN GENERAL ELECTRIC,1,GE,0,1,CANADIAN GENERAL ELECTRIC,1,GE,0,1,CANADIAN GENERAL ELECTRIC,1 +m31,GE,logo_text,yes,GE,yes,1,1,1,,0,1,NMO,0,,0,1,NOO,0,,0,1,GENERAL•EL,1 +m32,ELSTER,text,yes,ELSTER,yes,1,1,,ELSTER,0,1,ELSTER,1,ELSTER,0,1,ELSTER,1,,0,0,Iiiiiiiiiiiilliiiiiiiiiilliiiiiii,0 +m33,DUNCAN,text,partial,GE,no,1,1,2,,0,0,KILOWATTHOURS,0,,0,0,KILOWATTHOURS,0,,0,0,KILOWATTHOURS,0 +m34,ELSTER,logo_text,yes,ELSTER,yes,1,1,5,ELSTER,0,1,STER,0,ELSTER,0,1,STER,0,,0,0,",uuiJu I",0 +m35,ELSTER,logo_text,yes,ELSTER,yes,1,,,ELSTER,0,1,elster (,1,ELSTER,0,1,elster (,1,ELSTER,0,1,MUST PROBÉ,0 +m36,GE,logo_text,yes,GE,yes,1,,,GE,0,1,KILOWATTHOURS,0,GE,0,1,KILOWATTHOURS,0,,0,0,,0 +m37,SANGAMO,text,yes,SANGAMO,yes,0,1,1,SANGAMO,0,1,SANGAMO,1,SANGAMO,0,1,SANGAMO,1,SANGAMO,0,1,SANGAMO,1 +m38,WESTINGHOUSE,text,yes,WESTINGHOUSE,yes,0,1,2,WESTINGHOUSE,0,1,Westinghouse,1,WESTINGHOUSE,0,1,Westinghouse,1,,0,0,WATTHOUR,0 +m39,ITRON,logo_text,yes,ITRON,yes,1,1,1,,0,0,"OpenWay,",0,,0,0,"OpenWay,",0,,0,0,uuuiJu,0 +m40,LANDIS+GYR,text,yes,LANDIS+GYR,yes,0,1,2,LANDIS+GYR,0,1,Landis+Gyr,1,LANDIS+GYR,0,1,Landis+Gyr,1,LANDIS+GYR,0,1,iLL UUUIJIJ,0 +m41,SANGAMO,text,yes,SANGAMO,yes,0,,,SANGAMO,0,1,SANGAMO,1,SANGAMO,0,1,SANGAMO,1,SANGAMO,0,1,kWk,0 +m42,LANDIS+GYR,text,yes,GE,no,1,1,1,LANDIS+GYR,0,1,PG&E,0,LANDIS+GYR,0,1,PG&E,0,,0,0,siif+l&'STATr)i Efftwciyr,0 +m43,CHUNGHSIN,logo_text,yes,CHUNGHSIN,yes,0,1,1,,0,0,KILOWATTHOURS,0,,0,0,KILOWATTHOURS,0,,0,0,KILOWATTHOURS,0 +m44,SENSUS,logo_text,yes,SENSUS,yes,0,1,2,SENSUS,0,1,FlexNet,0,SENSUS,0,1,FlexNet,0,SENSUS,0,1,Watthour Meter,0 +m45,SENSUS,logo_text,yes,SENSUS,yes,0,1,1,SENSUS,0,1,sånsus,1,SENSUS,0,1,sEnsus,1,SENSUS,0,1,"u Iiiiiiiiiiiiii',",0 +m46,,none,no,ACLARA,no,1,1,1,,0,0,USA,0,,0,0,USA,0,,0,0,USA,0 +m47,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,TATUNG,0,1,TATUNG,1,TATUNG,0,1,TATUNG,1,TATUNG,0,1,(tsTATUNG,1 +m48,TATUNG,logo_text,yes,TATUNG,yes,0,1,2,,0,0,AЫSAДa EaDEş,0,,0,0,TUNG,0,,0,0,llB*=t,0 +m49,TATUNG,logo_text,yes,TATUNG,yes,0,1,2,TATUNG,0,1,TATUNG,1,TATUNG,0,1,TATUNG,1,TATUNG,0,1,rtTATUNG,1 +m50,TATUNG,logo_text,yes,TATUNG,yes,0,1,,TATUNG,0,1,SCROLL,0,TATUNG,0,1,SCROLL,0,TATUNG,0,1,ICROLL_,0 +m51,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,,0,0,AMAN,0,,0,0,AMA N,0,TATUNG,0,1,¢npnJT,0 +m52,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,,0,0,АRXEALAD,0,,0,0,kvarh,0,TATUNG,0,1,ni_i_-,0 +m53,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,,0,0,SINGLE-STATOR WATTHOUR METER,0,,0,0,SINGLE-STATOR WATTHOUR METER,0,,0,0,SINGLE-STATOR WATTHOUR METER,0 +m54,,logo_only,no,TATUNG,no,0,1,1,,0,0,,0,,0,0,,0,,0,0,IllllllNllMlllll,0 +m55,TATUNG,logo_text,yes,TATUNG,yes,0,1,1,,0,0,KILOWATTHOURS,0,,0,0,KILOWATTHOURS,0,,0,0,K l L O W A T T H O U R S,0 +m56,GE,logo_text,yes,GE,yes,1,1,1,,0,1,GENERAL,1,,0,1,GENERAL,1,GE,0,1,GENERALQELECTRIC,1 +m57,WESTINGHOUSE,logo_text,yes,WESTINGHOUSE,yes,1,1,5,WESTINGHOUSE,0,1,CITY OF LOVELAND,0,WESTINGHOUSE,0,1,ava',0,,0,0,CITY Of LOVELAIWJ,0 +m58,CHUNGHSIN,logo_text,yes,,no,0,1,1,,0,0,FITZALL™,0,,0,0,FITZALL™,0,,0,0,""" DEMAND",0 +m59,SIAP,logo_text,yes,,no,0,1,2,,0,1,MEDIDOR MONOFASICO,0,,0,1,MEDIDOR MONOFASICO,0,,0,1,INDUSTRIA ARGÈNTINA,0 +m60,LANDIS+GYR,logo_text,yes,LANDIS+GYR,yes,0,1,1,LANDIS+GYR,0,1,+spuen,0,LANDIS+GYR,0,1,Landis+Gyr,1,LANDIS+GYR,0,1,Miiiiiiiiiiiiuiiiiii,0 +m61,LANDIS+GYR,text,yes,LANDIS+GYR,yes,0,1,,LANDIS+GYR,0,1,LANDIS & GYR,1,LANDIS+GYR,0,1,LANDIS & GYR,1,LANDIS+GYR,0,1,DREHSTROMZAHLER C £ E] o,0 +m62,DZG,logo_only,partial,DZG,yes,0,0,,,0,0,Kilowattstunden,0,,0,0,Kilowattstunden,0,,0,0,Kilowattstunden,0 +m63,EMH,logo_text,yes,EMH,yes,0,1,1,EMH,0,1,Drehstromzähler,0,EMH,0,1,Drehstromzähler,0,EMH,0,1,uu I,0 +m64,SIEMENS,text,yes,SIEMENS,yes,0,1,2,SIEMENS,0,1,E.-Nr.,0,SIEMENS,0,1,E.-Nr.,0,SIEMENS,0,1,FAG,0 +m65,ISKRA,logo_text,yes,ISKRA,yes,0,1,2,ISKRA,0,1,Liefer / Bezug-Zaehler,0,ISKRA,0,1,Liefer / Bezug-Zaehler,0,,0,0,Vorarlb•rg N•,0 +m66,LANDIS+GYR,logo_text,yes,LANDIS+GYR,yes,0,1,1,LANDIS+GYR,0,1,UUUI,0,LANDIS+GYR,0,1,OUDI,0,LANDIS+GYR,0,1,LET OP:,0 +m67,LANDIS+GYR,text,yes,,no,0,,,LANDIS+GYR,0,1,Sté. Française LANDIS & GYR MONTLUÇON,1,LANDIS+GYR,0,1,Ste. Française LANDIS & GYR MONTLUÇON,1,LANDIS+GYR,0,1,Whltr.,0 +m68,LANDIS+GYR,logo_text,yes,LANDIS+GYR,yes,0,1,1,LANDIS+GYR,0,1,LANDIS & GYR,1,LANDIS+GYR,0,1,LANDIS & GYR,1,LANDIS+GYR,0,1,O.I kWn,0 +m69,LANDIS+GYR,logo_text,yes,LANDIS+GYR,yes,0,1,1,LANDIS+GYR,0,1,EWZ,0,LANDIS+GYR,0,1,EWZ,0,,0,0,IANDlS & GYR,0 +m70,LANDIS+GYR,logo_text,yes,LANDIS+GYR,yes,0,1,2,LANDIS+GYR,0,1,EWZ,0,LANDIS+GYR,0,1,EWZ,0,,0,0,IANDlS & GYR,0 +m71,LANDIS+GYR,logo_text,yes,,no,0,1,1,LANDIS+GYR,0,1,EWZ,0,LANDIS+GYR,0,1,EWZ,0,LANDIS+GYR,0,1,IANDIS & GYR,1 +m73,LOGAREX,logo_text,yes,LOGAREX,yes,0,1,1,LOGAREX,0,1,Wechselstromzähler,0,LOGAREX,0,1,Wechselstromzähler,0,LOGAREX,0,1,°Zll] Wechselstromzahler,0 +m74,MAXWELL,text,yes,,yes,0,1,1,,0,1,YAXWELL,0,,0,1,MAXWELL,1,,0,1,Static Watthour Meter,0 +m75,OXFORO,text,partial,,no,0,1,1,,0,1,MADE IN GERMANY,0,,0,1,MADE IN GERMANY,0,,0,1,STAIC ENERGY METER,0 +m76,FGF ELECTRICAL & ELECTRONICS LTD,logo_text,yes,,no,0,1,1,,0,1,FGF ELECTRICAL & ELECTRONICS LTD.,1,,0,1,FGF ELECTRICAL & ELECTRONICS LTD.,1,,0,0,"Sl,No.;",0 +m77,SIEMENS,text,yes,SIEMENS,yes,0,1,2,SIEMENS,0,1,SIEMENS,1,SIEMENS,0,1,SIEMENS,1,SIEMENS,0,1,Wechselstromzahler,0 +m78,AEG,text,yes,AEG,yes,0,1,1,AEG,0,1,JUUU,0,AEG,0,1,JUUU,0,AEG,0,1,Wechselstromzahler,0 +m79,LANDIS+GYR,logo_text,yes,,no,0,1,1,LANDIS+GYR,0,1,MADE IN GT. BRITA,0,LANDIS+GYR,0,1,MADE IN GT. BRITA,0,LANDIS+GYR,0,1,LOW,0 +m80,TOSHIBA,logo_text,yes,TOSHIBA,yes,0,1,,,0,0,STR/NUZ,0,,0,0,STRE/NUZ,0,,0,0,OHZ tf&,0 +m81,ISKRA,logo_text,yes,ISKRA,yes,0,1,3,ISKRA,0,1,VKW,0,ISKRA,0,1,VKW,0,ISKRA,0,1,.tSSif•* t,0 +m82,LANDIS+GYR,logo_text,yes,LANDIS+GYR,yes,0,0,,LANDIS+GYR,0,1,LANDIS & GYR,1,LANDIS+GYR,0,1,LANDIS & GYR,1,LANDIS+GYR,0,1,VKWPaaEII.,0 +m83,SIEMENS,text,yes,SIEMENS,yes,0,,,SIEMENS,0,1,•VKW,0,SIEMENS,0,1,• VKW,0,SIEMENS,0,1,SIEMENS,1 diff --git a/experiments/autodetect/meter_brand/score.py b/experiments/autodetect/meter_brand/score.py new file mode 100644 index 000000000..62caf8889 --- /dev/null +++ b/experiments/autodetect/meter_brand/score.py @@ -0,0 +1,208 @@ +"""Score meter-brand reading on the #16 meter photos, from Vision's recognised lines. + +Inputs, all outside git: + /ocr/clean.jsonl Vision lines per photo and configuration, written by #16's meterocr + /brand_reader_a.csv brand labels from an independent reader + --manifest #16's manifest.csv; its notes name each meter's maker (second reader) + --numbers #16's results/locate_per_image.csv, to join the number results + +Writes a Markdown report to stdout and per-photo rows to --rows. + +Run from experiments/autodetect/meter_brand: + git show origin/t3/meter-closeup:experiments/meter-closeup/manifest.csv > /tmp/m16_manifest.csv + git show origin/t3/meter-closeup:experiments/meter-closeup/results/locate_per_image.csv > /tmp/m16_locate.csv + python3 score.py --manifest /tmp/m16_manifest.csv --numbers /tmp/m16_locate.csv \ + --rows results/brand_per_image.csv > results/brand.md +""" + +import argparse +import csv +import json +import math +import os +import re +from pathlib import Path + +from brands import SPEC, canonical, match_brand, normalise + +DATA = Path(os.environ.get("METER_DATA", Path.home() / "house-scanning-data" / "meter")) +CONFIGS = ("accurate", "accurate_lc", "fast") + + +def wilson(k: int, n: int) -> str: + if n == 0: + return "–" + z = 1.96 + p = k / n + centre = (p + z * z / (2 * n)) / (1 + z * z / n) + half = z * math.sqrt(p * (1 - p) / n + z * z / (4 * n * n)) / (1 + z * z / n) + return f"{k}/{n} = {100 * p:.0f}% ({100 * (centre - half):.0f}%–{100 * (centre + half):.0f}%)" + + +def load_ocr() -> dict[tuple[str, str], list[dict]]: + out = {} + for line in open(DATA / "ocr" / "clean.jsonl"): + r = json.loads(line) + out[(Path(r["path"]).stem, r["config"])] = r["lines"] + return out + + +def pick_listed(lines: list[dict]) -> tuple[str | None, bool]: + """The listed maker on the tallest line naming one, and whether several makers were named.""" + found = [(l["box"][3], match_brand(l["text"])) for l in lines] + found = [f for f in found if f[1]] + if not found: + return None, False + return max(found)[1], len({b for _, b in found}) > 1 + + +def pick_unlisted(lines: list[dict]) -> str | None: + """Without a list: the tallest line that reads as a word, not a rating, number or code.""" + words = [] + for l in lines: + norm = normalise(l["text"]) + letters = sum(c.isalpha() for c in norm) + if letters >= 3 and letters >= 0.6 * len(norm.replace(" ", "")) and not SPEC.search(l["text"].upper()): + words.append((l["box"][3], l["text"])) + return max(words)[1] if words else None + + +def names_brand(text: str | None, brand: str) -> bool: + if not text: + return False + return match_brand(text) == brand or normalise(brand).replace(" ", "") in normalise(text).replace(" ", "") + + +def note_head(pid: str, manifest: dict[str, dict]) -> str: + """#16 reader 1 opened each note with the maker and model, e.g. `Tatung D4S; faded print`. + + A note reading `same meter as m05` refers to that photo's note. + """ + head = manifest.get(pid, {}).get("notes", "").split(";")[0] + same = re.match(r"same meter as (m\d+)", head) + return note_head(same.group(1), manifest) if same else head + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--manifest", required=True) + ap.add_argument("--numbers", required=True) + ap.add_argument("--rows", required=True) + args = ap.parse_args() + + ocr = load_ocr() + labels = {r["id"]: r for r in csv.DictReader(open(DATA / "brand_reader_a.csv"))} + manifest = {r["id"]: r for r in csv.DictReader(open(args.manifest))} + numbers = {r["id"]: r for r in csv.DictReader(open(args.numbers))} + + rows = [] + for pid, lab in sorted(labels.items()): + m = manifest.get(pid, {}) + if m.get("usable") != "yes": + continue + # Drop the reader's qualifiers and translations, e.g. "OXFORO (uncertain)", "DZG (Deutsche ...)". + printed_name = re.sub(r"\(.*?\)", "", lab["brand_printed"]).strip() + brand = canonical(printed_name) if printed_name else None + head = note_head(pid, manifest) + row = { + "id": pid, + "brand": brand or "", + "form": lab["brand_form"], + "legible": lab["brand_legible"], + "second_reader": match_brand(head) or "", + # Agreed when #16's note names reader A's brand, listed or not. + "agreed": "yes" if brand and names_brand(head, brand) else "no", + "us_style": numbers.get(pid, {}).get("us_style", ""), + "number_read": numbers.get(pid, {}).get("read", ""), + "number_rank": numbers.get(pid, {}).get("rank", ""), + } + for cfg in CONFIGS: + lines = ocr.get((pid, cfg), []) + listed, several = pick_listed(lines) + unlisted = pick_unlisted(lines) + row[f"{cfg}_listed"] = listed or "" + row[f"{cfg}_several"] = int(several) + row[f"{cfg}_any_line"] = int(bool(brand) and any(names_brand(l["text"], brand) for l in lines)) + row[f"{cfg}_unlisted"] = unlisted or "" + row[f"{cfg}_unlisted_right"] = int(bool(brand) and names_brand(unlisted, brand)) + rows.append(row) + + Path(args.rows).parent.mkdir(parents=True, exist_ok=True) + with open(args.rows, "w", newline="") as f: + w = csv.DictWriter(f, fieldnames=list(rows[0])) + w.writeheader() + w.writerows(rows) + + def subset(name: str, keep) -> tuple[str, list[dict]]: + return name, [r for r in rows if keep(r)] + + printed = lambda r: r["brand"] and r["form"] in ("text", "logo_text") and r["legible"] in ("yes", "partial") + sets = [ + subset("brand printed in letters, both readers agree", lambda r: printed(r) and r["agreed"] == "yes"), + subset("brand printed in letters, reader A", printed), + subset("US-style meters, brand printed, agreed", lambda r: printed(r) and r["agreed"] == "yes" and r["us_style"] == "1"), + ] + + print("# Meter brand reading\n") + print(f"Usable photos: {len(rows)}. Reader A named a brand on {sum(bool(r['brand']) for r in rows)}; " + f"printed in letters and legible on {sum(bool(printed(r)) for r in rows)}; " + f"the two readers agree on {sum(bool(printed(r)) and r['agreed'] == 'yes' for r in rows)} of those.\n") + forms = {} + for r in rows: + forms[(r["form"], r["legible"])] = forms.get((r["form"], r["legible"]), 0) + 1 + print("| Brand form | Legible | Photos |\n|---|---|---|") + for (form, leg), n in sorted(forms.items()): + print(f"| {form} | {leg} | {n} |") + print() + + for cfg in CONFIGS: + print(f"## Vision `{cfg}`\n") + print("| Photos | Brand in any line | List rule: right | List rule: wrong maker | List rule: none | No-list rule: right |") + print("|---|---|---|---|---|---|") + for name, rs in sets: + n = len(rs) + anyl = sum(r[f"{cfg}_any_line"] for r in rs) + right = sum(r[f"{cfg}_listed"] == r["brand"] for r in rs) + wrong = sum(bool(r[f"{cfg}_listed"]) and r[f"{cfg}_listed"] != r["brand"] for r in rs) + none = sum(not r[f"{cfg}_listed"] for r in rs) + unl = sum(r[f"{cfg}_unlisted_right"] for r in rs) + print(f"| {name} ({n}) | {wilson(anyl, n)} | {wilson(right, n)} | {wrong} | {none} | {wilson(unl, n)} |") + print() + + print("## By how the brand is printed (`accurate`, both readers agree)\n") + print("| Printed as | Photos | Brand in any line | List rule: right | List rule: wrong maker |\n|---|---|---|---|---|") + for form, label in (("text", "plain letters"), ("logo_text", "letters inside a logo or wordmark")): + rs = [r for r in sets[0][1] if r["form"] == form] + n = len(rs) + print(f"| {label} | {n} | {wilson(sum(r['accurate_any_line'] for r in rs), n)} | " + f"{wilson(sum(r['accurate_listed'] == r['brand'] for r in rs), n)} | " + f"{sum(bool(r['accurate_listed']) and r['accurate_listed'] != r['brand'] for r in rs)} |") + print() + + # Photos without a readable brand: does the list rule stay silent? + silent = [r for r in rows if not printed(r)] + false_named = [r for r in silent if r["accurate_listed"]] + print(f"Photos without a brand printed in legible letters: {len(silent)}. " + f"The list rule (`accurate`) named a maker on {len(false_named)} of them" + + (": " + ", ".join(f"{r['id']} → {r['accurate_listed']} (reader A: {r['brand'] or 'none'}, {r['form']})" for r in false_named) if false_named else "") + + ".\n") + + print("## Brand and number together (`accurate`, #16's ranking for the number)\n") + print("| Photos | Brand right (list rule) | Number in #16's top three | Both |\n|---|---|---|---|") + for name, rs in sets: + rs = [r for r in rs if r["number_read"] != ""] + n = len(rs) + b = [r["accurate_listed"] == r["brand"] for r in rs] + top3 = [r["number_read"] == "1" and r["number_rank"] not in ("", "0") and int(r["number_rank"]) <= 3 for r in rs] + print(f"| {name} ({n}) | {wilson(sum(b), n)} | {wilson(sum(top3), n)} | {wilson(sum(x and y for x, y in zip(b, top3)), n)} |") + print() + + misses = [r for name, rs in sets[:1] for r in rs if r["accurate_listed"] != r["brand"]] + print("## Misses, `accurate`, agreed set\n") + print("| Photo | Label | Picked | Form | Legible | Brand in any line |\n|---|---|---|---|---|---|") + for r in misses: + print(f"| {r['id']} | {r['brand']} | {r['accurate_listed'] or '–'} | {r['form']} | {r['legible']} | {r['accurate_any_line']} |") + + +if __name__ == "__main__": + main() diff --git a/experiments/autodetect/pyproject.toml b/experiments/autodetect/pyproject.toml new file mode 100644 index 000000000..bab281335 --- /dev/null +++ b/experiments/autodetect/pyproject.toml @@ -0,0 +1,24 @@ +[project] +name = "autodetect" +version = "0.1.0" +description = "Evaluation of on-device window and door detection for the house-scanning app" +requires-python = ">=3.12,<3.13" +dependencies = [ + "numpy>=2.1", + "pillow>=11", + "onnxruntime>=1.22", + "tokenizers>=0.21", + "onnx>=1.23.0", + "torch==2.14.0", + "transformers>=5.17.0", + "scipy>=1.18.1", +] + +[dependency-groups] +dev = ["pytest>=8"] + +[tool.uv] +package = false + +[tool.pytest.ini_options] +pythonpath = ["."] diff --git a/experiments/autodetect/results/extent.md b/experiments/autodetect/results/extent.md new file mode 100644 index 000000000..3bce1c39e --- /dev/null +++ b/experiments/autodetect/results/extent.md @@ -0,0 +1,470 @@ +# 3D extent: detected door edges lifted onto the wall + +Generated 2026-09-26 by `uv run python -m autodetect.extent` (ground truth first: +`uv run python -m autodetect.extent_gt save`). Data: the ETH3D electro packet, 8 DSLR photos +with depth rendered from the laser scan, standing in for LiDAR. Door centres are 3.3 to 12.7 m +from the camera (median 7.6 m) and seen 5 to 43 degrees off the wall's normal (median 16). + +Ground truth is each door's edges measured once in the laser scan, independent of any photo or +detector (method in `autodetect/extent_gt.py`). Four doors: two gray metal doors in recesses and +two glass double doors. Heights are above the ground at the meter; the doors' thresholds sit +0 to 0.12 m above it. + +| Door | Width (ft) | Height (ft) | Edges read by eye only | +|---|---|---|---| +| B_open_niche | 6.92 | 9.84 | none | +| C_gray_double | 6.79 | 9.78 | none | +| E_glass_64 | 8.60 | 10.01 | none | +| F_glass_double | 7.26 | 10.04 | left | + +Pass: p90 absolute edge error at most 0.5 ft over all scored edges. Each detector +uses its door operating threshold from the OI tune set (Vision rectangles: its only threshold). + +Primary: doors wholly inside the photo. The last two columns are the doors the photo cuts off, +for their edges that are in view (not part of the pass). + +| Boxes from | Lifting | Threshold | Whole door views matched / in view | Edges scored | p50 ft | p90 ft | max ft | Pass | Cut-off views matched | Cut-off edges p90 ft | +|---|---|---|---|---|---|---|---|---|---|---| +| projected ground truth | mid-side | n/a | 10 / 10 | 40 | 0.24 | 0.59 | 1.01 | n/a | 5 / 5 | 0.65 (10) | +| projected ground truth | inner corner | n/a | 10 / 10 | 40 | 0.00 | 0.11 | 0.30 | n/a | 5 / 5 | 0.20 (10) | +| owlv2 | mid-side | 0.318 | 2 / 10 | 8 | 0.33 | 1.73 | 4.04 | no | 1 / 5 | 0.83 (3) | +| owlv2 | inner corner | 0.318 | 2 / 10 | 8 | 0.31 | 1.62 | 4.30 | no | 1 / 5 | 0.43 (3) | +| owlv2 (any score) | mid-side | 0.010 | 7 / 10 | 28 | 0.40 | 3.28 | 4.04 | n/a | 5 / 5 | 0.75 (10) | +| owlv2 (any score) | inner corner | 0.010 | 7 / 10 | 28 | 0.44 | 2.78 | 4.30 | n/a | 5 / 5 | 0.52 (10) | +| student_transfer | mid-side | 0.976 | 0 / 10 | 0 | n/a | n/a | n/a | no | 0 / 5 | n/a (0) | +| student_transfer | inner corner | 0.976 | 0 / 10 | 0 | n/a | n/a | n/a | no | 0 / 5 | n/a (0) | +| student_transfer (any score) | mid-side | 0.010 | 10 / 10 | 40 | 0.72 | 2.08 | 3.07 | n/a | 4 / 5 | 1.89 (9) | +| student_transfer (any score) | inner corner | 0.010 | 10 / 10 | 40 | 0.60 | 1.81 | 2.77 | n/a | 4 / 5 | 1.70 (9) | +| vision_rects | mid-side | 1.000 | 4 / 10 | 16 | 0.33 | 1.78 | 2.45 | no | 2 / 5 | 2.23 (5) | +| vision_rects | inner corner | 1.000 | 4 / 10 | 16 | 0.38 | 1.18 | 2.34 | no | 2 / 5 | 1.43 (5) | +| vision_rects (any score) | mid-side | 0.010 | 4 / 10 | 16 | 0.33 | 1.78 | 2.45 | n/a | 2 / 5 | 2.23 (5) | +| vision_rects (any score) | inner corner | 0.010 | 4 / 10 | 16 | 0.38 | 1.18 | 2.34 | n/a | 2 / 5 | 1.43 (5) | + +## By edge (p90 absolute error, ft; count in brackets) + +| Boxes from | Lifting | Left | Right | Bottom | Top | +|---|---|---|---|---|---| +| projected ground truth | mid-side | 0.23 (10) | 0.33 (10) | 0.72 (10) | 0.77 (10) | +| projected ground truth | inner corner | 0.13 (10) | 0.01 (10) | 0.00 (10) | 0.22 (10) | +| owlv2 | mid-side | 3.71 (2) | 0.12 (2) | 0.12 (2) | 0.65 (2) | +| owlv2 | inner corner | 3.92 (2) | 0.44 (2) | 0.10 (2) | 0.33 (2) | +| owlv2 (any score) | mid-side | 3.59 (7) | 0.28 (7) | 0.55 (7) | 3.08 (7) | +| owlv2 (any score) | inner corner | 3.86 (7) | 0.47 (7) | 0.34 (7) | 1.42 (7) | +| student_transfer | mid-side | n/a (0) | n/a (0) | n/a (0) | n/a (0) | +| student_transfer | inner corner | n/a (0) | n/a (0) | n/a (0) | n/a (0) | +| student_transfer (any score) | mid-side | 1.53 (10) | 2.62 (10) | 1.22 (10) | 1.41 (10) | +| student_transfer (any score) | inner corner | 1.61 (10) | 2.69 (10) | 1.37 (10) | 0.98 (10) | +| vision_rects | mid-side | 1.89 (4) | 0.49 (4) | 0.24 (4) | 2.05 (4) | +| vision_rects | inner corner | 1.77 (4) | 0.68 (4) | 0.46 (4) | 1.28 (4) | +| vision_rects (any score) | mid-side | 1.89 (4) | 0.49 (4) | 0.24 (4) | 2.05 (4) | +| vision_rects (any score) | inner corner | 1.77 (4) | 0.68 (4) | 0.46 (4) | 1.28 (4) | + +## Cross-view spread + +For each door edge seen in two or more photos: the largest minus the smallest lifted position. + +| Boxes from | Lifting | Door edges with 2+ views | Median spread ft | Max spread ft | +|---|---|---|---|---| +| projected ground truth | mid-side | 12 | 0.24 | 0.78 | +| projected ground truth | inner corner | 12 | 0.02 | 0.26 | +| owlv2 | mid-side | 0 | n/a | n/a | +| owlv2 | inner corner | 0 | n/a | n/a | +| owlv2 (any score) | mid-side | 8 | 0.25 | 1.39 | +| owlv2 (any score) | inner corner | 8 | 0.22 | 0.45 | +| student_transfer | mid-side | 0 | n/a | n/a | +| student_transfer | inner corner | 0 | n/a | n/a | +| student_transfer (any score) | mid-side | 12 | 0.98 | 3.32 | +| student_transfer (any score) | inner corner | 12 | 1.16 | 3.15 | +| vision_rects | mid-side | 4 | 0.32 | 0.35 | +| vision_rects | inner corner | 4 | 0.14 | 0.49 | +| vision_rects (any score) | mid-side | 4 | 0.32 | 0.35 | +| vision_rects (any score) | inner corner | 4 | 0.14 | 0.49 | + +## Every scored edge + +| Boxes from | Lifting | Photo | Door | Door in view | Edge | Error ft (lifted minus truth) | +|---|---|---|---|---|---|---| +| projected ground truth | mid-side | p00001 | B_open_niche | whole | left | -0.00 | +| projected ground truth | mid-side | p00001 | B_open_niche | whole | right | +0.14 | +| projected ground truth | mid-side | p00001 | B_open_niche | whole | bottom | -0.23 | +| projected ground truth | mid-side | p00001 | B_open_niche | whole | top | +0.46 | +| projected ground truth | mid-side | p00001 | C_gray_double | whole | left | -0.18 | +| projected ground truth | mid-side | p00001 | C_gray_double | whole | right | +0.32 | +| projected ground truth | mid-side | p00001 | C_gray_double | whole | bottom | -0.27 | +| projected ground truth | mid-side | p00001 | C_gray_double | whole | top | +0.47 | +| projected ground truth | mid-side | p00002 | B_open_niche | whole | left | -0.22 | +| projected ground truth | mid-side | p00002 | B_open_niche | whole | right | +0.33 | +| projected ground truth | mid-side | p00002 | B_open_niche | whole | bottom | -0.69 | +| projected ground truth | mid-side | p00002 | B_open_niche | whole | top | +0.75 | +| projected ground truth | mid-side | p00002 | C_gray_double | cut off | left | -0.35 | +| projected ground truth | mid-side | p00002 | C_gray_double | cut off | top | +0.90 | +| projected ground truth | mid-side | p00002 | F_glass_double | whole | left (eye-only truth) | -0.10 | +| projected ground truth | mid-side | p00002 | F_glass_double | whole | right | +0.01 | +| projected ground truth | mid-side | p00002 | F_glass_double | whole | bottom | -0.44 | +| projected ground truth | mid-side | p00002 | F_glass_double | whole | top | +0.21 | +| projected ground truth | mid-side | p00003 | B_open_niche | whole | left | -0.24 | +| projected ground truth | mid-side | p00003 | B_open_niche | whole | right | +0.34 | +| projected ground truth | mid-side | p00003 | B_open_niche | whole | bottom | -1.01 | +| projected ground truth | mid-side | p00003 | B_open_niche | whole | top | +0.94 | +| projected ground truth | mid-side | p00003 | C_gray_double | cut off | left | -0.38 | +| projected ground truth | mid-side | p00003 | F_glass_double | whole | left (eye-only truth) | -0.13 | +| projected ground truth | mid-side | p00003 | F_glass_double | whole | right | +0.04 | +| projected ground truth | mid-side | p00003 | F_glass_double | whole | bottom | -0.42 | +| projected ground truth | mid-side | p00003 | F_glass_double | whole | top | +0.25 | +| projected ground truth | mid-side | p00004 | B_open_niche | cut off | left | -0.63 | +| projected ground truth | mid-side | p00004 | E_glass_64 | cut off | right | +0.06 | +| projected ground truth | mid-side | p00004 | E_glass_64 | cut off | bottom | -0.36 | +| projected ground truth | mid-side | p00004 | E_glass_64 | cut off | top | +0.13 | +| projected ground truth | mid-side | p00004 | F_glass_double | whole | left (eye-only truth) | -0.04 | +| projected ground truth | mid-side | p00004 | F_glass_double | whole | right | +0.12 | +| projected ground truth | mid-side | p00004 | F_glass_double | whole | bottom | -0.24 | +| projected ground truth | mid-side | p00004 | F_glass_double | whole | top | +0.07 | +| projected ground truth | mid-side | p00005 | E_glass_64 | whole | left | -0.04 | +| projected ground truth | mid-side | p00005 | E_glass_64 | whole | right | +0.15 | +| projected ground truth | mid-side | p00005 | E_glass_64 | whole | bottom | -0.05 | +| projected ground truth | mid-side | p00005 | E_glass_64 | whole | top | +0.31 | +| projected ground truth | mid-side | p00005 | F_glass_double | whole | left (eye-only truth) | -0.23 | +| projected ground truth | mid-side | p00005 | F_glass_double | whole | right | +0.31 | +| projected ground truth | mid-side | p00005 | F_glass_double | whole | bottom | -0.02 | +| projected ground truth | mid-side | p00005 | F_glass_double | whole | top | +0.25 | +| projected ground truth | mid-side | p00006 | E_glass_64 | whole | left | -0.17 | +| projected ground truth | mid-side | p00006 | E_glass_64 | whole | right | +0.27 | +| projected ground truth | mid-side | p00006 | E_glass_64 | whole | bottom | -0.29 | +| projected ground truth | mid-side | p00006 | E_glass_64 | whole | top | +0.58 | +| projected ground truth | mid-side | p00006 | F_glass_double | cut off | left (eye-only truth) | -0.32 | +| projected ground truth | mid-side | p00006 | F_glass_double | cut off | bottom | -0.13 | +| projected ground truth | mid-side | p00006 | F_glass_double | cut off | top | +0.35 | +| projected ground truth | inner corner | p00001 | B_open_niche | whole | left | +0.00 | +| projected ground truth | inner corner | p00001 | B_open_niche | whole | right | -0.00 | +| projected ground truth | inner corner | p00001 | B_open_niche | whole | bottom | -0.00 | +| projected ground truth | inner corner | p00001 | B_open_niche | whole | top | -0.04 | +| projected ground truth | inner corner | p00001 | C_gray_double | whole | left | +0.04 | +| projected ground truth | inner corner | p00001 | C_gray_double | whole | right | -0.00 | +| projected ground truth | inner corner | p00001 | C_gray_double | whole | bottom | -0.00 | +| projected ground truth | inner corner | p00001 | C_gray_double | whole | top | -0.11 | +| projected ground truth | inner corner | p00002 | B_open_niche | whole | left | +0.13 | +| projected ground truth | inner corner | p00002 | B_open_niche | whole | right | -0.00 | +| projected ground truth | inner corner | p00002 | B_open_niche | whole | bottom | -0.00 | +| projected ground truth | inner corner | p00002 | B_open_niche | whole | top | -0.21 | +| projected ground truth | inner corner | p00002 | C_gray_double | cut off | left | +0.15 | +| projected ground truth | inner corner | p00002 | C_gray_double | cut off | top | -0.00 | +| projected ground truth | inner corner | p00002 | F_glass_double | whole | left (eye-only truth) | -0.00 | +| projected ground truth | inner corner | p00002 | F_glass_double | whole | right | -0.01 | +| projected ground truth | inner corner | p00002 | F_glass_double | whole | bottom | +0.00 | +| projected ground truth | inner corner | p00002 | F_glass_double | whole | top | -0.02 | +| projected ground truth | inner corner | p00003 | B_open_niche | whole | left | +0.16 | +| projected ground truth | inner corner | p00003 | B_open_niche | whole | right | -0.00 | +| projected ground truth | inner corner | p00003 | B_open_niche | whole | bottom | -0.00 | +| projected ground truth | inner corner | p00003 | B_open_niche | whole | top | -0.30 | +| projected ground truth | inner corner | p00003 | C_gray_double | cut off | left | +0.03 | +| projected ground truth | inner corner | p00003 | F_glass_double | whole | left (eye-only truth) | -0.00 | +| projected ground truth | inner corner | p00003 | F_glass_double | whole | right | -0.01 | +| projected ground truth | inner corner | p00003 | F_glass_double | whole | bottom | +0.00 | +| projected ground truth | inner corner | p00003 | F_glass_double | whole | top | -0.02 | +| projected ground truth | inner corner | p00004 | B_open_niche | cut off | left | -0.63 | +| projected ground truth | inner corner | p00004 | E_glass_64 | cut off | right | -0.00 | +| projected ground truth | inner corner | p00004 | E_glass_64 | cut off | bottom | -0.00 | +| projected ground truth | inner corner | p00004 | E_glass_64 | cut off | top | +0.00 | +| projected ground truth | inner corner | p00004 | F_glass_double | whole | left (eye-only truth) | -0.00 | +| projected ground truth | inner corner | p00004 | F_glass_double | whole | right | -0.02 | +| projected ground truth | inner corner | p00004 | F_glass_double | whole | bottom | +0.01 | +| projected ground truth | inner corner | p00004 | F_glass_double | whole | top | -0.00 | +| projected ground truth | inner corner | p00005 | E_glass_64 | whole | left | +0.01 | +| projected ground truth | inner corner | p00005 | E_glass_64 | whole | right | -0.00 | +| projected ground truth | inner corner | p00005 | E_glass_64 | whole | bottom | -0.00 | +| projected ground truth | inner corner | p00005 | E_glass_64 | whole | top | -0.02 | +| projected ground truth | inner corner | p00005 | F_glass_double | whole | left (eye-only truth) | +0.03 | +| projected ground truth | inner corner | p00005 | F_glass_double | whole | right | +0.00 | +| projected ground truth | inner corner | p00005 | F_glass_double | whole | bottom | -0.00 | +| projected ground truth | inner corner | p00005 | F_glass_double | whole | top | -0.05 | +| projected ground truth | inner corner | p00006 | E_glass_64 | whole | left | +0.07 | +| projected ground truth | inner corner | p00006 | E_glass_64 | whole | right | +0.00 | +| projected ground truth | inner corner | p00006 | E_glass_64 | whole | bottom | +0.00 | +| projected ground truth | inner corner | p00006 | E_glass_64 | whole | top | -0.09 | +| projected ground truth | inner corner | p00006 | F_glass_double | cut off | left (eye-only truth) | +0.05 | +| projected ground truth | inner corner | p00006 | F_glass_double | cut off | bottom | +0.00 | +| projected ground truth | inner corner | p00006 | F_glass_double | cut off | top | -0.00 | +| owlv2 | mid-side | p00005 | F_glass_double | whole | left (eye-only truth) | -0.74 | +| owlv2 | mid-side | p00005 | F_glass_double | whole | right | -0.14 | +| owlv2 | mid-side | p00005 | F_glass_double | whole | bottom | -0.13 | +| owlv2 | mid-side | p00005 | F_glass_double | whole | top | +0.66 | +| owlv2 | mid-side | p00006 | E_glass_64 | whole | left | +4.04 | +| owlv2 | mid-side | p00006 | E_glass_64 | whole | right | +0.00 | +| owlv2 | mid-side | p00006 | E_glass_64 | whole | bottom | -0.07 | +| owlv2 | mid-side | p00006 | E_glass_64 | whole | top | +0.52 | +| owlv2 | mid-side | p00006 | F_glass_double | cut off | left (eye-only truth) | -0.74 | +| owlv2 | mid-side | p00006 | F_glass_double | cut off | bottom | -0.22 | +| owlv2 | mid-side | p00006 | F_glass_double | cut off | top | +0.86 | +| owlv2 | inner corner | p00005 | F_glass_double | whole | left (eye-only truth) | -0.48 | +| owlv2 | inner corner | p00005 | F_glass_double | whole | right | -0.46 | +| owlv2 | inner corner | p00005 | F_glass_double | whole | bottom | -0.10 | +| owlv2 | inner corner | p00005 | F_glass_double | whole | top | +0.35 | +| owlv2 | inner corner | p00006 | E_glass_64 | whole | left | +4.30 | +| owlv2 | inner corner | p00006 | E_glass_64 | whole | right | -0.27 | +| owlv2 | inner corner | p00006 | E_glass_64 | whole | bottom | +0.08 | +| owlv2 | inner corner | p00006 | E_glass_64 | whole | top | +0.16 | +| owlv2 | inner corner | p00006 | F_glass_double | cut off | left (eye-only truth) | -0.35 | +| owlv2 | inner corner | p00006 | F_glass_double | cut off | bottom | -0.08 | +| owlv2 | inner corner | p00006 | F_glass_double | cut off | top | +0.46 | +| owlv2 (any score) | mid-side | p00001 | C_gray_double | whole | left | +3.29 | +| owlv2 (any score) | mid-side | p00001 | C_gray_double | whole | right | +0.24 | +| owlv2 (any score) | mid-side | p00001 | C_gray_double | whole | bottom | -0.26 | +| owlv2 (any score) | mid-side | p00001 | C_gray_double | whole | top | +0.04 | +| owlv2 (any score) | mid-side | p00001 | B_open_niche | whole | left | -2.56 | +| owlv2 (any score) | mid-side | p00001 | B_open_niche | whole | right | +0.15 | +| owlv2 (any score) | mid-side | p00001 | B_open_niche | whole | bottom | -0.25 | +| owlv2 (any score) | mid-side | p00001 | B_open_niche | whole | top | +2.16 | +| owlv2 (any score) | mid-side | p00002 | C_gray_double | cut off | left | -0.16 | +| owlv2 (any score) | mid-side | p00002 | C_gray_double | cut off | top | +0.43 | +| owlv2 (any score) | mid-side | p00002 | B_open_niche | whole | left | -3.27 | +| owlv2 (any score) | mid-side | p00002 | B_open_niche | whole | right | +0.07 | +| owlv2 (any score) | mid-side | p00002 | B_open_niche | whole | bottom | -0.33 | +| owlv2 (any score) | mid-side | p00002 | B_open_niche | whole | top | +2.76 | +| owlv2 (any score) | mid-side | p00003 | C_gray_double | cut off | left | -0.38 | +| owlv2 (any score) | mid-side | p00003 | B_open_niche | whole | left | -3.16 | +| owlv2 (any score) | mid-side | p00003 | B_open_niche | whole | right | -0.06 | +| owlv2 (any score) | mid-side | p00003 | B_open_niche | whole | bottom | -0.87 | +| owlv2 (any score) | mid-side | p00003 | B_open_niche | whole | top | +3.55 | +| owlv2 (any score) | mid-side | p00004 | F_glass_double | whole | left (eye-only truth) | -0.46 | +| owlv2 (any score) | mid-side | p00004 | F_glass_double | whole | right | -0.35 | +| owlv2 (any score) | mid-side | p00004 | F_glass_double | whole | bottom | -0.28 | +| owlv2 (any score) | mid-side | p00004 | F_glass_double | whole | top | +0.58 | +| owlv2 (any score) | mid-side | p00004 | E_glass_64 | cut off | right | -0.16 | +| owlv2 (any score) | mid-side | p00004 | E_glass_64 | cut off | bottom | -0.35 | +| owlv2 (any score) | mid-side | p00004 | E_glass_64 | cut off | top | +0.66 | +| owlv2 (any score) | mid-side | p00004 | B_open_niche | cut off | left | -0.66 | +| owlv2 (any score) | mid-side | p00005 | F_glass_double | whole | left (eye-only truth) | -0.74 | +| owlv2 (any score) | mid-side | p00005 | F_glass_double | whole | right | -0.14 | +| owlv2 (any score) | mid-side | p00005 | F_glass_double | whole | bottom | -0.13 | +| owlv2 (any score) | mid-side | p00005 | F_glass_double | whole | top | +0.66 | +| owlv2 (any score) | mid-side | p00006 | E_glass_64 | whole | left | +4.04 | +| owlv2 (any score) | mid-side | p00006 | E_glass_64 | whole | right | +0.00 | +| owlv2 (any score) | mid-side | p00006 | E_glass_64 | whole | bottom | -0.07 | +| owlv2 (any score) | mid-side | p00006 | E_glass_64 | whole | top | +0.52 | +| owlv2 (any score) | mid-side | p00006 | F_glass_double | cut off | left (eye-only truth) | -0.74 | +| owlv2 (any score) | mid-side | p00006 | F_glass_double | cut off | bottom | -0.22 | +| owlv2 (any score) | mid-side | p00006 | F_glass_double | cut off | top | +0.86 | +| owlv2 (any score) | inner corner | p00001 | C_gray_double | whole | left | +3.57 | +| owlv2 (any score) | inner corner | p00001 | C_gray_double | whole | right | -0.08 | +| owlv2 (any score) | inner corner | p00001 | C_gray_double | whole | bottom | -0.11 | +| owlv2 (any score) | inner corner | p00001 | C_gray_double | whole | top | -0.26 | +| owlv2 (any score) | inner corner | p00001 | B_open_niche | whole | left | -2.48 | +| owlv2 (any score) | inner corner | p00001 | B_open_niche | whole | right | -0.01 | +| owlv2 (any score) | inner corner | p00001 | B_open_niche | whole | bottom | +0.05 | +| owlv2 (any score) | inner corner | p00001 | B_open_niche | whole | top | +1.35 | +| owlv2 (any score) | inner corner | p00002 | C_gray_double | cut off | left | +0.30 | +| owlv2 (any score) | inner corner | p00002 | C_gray_double | cut off | top | -0.24 | +| owlv2 (any score) | inner corner | p00002 | B_open_niche | whole | left | -2.91 | +| owlv2 (any score) | inner corner | p00002 | B_open_niche | whole | right | -0.29 | +| owlv2 (any score) | inner corner | p00002 | B_open_niche | whole | bottom | +0.45 | +| owlv2 (any score) | inner corner | p00002 | B_open_niche | whole | top | +1.22 | +| owlv2 (any score) | inner corner | p00003 | C_gray_double | cut off | left | +0.03 | +| owlv2 (any score) | inner corner | p00003 | B_open_niche | whole | left | -2.73 | +| owlv2 (any score) | inner corner | p00003 | B_open_niche | whole | right | -0.46 | +| owlv2 (any score) | inner corner | p00003 | B_open_niche | whole | bottom | +0.27 | +| owlv2 (any score) | inner corner | p00003 | B_open_niche | whole | top | +1.51 | +| owlv2 (any score) | inner corner | p00004 | F_glass_double | whole | left (eye-only truth) | -0.42 | +| owlv2 (any score) | inner corner | p00004 | F_glass_double | whole | right | -0.49 | +| owlv2 (any score) | inner corner | p00004 | F_glass_double | whole | bottom | -0.04 | +| owlv2 (any score) | inner corner | p00004 | F_glass_double | whole | top | +0.49 | +| owlv2 (any score) | inner corner | p00004 | E_glass_64 | cut off | right | -0.23 | +| owlv2 (any score) | inner corner | p00004 | E_glass_64 | cut off | bottom | -0.01 | +| owlv2 (any score) | inner corner | p00004 | E_glass_64 | cut off | top | +0.51 | +| owlv2 (any score) | inner corner | p00004 | B_open_niche | cut off | left | -0.66 | +| owlv2 (any score) | inner corner | p00005 | F_glass_double | whole | left (eye-only truth) | -0.48 | +| owlv2 (any score) | inner corner | p00005 | F_glass_double | whole | right | -0.46 | +| owlv2 (any score) | inner corner | p00005 | F_glass_double | whole | bottom | -0.10 | +| owlv2 (any score) | inner corner | p00005 | F_glass_double | whole | top | +0.35 | +| owlv2 (any score) | inner corner | p00006 | E_glass_64 | whole | left | +4.30 | +| owlv2 (any score) | inner corner | p00006 | E_glass_64 | whole | right | -0.27 | +| owlv2 (any score) | inner corner | p00006 | E_glass_64 | whole | bottom | +0.08 | +| owlv2 (any score) | inner corner | p00006 | E_glass_64 | whole | top | +0.16 | +| owlv2 (any score) | inner corner | p00006 | F_glass_double | cut off | left (eye-only truth) | -0.35 | +| owlv2 (any score) | inner corner | p00006 | F_glass_double | cut off | bottom | -0.08 | +| owlv2 (any score) | inner corner | p00006 | F_glass_double | cut off | top | +0.46 | +| student_transfer (any score) | mid-side | p00001 | C_gray_double | whole | left | +0.23 | +| student_transfer (any score) | mid-side | p00001 | C_gray_double | whole | right | -0.22 | +| student_transfer (any score) | mid-side | p00001 | C_gray_double | whole | bottom | +0.08 | +| student_transfer (any score) | mid-side | p00001 | C_gray_double | whole | top | +0.22 | +| student_transfer (any score) | mid-side | p00001 | B_open_niche | whole | left | +0.22 | +| student_transfer (any score) | mid-side | p00001 | B_open_niche | whole | right | +0.62 | +| student_transfer (any score) | mid-side | p00001 | B_open_niche | whole | bottom | -0.69 | +| student_transfer (any score) | mid-side | p00001 | B_open_niche | whole | top | +1.29 | +| student_transfer (any score) | mid-side | p00002 | F_glass_double | whole | left (eye-only truth) | -0.72 | +| student_transfer (any score) | mid-side | p00002 | F_glass_double | whole | right | -2.04 | +| student_transfer (any score) | mid-side | p00002 | F_glass_double | whole | bottom | -1.19 | +| student_transfer (any score) | mid-side | p00002 | F_glass_double | whole | top | +1.07 | +| student_transfer (any score) | mid-side | p00002 | C_gray_double | cut off | left | +0.67 | +| student_transfer (any score) | mid-side | p00002 | C_gray_double | cut off | top | +0.09 | +| student_transfer (any score) | mid-side | p00002 | B_open_niche | whole | left | -0.63 | +| student_transfer (any score) | mid-side | p00002 | B_open_niche | whole | right | +0.49 | +| student_transfer (any score) | mid-side | p00002 | B_open_niche | whole | bottom | -0.72 | +| student_transfer (any score) | mid-side | p00002 | B_open_niche | whole | top | +0.93 | +| student_transfer (any score) | mid-side | p00003 | F_glass_double | whole | left (eye-only truth) | -0.61 | +| student_transfer (any score) | mid-side | p00003 | F_glass_double | whole | right | -2.56 | +| student_transfer (any score) | mid-side | p00003 | F_glass_double | whole | bottom | -1.16 | +| student_transfer (any score) | mid-side | p00003 | F_glass_double | whole | top | +1.15 | +| student_transfer (any score) | mid-side | p00003 | B_open_niche | whole | left | -0.15 | +| student_transfer (any score) | mid-side | p00003 | B_open_niche | whole | right | -0.53 | +| student_transfer (any score) | mid-side | p00003 | B_open_niche | whole | bottom | -0.13 | +| student_transfer (any score) | mid-side | p00003 | B_open_niche | whole | top | +1.16 | +| student_transfer (any score) | mid-side | p00004 | E_glass_64 | cut off | right | +2.29 | +| student_transfer (any score) | mid-side | p00004 | E_glass_64 | cut off | bottom | -0.24 | +| student_transfer (any score) | mid-side | p00004 | E_glass_64 | cut off | top | +1.80 | +| student_transfer (any score) | mid-side | p00004 | F_glass_double | whole | left (eye-only truth) | -1.17 | +| student_transfer (any score) | mid-side | p00004 | F_glass_double | whole | right | -2.57 | +| student_transfer (any score) | mid-side | p00004 | F_glass_double | whole | bottom | -0.71 | +| student_transfer (any score) | mid-side | p00004 | F_glass_double | whole | top | +1.02 | +| student_transfer (any score) | mid-side | p00004 | B_open_niche | cut off | left | -0.59 | +| student_transfer (any score) | mid-side | p00005 | F_glass_double | whole | left (eye-only truth) | +0.09 | +| student_transfer (any score) | mid-side | p00005 | F_glass_double | whole | right | -0.49 | +| student_transfer (any score) | mid-side | p00005 | F_glass_double | whole | bottom | -1.45 | +| student_transfer (any score) | mid-side | p00005 | F_glass_double | whole | top | +0.78 | +| student_transfer (any score) | mid-side | p00005 | E_glass_64 | whole | left | +1.53 | +| student_transfer (any score) | mid-side | p00005 | E_glass_64 | whole | right | -0.25 | +| student_transfer (any score) | mid-side | p00005 | E_glass_64 | whole | bottom | +0.04 | +| student_transfer (any score) | mid-side | p00005 | E_glass_64 | whole | top | -0.54 | +| student_transfer (any score) | mid-side | p00006 | F_glass_double | cut off | left (eye-only truth) | -0.30 | +| student_transfer (any score) | mid-side | p00006 | F_glass_double | cut off | bottom | -1.14 | +| student_transfer (any score) | mid-side | p00006 | F_glass_double | cut off | top | +1.10 | +| student_transfer (any score) | mid-side | p00006 | E_glass_64 | whole | left | +1.53 | +| student_transfer (any score) | mid-side | p00006 | E_glass_64 | whole | right | +3.07 | +| student_transfer (any score) | mid-side | p00006 | E_glass_64 | whole | bottom | +1.16 | +| student_transfer (any score) | mid-side | p00006 | E_glass_64 | whole | top | +2.40 | +| student_transfer (any score) | inner corner | p00001 | C_gray_double | whole | left | +0.45 | +| student_transfer (any score) | inner corner | p00001 | C_gray_double | whole | right | -0.51 | +| student_transfer (any score) | inner corner | p00001 | C_gray_double | whole | bottom | +0.30 | +| student_transfer (any score) | inner corner | p00001 | C_gray_double | whole | top | -0.27 | +| student_transfer (any score) | inner corner | p00001 | B_open_niche | whole | left | +0.22 | +| student_transfer (any score) | inner corner | p00001 | B_open_niche | whole | right | +0.45 | +| student_transfer (any score) | inner corner | p00001 | B_open_niche | whole | bottom | -0.42 | +| student_transfer (any score) | inner corner | p00001 | B_open_niche | whole | top | +0.71 | +| student_transfer (any score) | inner corner | p00002 | F_glass_double | whole | left (eye-only truth) | -0.60 | +| student_transfer (any score) | inner corner | p00002 | F_glass_double | whole | right | -2.10 | +| student_transfer (any score) | inner corner | p00002 | F_glass_double | whole | bottom | -0.78 | +| student_transfer (any score) | inner corner | p00002 | F_glass_double | whole | top | +0.84 | +| student_transfer (any score) | inner corner | p00002 | C_gray_double | cut off | left | +1.12 | +| student_transfer (any score) | inner corner | p00002 | C_gray_double | cut off | top | -0.51 | +| student_transfer (any score) | inner corner | p00002 | B_open_niche | whole | left | -0.27 | +| student_transfer (any score) | inner corner | p00002 | B_open_niche | whole | right | +0.15 | +| student_transfer (any score) | inner corner | p00002 | B_open_niche | whole | bottom | +0.01 | +| student_transfer (any score) | inner corner | p00002 | B_open_niche | whole | top | -0.11 | +| student_transfer (any score) | inner corner | p00003 | F_glass_double | whole | left (eye-only truth) | -0.45 | +| student_transfer (any score) | inner corner | p00003 | F_glass_double | whole | right | -2.66 | +| student_transfer (any score) | inner corner | p00003 | F_glass_double | whole | bottom | -0.81 | +| student_transfer (any score) | inner corner | p00003 | F_glass_double | whole | top | +0.90 | +| student_transfer (any score) | inner corner | p00003 | B_open_niche | whole | left | +0.21 | +| student_transfer (any score) | inner corner | p00003 | B_open_niche | whole | right | -0.85 | +| student_transfer (any score) | inner corner | p00003 | B_open_niche | whole | bottom | +0.60 | +| student_transfer (any score) | inner corner | p00003 | B_open_niche | whole | top | +0.03 | +| student_transfer (any score) | inner corner | p00004 | E_glass_64 | cut off | right | +2.25 | +| student_transfer (any score) | inner corner | p00004 | E_glass_64 | cut off | bottom | +0.15 | +| student_transfer (any score) | inner corner | p00004 | E_glass_64 | cut off | top | +1.56 | +| student_transfer (any score) | inner corner | p00004 | F_glass_double | whole | left (eye-only truth) | -1.14 | +| student_transfer (any score) | inner corner | p00004 | F_glass_double | whole | right | -2.69 | +| student_transfer (any score) | inner corner | p00004 | F_glass_double | whole | bottom | -0.50 | +| student_transfer (any score) | inner corner | p00004 | F_glass_double | whole | top | +0.93 | +| student_transfer (any score) | inner corner | p00004 | B_open_niche | cut off | left | -0.59 | +| student_transfer (any score) | inner corner | p00005 | F_glass_double | whole | left (eye-only truth) | +0.39 | +| student_transfer (any score) | inner corner | p00005 | F_glass_double | whole | right | -0.85 | +| student_transfer (any score) | inner corner | p00005 | F_glass_double | whole | bottom | -1.39 | +| student_transfer (any score) | inner corner | p00005 | F_glass_double | whole | top | +0.51 | +| student_transfer (any score) | inner corner | p00005 | E_glass_64 | whole | left | +1.59 | +| student_transfer (any score) | inner corner | p00005 | E_glass_64 | whole | right | -0.38 | +| student_transfer (any score) | inner corner | p00005 | E_glass_64 | whole | bottom | +0.07 | +| student_transfer (any score) | inner corner | p00005 | E_glass_64 | whole | top | -0.78 | +| student_transfer (any score) | inner corner | p00006 | F_glass_double | cut off | left (eye-only truth) | +0.13 | +| student_transfer (any score) | inner corner | p00006 | F_glass_double | cut off | bottom | -0.99 | +| student_transfer (any score) | inner corner | p00006 | F_glass_double | cut off | top | +0.76 | +| student_transfer (any score) | inner corner | p00006 | E_glass_64 | whole | left | +1.78 | +| student_transfer (any score) | inner corner | p00006 | E_glass_64 | whole | right | +2.77 | +| student_transfer (any score) | inner corner | p00006 | E_glass_64 | whole | bottom | +1.37 | +| student_transfer (any score) | inner corner | p00006 | E_glass_64 | whole | top | +1.40 | +| vision_rects | mid-side | p00001 | C_gray_double | whole | left | -0.66 | +| vision_rects | mid-side | p00001 | C_gray_double | whole | right | +0.16 | +| vision_rects | mid-side | p00001 | C_gray_double | whole | bottom | +0.21 | +| vision_rects | mid-side | p00001 | C_gray_double | whole | top | +1.14 | +| vision_rects | mid-side | p00001 | B_open_niche | whole | left | -2.42 | +| vision_rects | mid-side | p00001 | B_open_niche | whole | right | +0.05 | +| vision_rects | mid-side | p00001 | B_open_niche | whole | bottom | +0.16 | +| vision_rects | mid-side | p00001 | B_open_niche | whole | top | +2.45 | +| vision_rects | mid-side | p00002 | C_gray_double | cut off | left | -0.89 | +| vision_rects | mid-side | p00002 | C_gray_double | cut off | top | +2.67 | +| vision_rects | mid-side | p00004 | F_glass_double | whole | left (eye-only truth) | -0.26 | +| vision_rects | mid-side | p00004 | F_glass_double | whole | right | -0.60 | +| vision_rects | mid-side | p00004 | F_glass_double | whole | bottom | +0.04 | +| vision_rects | mid-side | p00004 | F_glass_double | whole | top | +0.40 | +| vision_rects | mid-side | p00005 | F_glass_double | whole | left (eye-only truth) | -0.61 | +| vision_rects | mid-side | p00005 | F_glass_double | whole | right | -0.26 | +| vision_rects | mid-side | p00005 | F_glass_double | whole | bottom | -0.26 | +| vision_rects | mid-side | p00005 | F_glass_double | whole | top | +0.53 | +| vision_rects | mid-side | p00006 | F_glass_double | cut off | left (eye-only truth) | -0.76 | +| vision_rects | mid-side | p00006 | F_glass_double | cut off | bottom | -1.58 | +| vision_rects | mid-side | p00006 | F_glass_double | cut off | top | +0.69 | +| vision_rects | inner corner | p00001 | C_gray_double | whole | left | -0.46 | +| vision_rects | inner corner | p00001 | C_gray_double | whole | right | -0.15 | +| vision_rects | inner corner | p00001 | C_gray_double | whole | bottom | +0.47 | +| vision_rects | inner corner | p00001 | C_gray_double | whole | top | +0.45 | +| vision_rects | inner corner | p00001 | B_open_niche | whole | left | -2.34 | +| vision_rects | inner corner | p00001 | B_open_niche | whole | right | -0.11 | +| vision_rects | inner corner | p00001 | B_open_niche | whole | bottom | +0.42 | +| vision_rects | inner corner | p00001 | B_open_niche | whole | top | +1.63 | +| vision_rects | inner corner | p00002 | C_gray_double | cut off | left | -0.31 | +| vision_rects | inner corner | p00002 | C_gray_double | cut off | top | +1.46 | +| vision_rects | inner corner | p00004 | F_glass_double | whole | left (eye-only truth) | -0.23 | +| vision_rects | inner corner | p00004 | F_glass_double | whole | right | -0.73 | +| vision_rects | inner corner | p00004 | F_glass_double | whole | bottom | +0.26 | +| vision_rects | inner corner | p00004 | F_glass_double | whole | top | +0.32 | +| vision_rects | inner corner | p00005 | F_glass_double | whole | left (eye-only truth) | -0.35 | +| vision_rects | inner corner | p00005 | F_glass_double | whole | right | -0.58 | +| vision_rects | inner corner | p00005 | F_glass_double | whole | bottom | -0.23 | +| vision_rects | inner corner | p00005 | F_glass_double | whole | top | +0.23 | +| vision_rects | inner corner | p00006 | F_glass_double | cut off | left (eye-only truth) | -0.32 | +| vision_rects | inner corner | p00006 | F_glass_double | cut off | bottom | -1.39 | +| vision_rects | inner corner | p00006 | F_glass_double | cut off | top | +0.33 | +| vision_rects (any score) | mid-side | p00001 | C_gray_double | whole | left | -0.66 | +| vision_rects (any score) | mid-side | p00001 | C_gray_double | whole | right | +0.16 | +| vision_rects (any score) | mid-side | p00001 | C_gray_double | whole | bottom | +0.21 | +| vision_rects (any score) | mid-side | p00001 | C_gray_double | whole | top | +1.14 | +| vision_rects (any score) | mid-side | p00001 | B_open_niche | whole | left | -2.42 | +| vision_rects (any score) | mid-side | p00001 | B_open_niche | whole | right | +0.05 | +| vision_rects (any score) | mid-side | p00001 | B_open_niche | whole | bottom | +0.16 | +| vision_rects (any score) | mid-side | p00001 | B_open_niche | whole | top | +2.45 | +| vision_rects (any score) | mid-side | p00002 | C_gray_double | cut off | left | -0.89 | +| vision_rects (any score) | mid-side | p00002 | C_gray_double | cut off | top | +2.67 | +| vision_rects (any score) | mid-side | p00004 | F_glass_double | whole | left (eye-only truth) | -0.26 | +| vision_rects (any score) | mid-side | p00004 | F_glass_double | whole | right | -0.60 | +| vision_rects (any score) | mid-side | p00004 | F_glass_double | whole | bottom | +0.04 | +| vision_rects (any score) | mid-side | p00004 | F_glass_double | whole | top | +0.40 | +| vision_rects (any score) | mid-side | p00005 | F_glass_double | whole | left (eye-only truth) | -0.61 | +| vision_rects (any score) | mid-side | p00005 | F_glass_double | whole | right | -0.26 | +| vision_rects (any score) | mid-side | p00005 | F_glass_double | whole | bottom | -0.26 | +| vision_rects (any score) | mid-side | p00005 | F_glass_double | whole | top | +0.53 | +| vision_rects (any score) | mid-side | p00006 | F_glass_double | cut off | left (eye-only truth) | -0.76 | +| vision_rects (any score) | mid-side | p00006 | F_glass_double | cut off | bottom | -1.58 | +| vision_rects (any score) | mid-side | p00006 | F_glass_double | cut off | top | +0.69 | +| vision_rects (any score) | inner corner | p00001 | C_gray_double | whole | left | -0.46 | +| vision_rects (any score) | inner corner | p00001 | C_gray_double | whole | right | -0.15 | +| vision_rects (any score) | inner corner | p00001 | C_gray_double | whole | bottom | +0.47 | +| vision_rects (any score) | inner corner | p00001 | C_gray_double | whole | top | +0.45 | +| vision_rects (any score) | inner corner | p00001 | B_open_niche | whole | left | -2.34 | +| vision_rects (any score) | inner corner | p00001 | B_open_niche | whole | right | -0.11 | +| vision_rects (any score) | inner corner | p00001 | B_open_niche | whole | bottom | +0.42 | +| vision_rects (any score) | inner corner | p00001 | B_open_niche | whole | top | +1.63 | +| vision_rects (any score) | inner corner | p00002 | C_gray_double | cut off | left | -0.31 | +| vision_rects (any score) | inner corner | p00002 | C_gray_double | cut off | top | +1.46 | +| vision_rects (any score) | inner corner | p00004 | F_glass_double | whole | left (eye-only truth) | -0.23 | +| vision_rects (any score) | inner corner | p00004 | F_glass_double | whole | right | -0.73 | +| vision_rects (any score) | inner corner | p00004 | F_glass_double | whole | bottom | +0.26 | +| vision_rects (any score) | inner corner | p00004 | F_glass_double | whole | top | +0.32 | +| vision_rects (any score) | inner corner | p00005 | F_glass_double | whole | left (eye-only truth) | -0.35 | +| vision_rects (any score) | inner corner | p00005 | F_glass_double | whole | right | -0.58 | +| vision_rects (any score) | inner corner | p00005 | F_glass_double | whole | bottom | -0.23 | +| vision_rects (any score) | inner corner | p00005 | F_glass_double | whole | top | +0.23 | +| vision_rects (any score) | inner corner | p00006 | F_glass_double | cut off | left (eye-only truth) | -0.32 | +| vision_rects (any score) | inner corner | p00006 | F_glass_double | cut off | bottom | -1.39 | +| vision_rects (any score) | inner corner | p00006 | F_glass_double | cut off | top | +0.33 | + +Limits: four doors on one building, seen by a DSLR from two to four times the app's 1 to 3 m, with +laser depth that is denser and cleaner than an iPhone's LiDAR and absent on phones without it. +No windows: the electro windows are curtain-wall glazing, not house windows. diff --git a/experiments/autodetect/results/proposals.md b/experiments/autodetect/results/proposals.md new file mode 100644 index 000000000..e3a4d7d7b --- /dev/null +++ b/experiments/autodetect/results/proposals.md @@ -0,0 +1,108 @@ +# Proposals: window and door detection + +Generated 2026-09-26 by `uv run python -m autodetect.score` from cached predictions +(see each model's run command below). Criteria are in `../README.md`, settings in +`../autodetect/config.py`. IoU 0.5; Open Images rules for unverified classes and group-of boxes. +The threshold is chosen on the 150-image OI tune set and applied unchanged to both held-out sets. + +## Operating point + +Pass needs recall >= 80% and precision >= 60% at the operating threshold, judged per set. + +| Model | Class | Threshold | Set | Images | GT | TP | FP | Precision | Recall | AP50 | Pass | +|---|---|---|---|---|---|---|---|---|---|---|---| +| owlv2 | window | 0.162 | Open Images eval | 289 | 3398 | 768 | 631 | 54.9% | 22.6% | 26.0% | no | +| owlv2 | window | 0.162 | CMP base | 378 | 12222 | 4287 | 1153 | 78.8% | 35.1% | 58.3% | no | +| owlv2 | door | 0.318 | Open Images eval | 112 | 102 | 59 | 20 | 74.7% | 57.8% | 69.6% | no | +| owlv2 | door | 0.318 | CMP base | 378 | 398 | 66 | 22 | 75.0% | 16.6% | 40.3% | no | +| owlv2 | window_or_door | 0.221 | Open Images eval | 101 | 318 | 169 | 117 | 59.1% | 53.1% | 59.5% | no | +| owlv2 | window_or_door | 0.221 | CMP base | 378 | 12620 | 1536 | 305 | 83.4% | 12.2% | 56.8% | no | +| student_transfer | window | 0.662 | Open Images eval | 289 | 3398 | 232 | 184 | 55.8% | 6.8% | 8.9% | no | +| student_transfer | window | 0.662 | CMP base | 378 | 12222 | 2603 | 2277 | 53.3% | 21.3% | 22.4% | no | +| student_transfer | door | 0.976 | Open Images eval | 112 | 102 | 8 | 7 | 53.3% | 7.8% | 27.5% | no | +| student_transfer | door | 0.976 | CMP base | 378 | 398 | 1 | 0 | 100.0% | 0.3% | 19.0% | no | +| student_transfer | window_or_door | 0.658 | Open Images eval | 101 | 318 | 91 | 84 | 52.0% | 28.6% | 32.7% | no | +| student_transfer | window_or_door | 0.658 | CMP base | 378 | 12620 | 2672 | 2318 | 53.5% | 21.2% | 22.6% | no | +| vision_rects | window | 1.000 | Open Images eval | 289 | 3398 | 517 | 7460 | 6.5% | 15.2% | 1.1% | no | +| vision_rects | window | 1.000 | CMP base | 378 | 12222 | 4043 | 15103 | 21.1% | 33.1% | 7.8% | no | +| vision_rects | window_or_door | 1.000 | Open Images eval | 101 | 318 | 125 | 2576 | 4.6% | 39.3% | 3.4% | no | +| vision_rects | window_or_door | 1.000 | CMP base | 378 | 12620 | 4219 | 14927 | 22.0% | 33.4% | 8.1% | no | + +## Tune-set operating point (where each threshold came from) + +| Model | Class | Threshold | Rule | Tune precision | Tune recall | +|---|---|---|---|---|---| +| owlv2 | window | 0.162 | lowest score with precision >= 0.6 | 60.0% | 21.3% | +| owlv2 | door | 0.318 | lowest score with precision >= 0.6 | 60.0% | 50.0% | +| owlv2 | window_or_door | 0.221 | lowest score with precision >= 0.6 | 60.1% | 56.0% | +| student_transfer | window | 0.662 | lowest score with precision >= 0.6 | 60.1% | 5.5% | +| student_transfer | door | 0.976 | lowest score with precision >= 0.6 | 66.7% | 7.4% | +| student_transfer | window_or_door | 0.658 | lowest score with precision >= 0.6 | 60.3% | 25.8% | +| vision_rects | window | 1.000 | best F1 (no score reaches the precision bar) | 6.6% | 12.9% | +| vision_rects | window_or_door | 1.000 | best F1 (no score reaches the precision bar) | 4.0% | 28.3% | + +## Diagnostic: best recall at 60% precision on the scored set itself + +Not a pass criterion: the threshold here is chosen on the set it is scored on. It shows whether +a failure comes from the tune-set threshold not transferring or from the model, since no +threshold passes when even this recall is under 80%. + +| Model | Class | Set | Threshold | Precision | Recall | +|---|---|---|---|---|---| +| owlv2 | window | Open Images eval | 0.179 | 60.0% | 19.3% | +| owlv2 | window | CMP base | 0.104 | 60.0% | 63.7% | +| owlv2 | door | Open Images eval | 0.261 | 60.2% | 69.6% | +| owlv2 | door | CMP base | 0.245 | 60.0% | 32.4% | +| owlv2 | window_or_door | Open Images eval | 0.229 | 60.0% | 51.9% | +| owlv2 | window_or_door | CMP base | 0.108 | 60.0% | 62.9% | +| student_transfer | window | Open Images eval | 0.739 | 60.0% | 5.8% | +| student_transfer | window | CMP base | 0.813 | 60.0% | 15.8% | +| student_transfer | door | Open Images eval | 0.918 | 60.7% | 16.7% | +| student_transfer | door | CMP base | 0.617 | 60.3% | 11.1% | +| student_transfer | window_or_door | Open Images eval | 0.769 | 60.2% | 25.2% | +| student_transfer | window_or_door | CMP base | 0.803 | 60.0% | 15.8% | +| vision_rects | window | Open Images eval | 1.000 (never reaches 60%; best F1) | 6.5% | 15.2% | +| vision_rects | window | CMP base | 1.000 (never reaches 60%; best F1) | 21.1% | 33.1% | +| vision_rects | window_or_door | Open Images eval | 1.000 (never reaches 60%; best F1) | 4.6% | 39.3% | +| vision_rects | window_or_door | CMP base | 1.000 (never reaches 60%; best F1) | 22.0% | 33.4% | + +## Diagnostic: near-sized objects only + +Not a pass criterion. Ground-truth boxes narrower or shorter than 10% of the image +are treated as difficult (a detection on one is ignored, a miss is not counted), and detections +that small are dropped, to approximate the large objects in a 1 to 3 m phone frame. Same +thresholds. Dropping small detections was added after the first scored run showed that +without it the small false positives alone kept precision under 25%. + +| Model | Class | Set | GT | Precision | Recall | AP50 | +|---|---|---|---|---|---|---| +| owlv2 | window | Open Images eval | 206 | 51.9% | 52.4% | 49.9% | +| owlv2 | window | CMP base | 282 | 44.6% | 57.1% | 46.7% | +| owlv2 | door | Open Images eval | 63 | 72.5% | 58.7% | 69.9% | +| owlv2 | door | CMP base | 74 | 55.6% | 6.8% | 35.3% | +| owlv2 | window_or_door | Open Images eval | 132 | 62.0% | 64.4% | 65.3% | +| owlv2 | window_or_door | CMP base | 356 | 71.7% | 37.1% | 44.4% | +| student_transfer | window | Open Images eval | 206 | 52.1% | 36.4% | 37.7% | +| student_transfer | window | CMP base | 282 | 31.7% | 63.1% | 44.1% | +| student_transfer | door | Open Images eval | 63 | 53.3% | 12.7% | 37.7% | +| student_transfer | door | CMP base | 74 | 100.0% | 1.4% | 31.5% | +| student_transfer | window_or_door | Open Images eval | 132 | 45.1% | 45.5% | 43.1% | +| student_transfer | window_or_door | CMP base | 356 | 34.2% | 57.3% | 40.7% | +| vision_rects | window | Open Images eval | 206 | 8.8% | 35.0% | 4.8% | +| vision_rects | window | CMP base | 282 | 8.8% | 43.6% | 6.4% | +| vision_rects | window_or_door | Open Images eval | 132 | 12.8% | 38.6% | 6.7% | +| vision_rects | window_or_door | CMP base | 356 | 10.9% | 42.4% | 8.5% | + +## Model, license and Mac latency + +Latency is per image on this Mac (Apple M4 Pro, 24 GB), inference call only, excluding JPEG +decode, preprocessing and the first (warm-up) image. It is not an iPhone number; a phone is +slower. Other agents shared the Mac throughout: the load average column is the 1, 5 and 15 +minute load when the OI eval predictions were saved (12 cores), and loads of 100 to 490 were +seen during the OWLv2 run, so every timing here is likely slower than on an idle Mac. + +| Model | License | Size | Runtime | Input | OI eval median ms | OI eval p90 ms | CMP median ms | CPU-only median / p90 ms | Load average | Speed class (Mac, p90) | Command | +|---|---|---|---|---|---|---|---|---|---|---|---| +| owlv2 | Apache-2.0 | 308 MB (fp16 ONNX) | PyTorch MPS (GPU), Mac, fp32 | 960 x 960 (padded square) | 480.7 | 526.9 | 453.8 | n/a | not recorded | keyframe | `uv run python -m autodetect.owl` | +| student_transfer | ours; trained on Open Images V7 train (CC BY 2.0 images, CC BY 4.0 boxes) | 6.8 MB (.mlmodel) | Core ML via Vision, compute units .all, Mac | Vision scaleFill to the model's input | 49.8 | 141.2 | 54.3 | 78.1 / 149.5 (keyframe) | [62.8, 104.8, 98.0] | keyframe | `uv run python -m autodetect.student predict transfer` | +| vision_rects | OS API (no weights shipped) | 0 (in the OS) | Vision, Mac | image as stored (OI 1024 px, CMP about 1024 px) | 12.1 | 32.6 | 10.6 | n/a | [433.1, 278.1, 223.6] | live | `uv run python -m autodetect.run_vision` | diff --git a/experiments/autodetect/results/resources.md b/experiments/autodetect/results/resources.md new file mode 100644 index 000000000..720a1aaaa --- /dev/null +++ b/experiments/autodetect/results/resources.md @@ -0,0 +1,27 @@ +# Resources used on the shared Mac (M4 Pro, 24 GB) + +Peak resident memory is from `/usr/bin/time -l` on each command. GPU memory on Apple silicon is unified and is not counted in resident memory, so the MPS figure comes from `torch.mps.driver_allocated_memory()`. + +| Step | Command | Wall time | Peak RSS | +|---|---|---|---| +| Select Open Images metadata (streamed, about 1.7 GB read per run, run twice) | `python -m autodetect.openimages select` | 111 s | 152 MB | +| Download and downscale 1,790 Open Images photos | `python -m autodetect.openimages download` | 127 s | 161 MB | +| Vision rectangles, all sets | `python -m autodetect.run_vision` | 8 s | 79 MB | +| OWLv2 on MPS, 828 images | `python -m autodetect.owl` | 488 s | 1.50 GB | +| OWLv2 onnxruntime CPU probe (fp16; fp32 upcast) | one image, three runs | 43 s; 82 s | 1.96 GB; 1.77 GB | +| Laser elevations for door ground truth | `python -m autodetect.extent_gt render` | under 60 s | 590 MB | +| Create ML, Create ML's own iteration count (stopped by me after 2 h 8 min, no progress output) | first `trainod` | 7,706 s | 323 MB | +| Create ML, 1,000 iterations | `python -m autodetect.student train transfer 1000` | 556 s | 478 MB | +| Create ML student inference, all sets plus CPU-only pass | `python -m autodetect.student predict transfer scaleFill` | 136 s | 293 MB | +| Grounding DINO onnxruntime CPU probe | one image, three runs | 82 s | 2.73 GB | +| D-FINE small training probe, 20 steps | `python -m autodetect.dfine probe` | 187 s | 361 MB RSS plus 3.56 GB MPS | + +Load averages on the 12-core Mac ranged from 18 to 492 during the run, because other agents shared it. Every timing above and in `proposals.md` is slower than on an idle machine by an unknown factor. + +## Disk + +- `~/house-scanning-data/autodetect/` holds 289 MB at the end: Open Images 206 MB, CMP 42 MB, cached predictions 28 MB, the Create ML model and hard links to its training images, and small files. +- The folder peaked at about 960 MB between 21:36 and 21:52. The Grounding DINO weights (360 MB) were still on disk when Create ML's session folder (230 MB, checkpoints I did not expect) was written. That peak exceeded the 900 MB limit. Both folders are now deleted, along with an 85 MB cache of the scan in the meter frame, which `extent_gt` rebuilds. +- Weights were deleted after their predictions were cached: OWLv2 (308 MB), Grounding DINO (360 MB) and D-FINE small (41 MB). Their configuration and tokenizer files (under 3 MB) remain. +- `experiments/autodetect/.venv` shows 869 MB under `du`. uv clones files from its cache on APFS, so most of that is shared: free space dropped about 55 MB when torch 2.14.0 and transformers were added. +- `swift build` writes a 370 MB `.build` folder. It was deleted after each build, and the three binaries (under 400 KB) live in `~/house-scanning-data/autodetect/bin/`. diff --git a/experiments/autodetect/tests/test_cmp.py b/experiments/autodetect/tests/test_cmp.py new file mode 100644 index 000000000..9515541b1 --- /dev/null +++ b/experiments/autodetect/tests/test_cmp.py @@ -0,0 +1,14 @@ +from autodetect.cmp import parse + +XML = ( + "\r\r\r0.2\r\r\r0.3\r\r\r0.6\r\r\r0.5\r\r\r" + "\r\rwindow\r\r\r1\r\r\r" + "\r\r\r0\r\r\r1\r\r\r0\r\r\r1\r\r\r" + "\r\rfacade\r\r\r1\r\r\r" +) + + +def test_x_tags_are_rows_and_y_tags_are_columns(tmp_path): + f = tmp_path / "cmp_b9999.xml" + f.write_text(XML) + assert parse(f) == [{"label": "window", "box": [0.5, 0.2, 0.6, 0.3], "group": False}] diff --git a/experiments/autodetect/tests/test_dfine.py b/experiments/autodetect/tests/test_dfine.py new file mode 100644 index 000000000..b8890c5c5 --- /dev/null +++ b/experiments/autodetect/tests/test_dfine.py @@ -0,0 +1,17 @@ +import pytest + +torch = pytest.importorskip("torch") +from transformers import DFineConfig # noqa: E402 +from transformers.models.d_fine.modeling_d_fine import DFineIntegral # noqa: E402 + +from autodetect.dfine import _integral_forward # noqa: E402 + + +def test_patched_integral_matches_transformers(): + cfg = DFineConfig() + layer = DFineIntegral(cfg) + g = torch.Generator().manual_seed(0) + corners = torch.randn(2, 5, 4 * (cfg.max_num_bins + 1), generator=g) + project = torch.randn(cfg.max_num_bins + 1, generator=g) + expected = DFineIntegral.forward(layer, corners, project) + assert torch.allclose(_integral_forward(layer, corners, project), expected, atol=1e-6) diff --git a/experiments/autodetect/tests/test_oieval.py b/experiments/autodetect/tests/test_oieval.py new file mode 100644 index 000000000..d195becba --- /dev/null +++ b/experiments/autodetect/tests/test_oieval.py @@ -0,0 +1,150 @@ +import math + +import numpy as np +import pytest + +from autodetect.oieval import ( + MERGED, + ClassEntries, + at_threshold, + average_precision, + choose_threshold, + class_entries, + image_entries, +) + +A = [0.1, 0.1, 0.3, 0.3] +B = [0.6, 0.6, 0.9, 0.9] +GROUP = [0.0, 0.5, 1.0, 1.0] + + +def det(box, score, label="window"): + return {"label": label, "score": score, "box": box} + + +def gt(box, label="window", group=False): + return {"label": label, "box": box, "group": group} + + +def test_duplicate_detection_of_a_matched_box_is_a_false_positive(): + scores, tp, n = image_entries([gt(A)], [det(A, 0.9), det(A, 0.8)]) + assert n == 1 + assert scores == [0.9, 0.8] + assert tp == [True, False] + + +def test_iou_below_half_is_a_false_positive(): + shifted = [0.2, 0.1, 0.4, 0.3] # IoU with A is 1/3 + _, tp, _ = image_entries([gt(A)], [det(shifted, 0.9)]) + assert tp == [False] + + +def test_group_counts_one_true_positive_at_its_best_score_and_absorbs_the_rest(): + inside = [[0.1, 0.6, 0.2, 0.7], [0.3, 0.6, 0.4, 0.7], [0.5, 0.6, 0.6, 0.7]] + dets = [det(b, s) for b, s in zip(inside, (0.4, 0.7, 0.5))] + scores, tp, n = image_entries([gt(GROUP, group=True)], dets) + assert n == 1 + assert scores == [0.7] + assert tp == [True] + + +def test_group_match_uses_the_detections_own_area(): + # Detection much larger than the group box: IoA over the detection is small, so it is a FP. + big = [0.0, 0.0, 1.0, 1.0] + small_group = [0.4, 0.4, 0.5, 0.5] + scores, tp, n = image_entries([gt(small_group, group=True)], [det(big, 0.9)]) + assert (scores, tp, n) == ([0.9], [False], 1) + + +def test_single_box_matches_before_group_and_duplicate_inside_group_is_absorbed(): + single = [0.1, 0.6, 0.3, 0.8] + dets = [det(single, 0.9), det(single, 0.8)] + scores, tp, n = image_entries([gt(single), gt(GROUP, group=True)], dets) + assert n == 2 + # first matches the single box; the duplicate falls inside the group and becomes its TP + assert sorted(zip(scores, tp)) == [(0.8, True), (0.9, True)] + + +def test_undetected_group_is_one_miss(): + _, _, n = image_entries([gt(GROUP, group=True), gt(A)], []) + assert n == 2 + + +def test_unverified_class_is_ignored_and_negative_class_is_all_false_positives(): + gts = { + "unverified": {"verified": {"door": 1}, "boxes": [gt(B, "door")]}, + "negative": {"verified": {"window": 0}, "boxes": []}, + } + preds = {"unverified": [det(A, 0.9)], "negative": [det(A, 0.8)]} + e = class_entries(gts, preds, "window") + assert e.num_images == 1 + assert e.num_gt == 0 + assert list(e.scores) == [0.8] + assert list(e.tp) == [False] + + +def test_merged_class_needs_both_verified_and_pools_boxes(): + gts = { + "both": {"verified": {"window": 1, "door": 0}, "boxes": [gt(A)]}, + "window_only": {"verified": {"window": 1}, "boxes": [gt(A)]}, + "mixed": {"verified": {"window": 1, "door": 1}, "boxes": [gt(A), gt(B, "door")]}, + } + preds = { + "both": [det(A, 0.9, "window")], + "window_only": [det(B, 0.9, "window")], + "mixed": [det(A, 0.8, "door"), det(B, 0.7, "window")], + } + e = class_entries(gts, preds, MERGED) + assert e.num_images == 2 + assert e.num_gt == 3 + assert sorted(e.tp.tolist()) == [True, True, True] + + +def test_average_precision_matches_hand_computed_envelope(): + # Ranked TP, FP, TP with 3 GT: points (1/3, 1), (1/3, 1/2), (2/3, 2/3); envelope gives + # 1/3 * 1 + 1/3 * 2/3 = 5/9. + e = ClassEntries(np.array([0.9, 0.8, 0.7]), np.array([True, False, True]), num_gt=3, num_images=1) + assert average_precision(e) == pytest.approx(5 / 9) + + +def test_threshold_is_lowest_score_meeting_precision(): + e = ClassEntries(np.array([0.9, 0.8, 0.7, 0.6, 0.5]), np.array([True, True, False, True, False]), 4, 1) + t, rule = choose_threshold(e, 0.6) + # precision by cut: 1, 1, 2/3, 3/4, 3/5 -> lowest cut still >= 0.6 is 0.5 + assert t == 0.5 + assert rule.startswith("lowest") + r = at_threshold(e, t) + assert (r["tp"], r["fp"], r["recall"]) == (3, 2, 0.75) + + +def test_threshold_skips_cuts_inside_tied_scores(): + # Two entries at 0.5: a cut can only fall above or below both. + e = ClassEntries(np.array([0.9, 0.5, 0.5]), np.array([True, False, False]), 1, 1) + t, _ = choose_threshold(e, 0.6) + assert t == 0.9 + + +def test_threshold_falls_back_to_best_f1(): + e = ClassEntries(np.array([0.9, 0.8]), np.array([False, True]), 1, 1) + t, rule = choose_threshold(e, 0.6) + assert t == 0.8 + assert "F1" in rule + assert math.isnan(average_precision(ClassEntries(np.array([]), np.array([], bool), 0, 1))) + + +def test_detection_on_a_difficult_box_is_ignored_and_the_box_is_not_a_miss(): + hard = dict(gt(A), difficult=True) + scores, tp, n = image_entries([hard, gt(B)], [det(A, 0.9), det(B, 0.8)]) + assert (scores, tp, n) == ([0.8], [True], 1) + + +def test_near_sized_filter_marks_boxes_below_the_minimum_side(): + tiny = [0.1, 0.1, 0.15, 0.4] # 5% wide + gts = {"i": {"verified": {"window": 1}, "boxes": [gt(tiny), gt(B)]}} + near_miss = [0.0, 0.0, 0.2, 0.2] + preds = {"i": [det(tiny, 0.9), det([0.0, 0.0, 0.05, 0.05], 0.8), det(near_miss, 0.7)]} + e = class_entries(gts, preds, "window", near_min_side=0.10) + assert e.num_gt == 1 + # the tiny detection is dropped by size, the near-sized miss stays a false positive + assert list(e.scores) == [0.7] + assert list(e.tp) == [False] diff --git a/experiments/autodetect/uv.lock b/experiments/autodetect/uv.lock new file mode 100644 index 000000000..71804e7bd --- /dev/null +++ b/experiments/autodetect/uv.lock @@ -0,0 +1,893 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" + +[[package]] +name = "annotated-doc" +version = "0.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/8e/38aa427ed5402449e226975b649c5dc73ccadfefeb95e6aecb8f8ea4b6b6/annotated_doc-0.0.5.tar.gz", hash = "sha256:c7e58ce09192557605d8bbd92836d7e1d520ac9580096042c0bfd197efacf1bb", size = 10758, upload-time = "2026-07-28T13:50:58.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", hash = "sha256:117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101", size = 5302, upload-time = "2026-07-28T13:50:57.239Z" }, +] + +[[package]] +name = "anyio" +version = "4.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/d2/f4d173e22df740bc37b1db102b386ba719b66e95b0f0d751f556b387e6d2/anyio-4.15.1.tar.gz", hash = "sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94", size = 276966, upload-time = "2026-09-05T10:42:39.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", hash = "sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101", size = 132079, upload-time = "2026-09-05T10:42:37.923Z" }, +] + +[[package]] +name = "autodetect" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "numpy" }, + { name = "onnx" }, + { name = "onnxruntime" }, + { name = "pillow" }, + { name = "scipy" }, + { name = "tokenizers" }, + { name = "torch" }, + { name = "transformers" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pytest" }, +] + +[package.metadata] +requires-dist = [ + { name = "numpy", specifier = ">=2.1" }, + { name = "onnx", specifier = ">=1.23.0" }, + { name = "onnxruntime", specifier = ">=1.22" }, + { name = "pillow", specifier = ">=11" }, + { name = "scipy", specifier = ">=1.18.1" }, + { name = "tokenizers", specifier = ">=0.21" }, + { name = "torch", specifier = "==2.14.0" }, + { name = "transformers", specifier = ">=5.17.0" }, +] + +[package.metadata.requires-dev] +dev = [{ name = "pytest", specifier = ">=8" }] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "click" +version = "8.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/0e/7fa0ef50764b67090eca4114772a2abf8b6148198475e54c660b97caeee6/click-8.5.0.tar.gz", hash = "sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34", size = 382235, upload-time = "2026-08-26T13:33:14.56Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", hash = "sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", size = 125251, upload-time = "2026-08-26T13:33:12.928Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cuda-bindings" +version = "13.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-pathfinder" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/11/1293429c1c3a3e19b551275e65efddd122a905bbe7e368816a59f3ef2a41/cuda_bindings-13.4.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bfbd3f7d4ac04dd41dc49121b9e408c8283992f47124c2290ecb79bbbadcca8e", size = 6488226, upload-time = "2026-09-23T02:22:00.578Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c3/efb6bbb7307bf5c83dc4acca650280b210c67ed1a1a60f898a90e7c82e38/cuda_bindings-13.4.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5f72bcfcdf3be23e1da3c792f68f508586f48d037bca8b10f552c4cca5971f2", size = 7172185, upload-time = "2026-09-23T02:22:03.114Z" }, +] + +[[package]] +name = "cuda-pathfinder" +version = "1.8.2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/59/239c7259e669c46ddbcac0aa60e3a0ef00bfeaaa687f905b24dd6a7a10fe/cuda_pathfinder-1.8.2-py3-none-any.whl", hash = "sha256:4e65059febdb4d19d5cbc4798677e19db2b582f2f702f457b609e571690d357e", size = 62551, upload-time = "2026-09-17T22:19:09.396Z" }, +] + +[[package]] +name = "cuda-toolkit" +version = "13.0.3.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/c7/a79086a62c98befcdb8349656c6f114e2db3b8b2422f6e25c97a7f2a9a3c/cuda_toolkit-13.0.3.0-py2.py3-none-any.whl", hash = "sha256:d693caaa261214ddd7dbb60d68e71cbed884e68c2be7509778f3051da0b91c3f", size = 2512, upload-time = "2026-04-14T00:50:08.173Z" }, +] + +[package.optional-dependencies] +cublas = [ + { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cuda-nvrtc", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +cudart = [ + { name = "nvidia-cuda-runtime", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +cufft = [ + { name = "nvidia-cufft", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +cufile = [ + { name = "nvidia-cufile", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, +] +cupti = [ + { name = "nvidia-cuda-cupti", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +curand = [ + { name = "nvidia-curand", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +cusolver = [ + { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cusolver", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +cusparse = [ + { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +nvjitlink = [ + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +nvrtc = [ + { name = "nvidia-cuda-nvrtc", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +nvtx = [ + { name = "nvidia-nvtx", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] + +[[package]] +name = "filelock" +version = "4.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c8/d7/37691dc5063438a448b646f6f2442b4beebf16cc0e18d8cdfa7aeec60b8c/filelock-4.0.4.tar.gz", hash = "sha256:90999ed63a26ccf86b93b959ab10cf1017f422d816be454ed54cbed263e71ab5", size = 244639, upload-time = "2026-09-26T15:19:12.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/ac/8b9c6dc2aa7e9cf5582e20a337006c3428c3d752c2255dbaca2c78a8be45/filelock-4.0.4-py3-none-any.whl", hash = "sha256:0df72be195ca7892216d16f2edce8d9b93a571f02402972020a8cff84c594c7b", size = 108629, upload-time = "2026-09-26T15:19:10.603Z" }, +] + +[[package]] +name = "flatbuffers" +version = "25.12.19" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl", hash = "sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", size = 26661, upload-time = "2025-12-19T23:16:13.622Z" }, +] + +[[package]] +name = "fsspec" +version = "2026.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/77/cd/9be253869fc42e764de7f3dedd6969af7d44ff9c3375214a3442a6f3fc08/fsspec-2026.9.0.tar.gz", hash = "sha256:0f08147951c8cb31d844c3547d631053b127863b60be04cf06e121333ee0e2fe", size = 333545, upload-time = "2026-09-18T17:50:42.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/c0/a98505f18594f1bce828bb159cec0fcf9860562f1a2c85913409fc8f3d9e/fsspec-2026.9.0-py3-none-any.whl", hash = "sha256:8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f", size = 221738, upload-time = "2026-09-18T17:50:41.341Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "hf-xet" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/ab/522a2ab67f27971a9d48ca666d4fca85ef7d5282d142e31fd087e27b1bbe/hf_xet-1.6.0.tar.gz", hash = "sha256:2e58454a340b3556dfa4972d5451aff4fba8dd42a236600ba1a1d2b1514f0fef", size = 920527, upload-time = "2026-08-03T22:33:13.243Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/50/7afa2c9c787405864fc47a0d1bbc02c62e9101947ed43c1f43899fc7d91d/hf_xet-1.6.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:633dc0cd71d32da58ab8c03ad38e2fac452c15c2b0a2866ebf6ededfe0a5061d", size = 4071729, upload-time = "2026-08-03T22:33:00.721Z" }, + { url = "https://files.pythonhosted.org/packages/4b/69/55b8dcf636142ae660fec1869fcac14c4da2e8412e14d6eee1523be77e9f/hf_xet-1.6.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:f0906082d9932ae0c0057fa194041c22b4e2cdb46b2592ef3b91f020d62a081a", size = 3876287, upload-time = "2026-08-03T22:33:02.251Z" }, + { url = "https://files.pythonhosted.org/packages/67/4e/a28359bf1c1ecf11eba22123168c138698f7cb576ac678f5a2e16cd5da08/hf_xet-1.6.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d62671bb130879cef0ee4c9ebe47a14af6c66ec53e6d84dc15936e5ffdfac82f", size = 4464663, upload-time = "2026-08-03T22:33:03.802Z" }, + { url = "https://files.pythonhosted.org/packages/9a/69/1f0cbc2fb22ae6082d094f743d1b8945a3f36f6089cb95f42b7ee348cda7/hf_xet-1.6.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0e6e21fa3cdfcdcd76748564bf593870a5e013f47d97cf10aed63aa222cff5b7", size = 4262538, upload-time = "2026-08-03T22:33:05.287Z" }, + { url = "https://files.pythonhosted.org/packages/d1/3a/4f4f2301ade26e404462d3336fa11f7958d914cabbabdd6e03c3c5d5658c/hf_xet-1.6.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4fc74352a17015bd0ee90038bc9efe38db894cde45f268b6712b04fce8cd0acb", size = 4460520, upload-time = "2026-08-03T22:33:06.81Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5f/311725e2a905534dfee2dcb5b08414f249147f1f12252bfc2bd24caa075c/hf_xet-1.6.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4f71cba6129110c3374a33f919001ff130488fc23553698e34cc1c2a1198c", size = 4675937, upload-time = "2026-08-03T22:33:08.616Z" }, + { url = "https://files.pythonhosted.org/packages/98/b7/8c59a66d15205024662f1d66968136f13893f96df1ddc5087e2e281fc95f/hf_xet-1.6.0-cp38-abi3-win_amd64.whl", hash = "sha256:fb4fadde1b2b70bf4c0c14a6dccbe7194b1c28947fefd5bbe3fed9d940676c3b", size = 4033128, upload-time = "2026-08-03T22:33:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/73/63/ca511b6f802f28cf3489b280fe77475bcca8de85e81a6299d7916b5b5555/hf_xet-1.6.0-cp38-abi3-win_arm64.whl", hash = "sha256:3dc3e35441ba395006af5aaacc40ef2e603c51ef46c3530b9156185f00935ea3", size = 3859359, upload-time = "2026-08-03T22:33:11.725Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "huggingface-hub" +version = "1.33.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "httpx" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/2a/484d112c0d8fc5f665d7b65137ac9cdb2953c982391598c3597968a12ee7/huggingface_hub-1.33.0.tar.gz", hash = "sha256:367be21a201db9523eddf8aeac7048f2602c1b308691c97640d5e72ed188007e", size = 1043548, upload-time = "2026-09-24T09:49:29.971Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/16/963096d224b80909432dc16561a615fd33d2d13beef3ce4c63fa25e40867/huggingface_hub-1.33.0-py3-none-any.whl", hash = "sha256:04e434b06e100eddbce9a6e817d72693a7884b10a79bd67ab48080d5c07eb899", size = 846435, upload-time = "2026-09-24T09:49:28.059Z" }, +] + +[[package]] +name = "idna" +version = "3.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/08/8eea9d4b8302028f3abb2c0813953f7aec26d33b7a8960ed760e65ff29fa/idna-3.20.tar.gz", hash = "sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44", size = 216463, upload-time = "2026-09-17T14:11:04.752Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", hash = "sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", size = 69583, upload-time = "2026-09-17T14:11:03.168Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "ml-dtypes" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/72/307d7c4bd0600601c7133fba5cb78af7db968152951c1cd473abb1cda782/ml_dtypes-0.6.0.tar.gz", hash = "sha256:5e60251d32ced5598972e4d5e06a2f044341f9291402551a3f6f0ec44f9299b0", size = 3032327, upload-time = "2026-08-13T14:14:40.215Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/6a/441eb053b078954f7fea284dfb288701884d0a1404d39babb858e1649023/ml_dtypes-0.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5359c588cc62de6f78d7430f06b65853d884955494d86d6ad90b6dd64a3f3a08", size = 565447, upload-time = "2026-08-13T14:14:01.737Z" }, + { url = "https://files.pythonhosted.org/packages/ed/cf/87e8a6c57eed63a91782a0d229856ddf73e138ce004dd71e2799a9dcdb33/ml_dtypes-0.6.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37da32aa97749251025666d62372775019594577b9c9e9cfda83bed48d778fdb", size = 360227, upload-time = "2026-08-13T14:14:02.938Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f9/7d76c1eae866f5d4636401b31b6d6dd90e4b4ced1fa7cfdfcca9c60e4bd3/ml_dtypes-0.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b4a480aa8fd54a1805b8ac10f3f91763926a74f73c0c364c10f9231854f4170", size = 409890, upload-time = "2026-08-13T14:14:04.248Z" }, + { url = "https://files.pythonhosted.org/packages/ba/db/9c61ec2760b5cbfb1c6558d5c991a6d8fd3271053c32db20506a9a90272b/ml_dtypes-0.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a3e9d53925597fbffafd2a37048dadeddd0bdaba58058f6ae0869ed709a184d", size = 439333, upload-time = "2026-08-13T14:14:05.501Z" }, + { url = "https://files.pythonhosted.org/packages/6a/57/780ca3e5ab135b9fbdd8e5441abf5f801b30398371b691291e05ab9834c0/ml_dtypes-0.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:6eaed129a4afe90694b8685e2f9b6294849f5eda4af9a15be83a4326eeebd775", size = 552268, upload-time = "2026-08-13T14:14:06.866Z" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "networkx" +version = "3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/76/3af777226b63a5e64a6b36b1ec5855c14e2b94a37096d4760e595fc43511/networkx-3.7.tar.gz", hash = "sha256:fd77a511bd90f39f3d016351345b52cf5319b813bdca01de3f755d3cca62e96a", size = 1866482, upload-time = "2026-09-21T16:45:16.974Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/cd/fe58041e9011f307c490e3e17dd48cc516448f7c698a3f2d9d9d65d7e6a8/networkx-3.7-py3-none-any.whl", hash = "sha256:e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0", size = 2142205, upload-time = "2026-09-21T16:45:14.609Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/01/11703282db468b85f6f7b8c7f22d058de5970d5c7e60a3a8aaa313c3de36/numpy-2.5.3.tar.gz", hash = "sha256:df2d5874ff183595a4ba404edd04f6bd9b5505c1d7708573f6a6c17489a67563", size = 20791231, upload-time = "2026-09-06T16:27:47.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/50/8fdbb16af64895706a45f06a4068e29db732ec180f3c1375f14123359138/numpy-2.5.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb189f09db39283b26bfd061ec16189e14f71c6755207f72a0f7540867afe5b9", size = 16994982, upload-time = "2026-09-06T16:24:29.244Z" }, + { url = "https://files.pythonhosted.org/packages/60/39/789131c1188c078dcb3a1692e72e1e050c68b88ffe72c9ccaac9bcd7a9cd/numpy-2.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f59a878c33d6b88122d80d239bb3b845d58708750b0cb06a09aebb9b18ec696c", size = 12009327, upload-time = "2026-09-06T16:24:32.491Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/a312e95696e5f601914dd8b6dd844692ba61670807417e24b68e337b5c70/numpy-2.5.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a72f874bc9e10e4b8f80426fb49716d5141f64442a0c8418065093ec8017fbb0", size = 5445405, upload-time = "2026-09-06T16:24:35.071Z" }, + { url = "https://files.pythonhosted.org/packages/30/d0/5623a1707ed4fe16e3909fe3cf5ee3da004ae677ad23d83bbf3adf1a6faf/numpy-2.5.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fc36dc566135b5eceec4cf89758fcb719266a019ef07dae1754ae7c9f617ef3e", size = 6783213, upload-time = "2026-09-06T16:24:37.253Z" }, + { url = "https://files.pythonhosted.org/packages/f1/32/84146fc020ad3c25f805f70ab60da46fe3c540a21369754a7e4369754b6f/numpy-2.5.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76c2c1e6bfa5c84adc6434dfbf013aa92096a7985221762c8f11fedfd20fff58", size = 15687872, upload-time = "2026-09-06T16:24:39.751Z" }, + { url = "https://files.pythonhosted.org/packages/65/af/aa78d1a88805456e212b65461354cd943197fb9acecc4c90fd12295123a3/numpy-2.5.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7e18c623bb5c95acb3b3328861272816ba199fb531921c5d6d0b675f1fde9e3", size = 16717410, upload-time = "2026-09-06T16:24:42.745Z" }, + { url = "https://files.pythonhosted.org/packages/3b/24/faa79d865e69a97ba17473b23a1b74094b2259c03e820c70297293b9ea49/numpy-2.5.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4f8929ee6c96bfbd7b4ed2032e0c03af86fe1826740ab61ddabf9072d06e57ff", size = 17040975, upload-time = "2026-09-06T16:24:45.961Z" }, + { url = "https://files.pythonhosted.org/packages/62/4a/8877e629445a7176297dffcaf9c485faa96a95d81728a62521ad55bd4c0f/numpy-2.5.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b5d93cf48f687479941d12b69c873ad2cc76bbd487f0091c2200636497f34034", size = 18476479, upload-time = "2026-09-06T16:24:49.35Z" }, + { url = "https://files.pythonhosted.org/packages/c8/db/35e1c2d38b04cbd5b731f9d71495e055e813197669d22b612f11748d2ff9/numpy-2.5.3-cp312-cp312-win32.whl", hash = "sha256:bf63afbe037eb5d2fe87fbcc7778e61da53ebaf21d938a4515aa73b62532a5d4", size = 6133378, upload-time = "2026-09-06T16:24:51.915Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/accf6d4f0c80c5d9ba9735d6b1550e444180599f34dec69ca01360f717ad/numpy-2.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0a59a421a32580a009e8a1751345bf829631b990dc1794b80514ab722b435def", size = 12567828, upload-time = "2026-09-06T16:24:54.255Z" }, + { url = "https://files.pythonhosted.org/packages/22/43/1764aff32e4652526ae2f71fa8b3efd8d25c8a3d6926914454e47138ed1e/numpy-2.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:ccb32e0525d29e8b0572eb84c9a57af0e7a4e615726927506f55063c62414034", size = 10485432, upload-time = "2026-09-06T16:24:57.278Z" }, +] + +[[package]] +name = "nvidia-cublas" +version = "13.1.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cuda-nvrtc" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/a1/0bd24ee8c8d03adac032fd2909426a00c88f8c57961b1277ded97f91119f/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b7a210458267ac818974c53038fbec2e969d5c99f305ab15c72522fa9f001dd5", size = 542848918, upload-time = "2026-04-08T18:46:22.985Z" }, + { url = "https://files.pythonhosted.org/packages/3b/cd/154ca20c38269e05eff77c1464e6c1da89f50a6390b565e9d82e06bc11e1/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:37936a16db8fe4ac1f065c2139360608a543a09275cb1a1af612e08cfa065436", size = 423138758, upload-time = "2026-04-08T18:46:58.655Z" }, +] + +[[package]] +name = "nvidia-cuda-cupti" +version = "13.0.85" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/2a/80353b103fc20ce05ef51e928daed4b6015db4aaa9162ed0997090fe2250/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:796bd679890ee55fb14a94629b698b6db54bcfd833d391d5e94017dd9d7d3151", size = 10310827, upload-time = "2025-09-04T08:26:42.012Z" }, + { url = "https://files.pythonhosted.org/packages/33/6d/737d164b4837a9bbd202f5ae3078975f0525a55730fe871d8ed4e3b952b0/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:4eb01c08e859bf924d222250d2e8f8b8ff6d3db4721288cf35d14252a4d933c8", size = 10715597, upload-time = "2025-09-04T08:26:51.312Z" }, +] + +[[package]] +name = "nvidia-cuda-nvrtc" +version = "13.0.88" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/68/483a78f5e8f31b08fb1bb671559968c0ca3a065ac7acabfc7cee55214fd6/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:ad9b6d2ead2435f11cbb6868809d2adeeee302e9bb94bcf0539c7a40d80e8575", size = 90215200, upload-time = "2025-09-04T08:28:44.204Z" }, + { url = "https://files.pythonhosted.org/packages/b7/dc/6bb80850e0b7edd6588d560758f17e0550893a1feaf436807d64d2da040f/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d27f20a0ca67a4bb34268a5e951033496c5b74870b868bacd046b1b8e0c3267b", size = 43015449, upload-time = "2025-09-04T08:28:20.239Z" }, +] + +[[package]] +name = "nvidia-cuda-runtime" +version = "13.0.96" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/4f/17d7b9b8e285199c58ce28e31b5c5bbaa4d8271af06a89b6405258245de2/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef9bcbe90493a2b9d810e43d249adb3d02e98dd30200d86607d8d02687c43f55", size = 2261060, upload-time = "2025-10-09T08:55:15.78Z" }, + { url = "https://files.pythonhosted.org/packages/2e/24/d1558f3b68b1d26e706813b1d10aa1d785e4698c425af8db8edc3dced472/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f82250d7782aa23b6cfe765ecc7db554bd3c2870c43f3d1821f1d18aebf0548", size = 2243632, upload-time = "2025-10-09T08:55:36.117Z" }, +] + +[[package]] +name = "nvidia-cudnn-cu13" +version = "9.24.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/30/7c257e3d5cb4fecb147b93895c66e29c93f8e76d74b45bb418ff0587c4ec/nvidia_cudnn_cu13-9.24.0.43-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:a6812a554a1ff0413e9c52b84c26c050380649ab9615f9c16bded368ce9f421f", size = 650976863, upload-time = "2026-07-02T16:23:39.248Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ba/791cffd048fe5b044e620df55267e3e95c0e6e07d50b41e377c03dfc910f/nvidia_cudnn_cu13-9.24.0.43-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:71f181cd810e90f9b6023b01186fe82d13d65f0ec098581ee201d39fad769e4b", size = 553099438, upload-time = "2026-07-02T16:27:42.58Z" }, +] + +[[package]] +name = "nvidia-cufft" +version = "12.0.0.61" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2f/7b57e29836ea8714f81e9898409196f47d772d5ddedddf1592eadb8ab743/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c44f692dce8fd5ffd3e3df134b6cdb9c2f72d99cf40b62c32dde45eea9ddad3", size = 214085489, upload-time = "2025-09-04T08:31:56.044Z" }, +] + +[[package]] +name = "nvidia-cufile" +version = "1.15.1.6" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/70/4f193de89a48b71714e74602ee14d04e4019ad36a5a9f20c425776e72cd6/nvidia_cufile-1.15.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08a3ecefae5a01c7f5117351c64f17c7c62efa5fffdbe24fc7d298da19cd0b44", size = 1223672, upload-time = "2025-09-04T08:32:22.779Z" }, + { url = "https://files.pythonhosted.org/packages/ab/73/cc4a14c9813a8a0d509417cf5f4bdaba76e924d58beb9864f5a7baceefbf/nvidia_cufile-1.15.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bdc0deedc61f548bddf7733bdc216456c2fdb101d020e1ab4b88d232d5e2f6d1", size = 1136992, upload-time = "2025-09-04T08:32:14.119Z" }, +] + +[[package]] +name = "nvidia-curand" +version = "10.4.0.35" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/72/7c2ae24fb6b63a32e6ae5d241cc65263ea18d08802aaae087d9f013335a2/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:133df5a7509c3e292aaa2b477afd0194f06ce4ea24d714d616ff36439cee349a", size = 61962106, upload-time = "2025-08-04T10:21:41.128Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9f/be0a41ca4a4917abf5cb9ae0daff1a6060cc5de950aec0396de9f3b52bc5/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:1aee33a5da6e1db083fe2b90082def8915f30f3248d5896bcec36a579d941bfc", size = 59544258, upload-time = "2025-08-04T10:22:03.992Z" }, +] + +[[package]] +name = "nvidia-cusolver" +version = "12.0.4.66" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas" }, + { name = "nvidia-cusparse" }, + { name = "nvidia-nvjitlink" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" }, + { url = "https://files.pythonhosted.org/packages/5f/67/cba3777620cdacb99102da4042883709c41c709f4b6323c10781a9c3aa34/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0a759da5dea5c0ea10fd307de75cdeb59e7ea4fcb8add0924859b944babf1112", size = 200941980, upload-time = "2025-09-04T08:33:22.767Z" }, +] + +[[package]] +name = "nvidia-cusparse" +version = "12.6.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" }, + { url = "https://files.pythonhosted.org/packages/fa/18/623c77619c31d62efd55302939756966f3ecc8d724a14dab2b75f1508850/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b3c89c88d01ee0e477cb7f82ef60a11a4bcd57b6b87c33f789350b59759360b", size = 145942937, upload-time = "2025-09-04T08:33:58.029Z" }, +] + +[[package]] +name = "nvidia-cusparselt-cu13" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/e1/cdc1797eadf82d3a9a575a19b33fdc871a97edbec42c00b5b5e914f4aff4/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4dca476c50bf4780d46cd0bfbd82e2bc10a08e4fef7950917ce8d7578d22a23f", size = 221051344, upload-time = "2025-09-05T18:49:51.289Z" }, + { url = "https://files.pythonhosted.org/packages/34/7d/2661f2fb3ac4302f3a246f5fc030213ac60c1fe0bce84f9783dbd831dbb7/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:786ce87568c303fadb5afcc7102d454cd3040d75f6f8626f5db460d1871f4dd0", size = 170148586, upload-time = "2025-09-05T18:50:50.248Z" }, +] + +[[package]] +name = "nvidia-nccl-cu13" +version = "2.30.7" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/21/a73174c6157101bdf1ffc22b517f76ff0082613989dd9bc8f43e8034caac/nvidia_nccl_cu13-2.30.7-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:ca786ffa5a647c75d4d1f5cc72a6c4f537947e2ba8823d7c8aaf768e7a7b9f77", size = 215983881, upload-time = "2026-06-09T03:23:15.633Z" }, + { url = "https://files.pythonhosted.org/packages/3f/34/c500f90c7ae641b8e0f98965b36b8a7ac79cc8b296e8d251fe3eb592ee54/nvidia_nccl_cu13-2.30.7-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:cefa7fdb9710efd0f39c5f1be1d61ff6fc9a996c451265bd7fbdcf9455ed4b50", size = 215965170, upload-time = "2026-06-09T03:23:39.73Z" }, +] + +[[package]] +name = "nvidia-nvjitlink" +version = "13.4.92" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/6b/eef7a9e32872b8f41e145bf10cddc9af26e153c338852811fe9a9baddf9e/nvidia_nvjitlink-13.4.92-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:e0391f24ed94ec879b84e3da4d4ec320c879aff681f2c7a638462f7199284323", size = 42452378, upload-time = "2026-09-16T20:45:29.042Z" }, + { url = "https://files.pythonhosted.org/packages/1f/a8/1cbd4014898af8b419e69b0d7dbc63da2121ee92d92b47d59f4fe9075349/nvidia_nvjitlink-13.4.92-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:25f74fad0d654271c921ac4dca614bd6258bc21791242fc7b2289dad7ae9c099", size = 40420120, upload-time = "2026-09-16T20:45:19.163Z" }, +] + +[[package]] +name = "nvidia-nvshmem-cu13" +version = "3.4.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/0f/05cc9c720236dcd2db9c1ab97fff629e96821be2e63103569da0c9b72f19/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dc2a197f38e5d0376ad52cd1a2a3617d3cdc150fd5966f4aee9bcebb1d68fe9", size = 60215947, upload-time = "2025-09-06T00:32:20.022Z" }, + { url = "https://files.pythonhosted.org/packages/3c/35/a9bf80a609e74e3b000fef598933235c908fcefcef9026042b8e6dfde2a9/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:290f0a2ee94c9f3687a02502f3b9299a9f9fe826e6d0287ee18482e78d495b80", size = 60412546, upload-time = "2025-09-06T00:32:41.564Z" }, +] + +[[package]] +name = "nvidia-nvtx" +version = "13.0.85" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/f3/d86c845465a2723ad7e1e5c36dcd75ddb82898b3f53be47ebd429fb2fa5d/nvidia_nvtx-13.0.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4936d1d6780fbe68db454f5e72a42ff64d1fd6397df9f363ae786930fd5c1cd4", size = 148047, upload-time = "2025-09-04T08:29:01.761Z" }, + { url = "https://files.pythonhosted.org/packages/a8/64/3708a90d1ebe202ffdeb7185f878a3c84d15c2b2c31858da2ce0583e2def/nvidia_nvtx-13.0.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb7780edb6b14107373c835bf8b72e7a178bac7367e23da7acb108f973f157a6", size = 148878, upload-time = "2025-09-04T08:28:53.627Z" }, +] + +[[package]] +name = "onnx" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "protobuf" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/3a/b73bfb8f506a7b5be43eebf71dbdd351c4116f8100e1103a91bfcbcd3502/onnx-1.23.0.tar.gz", hash = "sha256:3f4b7323ea3397c63aa6ff5d43abe16013ffefc0a96cb8a0be6527ff1e1add40", size = 6022619, upload-time = "2026-09-18T19:30:37.511Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/f9/54d8047c2f409cfc314a0df520c6e5703afe78b1395e8c44287724c4b37e/onnx-1.23.0-cp312-abi3-macosx_13_0_universal2.whl", hash = "sha256:6cc93aa89502acbf453a16d79b465d47d9c454f3a3cb3fc5507a8cb59ab53208", size = 9725329, upload-time = "2026-09-18T19:30:07.486Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ff/a7d3fe41debd5b8947182a632b4e001bd3a7a103212e58ef6ca0c3daab91/onnx-1.23.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:95b77466b4f6bc7c2c63d6004b8db7d963fb17bf24aff13007752e9d2ebf9390", size = 8640232, upload-time = "2026-09-18T19:30:10.058Z" }, + { url = "https://files.pythonhosted.org/packages/09/86/63cdd5740f566fd9de2cadc106529adee0566f2fcafe69a65767eedc1681/onnx-1.23.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f336004196a22fbdc16c62e7f26f20635af1826db6147c80ff3b4b8d428fc7ef", size = 8881347, upload-time = "2026-09-18T19:30:12.792Z" }, + { url = "https://files.pythonhosted.org/packages/cd/24/7844929ef08aee3f9cb857d5ce34bb60d44496c9cc5c66cdfd8255917283/onnx-1.23.0-cp312-abi3-pyemscripten_2026_0_wasm32.whl", hash = "sha256:05ad734997f09fcc9633fc2e3715033239792fc9f12aec6ec0c48e32b214e47e", size = 7314556, upload-time = "2026-09-18T19:30:15.456Z" }, + { url = "https://files.pythonhosted.org/packages/52/68/ee1ad44118d0031e28a1cabb1cc02a4c9e30273bdc25571c5847aec5e4e8/onnx-1.23.0-cp312-abi3-win32.whl", hash = "sha256:221037cb9ffe67b701fb180ca871f1ee9089f431d944f3d0313ffae68c356a80", size = 7736116, upload-time = "2026-09-18T19:30:18.06Z" }, + { url = "https://files.pythonhosted.org/packages/81/5a/766abb1411b9f9b06dc4e8fe9ff195d3b715535677c362ab3d950fa0e93f/onnx-1.23.0-cp312-abi3-win_amd64.whl", hash = "sha256:70a2f930b221f9dbdff62704838ce8bf81442787b25048f8b9cdc9118168799e", size = 7872197, upload-time = "2026-09-18T19:30:20.619Z" }, + { url = "https://files.pythonhosted.org/packages/94/34/483fa56b4d47a5210d64dccb522a60b46e0953ca3f72d75b3c4759266f5f/onnx-1.23.0-cp312-abi3-win_arm64.whl", hash = "sha256:dcd4d269818a13c48444c96b7f17c7539d8cda7810ef802431393b6cf5df794b", size = 8037224, upload-time = "2026-09-18T19:30:22.682Z" }, +] + +[[package]] +name = "onnxruntime" +version = "1.30.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flatbuffers" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "protobuf" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/6f/48169f2e62b405bff5053cbd1d73fb5ce41ef7ecd13bb3bfcc191e689b8a/onnxruntime-1.30.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:001ed726c9bd5e2bc92faade7d37d889e9606a350b7d5529f0227df2e3bb57fd", size = 21544867, upload-time = "2026-09-10T16:31:19.876Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/cbc5b8f91963689fdd622f463508c01d0aa95d3f944747b1e0b1eb2160b8/onnxruntime-1.30.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:6c32a000d5139a38ba9349030b0032e3331acb559d596b22738d9d2b343a2b83", size = 21345202, upload-time = "2026-09-10T16:31:23.361Z" }, + { url = "https://files.pythonhosted.org/packages/34/35/e7f862dbacbc99fadd9b14a614e49c99bf0f35fd9927a82f096e3de33531/onnxruntime-1.30.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:fa688e7891a6aa206636fe7372e27ee75fd17713289f6b4fc7b190e0a7de9328", size = 23585654, upload-time = "2026-09-10T16:31:26.65Z" }, + { url = "https://files.pythonhosted.org/packages/a6/13/0f1699f6de549c9324bc9112a2a85b14c517904cd11b562a654643b755a1/onnxruntime-1.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:f3501472571f1b1eee50e017851e7929f5ea37312d2d8c2494a19e8fc58b4a38", size = 14311470, upload-time = "2026-09-10T16:31:31.273Z" }, + { url = "https://files.pythonhosted.org/packages/a2/17/02b13e5f51461f0453b18ab854e2d0bc1b6ec353241b05a2ee6b79e35d87/onnxruntime-1.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:dc4c706f1935ebb62356e6a095b047859badd854482c40560888e95c328ed262", size = 14175072, upload-time = "2026-09-10T16:31:34.541Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pillow" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "protobuf" +version = "7.36.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/89/5b8517baa72f84a67b8a307ba953c91057af618bf40bf676f3c03551f8f0/protobuf-7.36.2.tar.gz", hash = "sha256:497d0463ff3316681da6c0b9e8d06cb465d61abce00b613ab42226175644d1bb", size = 512737, upload-time = "2026-09-17T20:07:59.326Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/72/98342feb672507c8f3a69e34b4fa8961f608edba5c1a48a6f47156d92cb5/protobuf-7.36.2-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:cbc70b17ee27e28894c7fee8bb04be1abead49e936bc70eb60052531eee2079e", size = 456039, upload-time = "2026-09-17T20:07:51.542Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ea/91fdf7c2b8bbd49cde056f00a9df6773532987e1c00fe2830b895af95c7e/protobuf-7.36.2-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:e11e1f0180583a2af89db6a2ecd9e8dc40aa6d2988ca175bfd0e6d12ea72d74e", size = 344219, upload-time = "2026-09-17T20:07:52.914Z" }, + { url = "https://files.pythonhosted.org/packages/17/ab/5fd5f8ece73fad885c5a09aa849b32d70472f954ba3a92d3bb5974ea953b/protobuf-7.36.2-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:f4fee11ec330d238b34a05c9b675f693c20415d1c5bd7d5320cc2f8a798eb9cf", size = 357223, upload-time = "2026-09-17T20:07:53.985Z" }, + { url = "https://files.pythonhosted.org/packages/db/f3/3996583dd2906297a637af12114deddf7658af6e683fedb83be061983fb5/protobuf-7.36.2-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:89f23aa53c24553a2416fd4fd1ec06f74fa42b14b546d8883128813f775bbfd2", size = 343223, upload-time = "2026-09-17T20:07:54.931Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1b/dcc64f358fcb51811b58ae40b3d28f820725f116d86487cc20bd4b130701/protobuf-7.36.2-cp310-abi3-win32.whl", hash = "sha256:912c1221170e16c08d1f086762f563dd61ff83c18b5fa6652952dfaded66f728", size = 442998, upload-time = "2026-09-17T20:07:55.826Z" }, + { url = "https://files.pythonhosted.org/packages/8a/55/b77bda4e5e5f5971fb51b07663694690e9afdb9402136c16a522bd621cad/protobuf-7.36.2-cp310-abi3-win_amd64.whl", hash = "sha256:a300819d441e078a5608c0d3c709796bb548136058fda017ae51d425b44fd353", size = 456514, upload-time = "2026-09-17T20:07:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/d52c7016b04b6c5108f26691f9d33ec82a9b65d041f1a9c771137693d618/protobuf-7.36.2-py3-none-any.whl", hash = "sha256:bdb3a345d48db958e6ce1f18e508beb0cc981d64f24088427549c866cd039f1e", size = 179806, upload-time = "2026-09-17T20:07:58.211Z" }, +] + +[[package]] +name = "pygments" +version = "2.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, +] + +[[package]] +name = "regex" +version = "2026.9.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/5c/f403115361de25809e8f785686ec7096e30fef73be9ae35aa51da4e80abb/regex-2026.9.10.tar.gz", hash = "sha256:1e321e2c84f0e52c457f5ea5944f796d6e8e09cb99738ea98dcc1bfe402a128d", size = 417072, upload-time = "2026-09-09T21:00:21.521Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/c8/bfbe893e90ee0148bd2860dd086f09b5d2080ca2b125f740c2e118c16982/regex-2026.9.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:880ac684c27176464c00c3fdc456116364f5ebc70da07aad0c2d4a7ba45e98db", size = 496609, upload-time = "2026-09-09T20:57:09.987Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ac/56d5ae6efb759255c3b3db650a4be25f96a844ea3613b91e1e189a3b7294/regex-2026.9.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9d36b03dc362aa40ffaaec9d9bd75e87763529563ec008c43b0e07782f5be7a", size = 297024, upload-time = "2026-09-09T20:57:11.35Z" }, + { url = "https://files.pythonhosted.org/packages/60/4b/0f2d5f6bbb791cc10f22f0ed16c487e630dde8fa8fa0bd92a2bfe21a4b20/regex-2026.9.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866de9f98df0611d7b62b3a8729d3284a64c0cc6edd90bb95a533e443a4939cb", size = 291905, upload-time = "2026-09-09T20:57:13.127Z" }, + { url = "https://files.pythonhosted.org/packages/89/51/3fb5fe0d32f4cf0bc982286722c729a8d6f522d2fa2d5d14a702d9fc87f8/regex-2026.9.10-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c66d54042a14a503907d81861b8a5235e6d1f03d4fbc1d8767f652eaf957ac1", size = 800055, upload-time = "2026-09-09T20:57:14.68Z" }, + { url = "https://files.pythonhosted.org/packages/89/46/ee507bd2f9d4420f26a594b35c551d7194b66f5d7897f63730fae6ec05c1/regex-2026.9.10-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:032da15431c890d376f53547f0a6219f4f4cd19f3e4f11bdc321453b5bd207e4", size = 871133, upload-time = "2026-09-09T20:57:16.674Z" }, + { url = "https://files.pythonhosted.org/packages/d1/75/cbaa90689684f91b1bc017e7f8c6d9425c6bd299108db02482dc51376d8a/regex-2026.9.10-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:23ac9a28180f274d7dd7651fa131ad5b02d343b75df4b040737f0356223895dd", size = 919627, upload-time = "2026-09-09T20:57:18.402Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f5/dcdf5e0d898024005cfcce631e3e934d111dfbe177ca0b7f253ae8a735a2/regex-2026.9.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e67f8843f0e4b931f1fa860bf3bbe4134b714c0155cc5c7c0d7ea450230aae0", size = 804587, upload-time = "2026-09-09T20:57:19.859Z" }, + { url = "https://files.pythonhosted.org/packages/73/70/eedfe81c29bae266a06ab4250978361a9bccd474704d88d4f4ef4506dff8/regex-2026.9.10-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bb7774924f8cd69f49cba0b3c2d679a6326f777e0e67d130ad5203e4df53f0d3", size = 777320, upload-time = "2026-09-09T20:57:21.62Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e5/86b207077efbcd91305700488f170b7eb1e1c54721cea74175273aa3b9a4/regex-2026.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c32480f3371b75068decaf9e5da72c224e953830dd71e36e06cf80e30ea39d8", size = 790572, upload-time = "2026-09-09T20:57:23.048Z" }, + { url = "https://files.pythonhosted.org/packages/b2/92/f622c3b2323f4c035b98e80221740a442127ad7993135b814f52057430db/regex-2026.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d2d377fd1cad611b806cdd732d86b65f536c768209890cb442556548daa65a23", size = 865485, upload-time = "2026-09-09T20:57:24.658Z" }, + { url = "https://files.pythonhosted.org/packages/4a/be/34bd621d3d6ac906ad67e57ed56c40cd45f7d51b9c0328335e97a7cb8ecb/regex-2026.9.10-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c014641157e9049b0603b8daa5343bd408d9b757b709aaa0f373cd3fab2d7944", size = 767925, upload-time = "2026-09-09T20:57:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/0d/28/ddbf7cba86f2adf5038c6c16aa829636ffc6e437f81bb0cbf302899cea5e/regex-2026.9.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1562aabd9d4eb09bd88a62ad97ed06800094b529ac43419e43020b9cefec79b0", size = 858800, upload-time = "2026-09-09T20:57:27.901Z" }, + { url = "https://files.pythonhosted.org/packages/d0/f1/e8d7656ff3d3bd32e881d32f540b4981c79dee61908d6b790a45966e6895/regex-2026.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2479171edccced52ef02b899558f88ab2c235fe05b93180fdcae1670aacd89e1", size = 791648, upload-time = "2026-09-09T20:57:29.786Z" }, + { url = "https://files.pythonhosted.org/packages/fc/65/eac1a79115c8475d8ff539602eb54031564d719fdea5a599c4b0a1a26d1b/regex-2026.9.10-cp312-cp312-win32.whl", hash = "sha256:239620b0e0681669367c0e218c8eb2551d9f8fe3b9fccfc8d0003377804e8348", size = 267326, upload-time = "2026-09-09T20:57:31.782Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d4/4dcd0a05d3e97ca829165df1c39717f899d1d484dac8a6032439f2cb8d6d/regex-2026.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:4db7d00c4afbfbb55b8e17b1e371da11418ea9389b030acec63c1fa4c7ad4b86", size = 277933, upload-time = "2026-09-09T20:57:33.648Z" }, + { url = "https://files.pythonhosted.org/packages/55/f8/22617a80dee28f2451011eae36bc26b3d78c4994ba87b5281d60acf9b6c0/regex-2026.9.10-cp312-cp312-win_arm64.whl", hash = "sha256:c25a754bb81a2edcfc3b65eda50f017d736f818112ed43e8aafd595cb00678ae", size = 277447, upload-time = "2026-09-09T20:57:35.156Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "safetensors" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/06/f955dbbb1859e3bd23c8ac6141af5106e7ad5fedec4a3a6e3d60f94b7001/safetensors-0.8.0.tar.gz", hash = "sha256:fabaf3e0f18a6618d9b36560682562157f77c2b71fcffc7b432be2baed9d753d", size = 325846, upload-time = "2026-06-09T07:52:25.563Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/a0/f718cda65b05407d228f97602cf60dca269c979867aa5beb25410de26cd3/safetensors-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c554f85858e05226d3c2828e32395e677434685d6d94594a41643361c5e837f0", size = 473568, upload-time = "2026-06-09T07:52:18.829Z" }, + { url = "https://files.pythonhosted.org/packages/f5/b1/fa7c600e7dceae12e9606c7578cbc9ff1e1ed55844883ee5c92205e86226/safetensors-0.8.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:c80201d22cbf405b80647a60ada77bba06c8fba2da2743ba1e89cdcc39a81f25", size = 484562, upload-time = "2026-06-09T07:52:17.518Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/65a7de0af421317bb36a067241e4235fff194eed60b961ed6d3f59a3fc60/safetensors-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a46e5ff292c356d6991e60942ba7f79817682d3a2cef0702136448cb9c4d235", size = 502844, upload-time = "2026-06-09T07:52:07.624Z" }, + { url = "https://files.pythonhosted.org/packages/91/4f/3175c9d75634e0e0dda0082794193521035edd7c70a6f212bf33ca06ddf4/safetensors-0.8.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4124502b78f03534117c848f87a39b8f31e577b15eff423bf8bfb95f2a8c30d0", size = 511823, upload-time = "2026-06-09T07:52:09.565Z" }, + { url = "https://files.pythonhosted.org/packages/20/87/846c289e7aa2299eff406335717cf43ce8777194ece8aad75772e0411615/safetensors-0.8.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bc0a787ba8a35be368ee3574edfa2b1ad389eebd0a72e482ae275490e3f6c98", size = 633461, upload-time = "2026-06-09T07:52:11.128Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/8d64d9df2c45d5ded401df889d0ad90882804ca172d79ec4f0df8f727fe0/safetensors-0.8.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040070828e36dc8e122178bbbd5830ff9e97920affb84cbe0f46442497bed358", size = 545148, upload-time = "2026-06-09T07:52:13.603Z" }, + { url = "https://files.pythonhosted.org/packages/28/50/f203ff3a3ddfe19308efc83c5a3a29ed02bf786732ec35e68bf9162f3365/safetensors-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774", size = 516040, upload-time = "2026-06-09T07:52:16.29Z" }, + { url = "https://files.pythonhosted.org/packages/46/fb/cdaed17ceb2948784fd9c36b6fd3e951b608547cea81a48e8ee6f8cfdfcb/safetensors-0.8.0-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:fcdd41ec4628fee5799f807c73c353629130fbd942aa23d83c623dd6c9d52d78", size = 513832, upload-time = "2026-06-09T07:52:12.37Z" }, + { url = "https://files.pythonhosted.org/packages/0d/49/1e15de264dcc3b77943d2d0c56a95809956883b1c2d6d585c792523f180b/safetensors-0.8.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e9f537aa183a38ace122d27303dcd986b26bd2a7591f9181d7f0c396f4677ca", size = 559930, upload-time = "2026-06-09T07:52:14.743Z" }, + { url = "https://files.pythonhosted.org/packages/2a/43/bf38443278eab4b1be1fce2931e2b012ad9cb7df52ada751d0aab8f7659a/safetensors-0.8.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:87eec7ffed2b809f05a398a8becb7d013f19f7837cd15d9748580d6cf30dbaf4", size = 678670, upload-time = "2026-06-09T07:52:20.032Z" }, + { url = "https://files.pythonhosted.org/packages/72/e3/68cd3fa5b48488e84add63e04cb12f3bc28ae4638c06d4508c6e88823d0e/safetensors-0.8.0-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:4a95ae2b05d7726d751da4ebf626a2ca782b706e101bd894c95bc2450b1cffcc", size = 786679, upload-time = "2026-06-09T07:52:21.322Z" }, + { url = "https://files.pythonhosted.org/packages/29/4b/1c19c509d56e01f4fbb3d0a2e597450f6cc04d1d56cf52defb0a62dfd715/safetensors-0.8.0-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:3ae091f16662658bdc019a4ff6cb4c085bb7d725eb5978b183ffd265863b6d2d", size = 765683, upload-time = "2026-06-09T07:52:22.594Z" }, + { url = "https://files.pythonhosted.org/packages/27/43/41c1621732edd934d868a00d1b891584c892a7b62a9aab82ea5a0a5623ee/safetensors-0.8.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8e080062fcde23be189565e1c3305d16751a218ecf9412c8601e64204eb6f846", size = 722361, upload-time = "2026-06-09T07:52:23.924Z" }, + { url = "https://files.pythonhosted.org/packages/8e/3f/73ccf82579412b4a71c4ca673f10b5f1f888d7cf5af7fe24f27d30307be4/safetensors-0.8.0-cp310-abi3-win32.whl", hash = "sha256:2ddf52eac562eda224f99acfa7889d02968c1fd59a5b011ae7d8137c37e9c02d", size = 342401, upload-time = "2026-06-09T07:52:28.895Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6d/3fba214c1e5e0f69991677ec3bc17023f0421776975e1de0c682dca475e2/safetensors-0.8.0-cp310-abi3-win_amd64.whl", hash = "sha256:096ec1a98435df7beb08853bb5aa9081a84f23d0adc67ed1a0a10550f608373f", size = 355540, upload-time = "2026-06-09T07:52:27.832Z" }, + { url = "https://files.pythonhosted.org/packages/8d/fc/7eedc3510d97878876e32774eebbeb61c43f148a96e915c84229a3e967aa/safetensors-0.8.0-cp310-abi3-win_arm64.whl", hash = "sha256:f7838e5135a406ad3e02efdcb8cf2e5397d368b0154537c4fec682dbc544d452", size = 340500, upload-time = "2026-06-09T07:52:26.745Z" }, +] + +[[package]] +name = "scipy" +version = "1.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/74/66de6258867beb2ef08f35f9f2ac017a52cacd5081714d239ff1a442d458/scipy-1.18.1.tar.gz", hash = "sha256:52c4b7422442aba924d03ad4019852b08a92e64ea187b933135687bfe2747307", size = 30781235, upload-time = "2026-08-21T23:28:50.599Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/f7/240c110c08693826b4513a52f5717d62ec7c7af72f2920821247c03b17b3/scipy-1.18.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:457fd7a2a8edeb044ab6ffbc0aa03ff6cd18491356e5e0c834d76ce621b916d1", size = 31111061, upload-time = "2026-08-21T23:23:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/05/4a/78c6285577c375e7cf27277ea8ee6961224327f1e1a0c44af5f17f23635c/scipy-1.18.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:e708533e8b2ae2497d65346538a7dcc92814410b25b81432eac66de0f2af8265", size = 28733332, upload-time = "2026-08-21T23:23:50.015Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f6/a5b82f8abbe14d134691b8b903696f701d25a081353a29dc655c364d9e62/scipy-1.18.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:7bbf207c4453ce1ad2e00b17313852b33310b83090c2311bdaf97f93c0380d12", size = 20475078, upload-time = "2026-08-21T23:23:54.138Z" }, + { url = "https://files.pythonhosted.org/packages/23/22/0858a0bbd6b3e825ceb8cd9baf9eaf3b2f2b1d77727eb6be40500bcdc92f/scipy-1.18.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:78c0665edead396b1abb4897c41a5c1d9bf090c8a637a4c20a61678e0a264e66", size = 23108904, upload-time = "2026-08-21T23:23:57.824Z" }, + { url = "https://files.pythonhosted.org/packages/75/9a/2e71719f31eaefe0e3a1706c4a1ded94e664bfd95ffca2b219a671faee01/scipy-1.18.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c085faa2cfa879c5141df483f836f4d691045a078224a670fa570fa01612d89", size = 34025113, upload-time = "2026-08-21T23:24:02.209Z" }, + { url = "https://files.pythonhosted.org/packages/df/64/ff35eb9e54894cf471ff4716abd3c81eb0a0626869217ce3e6ba4ccf17d7/scipy-1.18.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f55fa87b6c612ecd6b058f167c53231b1d14e412efe361d3d6e38b3631c73218", size = 35344199, upload-time = "2026-08-21T23:24:07.844Z" }, + { url = "https://files.pythonhosted.org/packages/d3/af/c5538be1792f7034c12c7db6ee67cace58253c7b87b122d68253eaf5de89/scipy-1.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c35d74ce0e193ff740c2f2be2ac913ddc232fe6c1ff40b26cfecb9c670c63314", size = 35639587, upload-time = "2026-08-21T23:24:13.05Z" }, + { url = "https://files.pythonhosted.org/packages/91/4c/075e4f66471bac101141ac739e9e135549be1bae584571bd03a530c056e1/scipy-1.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2924a03db38dc2e848bca2fe9f077dafb891480b91a00a0963a8cf86dfc31c1", size = 37480330, upload-time = "2026-08-21T23:24:19.608Z" }, + { url = "https://files.pythonhosted.org/packages/39/e7/979fd14e75008623df31ba70d6bb144700f68feadcea042021c06a05bf82/scipy-1.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:5e4d44984abc0020154ea81b247adeddcc3ac5527b975ff798bd1ba0adc513c2", size = 36658278, upload-time = "2026-08-21T23:24:25.463Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0b/e1525354ff9d7d5feb6d1b31af6d14072e5c91e9607b421fa1ec889660b3/scipy-1.18.1-cp312-cp312-win_arm64.whl", hash = "sha256:d65d448389b8436493abcf629cc94ad0cf32aecaf06e1acca1de53cc795f2f12", size = 24400588, upload-time = "2026-08-21T23:24:30.579Z" }, +] + +[[package]] +name = "setuptools" +version = "84.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/44/f5da03a8ef95d369145c5bb53050e7877c9f3d312e128605fd9504829143/setuptools-84.0.0.tar.gz", hash = "sha256:f4695c21257f0d9b537ec2692c941d02ee143b7cc1276941349a546573b2ef73", size = 1168449, upload-time = "2026-08-08T18:27:58.365Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", hash = "sha256:51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", size = 818216, upload-time = "2026-08-08T18:27:56.719Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + +[[package]] +name = "tokenizers" +version = "0.23.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/1e/bc6587c5ab643b2e17776cace9070a2ae73549c86bffac9934a600bf3c31/tokenizers-0.23.2.tar.gz", hash = "sha256:7f0f085686b9de0d0079e6f874ae053600db64c5d13049e0bbc0119926d25aac", size = 385745, upload-time = "2026-09-03T08:55:42.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/ed/8a443528baa6fac8dfe8c3b75b038c63ac92bb539bcabe311e227c718173/tokenizers-0.23.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:85a9a357a3764aecc904ee76bdaf8cf1ad8e5a67a1b929a487c4a39b49ed0e90", size = 3148852, upload-time = "2026-09-03T08:55:30.874Z" }, + { url = "https://files.pythonhosted.org/packages/67/49/22da045a91732384d3a3771816bf188dc5a1f702c32e635afa7c679c0bef/tokenizers-0.23.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:986670e43691469dcee610ea0f846f91a8f84e91fc6f7a48d4c064414c0ec2bf", size = 3101593, upload-time = "2026-09-03T08:55:28.587Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4d/8f569ed49372a3ed8e57099bd515055fd48d7c95912c4307cda6973c2168/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a37039b5dfc4af84eb3ef0a92f4307e28936c8f9adccba2629d36f652e9bf7a2", size = 3516830, upload-time = "2026-09-03T08:55:14.741Z" }, + { url = "https://files.pythonhosted.org/packages/2a/de/e2f14c8919d5bf51874051d00d6c7b7e0e8bde6c6a2dbeddda7f642896ff/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b7e37ba198f24150f523e1242e83c4970de4a525480586be5dcc24d9add32c5", size = 3407975, upload-time = "2026-09-03T08:55:16.842Z" }, + { url = "https://files.pythonhosted.org/packages/c5/bd/93c69152d02ef06ce47aed8b2bf4952dcf733c935a62791873932b2934d9/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43e4f2071e3cc8d5d86421c874aebc82659bb51a68bcdef5a0da75ee89511ccb", size = 3748165, upload-time = "2026-09-03T08:55:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/2d/b7/56b84b80bc96942bba8eb23751a9e8a1fce4faaf4390425e7083f721c98c/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:325fee2e0418a9dc6c9ecf736a5f5f0db7875183ace9549ae339da76f7a1fbb7", size = 4024165, upload-time = "2026-09-03T08:55:18.806Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8a/0175e216f005c2fe08238292663aa41e4c802b216e71047a69a0e9fc6fa3/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:950d7c9426fa72406a0ffeacdbc0bb9985f5db20eb8b263f29c79aaf83105703", size = 3591899, upload-time = "2026-09-03T08:55:22.752Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ca/ca6b93c7820df123b2662a9469e8facc826ccc94e98fdd0d615f6431e73a/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41c2f84d172449b4dadb9cdc508e3e364076613c35b16e76ecfe47a60d1e3305", size = 3386843, upload-time = "2026-09-03T08:55:26.584Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a4/4f9106d317b14a80aefea9f0e3a8d07ef25f856a7607eb7f5ab894281fcb/tokenizers-0.23.2-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:12f0835dc2ee694746a76adf7b1567d4346a4a502ebe93fb1f5f80ea49799b78", size = 3577314, upload-time = "2026-09-03T08:55:20.825Z" }, + { url = "https://files.pythonhosted.org/packages/8d/6a/1552b70fb0d9ab074fd3fc961435d01364e79c9058481822c3af6e8d402c/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eb2f9c8a24da020ea8c11a01a19c1c2547912d92121ae4a01cfbca46125dee40", size = 9967367, upload-time = "2026-09-03T08:55:33.188Z" }, + { url = "https://files.pythonhosted.org/packages/06/01/3ccb3a956c7528b2507b8a9714155c4baf86af593039db6ea375dd0c96c3/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f486f402f6f9abee5bb032553736813af0c710a86b2e0ca592634c55cea1f835", size = 9811886, upload-time = "2026-09-03T08:55:35.642Z" }, + { url = "https://files.pythonhosted.org/packages/fa/73/7038e612d48bda1599457f712f6bd3854eae1a9dc9c13aa47f835349db48/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:bef235815a067b2648caf6dcc7a71091b0b0fff9ee8057f6451eb9335fae52ef", size = 10146224, upload-time = "2026-09-03T08:55:38.391Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d8/8e9e4e0b287a338d8f88976729628c9d22e8a54cfaf9777018a7f7cb58a0/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5c56bda1511921587789163e524d196ed8284174ac23abd7685d5ea8da6c4718", size = 10256304, upload-time = "2026-09-03T08:55:40.977Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1f/c79a01f671a49728ebb0b61f7ff9ea45663b66cab40bc0858e9859b25c16/tokenizers-0.23.2-cp310-abi3-win32.whl", hash = "sha256:debf978920d93ba9c219bd67cc4bbfaf912c9039e41e7a28b91ec15e3728c95a", size = 2592809, upload-time = "2026-09-03T08:55:48.02Z" }, + { url = "https://files.pythonhosted.org/packages/db/f7/0a69ac6b82dbccf3f71add938a161c497952749294b8dd6dfe03a819dc40/tokenizers-0.23.2-cp310-abi3-win_amd64.whl", hash = "sha256:2e96f5699d5249c9c64aa8412e044f727aae3a4098cf830f9901ec1afc361cde", size = 2863236, upload-time = "2026-09-03T08:55:46.193Z" }, + { url = "https://files.pythonhosted.org/packages/d7/b0/dee84cb44175be1b4c35bd2f770727494e78f0bb38e571a623ade94dbebb/tokenizers-0.23.2-cp310-abi3-win_arm64.whl", hash = "sha256:e49c394456dd9985787fec76132438ba3fb8911f857b1bf3d40119f9292d41aa", size = 2729352, upload-time = "2026-09-03T08:55:44.345Z" }, +] + +[[package]] +name = "torch" +version = "2.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-bindings", marker = "sys_platform == 'linux'" }, + { name = "cuda-toolkit", extra = ["cublas", "cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "sys_platform == 'linux'" }, + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx" }, + { name = "nvidia-cudnn-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparselt-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvshmem-cu13", marker = "sys_platform == 'linux'" }, + { name = "setuptools" }, + { name = "sympy" }, + { name = "triton", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/76/bb4770f56cf6d8971671dbcbb7493e5a6a15ad2825f4e359b02c27c38297/torch-2.14.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:c1f844f1c750e87df4b68bc3afbc0e2b0c7ef19d7b8f666e48bdcf6a0c4f0056", size = 127303200, upload-time = "2026-09-02T13:43:20.311Z" }, + { url = "https://files.pythonhosted.org/packages/fe/7b/ec44bacf2c8886b85ba4ca2285e8b09f2dff5d9c99e6a031326954082cb5/torch-2.14.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:ada340e62591d06a2bcc2d68170f20f45f0b0665d372dc510a8ed7eb3b1d609a", size = 454010251, upload-time = "2026-09-02T13:44:24.927Z" }, + { url = "https://files.pythonhosted.org/packages/15/71/49399acd41f750a906c686bd23c08a2001ccb8dd25f2971003c2ed89c1dd/torch-2.14.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:fecffb58f51fd643d213acd68da21cc3fc19bea05a3bc64b4ee55128f47a4963", size = 554620488, upload-time = "2026-09-02T13:44:49.442Z" }, + { url = "https://files.pythonhosted.org/packages/be/16/9489b137112040f9911d7527e452854f21cc4e499ce0da79864e6a7451a7/torch-2.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:cad84f41bbdf3dcf333ce394aeeaf25237c4d94fd6b659ba5eb813c829978823", size = 124114011, upload-time = "2026-09-02T13:43:55.034Z" }, +] + +[[package]] +name = "tqdm" +version = "4.70.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/ea/b2a5bd54b28a324dae8211928b2d730b6547500342c7e6c6dea08bd0a485/tqdm-4.70.1.tar.gz", hash = "sha256:cefd0eca11b2a37a3aee776544d4f4ae913f02688135b5556b8788dfa474afc4", size = 171846, upload-time = "2026-09-11T07:25:16.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/03/921a3d3c75785aca9ebfbfcabfbc3a1be12e2ab5265deb026d55a5a3f83e/tqdm-4.70.1-py3-none-any.whl", hash = "sha256:c293e525e6fef9c20e8728fd4612df02a0aa31bb5fe91ecd93e123b1b7bffa73", size = 80199, upload-time = "2026-09-11T07:25:14.599Z" }, +] + +[[package]] +name = "transformers" +version = "5.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "safetensors" }, + { name = "tokenizers" }, + { name = "tqdm" }, + { name = "typer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/9e/750649904a065007a838981785b2bd8d9ff26154c6c341ac67d0b7f82c68/transformers-5.17.0.tar.gz", hash = "sha256:a153be279169b55b92d8000bf4af294aed684503d091cca7804da2dd8a9de000", size = 9817878, upload-time = "2026-09-09T15:39:56.886Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/d0/c502b60d684adbd98a8dc7d5bb866842772b816ac4354e4608be240041ae/transformers-5.17.0-py3-none-any.whl", hash = "sha256:78ec1ce21579b38dfb83950a0658cd119f87212a2fcfdff478096ce9d6c03801", size = 12295140, upload-time = "2026-09-09T15:39:53.746Z" }, +] + +[[package]] +name = "triton" +version = "3.8.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/07/0f8cd8e8db0472334253efdaaab3d0819fea27aa99bf0e7f1aeea4ceb5ae/triton-3.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9c404c69ed4a39e8ec632eaf6b9fe058a060bf98979c177f6ef666f06bb8d50", size = 226474486, upload-time = "2026-08-28T16:08:18.29Z" }, + { url = "https://files.pythonhosted.org/packages/c1/09/b7012e5bfae67640f268aa584caa80fe1674f6b0da949046b679972c33e3/triton-3.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e91ffa46d095b252248297292dd22bcbacd53a125a0c2eefbbbf74925a320bc3", size = 247972921, upload-time = "2026-08-28T15:55:53.157Z" }, +] + +[[package]] +name = "typer" +version = "0.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/16/f7/57713ba479fd405eb76de31404b2c744c289e336b2d999511ebf51e496f7/typer-0.27.2.tar.gz", hash = "sha256:269b7eb9d3c202ca84b4bc9618cb04ebb43d3d4d1e567e4c768607232c05f945", size = 204045, upload-time = "2026-08-28T10:26:55.046Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/bf/205d0004930ede8f542fb58f601526fccf4ae7626075ca1e6c4de5d3d652/typer-0.27.2-py3-none-any.whl", hash = "sha256:b3a5fc4342d5fc8fda8fc3010b1cf117e9249aab7fae800c2eff62fd3842d97d", size = 123130, upload-time = "2026-08-28T10:26:53.752Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/experiments/autodetect/vision/Package.swift b/experiments/autodetect/vision/Package.swift new file mode 100644 index 000000000..d9738434a --- /dev/null +++ b/experiments/autodetect/vision/Package.swift @@ -0,0 +1,12 @@ +// swift-tools-version: 6.0 +import PackageDescription + +let package = Package( + name: "autodetect-vision", + platforms: [.macOS(.v14)], + targets: [ + .executableTarget(name: "rects"), + .executableTarget(name: "trainod"), + .executableTarget(name: "coremldet"), + ] +) diff --git a/experiments/autodetect/vision/Sources/coremldet/main.swift b/experiments/autodetect/vision/Sources/coremldet/main.swift new file mode 100644 index 000000000..700158809 --- /dev/null +++ b/experiments/autodetect/vision/Sources/coremldet/main.swift @@ -0,0 +1,90 @@ +// Runs a Create ML object detector through Vision (VNCoreMLRequest), the way the app would, and +// times each call. One image path per stdin line, one JSON result per stdout line. +// +// Usage: coremldet +// Result: {"path", "elapsed_ms", "detections": [{"label", "score", "box": [x0, y0, x1, y1]}]} +// Boxes normalized, top-left origin. elapsed_ms times perform() only, not decoding. `conf` and +// `iou` feed the model's confidenceThreshold and iouThreshold inputs (its NMS stage). + +import CoreGraphics +import CoreML +import Foundation +import ImageIO +import Vision + +struct Detection: Encodable { + let label: String + let score: Float + let box: [Double] + let label_share: Float // the top label's share among classes, not the box's confidence +} + +struct Result: Encodable { + let path: String + let elapsed_ms: Double + let detections: [Detection] + let error: String? +} + +final class Thresholds: NSObject, MLFeatureProvider { + let values: [String: MLFeatureValue] + init(conf: Double, iou: Double) { + values = ["confidenceThreshold": MLFeatureValue(double: conf), "iouThreshold": MLFeatureValue(double: iou)] + } + var featureNames: Set { Set(values.keys) } + func featureValue(for name: String) -> MLFeatureValue? { values[name] } +} + +let args = CommandLine.arguments +guard args.count == 6, let conf = Double(args[4]), let iou = Double(args[5]) else { + FileHandle.standardError.write(Data("usage: coremldet \n".utf8)) + exit(2) +} +var modelURL = URL(fileURLWithPath: args[1]) +if modelURL.pathExtension == "mlmodel" { + modelURL = try MLModel.compileModel(at: modelURL) +} +let config = MLModelConfiguration() +switch args[2] { +case "all": config.computeUnits = .all +case "cpu": config.computeUnits = .cpuOnly +default: FileHandle.standardError.write(Data("compute units must be all or cpu\n".utf8)); exit(2) +} +let crop: VNImageCropAndScaleOption +switch args[3] { +case "scaleFill": crop = .scaleFill +case "scaleFit": crop = .scaleFit +case "centerCrop": crop = .centerCrop +default: FileHandle.standardError.write(Data("unknown crop option \(args[3])\n".utf8)); exit(2) +} +let vnModel = try VNCoreMLModel(for: try MLModel(contentsOf: modelURL, configuration: config)) +vnModel.featureProvider = Thresholds(conf: conf, iou: iou) + +let encoder = JSONEncoder() +while let path = readLine() { + guard !path.isEmpty else { continue } + guard let source = CGImageSourceCreateWithURL(URL(fileURLWithPath: path) as CFURL, nil), + let image = CGImageSourceCreateImageAtIndex(source, 0, nil) + else { + print(String(decoding: try encoder.encode(Result(path: path, elapsed_ms: 0, detections: [], error: "cannot decode image")), as: UTF8.self)) + continue + } + let request = VNCoreMLRequest(model: vnModel) + request.imageCropAndScaleOption = crop + let handler = VNImageRequestHandler(cgImage: image, options: [:]) + let started = DispatchTime.now().uptimeNanoseconds + var failure: String? = nil + do { try handler.perform([request]) } catch { failure = "\(error)" } + let ms = Double(DispatchTime.now().uptimeNanoseconds - started) / 1e6 + let dets = (request.results as? [VNRecognizedObjectObservation] ?? []).compactMap { o -> Detection? in + let b = o.boundingBox // normalized, bottom-left origin + let box = [Double(b.minX), 1 - Double(b.maxY), Double(b.maxX), 1 - Double(b.minY)] + // One label per box, the most confident, as for the other candidates. The score is the + // observation's confidence (the model's box confidence for that label); the label's own + // confidence is its share among the classes and is near 1 for almost every box. + guard let top = o.labels.first else { return nil } + return Detection(label: top.identifier, score: o.confidence, box: box, label_share: top.confidence) + } + print(String(decoding: try encoder.encode(Result(path: path, elapsed_ms: ms, detections: dets, error: failure)), as: UTF8.self)) + fflush(stdout) +} diff --git a/experiments/autodetect/vision/Sources/rects/main.swift b/experiments/autodetect/vision/Sources/rects/main.swift new file mode 100644 index 000000000..17a344dbf --- /dev/null +++ b/experiments/autodetect/vision/Sources/rects/main.swift @@ -0,0 +1,87 @@ +// Finds rectangles with Apple Vision's VNDetectRectanglesRequest, as class-agnostic window +// proposals. One JSON request per stdin line, one JSON result per stdout line. +// +// Request: {"path": "...", "maximumObservations": 0, "minimumAspectRatio": 0.2, +// "maximumAspectRatio": 1.0, "minimumSize": 0.03, "quadratureTolerance": 30, +// "minimumConfidence": 0} +// Result: {"path", "width", "height", "elapsed_ms", "rects": [{"box": [x0, y0, x1, y1], +// "corners": [[x, y] x4], "score"}], "error"} +// Boxes are the quadrilateral's axis-aligned bounds, normalized, top-left origin. elapsed_ms +// times perform() only, not decoding. + +import CoreGraphics +import Foundation +import ImageIO +import Vision + +struct Request: Decodable { + let path: String + let maximumObservations: Int + let minimumAspectRatio: Float + let maximumAspectRatio: Float + let minimumSize: Float + let quadratureTolerance: Float + let minimumConfidence: Float +} + +struct Rect: Encodable { + let box: [Double] + let corners: [[Double]] + let score: Float +} + +struct Result: Encodable { + let path: String + let width: Int + let height: Int + let elapsed_ms: Double + let rects: [Rect] + let error: String? +} + +func loadImage(_ path: String) -> CGImage? { + guard let source = CGImageSourceCreateWithURL(URL(fileURLWithPath: path) as CFURL, nil) else { return nil } + return CGImageSourceCreateImageAtIndex(source, 0, nil) +} + +func detect(_ r: Request) -> Result { + guard let image = loadImage(r.path) else { + return Result(path: r.path, width: 0, height: 0, elapsed_ms: 0, rects: [], error: "cannot decode image") + } + let request = VNDetectRectanglesRequest() + request.maximumObservations = r.maximumObservations + request.minimumAspectRatio = r.minimumAspectRatio + request.maximumAspectRatio = r.maximumAspectRatio + request.minimumSize = r.minimumSize + request.quadratureTolerance = r.quadratureTolerance + request.minimumConfidence = r.minimumConfidence + let handler = VNImageRequestHandler(cgImage: image, options: [:]) + let started = DispatchTime.now().uptimeNanoseconds + do { + try handler.perform([request]) + } catch { + return Result(path: r.path, width: image.width, height: image.height, elapsed_ms: 0, rects: [], error: "\(error)") + } + let ms = Double(DispatchTime.now().uptimeNanoseconds - started) / 1e6 + // Vision's normalized coordinates have a bottom-left origin; flip y. + let rects = (request.results ?? []).map { o -> Rect in + let pts = [o.topLeft, o.topRight, o.bottomRight, o.bottomLeft].map { [Double($0.x), 1 - Double($0.y)] } + let xs = pts.map { $0[0] }, ys = pts.map { $0[1] } + return Rect(box: [xs.min()!, ys.min()!, xs.max()!, ys.max()!], corners: pts, score: o.confidence) + } + return Result(path: r.path, width: image.width, height: image.height, elapsed_ms: ms, rects: rects, error: nil) +} + +let decoder = JSONDecoder() +let encoder = JSONEncoder() +while let line = readLine() { + guard !line.isEmpty else { continue } + let result: Result + do { + result = detect(try decoder.decode(Request.self, from: Data(line.utf8))) + } catch { + result = Result(path: "", width: 0, height: 0, elapsed_ms: 0, rects: [], error: "bad request: \(error)") + } + print(String(decoding: try encoder.encode(result), as: UTF8.self)) + fflush(stdout) +} diff --git a/experiments/autodetect/vision/Sources/trainod/main.swift b/experiments/autodetect/vision/Sources/trainod/main.swift new file mode 100644 index 000000000..96a1dfec8 --- /dev/null +++ b/experiments/autodetect/vision/Sources/trainod/main.swift @@ -0,0 +1,87 @@ +// Trains a Create ML object detector (MLObjectDetector) on a folder of images plus +// annotations.json in Create ML's format: [{"image": "a.jpg", "annotations": [{"label", +// "coordinates": {"x", "y", "width", "height"}}]}], pixels, box centre, top-left origin. +// +// Usage: trainod +// transfer: transfer learning on Apple's object feature print (the extractor ships in the OS, +// so the model file holds only the detection head). yolo: the full darknet-YOLO network. +// Progress goes to stderr every 10 iterations. The session directory keeps checkpoints, so +// rerunning the same command after a kill resumes instead of starting over. + +import Combine +import CreateML +import CoreML +import Foundation + +func fail(_ message: String) -> Never { + FileHandle.standardError.write(Data((message + "\n").utf8)) + exit(2) +} + +let args = CommandLine.arguments +guard args.count == 6, let iterations = Int(args[4]) else { + fail("usage: trainod ") +} +let trainDir = URL(fileURLWithPath: args[1], isDirectory: true) +let out = URL(fileURLWithPath: args[2]) +let algoName = args[3] +let sessionDir = URL(fileURLWithPath: args[5], isDirectory: true) + +var params = MLObjectDetector.ModelParameters(validation: .split(strategy: .automatic), maxIterations: iterations) +switch algoName { +case "transfer": params.algorithm = .transferLearning(.objectPrint(revision: 1)) +case "yolo": params.algorithm = .darknetYolo +default: fail("unknown algorithm \(algoName); use transfer or yolo") +} +let session = MLTrainingSessionParameters(sessionDirectory: sessionDir, reportInterval: 10, checkpointInterval: 50, iterations: iterations) +let started = Date() +let job: MLJob +if FileManager.default.fileExists(atPath: sessionDir.appendingPathComponent("session.json").path) { + let restored = try MLObjectDetector.restoreTrainingSession(sessionParameters: session) + job = try MLObjectDetector.resume(restored) +} else { + job = try MLObjectDetector.train( + trainingData: .directoryWithImagesAndJsonAnnotation(at: trainDir), + annotationType: .boundingBox(units: .pixel, origin: .topLeft, anchor: .center), + parameters: params, + sessionParameters: session + ) +} + +let watcher = job.progress.observe(\.fractionCompleted, options: [.new]) { progress, _ in + guard let p = MLProgress(progress: progress) else { return } + let loss = (p.metrics[.loss] as? Double).map { String(format: "%.4f", $0) } ?? "-" + FileHandle.standardError.write(Data("phase \(p.phase) item \(p.itemCount)/\(p.totalItemCount ?? -1) loss \(loss) t \(Int(p.elapsedTime))s\n".utf8)) +} + +var bag = Set() +job.result.sink( + receiveCompletion: { completion in + if case .failure(let error) = completion { fail("training failed: \(error)") } + }, + receiveValue: { detector in + do { + try detector.write(to: out, metadata: MLModelMetadata( + author: "house-scanning autodetect experiment", + shortDescription: "Window and door detector, Create ML \(algoName), Open Images V7 train subset", + license: "Training images CC BY 2.0 (Open Images); see manifests/oi_train.csv" + )) + let report: [String: Any] = [ + "algorithm": algoName, + "iterations": iterations, + "train_seconds_this_run": Date().timeIntervalSince(started), + "training_map50": detector.trainingMetrics.meanAveragePrecision.IoU50, + "validation_map50": detector.validationMetrics.meanAveragePrecision.IoU50, + "validation_ap50": detector.validationMetrics.averagePrecision.IoU50, + "parameters": "\(detector.modelParameters)", + ] + let json = try JSONSerialization.data(withJSONObject: report, options: [.prettyPrinted, .sortedKeys]) + print(String(decoding: json, as: UTF8.self)) + exit(0) + } catch { + fail("could not write model: \(error)") + } + } +).store(in: &bag) + +withExtendedLifetime(watcher) { RunLoop.main.run() }