最广为人知的目标检测模型是Yolo系列,现已更新为V8系列,但现有的Yolo模型面临量化支持不足、精度延迟权衡不足等局限性。
Yolo-NAS 模型在 Coco、Objects365 和 RoboFlow 100 等知名数据集上进行了预训练,非常适合生产环境中的下游对象检测任务。 YOLO-NAS的发布代表了目标检测模型推理性能和效率的重大飞跃,解决了传统模型的局限性,并为各种任务和硬件提供了前所未有的适应性。 全新 YOLO-NAS 提供最先进的 (SOTA) 性能和无与伦比的精度速度性能,性能优于 YOLO5、YOLOX6、YOLOXV7 和 YOLO8 等其他型号。
然而,其主流的目标检测模型,为了快速运行,需要使用强大的GPU作为后端算力。 随着移动终端的普及,移动终端对大型机型的需求越来越大。 谷歌发布的MediaPipe系列已经成功在移动终端上运行目标检测模型,运行速度在ms级。
mediapipe 对象检测模型可以对 ** 或实时实时流执行对象检测任务。 mediapipe 目标检测模型包含三种不同大小的模型,您可以根据自己的任务选择相关模型。
型号 1:efficientdet-lite0
EfficientDet-Lite0 模型使用具有 320x320 输入大小和 bifpn 特征网络的 EfficientNet-Lite0 骨干网络模型。 该模型使用 COCO 数据集进行训练,COCO 数据集是一个包含 150 万个对象实例和 80 个对象标签的大规模对象检测数据集。 EfficientDet-Lite0 模型使用三种不同的大小:int8、float16 或 float32。 该模型在延迟和准确性之间取得了平衡。 对于许多任务来说,它既准确又轻巧。 是大多数对象检测任务的首选模型。
模型 2:efficientdet-lite2
EfficientDet-Lite2 模型使用输入大小为 448x448 的 EfficientNet-Lite2 骨干网络模型和 BIFPN 特征网络。 该模型还使用 COCO 数据集进行训练,EfficientDet-Lite2 还提供三种尺寸:INT8、FLOAT16 和 FLOAT32。 该模型通常比 EfficientDet-Lite0 更准确,但它也更慢且更占用内存。
型号 3:SSD MobileNetv2
SSD MobileNetv2 模型使用具有 256x256 输入大小和 SSD 签名网络的 MobileNetv2 骨干网络模型。 该模型使用 COCO 数据集进行训练,SSD MobileNetv2 提供了 2 种大小的模型,INT8 和 FLOAT 32。 该模型比 EfficientDet-Lite0 更快、更轻,但通常也不太准确。
无论是输入,还是**,其模型最终都会转换为**进行目标检测,对于**,在目标检测完成后,将每一帧的**连接在一起,再次转换为**,最终实现**或**流的目标检测。 其模型输出 4 个参数:
检测框:用于目标检测的框的位置检测类:目标检测的分类检测分数:目标检测的置信度数框数:框数
对于没有GPU的移动终端,其EfficientDet-Lite 0 INT8型号只有29延迟为 31 毫秒,其最大型号仅为 198延迟77ms,速度也相当快。
实现 MediaPipe 对象检测模型
若要实现 MediaPipe 对象检测模型,首先需要设置相关环境。 安装 mediapipe 010个版本,以及**相关的目标检测模型,这里可以**3种任意尺寸模型的模型。
pip install -q mediapipe==0.10.0!wget -q -o efficientdet.tflite -q -q -o efficientdet.tflite -q -q -o efficientdet.tflite -q
然后,创建一个可视化函数,该函数的主要目的是在对象检测完成后可视化目标检测的结果。
import cv2import numpy as npmargin = 10 row_size = 10 font_size = 1font_thickness = 1text_color = (255, 0, 0) # reddef visualize(image, detection_result) -np.ndarray: for detection in detection_result.detections: bbox = detection.bounding_box start_point = bbox.origin_x, bbox.origin_y end_point = bbox.origin_x + bbox.width, bbox.origin_y + bbox.height cv2.rectangle(image, start_point, end_point, text_color, 3) category = detection.categories[0] category_name = category.category_name probability = round(category.score, 2) result_text = category_name + ' (' + str(probability) +')' text_location = (margin + bbox.origin_x, margin + row_size + bbox.origin_y) cv2.puttext(image, result_text, text_location, cv2.font_hershey_plain,font_size, text_color, font_thickness) return image
现在我们可以加载一个需要对象检测的**,并执行对象检测任务。
import numpy as npimport mediapipe as mpfrom mediapipe.tasks import pythonfrom mediapipe.tasks.python import visionimage_file = '12.jpg'base_options = python.baseoptions(model_asset_path='efficientdet.tflite')options = vision.objectdetectoroptions(base_options=base_options,score_threshold=0.5)detector = vision.objectdetector.create_from_options(options)image = mp.image.create_from_file(image_file)detection_result = detector.detect(image)image_copy = np.copy(image.numpy_view())annotated_image = visualize(image_copy, detection_result)rgb_annotated_image = cv2.cvtcolor(annotated_image, cv2.color_bgr2rgb)cv2_imshow(rgb_annotated_image)
当然,在目标检测的类别和目标检测的准确性方面,MediaPipe 与其他基于 GPU 系列的目标检测模型还是有差距的,但 MediaPipe 并不使用 GPU 进行加速,如果在移动端使用其他目标检测模型,效果不如 Mediapipe, 而且它的对象检测模型也非常相关。
YOLO模型系列。