From 1a1eb16e94874e88e14594423e34cb3d69828a6c Mon Sep 17 00:00:00 2001 From: b-lovro Date: Fri, 27 Sep 2024 13:18:01 +0200 Subject: [PATCH] Example yolov8n (#1078) * Added yolov8n model download and example script for yolov8n --- examples/Yolo/yolov8_nano.py | 127 +++++++++++++++++++++++++++++ examples/install_requirements.py | 6 ++ examples/models/v8n-yolo/model.yml | 25 ++++++ 3 files changed, 158 insertions(+) create mode 100644 examples/Yolo/yolov8_nano.py create mode 100644 examples/models/v8n-yolo/model.yml diff --git a/examples/Yolo/yolov8_nano.py b/examples/Yolo/yolov8_nano.py new file mode 100644 index 000000000..3da54597f --- /dev/null +++ b/examples/Yolo/yolov8_nano.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 + +""" +The code is the same as for Tiny Yolo V3 and V4, the only difference is the blob file +- Tiny YOLOv3: https://github.com/david8862/keras-YOLOv3-model-set +- Tiny YOLOv4: https://github.com/TNTWEN/OpenVINO-YOLOV4 +""" + +from pathlib import Path +import sys +import cv2 +import depthai as dai +import numpy as np +import time + +# Get yolo v8n model blob file path +nnPath = str((Path(__file__).parent / Path('../models/yolov8n_coco_640x352.blob')).resolve().absolute()) +if not Path(nnPath).exists(): + import sys + raise FileNotFoundError(f'Required file/s not found, please run "{sys.executable} install_requirements.py"') + +# yolo v8 abel texts +labelMap = [ + "person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train", + "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", + "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", + "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", + "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", + "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", + "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", + "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", + "chair", "sofa", "pottedplant", "bed", "diningtable", "toilet", "tvmonitor", + "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", + "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", + "teddy bear", "hair drier", "toothbrush" +] + +syncNN = True + +# Create pipeline +pipeline = dai.Pipeline() + +# Define sources and outputs +camRgb = pipeline.create(dai.node.ColorCamera) +detectionNetwork = pipeline.create(dai.node.YoloDetectionNetwork) +xoutRgb = pipeline.create(dai.node.XLinkOut) +nnOut = pipeline.create(dai.node.XLinkOut) + +xoutRgb.setStreamName("rgb") +nnOut.setStreamName("nn") + +# Properties +camRgb.setPreviewSize(640, 352) +camRgb.setResolution(dai.ColorCameraProperties.SensorResolution.THE_1080_P) +camRgb.setInterleaved(False) +camRgb.setColorOrder(dai.ColorCameraProperties.ColorOrder.BGR) +camRgb.setFps(40) + +# Network specific settings +detectionNetwork.setConfidenceThreshold(0.5) +detectionNetwork.setNumClasses(80) +detectionNetwork.setCoordinateSize(4) +detectionNetwork.setIouThreshold(0.5) +detectionNetwork.setBlobPath(nnPath) +detectionNetwork.setNumInferenceThreads(2) +detectionNetwork.input.setBlocking(False) + +# Linking +camRgb.preview.link(detectionNetwork.input) +if syncNN: + detectionNetwork.passthrough.link(xoutRgb.input) +else: + camRgb.preview.link(xoutRgb.input) + +detectionNetwork.out.link(nnOut.input) + +# Connect to device and start pipeline +with dai.Device(pipeline) as device: + + # Output queues will be used to get the rgb frames and nn data from the outputs defined above + qRgb = device.getOutputQueue(name="rgb", maxSize=4, blocking=False) + qDet = device.getOutputQueue(name="nn", maxSize=4, blocking=False) + + frame = None + detections = [] + startTime = time.monotonic() + counter = 0 + color2 = (255, 255, 255) + + # nn data, being the bounding box locations, are in <0..1> range - they need to be normalized with frame width/height + def frameNorm(frame, bbox): + normVals = np.full(len(bbox), frame.shape[0]) + normVals[::2] = frame.shape[1] + return (np.clip(np.array(bbox), 0, 1) * normVals).astype(int) + + def displayFrame(name, frame): + color = (255, 0, 0) + for detection in detections: + bbox = frameNorm(frame, (detection.xmin, detection.ymin, detection.xmax, detection.ymax)) + cv2.putText(frame, labelMap[detection.label], (bbox[0] + 10, bbox[1] + 20), cv2.FONT_HERSHEY_TRIPLEX, 0.5, 255) + cv2.putText(frame, f"{int(detection.confidence * 100)}%", (bbox[0] + 10, bbox[1] + 40), cv2.FONT_HERSHEY_TRIPLEX, 0.5, 255) + cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, 2) + # Show the frame + cv2.imshow(name, frame) + + while True: + if syncNN: + inRgb = qRgb.get() + inDet = qDet.get() + else: + inRgb = qRgb.tryGet() + inDet = qDet.tryGet() + + if inRgb is not None: + frame = inRgb.getCvFrame() + cv2.putText(frame, "NN fps: {:.2f}".format(counter / (time.monotonic() - startTime)), + (2, frame.shape[0] - 4), cv2.FONT_HERSHEY_TRIPLEX, 0.4, color2) + + if inDet is not None: + detections = inDet.detections + counter += 1 + + if frame is not None: + displayFrame("rgb", frame) + + if cv2.waitKey(1) == ord('q'): + break diff --git a/examples/install_requirements.py b/examples/install_requirements.py index 2487ed8b1..69cbfd594 100755 --- a/examples/install_requirements.py +++ b/examples/install_requirements.py @@ -224,6 +224,12 @@ def hasWhitespace(string): "zoo_type": "depthai", "default_ov_version": "2022.1" }, + "yolov8n_coco_640x352": { + "shaves": [6], + "compile_params": ["-ip U8"], + "zoo_type": "depthai", + "default_ov_version": "2021.4" + }, } blobconverter_cmds = [ diff --git a/examples/models/v8n-yolo/model.yml b/examples/models/v8n-yolo/model.yml new file mode 100644 index 000000000..b85d90966 --- /dev/null +++ b/examples/models/v8n-yolo/model.yml @@ -0,0 +1,25 @@ +# Copyright (c) 2021 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +description: >- + v8n-yolo +task_type: object_attributes +files: + - name: yolov8n_coco_640x352.blob + size: 6376024 + sha256: 6c2b9a63b8324cd80a4d413cffb3e0f4471e6731faa90513faa1e7fed83f6348 + source: https://artifacts.luxonis.com/artifactory/luxonis-depthai-data-local/network/yolov8n_coco_640x352.blob + +framework: dldt +license: https://raw.githubusercontent.com/openvinotoolkit/open_model_zoo/master/LICENSE