Spaces:
Running on Zero
Running on Zero
File size: 2,032 Bytes
c9b579e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #!/usr/bin/env python3
"""Bundle the annotated images for the app's validation section.
python scripts/make_validation_set.py --data-dir /path/to/TIFs_and_CVAT_zips --out validation
Every annotated image is written as a lossless PNG named after the image name
recorded inside its CVAT export (so that cellquant.annotations.discover pairs them
again) next to a copy of that export. Byte-identical duplicate TIFs collapse to one
entry, exactly as in training.
"""
from __future__ import annotations
import argparse
import os
import shutil
import sys
from PIL import Image
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from cellquant.annotations import discover, load_image # noqa: E402
from cellquant.labels import CELL_LABELS, NOSTRIL_LABELS # noqa: E402
def main(argv=None):
ap = argparse.ArgumentParser()
ap.add_argument("--data-dir", required=True)
ap.add_argument("--out", default=os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "validation"))
a = ap.parse_args(argv)
samples, _ = discover(a.data_dir, verbose=False)
os.makedirs(a.out, exist_ok=True)
for s in samples:
img = load_image(s.image_path)
stem = os.path.splitext(os.path.basename(s.annotation.image_name))[0].strip()
png = os.path.join(a.out, stem + ".png")
Image.fromarray(img).save(png, optimize=True)
shutil.copyfile(s.annotation_path, os.path.join(a.out, os.path.basename(s.annotation_path)))
n_nuc = sum(s.annotation.count(c) for c in CELL_LABELS)
n_pun = sum(s.annotation.count(c) for c in NOSTRIL_LABELS)
print(f"{s.key}: {os.path.basename(png)} ({os.path.getsize(png)/1e6:.1f} MB, {n_nuc} nuclei, {n_pun} puncta) + {os.path.basename(s.annotation_path)}")
check, _ = discover(a.out, verbose=False)
assert [c.key for c in check] == [s.key for s in samples], "re-discovery of the bundle failed"
print(f"{len(check)} annotated images in {a.out}")
if __name__ == "__main__":
main()
|