# ------------------------------------------------------------------------------ # Reference: https://github.com/SHI-Labs/OneFormer # Modified by Vidit Goel (https://github.com/vidit98) # ------------------------------------------------------------------------------ import os import random # fmt: off import sys sys.path.insert(1, './annotator/OneFormer') # fmt: on import imutils import cv2 import numpy as np from detectron2.config import get_cfg from detectron2.projects.deeplab import add_deeplab_config from detectron2.data import MetadataCatalog from oneformer import ( add_oneformer_config, add_common_config, add_swin_config, add_dinat_config, add_convnext_config, ) from demo.defaults import DefaultPredictor def setup_cfg(config_file, wts): # load config from file and command-line arguments cfg = get_cfg() add_deeplab_config(cfg) add_common_config(cfg) add_swin_config(cfg) add_dinat_config(cfg) add_convnext_config(cfg) add_oneformer_config(cfg) cfg.merge_from_file(config_file) cfg.MODEL.WEIGHTS = wts cfg.freeze() return cfg class OneformerSegmenter: def __init__(self, wts, config='./annotator/OneFormer/configs/coco/swin/oneformer_swin_large_bs16_100ep.yaml',confidence_thresh=0.5): cfg = setup_cfg(config, wts) metadata = MetadataCatalog.get(cfg.DATASETS.TEST_PANOPTIC[0] if len(cfg.DATASETS.TEST_PANOPTIC) else "__unused") self.predictor = DefaultPredictor(cfg) self.metadata = metadata def __call__(self, img, task): if task == 'panoptic': predictions = self.predictor(img, "panoptic") panoptic_seg, segments_info = predictions["panoptic_seg"] return panoptic_seg, segments_info elif task == 'semantic': predictions = self.predictor(img, "semantic") semask = predictions["sem_seg"].argmax(dim=0) return semask