From cf03f62088a843dec95c7f856883cb1a2ec11d39 Mon Sep 17 00:00:00 2001 From: Nate Meyer Date: Fri, 26 Aug 2022 02:00:11 -0400 Subject: [PATCH] Load model and submit for inference. Sucessfully load model and initialize OpenVino engine with either CPU or GPU as device. Does not parse results for objects. --- docker/install_deps.sh | 1 + frigate/detectors/openvino.py | 105 ++++++++++++---------------------- requirements-wheels.txt | 4 +- 3 files changed, 41 insertions(+), 69 deletions(-) diff --git a/docker/install_deps.sh b/docker/install_deps.sh index 681a82f96..0f6c5c1d3 100755 --- a/docker/install_deps.sh +++ b/docker/install_deps.sh @@ -53,6 +53,7 @@ if [[ "${TARGETARCH}" == "amd64" ]]; then echo 'deb http://deb.debian.org/debian testing main non-free' >/etc/apt/sources.list.d/debian-testing.list apt-get -qq update apt-get -qq install --no-install-recommends --no-install-suggests -y \ + intel-opencl-icd \ mesa-va-drivers libva-drm2 intel-media-va-driver-non-free i965-va-driver libmfx1 radeontop intel-gpu-tools rm -f /etc/apt/sources.list.d/debian-testing.list fi diff --git a/frigate/detectors/openvino.py b/frigate/detectors/openvino.py index 03e8750ed..e038048eb 100644 --- a/frigate/detectors/openvino.py +++ b/frigate/detectors/openvino.py @@ -10,79 +10,48 @@ logger = logging.getLogger(__name__) class OvDetector(DetectionApi): def __init__(self, det_device=None, model_path=None, num_threads=1): - self.ovCore = ov.Core() - self.ovModel = self.ovCore.read_model(model_path) - self.interpreter = self.ovCore.compile_model( - model=self.ovModel, device_name=det_device + self.ov_core = ov.Core() + self.ov_model = self.ov_core.read_model(model_path) + self.interpreter = self.ov_core.compile_model( + model=self.ov_model, device_name=det_device ) - - self.interpreter.allocate_tensors() - - self.tensor_input_details = self.interpreter.get_input_details() - self.tensor_output_details = self.interpreter.get_output_details() + logger.info(f"Model Input Shape: {self.interpreter.input().shape}") + logger.info(f"Model Output Shape: {self.interpreter.output().shape}") def detect_raw(self, tensor_input): - self.interpreter.set_tensor(self.tensor_input_details[0]["index"], tensor_input) - self.interpreter.invoke() + tensor_transpose = np.reshape(tensor_input, self.interpreter.input().shape) - boxes = self.interpreter.tensor(self.tensor_output_details[0]["index"])()[0] - class_ids = self.interpreter.tensor(self.tensor_output_details[1]["index"])()[0] - scores = self.interpreter.tensor(self.tensor_output_details[2]["index"])()[0] - count = int( - self.interpreter.tensor(self.tensor_output_details[3]["index"])()[0] - ) + infer_request = self.interpreter.create_infer_request() + results = infer_request.infer([tensor_transpose]) + + # class_ids = self.interpreter.tensor(self.tensor_output_details[1]["index"])()[0] + # scores = self.interpreter.tensor(self.tensor_output_details[2]["index"])()[0] + # count = int( + # self.interpreter.tensor(self.tensor_output_details[3]["index"])()[0] + # # ) + + # class_ids = results[0, 0, :, 1] + # # class_ids = [0, 0, 1, 1] + # print(class_ids) + + # scores = results + # print(scores) detections = np.zeros((20, 6), np.float32) - - for i in range(count): - if scores[i] < 0.4 or i == 20: - break - detections[i] = [ - class_ids[i], - float(scores[i]), - boxes[i][0], - boxes[i][1], - boxes[i][2], - boxes[i][3], - ] - - return detections - - -class GpuOpenVino(DetectionApi): - def __init__(self, det_device=None, model_path=None, num_threads=1): - self.interpreter = tflite.Interpreter( - model_path=model_path or "/cpu_model.tflite", num_threads=3 - ) - - self.interpreter.allocate_tensors() - - self.tensor_input_details = self.interpreter.get_input_details() - self.tensor_output_details = self.interpreter.get_output_details() - - def detect_raw(self, tensor_input): - self.interpreter.set_tensor(self.tensor_input_details[0]["index"], tensor_input) - self.interpreter.invoke() - - boxes = self.interpreter.tensor(self.tensor_output_details[0]["index"])()[0] - class_ids = self.interpreter.tensor(self.tensor_output_details[1]["index"])()[0] - scores = self.interpreter.tensor(self.tensor_output_details[2]["index"])()[0] - count = int( - self.interpreter.tensor(self.tensor_output_details[3]["index"])()[0] - ) - - detections = np.zeros((20, 6), np.float32) - - for i in range(count): - if scores[i] < 0.4 or i == 20: - break - detections[i] = [ - class_ids[i], - float(scores[i]), - boxes[i][0], - boxes[i][1], - boxes[i][2], - boxes[i][3], - ] + # i = 0 + # for object_detected in results["detection_out"][0, 0, :]: + # if object_detected[2] < 0.1 or i == 20: + # break + # detections.append( + # [ + # object_detected[1], + # float(object_detected[2]), + # object_detected[3], + # object_detected[4], + # object_detected[5], + # object_detected[6], + # ] + # ) + # i += 1 return detections diff --git a/requirements-wheels.txt b/requirements-wheels.txt index f952a9528..51e8c659e 100644 --- a/requirements-wheels.txt +++ b/requirements-wheels.txt @@ -3,7 +3,8 @@ Flask == 2.2.* imutils == 0.5.* matplotlib == 3.6.* mypy == 0.942 -numpy == 1.22.* +# numpy == 1.22.* +numpy == 1.19.* opencv-python-headless == 4.5.5.* paho-mqtt == 1.6.* peewee == 3.15.* @@ -18,3 +19,4 @@ scipy == 1.8.* setproctitle == 1.2.* ws4py == 0.5.* zeroconf == 0.39.4 +openvino == 2022.*