Spaces:
Runtime error
Runtime error
import csv | |
import os | |
import sys | |
import cv2 | |
import gradio as gr | |
import matplotlib.pyplot as plt | |
import numpy as np | |
import onnxruntime as ort | |
from matplotlib import gridspec | |
ade_palette = [] | |
labels_list = [] | |
csv.field_size_limit(sys.maxsize) | |
with open(r"labels.txt", "r") as fp: | |
for line in fp: | |
labels_list.append(line[:-1]) | |
with open(r"ade_palette.txt", "r") as fp: | |
for line in fp: | |
tmp_list = list(map(int, line[:-1].strip("][").split(", "))) | |
ade_palette.append(tmp_list) | |
colormap = np.asarray(ade_palette) | |
model_filename = "segformer-b5-finetuned-ade-640-640.onnx" | |
sess_options = ort.SessionOptions() | |
sess_options.intra_op_num_threads = os.cpu_count() | |
sess = ort.InferenceSession( | |
model_filename, sess_options, providers=["CPUExecutionProvider"] | |
) | |
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) | |
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): | |
img = cv2.imread(input_img) | |
img = cv2.resize(img, (640, 640)).astype(np.float32) | |
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | |
img_batch = np.expand_dims(img, axis=0) | |
img_batch = np.transpose(img_batch, (0, 3, 1, 2)) | |
logits = sess.run(None, {"pixel_values": img_batch})[0] | |
logits = np.transpose(logits, (0, 2, 3, 1)) | |
seg = np.argmax(logits, axis=-1)[0].astype("float32") | |
seg = cv2.resize(seg, (640, 640)).astype("uint8") | |
color_seg = np.zeros( | |
(seg.shape[0], seg.shape[1], 3), dtype=np.uint8 | |
) # height, width, 3 | |
for label, color in enumerate(colormap): | |
color_seg[seg == label, :] = color | |
# Convert to BGR | |
color_seg = color_seg[..., ::-1] | |
# Show image + mask | |
pred_img = img * 0.5 + color_seg * 0.5 | |
pred_img = pred_img.astype(np.uint8) | |
fig = draw_plot(pred_img, seg) | |
return fig | |
title = "SegFormer(ADE20k) in TensorFlow" | |
description = """ | |
This is demo TensorFlow SegFormer from π€ `transformers` official package. The pre-trained model was trained to segment scene specific images. We are **currently using ONNX model converted from the TensorFlow based SegFormer to improve the latency**. The average latency of an inference is **21** and **8** seconds for TensorFlow and ONNX converted models respectively (in [Colab](https://github.com/deep-diver/segformer-tf-transformers/blob/main/notebooks/TFSegFormer_ONNX.ipynb)). Check out the [repository](https://github.com/deep-diver/segformer-tf-transformers) to find out how to make inference, finetune the model with custom dataset, and further information. | |
""" | |
demo = gr.Interface( | |
sepia, | |
gr.inputs.Image(type="filepath"), | |
outputs=["plot"], | |
examples=["ADE_val_00000001.jpeg"], | |
allow_flagging="never", | |
title=title, | |
description=description, | |
) | |
demo.launch() | |