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: @lru_cache() def get_default_model(self) -> str: return self._get_default_model() def _get_default_model(self) -> str: raise NotImplementedError @lru_cache() def list_models(self) -> List[str]: return self._list_models() def _list_models(self) -> List[str]: raise NotImplementedError @lru_cache() 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 @lru_cache() 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