fnruha0921's picture
JL1 real-pair run jl1_prep.py
2a6a1ac verified
Raw History Blame Contribute Delete
2.37 kB
"""Unpack JL1-CD into npy: jl_pre/jl_post (N,512,512,3) uint8, jl_chg (N,512,512) uint8 {0,1}. Heuristic folder roles."""
import glob, os, sys, zipfile
from collections import defaultdict
import cv2, numpy as np
from huggingface_hub import hf_hub_download
z = hf_hub_download("circleLZY/JL1-CD", "JL1-CD.zip", repo_type="dataset", local_dir="/workspace/hfd")
zipfile.ZipFile(z).extractall("/workspace/jl1"); os.remove(z)
imgs = [p for p in glob.glob("/workspace/jl1/**/*", recursive=True) if p.lower().endswith((".png", ".jpg", ".jpeg", ".tif", ".tiff", ".bmp"))]
by_dir = defaultdict(list)
for p in imgs: by_dir[os.path.dirname(p)].append(p)
for d, v in sorted(by_dir.items()): print("DIR", d, len(v), flush=True)
PRE = {"a", "t1", "im1", "time1", "before", "pre", "image1", "img1", "imagea"}
POST = {"b", "t2", "im2", "time2", "after", "post", "image2", "img2", "imageb"}
def role(d):
b = os.path.basename(d).lower()
if any(k in b for k in ("label", "gt", "mask", "change")): return "lab"
if b in PRE: return "pre"
if b in POST: return "post"
return None
groups = defaultdict(dict)
for d, v in by_dir.items():
r = role(d)
if r: groups[os.path.dirname(d)][r] = {os.path.splitext(os.path.basename(p))[0]: p for p in v}
pre, post, chg = [], [], []
for g, roles in sorted(groups.items()):
if not {"pre", "post", "lab"} <= set(roles): print("skip group", g, list(roles)); continue
keys = sorted(set(roles["pre"]) & set(roles["post"]) & set(roles["lab"]))
print("GROUP", g, len(keys), flush=True)
for k in keys:
a = cv2.cvtColor(cv2.imread(roles["pre"][k], cv2.IMREAD_COLOR), cv2.COLOR_BGR2RGB)
b = cv2.cvtColor(cv2.imread(roles["post"][k], cv2.IMREAD_COLOR), cv2.COLOR_BGR2RGB)
l = cv2.imread(roles["lab"][k], cv2.IMREAD_GRAYSCALE)
if a.shape[:2] != (512, 512) or b.shape != a.shape or l.shape != a.shape[:2]: continue
pre.append(a); post.append(b); chg.append((l > 0).astype(np.uint8))
pre, post, chg = np.stack(pre), np.stack(post), np.stack(chg)
os.makedirs("/workspace/prep", exist_ok=True)
np.save("/workspace/prep/jl_pre.npy", pre); np.save("/workspace/prep/jl_post.npy", post); np.save("/workspace/prep/jl_chg.npy", chg)
print("JL1_DONE", pre.shape, "change frac", round(float(chg.mean()), 4), "pairs with change", int((chg.reshape(len(chg), -1).sum(1) >= 20).sum()), flush=True)