Use existing variable

This commit is contained in:
Nicolas Mowen 2025-04-18 07:51:57 -06:00
parent 6979b3419e
commit 8951647f33
2 changed files with 74 additions and 10 deletions

View File

@ -52,8 +52,6 @@ class ONNXDetector(DetectionApi):
path, providers=providers, provider_options=options path, providers=providers, provider_options=options
) )
self.h = detector_config.model.height
self.w = detector_config.model.width
self.onnx_model_type = detector_config.model.model_type self.onnx_model_type = detector_config.model.model_type
self.onnx_model_px = detector_config.model.input_pixel_format self.onnx_model_px = detector_config.model.input_pixel_format
self.onnx_model_shape = detector_config.model.input_tensor self.onnx_model_shape = detector_config.model.input_tensor
@ -70,10 +68,12 @@ class ONNXDetector(DetectionApi):
None, None,
{ {
"images": tensor_input, "images": tensor_input,
"orig_target_sizes": np.array([[self.h, self.w]], dtype=np.int64), "orig_target_sizes": np.array(
[[self.height, self.width]], dtype=np.int64
),
}, },
) )
return post_process_dfine(tensor_output, self.w, self.h) return post_process_dfine(tensor_output, self.width, self.height)
model_input_name = self.model.get_inputs()[0].name model_input_name = self.model.get_inputs()[0].name
tensor_output = self.model.run(None, {model_input_name: tensor_input}) tensor_output = self.model.run(None, {model_input_name: tensor_input})
@ -95,17 +95,21 @@ class ONNXDetector(DetectionApi):
detections[i] = [ detections[i] = [
class_id, class_id,
confidence, confidence,
y_min / self.h, y_min / self.height,
x_min / self.w, x_min / self.width,
y_max / self.h, y_max / self.height,
x_max / self.w, x_max / self.width,
] ]
return detections return detections
elif self.onnx_model_type == ModelTypeEnum.yologeneric: elif self.onnx_model_type == ModelTypeEnum.yologeneric:
return post_process_yolo(tensor_output, self.w, self.h) return post_process_yolo(tensor_output, self.width, self.height)
elif self.onnx_model_type == ModelTypeEnum.yolox: elif self.onnx_model_type == ModelTypeEnum.yolox:
return post_process_yolox( return post_process_yolox(
tensor_output[0], self.w, self.h, self.grids, self.expanded_strides tensor_output[0],
self.width,
self.height,
self.grids,
self.expanded_strides,
) )
else: else:
raise Exception( raise Exception(

View File

@ -4,6 +4,7 @@ import re
import urllib.request import urllib.request
from typing import Literal from typing import Literal
import numpy as np
from pydantic import Field from pydantic import Field
from frigate.const import MODEL_CACHE_DIR from frigate.const import MODEL_CACHE_DIR
@ -60,6 +61,9 @@ class Rknn(DetectionApi):
"Error initializing rknn runtime. Do you run docker in privileged mode?" "Error initializing rknn runtime. Do you run docker in privileged mode?"
) )
if self.detector_config.model.model_type == ModelTypeEnum.yolox:
self.calculate_grids_strides()
def __del__(self): def __del__(self):
self.rknn.release() self.rknn.release()
@ -150,6 +154,62 @@ class Rknn(DetectionApi):
'Make sure to set the model input_tensor to "nhwc" in your config.' 'Make sure to set the model input_tensor to "nhwc" in your config.'
) )
def post_process_yolonas(self, output: list[np.ndarray]):
"""
@param output: output of inference
expected shape: [np.array(1, N, 4), np.array(1, N, 80)]
where N depends on the input size e.g. N=2100 for 320x320 images
@return: best results: np.array(20, 6) where each row is
in this order (class_id, score, y1/height, x1/width, y2/height, x2/width)
"""
N = output[0].shape[1]
boxes = output[0].reshape(N, 4)
scores = output[1].reshape(N, 80)
class_ids = np.argmax(scores, axis=1)
scores = scores[np.arange(N), class_ids]
args_best = np.argwhere(scores > self.thresh)[:, 0]
num_matches = len(args_best)
if num_matches == 0:
return np.zeros((20, 6), np.float32)
elif num_matches > 20:
args_best20 = np.argpartition(scores[args_best], -20)[-20:]
args_best = args_best[args_best20]
boxes = boxes[args_best]
class_ids = class_ids[args_best]
scores = scores[args_best]
boxes = np.transpose(
np.vstack(
(
boxes[:, 1] / self.height,
boxes[:, 0] / self.width,
boxes[:, 3] / self.height,
boxes[:, 2] / self.width,
)
)
)
results = np.hstack(
(class_ids[..., np.newaxis], scores[..., np.newaxis], boxes)
)
return np.resize(results, (20, 6))
def post_process(self, output):
if self.detector_config.model.model_type == ModelTypeEnum.yolonas:
return self.post_process_yolonas(output)
else:
raise ValueError(
f'Model type "{self.detector_config.model.model_type}" is currently not supported.'
)
def detect_raw(self, tensor_input): def detect_raw(self, tensor_input):
output = self.rknn.inference( output = self.rknn.inference(
[ [