####################################################################################### # # MIT License # # Copyright (c) [2025] [leonelhs@gmail.com] # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # ####################################################################################### # # This project is one of several repositories exploring image segmentation techniques. # All related projects and interactive demos can be found at: # https://huggingface.co/spaces/leonelhs/removators # huggingface: https://huggingface.co/spaces/leonelhs/segformer-tf-transformers # import os from itertools import islice import cv2 import numpy as np import onnxruntime as ort import gradio as gr from PIL import Image from huggingface_hub import hf_hub_download from pallete import colormap from labels import cloth_labels, fashion_labels, ADE20k_labels REPO_ID = "leonelhs/segmentators" ADE20k_path = hf_hub_download(repo_id=REPO_ID, filename="segformer/segformer-b5-finetuned-ade-640-640.onnx") fashion_path = hf_hub_download(repo_id=REPO_ID, filename="segformer/segformer-b3-fashion.onnx") clothes_path = hf_hub_download(repo_id=REPO_ID, filename="segformer/segformer_b2_clothes.onnx") sess_options = ort.SessionOptions() sess_options.intra_op_num_threads = os.cpu_count() session_ade20k = ort.InferenceSession(fashion_path, sess_options, providers=["CPUExecutionProvider"]) session_cloth = ort.InferenceSession(clothes_path, sess_options, providers=["CPUExecutionProvider"]) session_fashion = ort.InferenceSession(fashion_path, sess_options, providers=["CPUExecutionProvider"]) def predict(input_img, model="ADE20k"): session = session_ade20k labels = ADE20k_labels if model == "Cloth": session = session_cloth labels = cloth_labels elif model == "Fashion": session = session_fashion labels = fashion_labels 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)) inputs = {'input': img_batch} logits = session.run(None, inputs)[0] logits = np.transpose(logits, (0, 2, 3, 1)) segmented_mask = np.argmax(logits, axis=-1)[0].astype("float32") segmented_mask = cv2.resize(segmented_mask, (640, 640)).astype("uint8") parts = [] unique_labels = np.unique(segmented_mask) for label in unique_labels: part = np.where(segmented_mask == label) color_seg = np.full((640, 640, 3), 0, dtype=np.uint8) color_seg[part[0], part[1], :] = colormap[label] color_seg = cv2.cvtColor(color_seg, cv2.COLOR_BGR2GRAY) parts.append((color_seg, labels[label])) return Image.fromarray(img.astype("uint8")), parts with gr.Blocks(title="SegFormer") as app: navbar = gr.Navbar(visible=True, main_page_name="Workspace") gr.Markdown("## SegFormer ONNX") with gr.Row(): with gr.Column(scale=1): inp = gr.Image(type="filepath", label="Upload Image") mod = gr.Dropdown(choices=["ADE20k","Cloth","Fashion"], label="Model generator", value="ADE20k") btn_predict = gr.Button("Parse") with gr.Column(scale=2): out = gr.AnnotatedImage(label="Image parsed annotated") btn_predict.click(predict, inputs=[inp, mod], outputs=[out]) with app.route("About this", "/about"): with open("README.md") as f: for line in islice(f, 12, None): gr.Markdown(line.strip()) app.launch(share=False, debug=True, show_error=True, mcp_server=True, pwa=True) app.queue()