RefDiffNet / app.py
ShashwatGupta23's picture
RefDiffNet: A11_CA prebackbone demo (clean history, no images in git)
add24bd
Raw History Blame
3.01 kB
"""Gradio demo: PCB defect + golden reference -> enriched image (A11_CA prebackbone)."""
from __future__ import annotations
import os
from pathlib import Path
import gradio as gr
import numpy as np
from PIL import Image
from prebackbone_infer import enrich_pair, get_enricher
EXAMPLES_DIR = Path(__file__).resolve().parent / "examples"
TITLE = "RefDiffNet — PCB Reference–Defect Enrichment"
DESCRIPTION = """
Upload a **defect PCB image** and its **golden reference** (same board, no defect).
The trained A11_CA prebackbone fuses them into an **enriched** image used by YOLO detection.
Formula: `enriched = defect + α · gate · delta`
"""
def _examples() -> list[list[str]]:
if not EXAMPLES_DIR.exists():
return []
inputs = sorted(EXAMPLES_DIR.glob("*_input.jpg"))
out: list[list[str]] = []
for inp in inputs:
ref = EXAMPLES_DIR / inp.name.replace("_input.", "_reference.")
if ref.exists():
out.append([str(inp), str(ref)])
return out
def run_demo(defect_img, reference_img):
if defect_img is None or reference_img is None:
raise gr.Error("Please upload both defect and reference images.")
defect_rgb, ref_rgb, enriched_rgb = enrich_pair(defect_img, reference_img)
# Side-by-side comparison for the demo panel
h = max(defect_rgb.shape[0], ref_rgb.shape[0], enriched_rgb.shape[0])
def _pad(im: np.ndarray) -> np.ndarray:
if im.shape[0] == h:
return im
pad = h - im.shape[0]
return np.pad(im, ((0, pad), (0, 0), (0, 0)), mode="constant", constant_values=114)
row = np.concatenate([_pad(defect_rgb), _pad(ref_rgb), _pad(enriched_rgb)], axis=1)
return enriched_rgb, row
def _preload_model():
try:
get_enricher()
except FileNotFoundError as e:
print(f"[warn] Model not loaded yet: {e}")
if __name__ == "__main__":
_preload_model()
with gr.Blocks(title=TITLE) as demo:
gr.Markdown(f"# {TITLE}")
gr.Markdown(DESCRIPTION)
with gr.Row():
defect_in = gr.Image(label="Defect image (input)", type="numpy", image_mode="RGB")
ref_in = gr.Image(label="Golden reference", type="numpy", image_mode="RGB")
run_btn = gr.Button("Generate enriched image", variant="primary")
with gr.Row():
enriched_out = gr.Image(label="Enriched output", type="numpy", image_mode="RGB")
compare_out = gr.Image(
label="Defect | Reference | Enriched",
type="numpy",
image_mode="RGB",
)
run_btn.click(fn=run_demo, inputs=[defect_in, ref_in], outputs=[enriched_out, compare_out])
ex = _examples()
if ex:
gr.Examples(examples=ex, inputs=[defect_in, ref_in], label="Example pairs")
demo.launch(
server_name="0.0.0.0",
server_port=int(os.environ.get("PORT", "7860")),
share=os.environ.get("GRADIO_SHARE", "").lower() in {"1", "true", "yes"},
)