city / app.py
ksh123k's picture
Update app.py
f045730 verified
import gradio as gr
import matplotlib
from matplotlib import gridspec
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import torch
from transformers import AutoImageProcessor, AutoModelForSemanticSegmentation
import time
# ๋ชจ๋ธ ๋กœ๋“œ
MODEL_ID = "nvidia/segformer-b2-finetuned-cityscapes-1024-1024"
processor = AutoImageProcessor.from_pretrained(MODEL_ID)
model = AutoModelForSemanticSegmentation.from_pretrained(MODEL_ID)
def ade_palette():
"""ADE20K palette that maps each class to RGB values."""
return [
[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], [190, 153, 153],
[153, 153, 153], [250, 170, 30], [220, 220, 0], [107, 142, 35], [152, 251, 152],
[70, 130, 180], [220, 20, 60], [255, 0, 0], [0, 0, 142], [0, 0, 70],
[0, 60, 100], [0, 80, 100], [0, 0, 230], [119, 11, 32]
]
# labels.txt ํŒŒ์ผ ์ฝ๊ธฐ
labels_list = []
with open("labels.txt", "r", encoding="utf-8") as fp:
for line in fp:
labels_list.append(line.rstrip("\n"))
colormap = np.asarray(ade_palette(), dtype=np.uint8)
def label_to_color_image(label):
if label.ndim != 2:
raise ValueError("Expect 2-D input label")
if np.max(label) >= len(colormap):
raise ValueError("label value too large.")
return colormap[label]
# โœ… [์ˆ˜์ •๋จ] : figsize์™€ width_ratios๋ฅผ ๋Š˜๋ ค์„œ ์ด๋ฏธ์ง€๋ฅผ ํฌ๊ฒŒ ๋งŒ๋“ฆ
def draw_plot(pred_img, seg_np):
# Figure์˜ ์ „์ฒด ํฌ๊ธฐ๋ฅผ (25, 20)์œผ๋กœ ๋Š˜๋ฆผ
fig = plt.figure(figsize=(25, 20))
# ์ด๋ฏธ์ง€์™€ ๋ฒ”๋ก€์˜ ๋„ˆ๋น„ ๋น„์œจ์„ 8:1๋กœ ๋ณ€๊ฒฝ (์ด๋ฏธ์ง€๊ฐ€ ๋” ๋„“์–ด์ง)
grid_spec = gridspec.GridSpec(1, 2, width_ratios=[8, 1])
plt.subplot(grid_spec[0])
plt.imshow(pred_img)
plt.axis('off')
LABEL_NAMES = np.asarray(labels_list)
FULL_LABEL_MAP = np.arange(len(LABEL_NAMES)).reshape(len(LABEL_NAMES), 1)
FULL_COLOR_MAP = label_to_color_image(FULL_LABEL_MAP)
unique_labels = np.unique(seg_np.astype("uint8"))
valid_labels = [label for label in unique_labels if label < len(LABEL_NAMES)]
ax = plt.subplot(grid_spec[1])
plt.imshow(FULL_COLOR_MAP[valid_labels].astype(np.uint8), interpolation="nearest")
ax.yaxis.tick_right()
plt.yticks(range(len(valid_labels)), LABEL_NAMES[valid_labels])
plt.xticks([], [])
ax.tick_params(width=0.0, labelsize=25)
return fig
# โœ… [์ˆ˜์ •๋จ] : 'alpha' ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๋Š” '์Šฌ๋ผ์ด๋” ๋ฒ„์ „'
def run_inference(input_img, alpha=0.5):
start_time = time.time()
img = Image.fromarray(input_img.astype(np.uint8)) if isinstance(input_img, np.ndarray) else input_img
if img.mode != "RGB":
img = img.convert("RGB")
inputs = processor(images=img, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
upsampled = torch.nn.functional.interpolate(
logits, size=img.size[::-1], mode="bilinear", align_corners=False
)
seg = upsampled.argmax(dim=1)[0].cpu().numpy().astype(np.uint8)
color_seg = colormap[seg]
# alpha ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ํˆฌ๋ช…๋„ ์กฐ์ ˆ
image_weight = 1.0 - alpha
overlay_weight = alpha
pred_img = (np.array(img) * image_weight + color_seg * overlay_weight).astype(np.uint8)
fig = draw_plot(pred_img, seg)
print(f"Inference time: {time.time() - start_time:.2f}s")
return fig
# ๋‹คํฌ ํ…Œ๋งˆ ์ •์˜
custom_theme = gr.themes.Soft(
primary_hue="emerald", # ๋ฉ”์ธ ์ƒ‰์ƒ: ์ฒญ๋ก๋น› ์ดˆ๋ก
secondary_hue="teal", # ๋ณด์กฐ ์ƒ‰์ƒ: ์ง„ํ•œ ์ฒญ๋ก
neutral_hue="slate" # ๊ธฐ๋ณธ ํ†ค ์œ ์ง€ (์–ด๋‘์šด ํšŒ์ƒ‰๊ณ„์—ด)
).set(
body_background_fill="#0f172a", # ์–ด๋‘์šด ๋ฐฐ๊ฒฝ ์œ ์ง€ (๋‹คํฌ๋ชจ๋“œ)
body_text_color="#e2f1e8", # ์‚ด์ง ์ดˆ๋ก๋น›์ด ๋„๋Š” ๋ฐ์€ ํ…์ŠคํŠธ
button_primary_background_fill="#10b981", # ๋ฉ”์ธ ๋ฒ„ํŠผ์ƒ‰ (emerald-500)
button_primary_text_color="#ffffff", # ๋ฒ„ํŠผ ์•ˆ ๊ธ€์ž์ƒ‰ (ํฐ์ƒ‰)
block_background_fill="#1a2e25", # ๋ธ”๋ก ์˜์—ญ: ์ง™์€ ๋…น์ƒ‰ ํ†ค ๋ฐฐ๊ฒฝ
)
demo = gr.Interface(
fn=run_inference,
# โœ… [์ˆ˜์ •๋จ] : inputs์— ์Šฌ๋ผ์ด๋” ๋‹ค์‹œ ์ถ”๊ฐ€
inputs=[
gr.Image(type="numpy", label="๐Ÿ“ธ Input Image"),
gr.Slider(0.0, 1.0, value=0.5, step=0.05, label="Overlay Transparency (ํˆฌ๋ช…๋„)")
],
outputs=gr.Plot(label="Overlay + Legend"),
# โœ… [์ˆ˜์ •๋จ] : examples๋ฅผ ์ค‘์ฒฉ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€๊ฒฝ
examples=[
["city1.png", 0.5],
["city2.png", 0.5],
["city3.jpg", 0.5],
["city4.jpeg", 0.5],
["city5.jpg", 0.5]
],
flagging_mode="never",
cache_examples=False,
title="๐Ÿ™๏ธ City Segment",
description=(
"segformer-b2๋ชจ๋ธ์„ ์ด์šฉ ๋„์‹œ ์ด๋ฏธ์ง€ ๋ถ„ํ•  ์‹œ๊ฐ.<br>"
"์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด ๋„๋กœ, ๊ฑด๋ฌผ, ์ฐจ๋Ÿ‰, ์‚ฌ๋žŒ ๋“ฑ ๊ฐ์ฒด๋ณ„๋กœ ์ƒ‰์ƒ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์ค๋‹ˆ๋‹ค."
),
theme=custom_theme
)
if __name__ == "__main__":
demo.launch()