chore(eval): reconcile the distractor sets and refresh the sweep numbers
The Wikimedia collector truncated the whole basename at 60 characters, so 13 files lost their extension and cv2 could not read them by name - the distractor sets were quietly scoring 13 images fewer than they held. It now truncates the stem and keeps the extension, and the files on disk are renamed to match. The search terms also pull in .djvu volumes whose page 1 Commons serves as a JPEG thumbnail. Twelve book scans were in the sets; they contributed 0 false accepts, and they are not shelves, so the collector filters them and the manifests no longer list them. With all 2650 crops readable the sweep is re-measured end to end: 3.09% at the old lines, 0.30% at the shipped 4.0/4, image6 44 shown / 42 correct / 95.5%. The accept sweep table and the verdict's far-unknown sentence now carry those numbers instead of the pre-calibration ones. Also: the fetched images are gitignored (manifests and results are not), the l10/l11 shelf-tag crops that back the catalog corrections are committed, and a stale pre-gate eval.json and a duplicate of eval/labels/image6.json are gone.
This commit is contained in:
parent
4bdad66bbe
commit
5eb4bdf6c8
19 changed files with 646 additions and 253 deletions
|
|
@ -141,7 +141,7 @@ def main() -> None:
|
|||
info = image_info(sorted(found))
|
||||
print(f" metadata for {len(info)} files")
|
||||
|
||||
kept, skipped = [], {"license": 0, "size": 0, "missing": 0}
|
||||
kept, skipped = [], {"license": 0, "size": 0, "missing": 0, "not_a_photo": 0}
|
||||
for title, entry in sorted(info.items()):
|
||||
if not entry.get("url"):
|
||||
skipped["missing"] += 1
|
||||
|
|
@ -150,6 +150,12 @@ def main() -> None:
|
|||
if not any(token in licence for token in PERMISSIVE):
|
||||
skipped["license"] += 1
|
||||
continue
|
||||
# A book scan is not a shelf. The search terms pull in .djvu volumes
|
||||
# whose page 1 is a title page, and Commons serves those as JPEG
|
||||
# thumbnails, so the extension check has to be on the source title.
|
||||
if any(title.lower().endswith(ext) for ext in (".djvu", ".pdf", ".svg", ".tif", ".tiff")):
|
||||
skipped["not_a_photo"] += 1
|
||||
continue
|
||||
if (entry.get("width") or 0) < 1000 or (entry.get("height") or 0) < 700:
|
||||
skipped["size"] += 1
|
||||
continue
|
||||
|
|
@ -158,9 +164,13 @@ def main() -> None:
|
|||
print(f" keeping {len(kept)} (skipped: {skipped})")
|
||||
manifest = []
|
||||
for index, (title, entry) in enumerate(kept):
|
||||
stem = os.path.basename(urllib.parse.urlparse(entry["url"]).path).replace(" ", "_")
|
||||
stem = urllib.parse.unquote(stem)[:60]
|
||||
name = f"{index:03d}_{stem}"
|
||||
# Truncate the stem, never the extension: a 60-character cut on the
|
||||
# whole basename drops it, and the file then has no type for cv2 or
|
||||
# for anyone reading the directory.
|
||||
stem, extension = os.path.splitext(
|
||||
os.path.basename(urllib.parse.urlparse(entry["url"]).path).replace(" ", "_")
|
||||
)
|
||||
name = f"{index:03d}_{urllib.parse.unquote(stem)[:60]}{extension.lower()}"
|
||||
path = os.path.join(root, name)
|
||||
if not os.path.exists(path):
|
||||
try:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue