|
import gradio as gr |
|
import random |
|
|
|
from matplotlib import gridspec |
|
import matplotlib.pyplot as plt |
|
import numpy as np |
|
from PIL import Image |
|
import tensorflow as tf |
|
from transformers import SegformerFeatureExtractor, TFSegformerForSemanticSegmentation |
|
|
|
feature_extractor = SegformerFeatureExtractor.from_pretrained( |
|
"nvidia/segformer-b5-finetuned-cityscapes-1024-1024" |
|
) |
|
model = TFSegformerForSemanticSegmentation.from_pretrained( |
|
"nvidia/segformer-b5-finetuned-cityscapes-1024-1024" |
|
) |
|
|
|
def ade_palette(): |
|
|
|
return [ |
|
[204, 87, 92], |
|
[112, 185, 212], |
|
[196, 160, 122], |
|
[106, 135, 242], |
|
[91, 192, 222], |
|
[255, 192, 203], |
|
[176, 224, 230], |
|
[222, 49, 99], |
|
[139, 69, 19], |
|
[255, 0, 0], |
|
[0, 0, 255], |
|
[255, 228, 181], |
|
[128, 0, 0], |
|
[0, 128, 0], |
|
[255, 99, 71], |
|
[0, 255, 0], |
|
[128, 0, 128], |
|
[255, 255, 0], |
|
[128, 0, 128] |
|
|
|
] |
|
|
|
labels_list = [] |
|
|
|
with open(r'labels.txt', 'r') as fp: |
|
for line in fp: |
|
labels_list.append(line[:-1]) |
|
|
|
colormap = np.asarray(ade_palette()) |
|
|
|
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] |
|
|
|
def draw_plot(pred_img, seg): |
|
fig = plt.figure(figsize=(20, 15)) |
|
|
|
grid_spec = gridspec.GridSpec(1, 2, width_ratios=[6, 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.numpy().astype("uint8")) |
|
ax = plt.subplot(grid_spec[1]) |
|
plt.imshow(FULL_COLOR_MAP[unique_labels].astype(np.uint8), interpolation="nearest") |
|
ax.yaxis.tick_right() |
|
plt.yticks(range(len(unique_labels)), LABEL_NAMES[unique_labels]) |
|
plt.xticks([], []) |
|
ax.tick_params(width=0.0, labelsize=25) |
|
return fig |
|
|
|
def sepia(input_img): |
|
input_img = Image.fromarray(input_img) |
|
|
|
inputs = feature_extractor(images=input_img, return_tensors="tf") |
|
outputs = model(**inputs) |
|
logits = outputs.logits |
|
|
|
logits = tf.transpose(logits, [0, 2, 3, 1]) |
|
logits = tf.image.resize( |
|
logits, input_img.size[::-1] |
|
) |
|
seg = tf.math.argmax(logits, axis=-1)[0] |
|
|
|
color_seg = np.zeros( |
|
(seg.shape[0], seg.shape[1], 3), dtype=np.uint8 |
|
) |
|
for label, color in enumerate(colormap): |
|
color_seg[seg.numpy() == label, :] = color |
|
|
|
|
|
pred_img = np.array(input_img) * 0.5 + color_seg * 0.5 |
|
pred_img = pred_img.astype(np.uint8) |
|
|
|
fig = draw_plot(pred_img, seg) |
|
return fig |
|
|
|
|
|
with gr.Blocks() as demo: |
|
section_labels = [ |
|
"road", |
|
"sidewalk", |
|
"building", |
|
"wall", |
|
"fence", |
|
"pole", |
|
"traffic light", |
|
"traffic sign", |
|
"vegetation", |
|
"terrain", |
|
"sky", |
|
"person", |
|
"rider", |
|
"car", |
|
"truck", |
|
"bus", |
|
"train", |
|
"motorcycle", |
|
"bicycle" |
|
] |
|
|
|
with gr.Row(): |
|
num_boxes = gr.Slider(1, 1, 1, step=0, label="Number of boxes") |
|
num_segments = gr.Slider(0, 19, 1, step=1, label="Number of segments") |
|
|
|
with gr.Row(): |
|
img_input = gr.Image() |
|
img_output = gr.AnnotatedImage( |
|
color_map={ |
|
"road": "#CC575C", |
|
"sidewalk": "#70B9D4", |
|
"building": "#C4A07A", |
|
"wall": "#6A87F2", |
|
"fence": "#5BC0DE", |
|
"pole": "#FFC0CB", |
|
"traffic light": "#B0E0E6", |
|
"traffic sign": "#DE3163", |
|
"vegetation": "#8B4513", |
|
"terrain": "#FF0000", |
|
"sky": "#0000FF", |
|
"person": "#FFE4B5", |
|
"rider": "#800000", |
|
"car": "#008000", |
|
"truck": "#FF6347", |
|
"bus": "#00FF00", |
|
"train": "#800080", |
|
"motorcycle": "#FFFF00", |
|
"bicycle": "#800080"} |
|
) |
|
|
|
section_btn = gr.Button("Identify Sections") |
|
selected_section = gr.Textbox(label="Selected Section") |
|
|
|
|
|
def section(img, num_boxes, num_segments): |
|
sections = [] |
|
|
|
for a in range(num_boxes): |
|
x = random.randint(0, img.shape[1]) |
|
y = random.randint(0, img.shape[0]) |
|
w = random.randint(0, img.shape[1] - x) |
|
h = random.randint(0, img.shape[0] - y) |
|
sections.append(((x, y, x + w, y + h), section_labels[a])) |
|
for b in range(num_segments): |
|
x = random.randint(0, img.shape[1]) |
|
y = random.randint(0, img.shape[0]) |
|
r = random.randint(0, min(x, y, img.shape[1] - x, img.shape[0] - y)) |
|
mask = np.zeros(img.shape[:2]) |
|
for i in range(img.shape[0]): |
|
for j in range(img.shape[1]): |
|
dist_square = (i - y) ** 2 + (j - x) ** 2 |
|
if dist_square < r ** 2: |
|
mask[i, j] = round((r ** 2 - dist_square) / r ** 2 * 4) / 4 |
|
sections.append((mask, section_labels[b + num_boxes])) |
|
return (img, sections) |
|
|
|
|
|
section_btn.click(section, [img_input, num_boxes, num_segments], img_output) |
|
|
|
|
|
def select_section(evt: gr.SelectData): |
|
return section_labels[evt.index] |
|
|
|
|
|
img_output.select(select_section, None, selected_section) |
|
|
|
demo = gr.Interface(fn=sepia, |
|
inputs=gr.Image(shape=(564,846)), |
|
outputs=['plot'], |
|
live=True, |
|
examples=["city1.jpg","city2.jpg","city3.jpg"], |
|
allow_flagging='never', |
|
title="This is a machine learning activity project at Kyunggi University.", |
|
theme="darkpeach", |
|
css=""" |
|
body { |
|
background-color: dark; |
|
color: white; /* ํฐํธ ์์ ์์ */ |
|
font-family: Arial, sans-serif; /* ํฐํธ ํจ๋ฐ๋ฆฌ ์์ */ |
|
} |
|
""" |
|
|
|
) |
|
|
|
|
|
demo.launch() |
|
|
|
|