行空板上YOLO和Mediapipe视频物体检测的测试

Introduction

经过前面三篇教程帖子(yolov8n在行空板上的运行(中文),yolov10n在行空板上的运行(中文),Mediapipe在行空板上的运行(中文))的介绍,我们对如何使用官方代码在行空板上运行物体检测的AI模型有了基本的概念,并对常见的模型进行了简单的测试和对比。

在行空板上YOLO和Mediapipe图片物体检测的测试(中文)中我们对于行空板上使用YOLO和Mediapipe进行图片物体检测进行了测试。

进一步的,本文将

  • 对不同模型的视频物体检查进行详细的对比分析;
  • 进行针对在行空板上的视频物体检测进行代码编写和优化;
  • 对不同模型的帧率对比测试。

Note: 因为视频物体检测和图片物体检测用的是相同的模型,所以在检测准确性上不会有区别,所以检测结果的准确性可以直接参考以行空板上YOLO和Mediapipe图片物体检测的测试(中文)所做的测试。

yolo视频物体检测

不同onnx模型导出设置的表现对比

设置和代码

导出onnx模型的官方代码为:

from ultralytics import YOLO# Load a pretrained YOLOv10n model
model = YOLO("yolov10n.pt")#export onnx
model.export(format='onnx')

yolo系列模型在使用官方代码导出onnx格式模型的时候,有几个不同的选项:

参数类型默认值描述
imgszint or tuple640模型输入所需的图像大小。对于正方形图像可以是整数,对于特定尺寸可以是元组(高度,宽度)。
halfboolFalse支持FP16(半精度)量化,减少模型尺寸,并可能加快对支持硬件的推理。
dynamicboolFalse允许ONNX和TensorRT导出的动态输入大小,增强处理不同图像尺寸的灵活性。
simplifyboolFalse简化ONNX导出的模型图,潜在地提高性能和兼容性。
  • 其中,dynamic与imgsz不兼容;dynamic与half不兼容。

我们将分别对这几个选项的不同组合进行对比测试,分辨率都采用640。共包括以下模型:

设置代码
默认model.export(format=‘onnx’, imgsz=640)
dynamicmodel.export(format=‘onnx’, dynamic=True)
simplifymodel.export(format=‘onnx’, simplify=True, imgsz=640)
simplify和dynamicmodel.export(format=‘onnx’, simplify=True, dynamic=True)
halfmodel.export(format=‘onnx’, half=True, imgsz=640)
simlify和halfmodel.export(format=‘onnx’, simplify=True, half=True, imgsz=640)
测试结果

对不同设置的模型进行行空板+USB摄像头的视频物体检测测试,结果如下:

模型大小simplifyhalfdynamicimgsz帧率
YOLOv10n8.99MB×××6400.3029
YOLOv10n8.86MB×××0.3002
YOLOv10n8.95MB××6400.3009
YOLOv10n8.95MB××0.3011
YOLOv10n8.99MB××6400.2999
YOLOv10n8.95MB×6400.3017
分析

通过测试结果的统计,可以分析得到以下特点:

  • dynamic设置可以略微减小模型大小,也会略微降低运行速度;
  • simplify也可以略微减小模型大小,但极不显著,也会略微降低运行速度;
  • 如果simplify和dynamic同时开启,不如值开启dynamic在模型尺寸上减少的明显;
  • half设置并没有速度上的提升,反而有降低,这是因为行空板没有半精度优化的硬件支持。
小结
  1. 如果能事先知道输入图片的尺寸,就不要使用任何参数设置,只用imgsz设置图片尺寸;
  2. 如果实现不知道图片输入的尺寸,就使用dynamic=True;
  3. 不要设置half=True和simplify=True

不同尺寸输入的表现对比

yolo的测试结果
模型模型大小dynamicimgsz帧率
YOLOv10n8.99MB×6400.30
YOLOv10n8.91MB×4480.59
YOLOv10n8.87MB×3201.07
YOLOv10n8.86MB×2561.70
YOLOv10n8.84MB×1285.01
YOLOv8n12.2MB×6400.26
YOLOv8n12.1MB4480.53
YOLOv8n12.1MB3200.99
YOLOv8n12.0MB2561.59
YOLOv8n12.0MB1284.80
YOLOv8n12.0MB649.17
分析

可以看出,随着输入尺寸的减小,帧率显著提高。

yolov10n的帧率比yolov8n略高10%左右,同时模型大小减少25%。

小结
  • 对于视频检测,在行空板上以128的分辨率运行勉强可以使用;
  • 建议选择yolov10n,相较v8,内存占用和速度方面都有优势。

Mediapipe视频物体检测

设置

针对Mediapipe中的三个模型,我们分别测试了非量化和int8量化下的不同分辨率。

分辨率包括:

640、448、320、256、128

测试结果

模型\分辨率64044832025612864
efficientdet_lite00.420.420.420.420.420.43
efficientdet_lite0_int80.850.850.850.850.850.86
efficientdet_lite20.130.130.130.130.130.13
efficientdet_lite2_int80.270.270.270.270.270.27
ssd_mobilenet_v20.610.610.610.610.610.61
ssd_mobilenet_v2_int80.610.610.610.610.610.62

小结

  • 与图片的目标检测结果类似,不同的分辨率对这些模型而言没有影响;
  • 对于efficientdet_lite0和efficientdet_lite2,int8量化可以显著提速;int8量化对于ssd_mobilenet_v2没有影响

视频物体检测总结

在这里插入图片描述

我们在统计测试后发现了以下特点:

  • yolo系列随着图片分辨率下调,检测耗时显著减少;而Mediapipe不明显。这说明在小分辨率图片检测中,yolo系列有显著的速度优势;
  • det的两个模型进行int8量化之后速度显著提升,几乎不会损失准确性;
  • Mediapipe的模型在较大分辨率的时候相比yolo有显著的速度优势,但是准确性略低一点。在应用的时候,需要在准确性和速度上进行权衡。

模型选择建议

  • 限于视频帧率问题,我们认为最多使用320分辨率,使帧率达到1;
  • 如果物体较近或者较大,在低分辨率图片上也可以方便地提取特征,这种情况下推荐使用较低分辨率而速度较快的模型,如64帧率的yolov8n
  • 如果物体较远或者物体较小,则需要分辨率更高才能提取到足够的特征,这种情况下推荐选择yolov10n。如果需要更高分辨率的图片,而且可以接收帧率较低,可以采用ssd_mobilenet_v2.tflite模型。可以参考下面的流程来选取模型:

在这里插入图片描述

附录

使用yolov10n视频检测的代码

行空板+USB摄像头使用yolov10n进行物体检测的代码代码如下:

import cv2
import numpy as np
import onnxruntime as ort
import yaml
import time def preprocess(frame, input_size):#这里的resize使用nearest,可以提速大约0.3-0.5帧image = cv2.resize(frame, input_size,interpolation=cv2.INTER_NEAREST)# 转换图片到数组image_data = np.array(image).transpose(2, 0, 1)  # 转换成CHWimage_data = image_data.astype(np.float32)image_data /= 255.0  # 归一化image_data = np.expand_dims(image_data, axis=0)  # 增加batch维度return image_datadef postprocess(output, image, input_size, show_size, classes):for detection in output:x1, y1, x2, y2, conf , class_id = detectionif conf > 0.4:x1 = int(x1 / input_size[0] * show_size[0])x2 = int(x2 / input_size[0] * show_size[0])y1 = int(y1 / input_size[1] * show_size[1])y2 = int(y2 / input_size[1] * show_size[1])class_id = int(class_id)  cv2.rectangle(image, (x1, y1), (x2, y2), (255, 0, 0), 2)  # 画框class_name = classes[class_id]cv2.putText(image, class_name, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)return imagedef main():input_size = (128, 128)with open('ultralytics/cfg/datasets/coco.yaml', 'r', encoding='utf-8') as f:data = yaml.safe_load(f)classes = data['names']window_name = 'FullScreen Image'cv2.namedWindow(window_name, cv2.WINDOW_NORMAL) cv2.setWindowProperty(window_name, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)# 加载模型session = ort.InferenceSession('yolov10n.onnx')input_name = session.get_inputs()[0].name# 打开摄像头。cap = cv2.VideoCapture(0)if not cap.isOpened():print("Cannot open camera")exit()prev_time = 0while True:ret, frame = cap.read()show_size = [320,240]if not ret:print("Can't receive frame (stream end?). Exiting ...")breakcurrent_time = time.time()# 预处理图像input_tensor = preprocess(frame, input_size)# 进行推理outputs = session.run(None, {input_name: input_tensor})output = outputs[0][0]# 后处理show_image = postprocess(output, frame, input_size, show_size, classes)fps = 1.0 / (current_time - prev_time)prev_time = current_time  # 更新前一帧的时间cv2.putText(show_image, f"FPS: {fps:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)# 显示结果cv2.imshow(window_name, show_image)if cv2.waitKey(1) == ord('q'):break# 释放资源cap.release()cv2.destroyAllWindows()if __name__ == '__main__':main()

使用Mediapipe视频检测的代码

行空板+USB摄像头使用Mediapipe进行物体检测的代码代码如下:

import numpy as np
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
import cv2
import timeinput_size = (640,640)
# STEP 1: Import the necessary modules.
base_options = python.BaseOptions(model_asset_path='efficientdet_lite0.tflite')
options = vision.ObjectDetectorOptions(base_options=base_options,score_threshold=0.5)
detector = vision.ObjectDetector.create_from_options(options)# STEP 2: Create an ObjectDetector object.
MARGIN = 10  # pixels
ROW_SIZE = 10  # pixels
FONT_SIZE = 1
FONT_THICKNESS = 1
TEXT_COLOR = (255, 0, 0)  # reddef visualize(image, detection_result) -> np.ndarray:"""Draws bounding boxes on the input image and return it.Args:image: The input RGB image.detection_result: The list of all "Detection" entities to be visualize.Returns:Image with bounding boxes."""for detection in detection_result.detections:# Draw bounding_boxbbox = detection.bounding_boxstart_point = bbox.origin_x, bbox.origin_yend_point = bbox.origin_x + bbox.width, bbox.origin_y + bbox.heightcv2.rectangle(image, start_point, end_point, TEXT_COLOR, 3)# Draw label and scorecategory = detection.categories[0]category_name = category.category_nameprobability = 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# STEP 3: Initialize the video capture from the webcam.
cap = cv2.VideoCapture(0)
prev_time = 0while cap.isOpened():ret, frame = cap.read()if not ret:breakframe = cv2.resize(frame, input_size, interpolation=cv2.INTER_NEAREST)# Convert the frame to the format required by MediaPipe.image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)# STEP 4: Detect objects in the frame.detection_result = detector.detect(image)# STEP 5: Process the detection result. In this case, visualize it.annotated_frame = visualize(frame, detection_result)# Calculate and display the frame ratecurrent_time = time.time()fps = 1 / (current_time - prev_time)prev_time = current_timefps_text = f'FPS: {fps:.2f}'print(fps_text)cv2.putText(annotated_frame, fps_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)cv2.imshow('Object Detection', annotated_frame)# Break the loop if the user presses 'q'.if cv2.waitKey(1) & 0xFF == ord('q'):break# Release the resources.
cap.release()
cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/417457.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

欧拉数据库的搭建及其部署

数据库的搭建 进行数据库安装前,必须保证软件yum仓库搭建完成 使用命令 dnf install mariadb-server,发现冲突selinux-policy-targeted-35.5-21.oe2203sp3.noarch有问题 [rootlocalhost yum.repos.d]# dnf install mariadb-server [rootlocalhost y…

鸿蒙轻内核M核源码分析系列五 时间管理

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 持续更新中…… 在鸿蒙轻内核源码分析上一篇文章中,我们剖析了中断的源码,简单提到了Tick中断。本文会继续分析Tick和时间相关的源…

法规探讨 | 《医疗器械管理法(草案征求意见稿)》初探(1)

昨日,国家药监局综合司正式公开征求《中华人民共和国医疗器械管理法(草案征求意见稿)》的意见,标志着我国医疗器械管理领域即将进入新的发展阶段。相较于现行的《医疗器械监督管理条例》,《医疗器械法》不仅沿袭了《条…

【深入解析】AI工作流中的HTTP组件:客户端与服务端执行的区别

在当今快速发展的技术环境中,AI工作流的设计和实现变得愈发重要。尤其是在处理HTTP组件时,前端执行与后端执行之间的区别,往往会对系统的安全性和数据的准确性产生深远的影响。今天,我们就来深入探讨这一话题,揭示前端…

vscode+django开发后端快速测试接口(轻量版,免postman安装)

目录 背景 步骤 安装插件 编写测试文件 示例一:get接口类型 示例二:post接口类型 示例三:delete接口类型 如何运行test.http测试文件 背景 在最近工作中涉及到使用Django框架开发后端,写完接口后,不可避免需要…

Java项目: 基于SpringBoot+mysql网上点餐系统分前后台(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql网上点餐系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐…

科研绘图系列:R语言差异基因四分图(Quad plot)

文章目录 介绍加载R包导入数据数据预处理画图参考介绍 四分图(Quad plot)是一种数据可视化技术,通常用于展示四个变量之间的关系。它由四个子图组成,每个子图都显示两个变量之间的关系。四分图的布局通常是2x2的网格,每个格子代表一个变量对的散点图。 在四分图中,通常…

2024数学建模国赛A题word版成品论文30页【附带完整解题代码+可视化图表】

0906 0:30 v1.0 问题一、问题二的完整可运行代码,模型建立与求解这一部分的论文。 0906 5:20 v1.1 增加了第三问的完整可运行代码和第二、三问的“模型建立与求解”的论文。(即1-3问的代码、模型建立与求解、算法设计、结果分析) 1-4问完整可…

大数据-119 - Flink Window总览 窗口机制-滚动时间窗口-基于时间驱动基于事件驱动

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

java利用JXL操作excel

通过JXL操作Excel JXL是韩国人所著,目前停止更新,只支持xls格式,即2007之前的版本 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java…

[数据集][目标检测]玉米病害检测数据集VOC+YOLO格式6000张4类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6000 标注数量(xml文件个数):6000 标注数量(txt文件个数):6000 标注…

《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.18.1容器版分布式ACL集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统&…

[数据集][目标检测]街道乱放广告牌检测数据集VOC+YOLO格式114张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):114 标注数量(xml文件个数):114 标注数量(txt文件个数):114 标注类别…

【数据结构】顺序表和链表——顺序表(包含丰富算法题)

文章目录 1. 线性表2. 顺序表2.1 概念与结构2.2 分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现2.4 顺序表算法题2.4.1 移除元素2.4.2 删除有序数组中的重复项2.4.3 合并两个有序数组 2.5 顺序表问题与思考 1. 线性表 线性表(linear list)…

数据分析:R语言计算XGBoost线性回归模型的SHAP值

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍SHAP用途计算方法:应用加载R包导入数据数据预处理函数模型介绍 SHAP(SHapley Additive exPlanations)值是一种解释机器学习模型预测的方法。它基于博弈论中的Shapley值概念,…

Vulnhub:hacksudo2

靶机下载地址 信息收集 主机发现 nmap 192.168.31.0/24 -Pn -T4 靶机ip:192.168.31.188 端口扫描 nmap 192.168.31.188 -A -p- -T4 开放端口有80,111,1337(ssh),2049(nfs)。 目录扫描 访问http服务。 点击图片进入游戏。玩了一下没看到什么信息。 目录扫描。…

地理信息科学在考古学中的应用:GIS与遥感技术的时空穿梭之旅

在历史的长河中,每一片土地都承载着文明的记忆。随着科技的进步,地理信息科学(GIS)与遥感技术正逐渐揭开古老秘密的面纱,让沉睡千年的历史遗迹重新焕发光彩。今天,就让我们踏上一场穿越时空的旅程&#xff…

(一)使用Visual Studio创建ASP.NET Core WebAPI项目

1.创建webAPI项目 选择ASP.NET Core Web API项目模版(基于.Core框架可以支持多种系统环境,所以我们选择.Core框架),点下一步。 2.项目名称 项目名称设置为:CoreWebAPI,点下一步 3.选择框架 选择.NET6.0框…

人机融合智能中的计算不可约性

计算的不可约性 是计算理论和复杂性科学中的一个重要概念,主要由 计算机科学家 和 数学家 提出和研究。它指的是在某些系统或过程的模拟中,没有简化或有效的方式来预测其行为,而必须逐步进行每一步的计算来获得结果。 不可约性定义&#xff1…

结构开发笔记(七):solidworks软件(六):装配摄像头、摄像头座以及螺丝,完成摄像头结构示意图

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/141931518 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…