mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-03 17:55:21 +03:00
Initial commit that adds YOLOv5 and YOLOv8 support for OpenVINO detector
This commit is contained in:
parent
27d3676ba5
commit
b561f00ff9
@ -26,6 +26,8 @@ class InputTensorEnum(str, Enum):
|
||||
class ModelTypeEnum(str, Enum):
|
||||
ssd = "ssd"
|
||||
yolox = "yolox"
|
||||
yolov5 = "yolov5"
|
||||
yolov8 = "yolov8"
|
||||
|
||||
|
||||
class ModelConfig(BaseModel):
|
||||
|
||||
@ -133,3 +133,69 @@ class OvDetector(DetectionApi):
|
||||
else:
|
||||
break
|
||||
return detections
|
||||
elif self.ov_model_type == ModelTypeEnum.yolov8:
|
||||
infer_request = self.interpreter.create_infer_request()
|
||||
infer_request.infer([tensor_input])
|
||||
out_tensor = infer_request.get_output_tensor()
|
||||
results = out_tensor.data[0]
|
||||
output_data = np.transpose(results)
|
||||
scores = np.max(output_data[:, 4:], axis=1)
|
||||
if len(scores) == 0:
|
||||
return np.zeros((20, 6), np.float32)
|
||||
|
||||
scores = np.expand_dims(scores, axis=1)
|
||||
dets = np.concatenate((output_data, scores), axis=1) # add scores to the last column
|
||||
dets = dets[dets[:,-1] > 0.5,:] # filter out lines with scores below threshold
|
||||
|
||||
ordered = dets[dets[:, -1].argsort()[::-1]][:20] # limit to top 20 scores, descending order
|
||||
detections = np.zeros((20, 6), np.float32)
|
||||
i = 0
|
||||
|
||||
for object_detected in ordered:
|
||||
if i < 20:
|
||||
detections[i] = [
|
||||
np.argmax(object_detected[4:-1]) , # Label ID
|
||||
object_detected[-1], # Confidence
|
||||
(object_detected[1] - (object_detected[3] / 2))
|
||||
/ self.h, # y_min
|
||||
(object_detected[0] - (object_detected[2] / 2))
|
||||
/ self.w, # x_min
|
||||
(object_detected[1] + (object_detected[3] / 2))
|
||||
/ self.h, # y_max
|
||||
(object_detected[0] + (object_detected[2] / 2))
|
||||
/ self.w, # x_max
|
||||
]
|
||||
i += 1
|
||||
else:
|
||||
break
|
||||
return detections
|
||||
elif self.ov_model_type == ModelTypeEnum.yolov5:
|
||||
infer_request = self.interpreter.create_infer_request()
|
||||
infer_request.infer([tensor_input])
|
||||
out_tensor = infer_request.get_output_tensor()
|
||||
output_data = out_tensor.data[0]
|
||||
conf_mask = (output_data[:, 4] >= 0.5).squeeze()
|
||||
output_data = output_data[conf_mask]
|
||||
ordered = output_data[output_data[:, 4].argsort()[::-1]][:20] # limit to top 20 scores, descending order
|
||||
|
||||
detections = np.zeros((20, 6), np.float32)
|
||||
i = 0
|
||||
|
||||
for object_detected in ordered:
|
||||
if i < 20:
|
||||
detections[i] = [
|
||||
np.argmax(object_detected[5:]) , # Label ID
|
||||
object_detected[4], # Confidence
|
||||
(object_detected[1] - (object_detected[3] / 2))
|
||||
/ self.h, # y_min
|
||||
(object_detected[0] - (object_detected[2] / 2))
|
||||
/ self.w, # x_min
|
||||
(object_detected[1] + (object_detected[3] / 2))
|
||||
/ self.h, # y_max
|
||||
(object_detected[0] + (object_detected[2] / 2))
|
||||
/ self.w, # x_max
|
||||
]
|
||||
i += 1
|
||||
else:
|
||||
break
|
||||
return detections
|
||||
Loading…
Reference in New Issue
Block a user