[docs]@UNFORKABLE.register_module(OP_NAME)@TAGGING_OPS.register_module(OP_NAME)@OPERATORS.register_module(OP_NAME)@LOADED_IMAGES.register_module(OP_NAME)classImageDetectionYoloMapper(Mapper):"""Perform object detection (with YOLO) on images and return the bounding boxes and class labels."""_accelerator="cuda"
[docs]def__init__(self,imgsz=640,conf=0.05,iou=0.5,model_path="yolo11n.pt",*args,**kwargs):""" Initialization method. :param imgsz: resolution for image resizing :param conf: confidence score threshold :param iou: IoU (Intersection over Union) score threshold :param model_path: the path to the YOLO model. """kwargs.setdefault("mem_required","800MB")super().__init__(*args,**kwargs)self.imgsz=imgszself.conf=confself.iou=iouself.model_key=prepare_model(model_type="yolo",model_path=model_path)
[docs]defprocess_single(self,sample,rank=None,context=False):# there is no image in this sampleifself.image_keynotinsampleornotsample[self.image_key]:# N x M x 4 for N images, M boxes, 4 coordssample[Fields.meta][MetaKeys.bbox_tag]=np.empty((0,0,4),dtype=np.float32)sample[Fields.meta][MetaKeys.class_label_tag]=-1returnsampleifMetaKeys.bbox_taginsample[Fields.meta]:returnsampleloaded_image_keys=sample[self.image_key]sample,images=load_data_with_context(sample,context,loaded_image_keys,load_image,mm_bytes_key=self.image_bytes_key)model=get_model(self.model_key,rank=rank,use_cuda=self.use_cuda())sample[Fields.meta][MetaKeys.bbox_tag]=[]sample[Fields.meta][MetaKeys.class_label_tag]=[]forimageinimages:targets=model(image,imgsz=self.imgsz,conf=self.conf,iou=self.iou,verbose=False)[0]sample[Fields.meta][MetaKeys.bbox_tag].append(targets.boxes.xywh.cpu().numpy())sample[Fields.meta][MetaKeys.class_label_tag].append(targets.boxes.cls.cpu().numpy())# match schemaiflen(sample[Fields.meta][MetaKeys.bbox_tag])==0:sample[Fields.meta][MetaKeys.bbox_tag]=np.empty((0,0,4),dtype=np.float32)sample[Fields.meta][MetaKeys.class_label_tag]=-1returnsample