Spaces:
Running
Running
| import os.path | |
| from functools import lru_cache | |
| from typing import List, Tuple | |
| import gradio as gr | |
| from hbutils.color import rnd_colors | |
| from hfutils.operate import get_hf_fs | |
| from hfutils.utils import hf_fs_path, parse_hf_fs_path | |
| from imgutils.data import ImageTyping | |
| def _v_fix(v): | |
| return int(round(v)) | |
| def _bbox_fix(bbox): | |
| return tuple(map(_v_fix, bbox)) | |
| class ObjectDetection: | |
| def get_default_model(self) -> str: | |
| return self._get_default_model() | |
| def _get_default_model(self) -> str: | |
| raise NotImplementedError | |
| def list_models(self) -> List[str]: | |
| return self._list_models() | |
| def _list_models(self) -> List[str]: | |
| raise NotImplementedError | |
| def get_default_iou_and_score(self, model_name: str) -> Tuple[float, float]: | |
| return self._get_default_iou_and_score(model_name) | |
| def _get_default_iou_and_score(self, model_name: str) -> Tuple[float, float]: | |
| raise NotImplementedError | |
| def get_labels(self, model_name: str) -> List[str]: | |
| return self._get_labels(model_name) | |
| def _get_labels(self, model_name: str) -> List[str]: | |
| raise NotImplementedError | |
| def detect(self, image: ImageTyping, model_name: str, | |
| iou_threshold: float = 0.7, score_threshold: float = 0.25) \ | |
| -> List[Tuple[Tuple[float, float, float, float], str, float]]: | |
| raise NotImplementedError | |
| def _gr_detect(self, image: ImageTyping, model_name: str, | |
| iou_threshold: float = 0.7, score_threshold: float = 0.25) \ | |
| -> gr.AnnotatedImage: | |
| labels = self.get_labels(model_name=model_name) | |
| _colors = list(map(str, rnd_colors(len(labels)))) | |
| _color_map = dict(zip(labels, _colors)) | |
| return gr.AnnotatedImage( | |
| value=(image, [ | |
| (_bbox_fix(bbox), label) for bbox, label, _ in | |
| self.detect(image, model_name, iou_threshold, score_threshold) | |
| ]), | |
| color_map=_color_map, | |
| label='Labeled', | |
| ) | |
| def make_ui(self): | |
| with gr.Row(): | |
| with gr.Column(): | |
| default_model_name = self.get_default_model() | |
| model_list = self.list_models() | |
| gr_input_image = gr.Image(type='pil', label='Original Image') | |
| gr_model = gr.Dropdown(model_list, value=default_model_name, label='Model') | |
| with gr.Row(): | |
| iou, score = self.get_default_iou_and_score(default_model_name) | |
| gr_iou_threshold = gr.Slider(0.0, 1.0, iou, label='IOU Threshold') | |
| gr_score_threshold = gr.Slider(0.0, 1.0, score, label='Score Threshold') | |
| gr_submit = gr.Button(value='Submit', variant='primary') | |
| with gr.Column(): | |
| gr_output_image = gr.AnnotatedImage(label="Labeled") | |
| gr_submit.click( | |
| self._gr_detect, | |
| inputs=[ | |
| gr_input_image, | |
| gr_model, | |
| gr_iou_threshold, | |
| gr_score_threshold, | |
| ], | |
| outputs=[gr_output_image], | |
| ) | |
| class DeepGHSObjectDetection(ObjectDetection): | |
| def __init__(self, repo_id: str): | |
| self._repo_id = repo_id | |
| def _get_default_model(self) -> str: | |
| raise NotImplementedError | |
| def _list_models(self) -> List[str]: | |
| hf_fs = get_hf_fs() | |
| return [ | |
| os.path.dirname(parse_hf_fs_path(path).filename) | |
| for path in hf_fs.glob(hf_fs_path( | |
| repo_id=self._repo_id, | |
| repo_type='model', | |
| filename='*/model.onnx' | |
| )) | |
| ] | |
| def _get_default_iou_and_score(self, model_name: str) -> Tuple[float, float]: | |
| raise NotImplementedError | |
| def _get_labels(self, model_name: str) -> List[str]: | |
| raise NotImplementedError | |
| def detect(self, image: ImageTyping, model_name: str, | |
| iou_threshold: float = 0.7, score_threshold: float = 0.25) \ | |
| -> List[Tuple[Tuple[float, float, float, float], str, float]]: | |
| raise NotImplementedError | |