# E2E cross-validation: 3 ujęcia, jeden proces (modele raz w VRAM). import sys, json, time sys.path.insert(0, "services/recolor") import numpy as np import cv2 from PIL import Image, ImageOps from fabric_recolor.service import FabricRecolorService, _load_rgb from fabric_recolor.masks import coverage from fabric_recolor.transfer import ( apply_transfer, background_field, build_delta, estimate_anchor, swatch_stats, ) from fabric_recolor.labcolor import rgb_to_lab from fabric_recolor.masks import INTERIOR ORIG = "data/media/originals/" CASES = [ ("6413", ORIG + "fd/fd12e584a23312c7c5edda1015fe9715d3f5fd19a2ef3d375d635cefab91f54b.jpg"), ("p6419", ORIG + "a1/a1bd6aeb76ca7c2b86a5c2196032246647b31e0f1a100b8d17a27717c7b72325.jpg"), ("p6410", ORIG + "1c/1c770fb6be86867393a74e72244f1a8b8903ddc24c927f762de2a0c37e08050d.jpg"), ] SWATCH = ORIG + "70/70e6537812c1454fd111c43021ad51a78072283cad9e0837c5d6bedf8e0deb36.jpg" svc = FabricRecolorService() swatch = _load_rgb(SWATCH) reports = {} for tag, path in CASES: t0 = time.time() rgb = _load_rgb(path) h, w = rgb.shape[:2] seg = svc._segment(rgb) alpha = seg.alpha.astype(np.float32) cov = coverage(alpha) # podgląd maski: alfa na obrazie (zielona poświata) + sama maska viz = rgb.copy() viz[alpha > 0.5] = (viz[alpha > 0.5] * 0.5 + np.array([0, 200, 0]) * 0.5).astype(np.uint8) Image.fromarray(viz).resize((w // 3, h // 3)).save(f"tmp/mask-prev-{tag}-v7.png") Image.fromarray((alpha * 255).astype(np.uint8)).resize((w // 3, h // 3)).save(f"tmp/alpha-{tag}-v7.png") lab = rgb_to_lab(rgb) anchor = estimate_anchor(lab, alpha) target = swatch_stats(swatch) interior = lab[..., 0][alpha >= INTERIOR] applied = build_delta(anchor, target, float(interior.mean()) if interior.size else None) applied.anchor_mode = "auto" bg = background_field(rgb, alpha) out = apply_transfer(rgb, alpha, bg, applied) Image.fromarray(np.clip(out, 0, 255).astype(np.uint8)).save(f"tmp/recolor-svc-{tag}-granat-v7.png") reports[tag] = { "ok": True, "output_path": f"tmp/recolor-svc-{tag}-granat-v7.png", "mask_coverage": round(cov, 4), "backend": seg.backend, "notes": seg.notes, "delta": {"l": round(applied.l, 3), "a": round(applied.a, 3), "b": round(applied.b, 3)}, "elapsed_s": round(time.time() - t0, 1), } print(tag, json.dumps(reports[tag]), flush=True) print(json.dumps(reports, indent=1))