dkrak737's picture
Upload app.py with huggingface_hub
d64cc76 verified
Raw
History Blame Contribute Delete
3.4 kB
# -*- coding: utf-8 -*-
"""
app.py (HF Space ยท ์—…๋กœ๋“œํ˜• ๋ฐ๋ชจ)
์‚ฌ์šฉ์ž๊ฐ€ ํ•œ ๋ฐฐํ„ฐ๋ฆฌ์˜ CT ์Šฌ๋ผ์ด์Šค(์ด๋ฏธ ํฌ๋กญ๋œ ํšŒ์ƒ‰ ์ด๋ฏธ์ง€)๋ฅผ ์—…๋กœ๋“œ โ†’ ์ถ”๋ก  โ†’ 3์กด ํŒ์ • + ์˜ค๋ฒ„๋ ˆ์ด + ๋ณด๊ณ ์„œ + IATA ์ง€์นจ.
AI-Hub ์›๋ณธ ๋ฐ์ดํ„ฐ๋Š” ๋ฐฐํฌํ•˜์ง€ ์•Š๋Š”๋‹ค(๋ผ์ด์„ ์Šค). ๋ฐœํ‘œ/์‹œ์—ฐ ๋•Œ ์ง์ ‘ ์Šฌ๋ผ์ด์Šค๋ฅผ ์—…๋กœ๋“œํ•ด ์‚ฌ์šฉ.
ํ™˜๊ฒฝ๋ณ€์ˆ˜:
HF_MODEL_REPO ๊ฐ€์ค‘์น˜ ๋ฐ›์„ HF ๋ชจ๋ธ ๋ ˆํฌ (์˜ˆ: user/battery-ct-defect-models)
ANTHROPIC_API_KEY (Space Secret) RAG ์ง€์นจ ์ƒ์„ฑ์šฉ. ์—†์œผ๋ฉด ๊ทœ์ • ๋งคํ•‘ ํด๋ฐฑ.
GLUE_NO_SEG=1 seg ์ •๋ฐ€ ๋งˆ์Šคํฌ ๋„๊ธฐ(CPU Space ์†๋„์šฉ; ๋ฐ•์Šค๋งŒ ํ‘œ์‹œ)
"""
import os
import gradio as gr
from load_models import load_all
from infer import infer_battery
from decide import decide
from render import make_overlay, make_report, pick_slice, recommend
MODELS = load_all()
USE_SEG = os.environ.get("GLUE_NO_SEG", "") == ""
def _paths(files):
out = []
for f in files or []:
out.append(f if isinstance(f, str) else getattr(f, "name", None))
return [p for p in out if p]
def screen(files, form, battery_id):
paths = _paths(files)
if not paths:
return "โš ๏ธ CT ์Šฌ๋ผ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜์„ธ์š”", None, {}, ""
slices = [{"idx": i, "name": os.path.basename(p), "img_path": p}
for i, p in enumerate(paths)]
bid = (battery_id or "uploaded").strip()
result = infer_battery(MODELS, slices, form, bid) # ํ˜•ํƒœ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒ
decision = decide(result)
report = make_report(result, decision)
guide = recommend(result, decision)
if decision["zone"].startswith("๐ŸŸข"):
return decision["zone"], None, report, guide
cur, crop = pick_slice(result, slices)
seg_model = MODELS["seg"] if USE_SEG else None
overlay = make_overlay(crop, result, cur, seg_model) if crop is not None else None
return decision["zone"], overlay, report, guide
with gr.Blocks(title="๋ฐฐํ„ฐ๋ฆฌ CT ๊ฒฐํ•จ ์Šคํฌ๋ฆฌ๋‹") as demo:
gr.Markdown(
"## ๐Ÿ”‹ ๋ฐฐํ„ฐ๋ฆฌ CT ๋‚ด๋ถ€๊ฒฐํ•จ ์Šคํฌ๋ฆฌ๋‹\n"
"ํ•œ ๋ฐฐํ„ฐ๋ฆฌ์˜ **CT ์Šฌ๋ผ์ด์Šค(ํฌ๋กญ๋œ ํšŒ์ƒ‰ ์ด๋ฏธ์ง€)** ๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด "
"๋‹ค๊ณต์„ฑยท๋ ˆ์ง„ยทํŒฝ์ฐฝ์„ ํƒ์ง€ํ•ด **๐ŸŸข ์ด์ƒ์—†์Œ ยท ๐ŸŸก ๊ฒ€ํ†  ํ•„์š” ยท ๐Ÿ”ด ์ด์ƒ ์žˆ์Œ** ์œผ๋กœ ํŒ์ •ํ•˜๊ณ , "
"IATA ํ•ญ๊ณต์šด์†ก ๊ทœ์ • ๊ธฐ๋ฐ˜ ์กฐ์น˜ ์ง€์นจ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n"
"> โš ๏ธ AI-Hub ์›๋ณธ ๋ฐ์ดํ„ฐ๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณธ์ธ ์Šฌ๋ผ์ด์Šค๋ฅผ ์—…๋กœ๋“œํ•˜์„ธ์š”."
)
with gr.Row():
with gr.Column():
files = gr.File(file_count="multiple", file_types=["image"],
label="CT ์Šฌ๋ผ์ด์Šค ์—…๋กœ๋“œ (ํ•œ ๋ฐฐํ„ฐ๋ฆฌ)")
form = gr.Radio(["module", "cell"], value="module",
label="๋ฐฐํ„ฐ๋ฆฌ ํ˜•ํƒœ (์ง์ ‘ ์„ ํƒ)")
bid = gr.Textbox(label="๋ฐฐํ„ฐ๋ฆฌ ID (์„ ํƒ)", placeholder="์˜ˆ: module_402")
btn = gr.Button("๊ฒ€์‚ฌ", variant="primary")
with gr.Column():
verdict = gr.Label(label="ํŒ์ •")
image = gr.Image(label="์œ„์น˜ (๋‹ค๊ณต์„ฑ=๋งˆ์Šคํฌ ยท ๋ ˆ์ง„=๋ฐ•์Šค)")
report = gr.JSON(label="๋ณด๊ณ ์„œ")
guide = gr.Markdown(label="์กฐ์น˜ ์ง€์นจ (IATA ยท ํ•œ/์˜)")
btn.click(screen, [files, form, bid], [verdict, image, report, guide])
if __name__ == "__main__":
demo.launch()