yolov8s_test / handler.py
iarbel's picture
Update handler.py
40901b4
from ultralyticsplus import YOLO
from typing import Dict, Any, List
DEFAULT_CONFIG = {'conf': 0.25, 'iou': 0.45, 'agnostic_nms': False, 'max_det': 1000}
BOX_KEYS = ['xmin', 'ymin', 'xmax', 'ymax']
class EndpointHandler():
def __init__(self, path=""):
self.model = YOLO('ultralyticsplus/yolov8s')
def __call__(self, data: Dict[str, Any]) -> List[Dict[str, Any]]:
"""
data args:
image: image path to segment
config: (conf - NMS confidence threshold,
iou - NMS IoU threshold,
agnostic_nms - NMS class-agnostic: True / False,
max_det - maximum number of detections per image)
Return:
A :obj: `dict` | `dict`: {scores, labels, boxes}
"""
inputs = data.pop("inputs", data)
input_config = inputs.pop("config", DEFAULT_CONFIG)
config = {**DEFAULT_CONFIG, **input_config}
if config is None:
config = DEFAULT_CONFIG
# Set model parameters
self.model.overrides['conf'] = config.get('conf')
self.model.overrides['iou'] = config.get('iou')
self.model.overrides['agnostic_nms'] = config.get('agnostic_nms')
self.model.overrides['max_det'] = config.get('max_det')
# Get label idx-to-name
names = self.model.model.names
# perform inference
result = self.model.predict(inputs['image'])[0]
prediction = []
for score, label, box in zip(result.boxes.conf, result.boxes.cls, result.boxes.xyxy):
item_score = score.item()
item_label = names[int(label)]
item_box = box.to(dtype=int).tolist()
item_prediction = {
'score': item_score,
'label': item_label,
'box': dict(zip(BOX_KEYS, item_box))
}
prediction.append(item_prediction)
return prediction