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

news2024/11/15 17:39:20

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)  # 转换成CHW
    image_data = image_data.astype(np.float32)
    image_data /= 255.0  # 归一化
    image_data = np.expand_dims(image_data, axis=0)  # 增加batch维度
    return image_data

def postprocess(output, image, input_size, show_size, classes):
    for detection in output:
        x1, y1, x2, y2, conf , class_id = detection
        if 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 image

def 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 = 0
    while True:
        ret, frame = cap.read()
        show_size = [320,240]

        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        current_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 time

input_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)  # red

def 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_box
        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)

        # Draw label and score
        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

# STEP 3: Initialize the video capture from the webcam.
cap = cv2.VideoCapture(0)
prev_time = 0

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    frame = 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 rate
    current_time = time.time()
    fps = 1 / (current_time - prev_time)
    prev_time = current_time
    fps_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.coloradmin.cn/o/2106984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

张飞硬件10-TVS管篇笔记

TVS管的原理 TVS或称瞬变电压抑制二极管,是在二极管工艺基础上发展起来的新产品,其电路符号和普通稳压管相同,外形也与普通二极管无异。当TVS管两端经受瞬间的高能量冲击时,它能以极高的速度将其阻抗骤然降低,同时吸收…

多账套场景下Oracle EBS 导入日记账时需要进行平衡段的校验

处理要进行COA的校验之外,还要进行账套配置这个地方,平衡段的校验,相关参参照关系见如下sql(Doc ID 943582.1): -- 1. SELECT *FROM gl_ledgersWHERE ledger_id &ledger_id;--2. SELECT *FROM gl_ledger_configurationsWHERE configurat…

JVM类的加载和类的加载器

JVM类的加载和类的加载器 一.类的加载过程 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于…

应用方案丨D02低功耗霍尔开关

1、概述 D02 是一款低功耗全极霍尔开关,用于检测施加的磁通量密度,并提供一个数字输出,该输出指示所感测磁通量幅度的当前状态。这些应用的一个例子是翻盖手机中的 ON/OFF 开关。微功耗设计特别适合电池供电系统,如手机或笔记本电…

附送试听地址!OpenAI ChatGPT被曝将新增8种语音!英特尔酷睿Ultra 200V正式发布|AI日报

文章推荐 如人类交流一样丝滑!讯飞星火版「Her」正式上线!成立仅16月的无问芯穹完成近5亿元A轮融资|AI日报 8款国内外免费AI生成视频工具对比实测!我们真的可以做到“一人搞定一部影视作品“吗? 今日热点 Sam Altm…

图像指定领域随机变换

资料生成和模型训练 图像指定领域随机变换 在计算机视觉领域中,除了瑕疵、灯光和场景随机变换外,还有许多其他常见的随机变换方法,可以帮助增强数据集的多样性和模型的泛化能力。以下是一些常见的随机变换: 1.随机剪切&#xf…

课堂教学行为时间序列分析-学生教师

https://github.com/Whiffe/SCB-dataset/tree/main/EvaluationMethod/behavior_analysis 在使用SCB模型对学生-教师行为检测后,以下是我们的检测数据: 每个行为如answer: "[0,1,1,1,0,1,0,1,… 长度是一个视频的长度(单位为秒&#xff…

UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件…

2024年【危险化学品生产单位主要负责人】考试及危险化学品生产单位主要负责人证考试

题库来源:安全生产模拟考试一点通公众号小程序 2024年【危险化学品生产单位主要负责人】考试及危险化学品生产单位主要负责人证考试,包含危险化学品生产单位主要负责人考试答案和解析及危险化学品生产单位主要负责人证考试练习。安全生产模拟考试一点通…

python无法连接SQL SERVER问题解决

python无法连接SQL SERVER问题解决 问题描述处理方法 问题描述 在使用pymssql实现对SQL server的访问,使用的代码如下: import pymssql server WIN-20240824UWC\\SQLEXPRESS user sa password 123456 database easyMES conn pymssql.connect(ser…

【C++ Primer Plus习题】11.1

问题: 解答: main.cpp #include <iostream> #include <fstream> #include "Vector.h" #include <time.h> using namespace std; using namespace VECTOR;int main() {ofstream fout;fout.open("randwalk.txt");srand(time(0));double d…

file | 某文件夹【解耦合】下的文件查找功能实现及功能单元测试

文件查找工具 概要思路OS模块 --- 学习版os.getcwd()os.path.dirname(os.getcwd())os.path.dirname() 和 os.path.basename() OS模块 — 实战版单元测试解耦合 概要 梳理业务主逻辑&#xff1a; 查看存放被采集JSON数据的文件夹内的文件列表【所有 包含文件夹下的文件夹下的文…

idea添加本地环境执行模版

用Flink的环境执行时&#xff0c;因为最后会打包放服务器&#xff0c;所以有些jar包将不会打包上传&#xff0c;这些jar包用<scope>provided</scope>标记 所以这些jar包在本地运行时也会不提供&#xff0c;为了程序在本地能跑&#xff0c;我们每次执行是需手动添加…

2024跨境必备的软件-产品优化AI智能工具,支持Shopee、TikTok Shop、TEMU、Lazada等

卖家朋友们&#xff0c;你是否还在用图片优化软件一张张修改产品图&#xff1f;改完还要绞尽脑汁思考如何才能写出爆款Listing&#xff1f;接着又要继续头疼图片翻译等问题&#xff1f; 一个产品优化完至少需要两三个小时&#xff0c;尤其对于多平台多站点的卖家朋友来说&…

利用正则表达式从字符串中提取浮点数

在 Python 中&#xff0c;使用正则表达式可以非常方便地从字符串中提取浮点数。Python 的 re 模块提供了正则表达式支持。下面是如何使用正则表达式提取浮点数的示例。 1、问题背景 在开发过程中&#xff0c;有时候我们需要从字符串中提取浮点数&#xff0c;例如从 HTML 代码中…

vs2022 如何去掉 错误|警告的波形曲线 绿色波浪线

如图&#xff1a; 去不去都一样&#xff0c;只是看着不舒服&#xff0c;相当不爽 工具→选项→文本编辑器→显示错误波形曲线&#xff0c;把前的√去掉&#xff0c;按确定 清爽多了&#xff0c;虽然没啥卵用 。。。

泛微OA主流程节点设置子流程归档后主流程自动跳转下一个节点,子流程已归档主流程不自动跳转

⭐️如果对你有用的话&#xff0c;希望可以点点赞&#xff0c;感谢了⭐️ 主流程节点已设置触发的子流程归档后自动跳转下个节点 当子流程归档后主流程不自动跳转下个节点 是什么问题&#xff1f; 主流程节点中存在必填字段中有空值&#xff0c;需要检查主流程节点排查把空值…

MSSQL数据库安全配置

预备知识 1、数据库安全的概念 对任何企业组织来说,数据的安全性最为重要。安全性主要是指允许那些具有相应的数据访问权限的用户能够登录到数据库,并访问数据以及对数据库对象实施各种权限范围内的操作,但是要拒绝所有的非授权用户的非法操作。因此安全性管理与用户管理是…

开学季好物分享!揭秘学霸们都在用的神器

一年一度的大学入学又开始了&#xff0c;一群充满朝气&#xff0c;怀着好奇的准大学生准备步入大学的校园。每次开学都看到大家拎着大包小包的行李&#xff0c;开学后快递站山人山海&#xff0c;看完这篇开学季好物分享&#xff01;揭秘学霸们都在用的神器&#xff0c;教你快人…

满誉而归 | 2024物联网IOTE展·人工智能AGIC展完美收官

引言&#xff1a; 随着物联网技术的飞速发展&#xff0c;2024年深圳物联网IOTE展会成为了全球科技界瞩目的焦点。北京宇音天下科技有限公司作为语音技术领域的先锋&#xff0c;公司在此次展会上展出了多款创新产品和解决方案&#xff0c;旨在通过尖端科技&#xff0c;推动智能生…