前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >YOLOv10在PyTorch和OpenVINO中推理对比

YOLOv10在PyTorch和OpenVINO中推理对比

作者头像
Color Space
发布2024-06-21 16:35:00
2180
发布2024-06-21 16:35:00
举报

视觉/图像重磅干货,第一时间送达!

导 读

本文主要介绍如何将YOLOv10模型转为OpenVINO支持的模型并做推理时间对比。

YOLOv10简介

YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上,引入了一种新的实时目标检测方法,解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑制(NMS)和优化各种模型组件,YOLOv10 在显著降低计算开销的同时实现了最先进的性能。大量实验证明,YOLOv10 在多个模型尺度上实现了卓越的精度-延迟权衡。

概述

实时目标检测旨在以较低的延迟准确预测图像中的物体类别和位置。YOLO 系列在性能和效率之间取得了平衡,因此一直处于这项研究的前沿。然而,对 NMS 的依赖和架构上的低效阻碍了最佳性能的实现。YOLOv10 通过为无 NMS 训练引入一致的双重分配和以效率-准确性为导向的整体模型设计策略,解决了这些问题。

网络架构

YOLOv10 的结构建立在以前YOLO 模型的基础上,同时引入了几项关键创新。模型架构由以下部分组成:

  • 主干网:YOLOv10 中的主干网负责特征提取,它使用了增强版的 CSPNet(跨阶段部分网络),以改善梯度流并减少计算冗余。
  • 颈部:颈部设计用于汇聚不同尺度的特征,并将其传递到头部。它包括 PAN(路径聚合网络)层,可实现有效的多尺度特征融合。
  • 一对多头:在训练过程中为每个对象生成多个预测,以提供丰富的监督信号并提高学习准确性。
  • 一对一头:在推理过程中为每个对象生成一个最佳预测,无需 NMS,从而减少延迟并提高效率。

主要功能

  • 无 NMS 训练:利用一致的双重分配来消除对 NMS 的需求,从而减少推理延迟。
  • 整体模型设计:从效率和准确性的角度全面优化各种组件,包括轻量级分类头、空间通道去耦向下采样和等级引导块设计。
  • 增强的模型功能:纳入大核卷积和部分自注意模块,在不增加大量计算成本的情况下提高性能。

模型支持:

YOLOv10 有多种模型,可满足不同的应用需求:

  • YOLOv10-N:用于资源极其有限环境的纳米版本。
  • YOLOv10-S:兼顾速度和精度的小型版本。
  • YOLOv10-M:通用中型版本。
  • YOLOv10-B:平衡型,宽度增加,精度更高。
  • YOLOv10-L:大型版本,精度更高,但计算资源增加。
  • YOLOv10-X:超大型版本可实现最高精度和性能。

性能

在准确性和效率方面,YOLOv10 优于YOLO 以前的版本和其他最先进的模型。例如,在 COCO 数据集上,YOLOv10-S 的速度是RT-DETR-R18 的 1.8 倍,而 YOLOv10-B 与 YOLOv9-C 相比,在性能相同的情况下,延迟减少了 46%,参数减少了 25%。下图是使用TensorRT FP16 在T4 GPU上的测试结果:

实验和结果

YOLOv10 在 COCO 等标准基准上进行了广泛测试,显示出卓越的性能和效率。与以前的版本和其他当代探测器相比,YOLOv10 在延迟和准确性方面都有显著提高。

YOLO模型转OpenVINO

首先我们需要进行必要的安装:

代码语言:javascript
复制
pip install git+https://github.com/THU-MIG/yolov10.git
pip install openvino openvino-dev

通过这些命令,必要的库的安装就完成了。

现在我们需要将PyTorch格式的YOLO模型转换为OpenVINO IR格式。但为此,常用的 Ultralytics 导出命令会显示某些错误。这是由于层差异造成的。那么我们如何进行这种转换呢?

如果您尝试使用标准导出命令进行转换,则在 ONNX 后转换为 IR 格式时会出现这样的错误:

那么我们如何解决这个问题呢?首先,对于 Ubuntu,我们需要在安装上述库后更新 PATH。这完全因计算机而异。因此,如果用户已经添加了此路径:

代码语言:javascript
复制
/home/root/.local/bin

添加到 PATH,不会出现任何问题。但是,如果没有,则会出现以下警告。

代码语言:javascript
复制
WARNING: The scripts ultralytics and yolo are installed in ‘/home/root/.local/bin’ which is not on PATH.

这将导致进程失败。为此,必须先调整 PATH 设置。

只需使用以下命令即可轻松解决此问题。

代码语言:javascript
复制
export PATH=$PATH:/home/root/.local/bin

但如果我们希望它持久化,我们可以使用 .bashrc

代码语言:javascript
复制
nano ~/.bashrc

在用此命令打开的文件的底行中:

代码语言:javascript
复制
export PATH=$PATH:/home/root/.local/bin

添加此行后,我们的 PATH 现在将变为永久的。最后,我们使用 source 命令更新我们的 bash 文件。

代码语言:javascript
复制
source ~/.bashrc

现在我们可以进行转换了。

首先你需要从这个地址下载你想要使用的模型并且把它放到python代码将要运行的文件夹中。

代码语言:javascript
复制
https://github.com/THU-MIG/yolov10/releases/tag/v1.1?source=post_page-----e798eed252f8--------------------------------
代码语言:javascript
复制
import types
from ultralytics.utils import ops
from ultralytics import YOLOv10
import torch

def v10_det_head_forward(self, x):
    one2one = self.forward_feat([xi.detach() for xi in x], self.one2one_cv2, self.one2one_cv3)
    if not self.export:
        one2many = super().forward(x)

    if not self.training:
        one2one = self.inference(one2one)
        if not self.export:
            return {"one2many": one2many, "one2one": one2one}
        else:
            assert self.max_det != -1
            boxes, scores, labels = ops.v10postprocess(one2one.permute(0, 2, 1), self.max_det, self.nc)
            return torch.cat(
                [boxes, scores.unsqueeze(-1), labels.unsqueeze(-1).to(boxes.dtype)],
                dim=-1,
            )
    else:
        return {"one2many": one2many, "one2one": one2one}
model = YOLOv10("yolov10n.pt")
model.model.model[-1].forward = types.MethodType(v10_det_head_forward, model.model.model[-1])
model.export(format="openvino", dynamic=True ,half=True)

执行此命令后,我们导出的模型将在同一目录中创建,名称为yolov10n_openvino_model。现在只需使用它!

OpenVINO VS PyTorch

现在让我们做简单的性能比较!

在我的计算机上,配备 Intel(R) Core(TM) i7–7560U CPU @ 2.40GHz,我将首先使用 PyTorch 格式的模型,即 640x640 和 Half,即 fp16

代码语言:javascript
复制
from ultralytics import YOLOv10
model = YOLOv10("yolov10n.pt")
model.predict(source=0, imgsz=640, show=True)

使用此命令,我首先使用 PyTorch 运行模型,结果如下:

单帧测试时间 70~100ms。那么使用 OpenVINO 会如何呢?

单帧测试时间 40~50ms。这个性能非常棒!

但重点是,要使用 Ultralytics API 来使用该模型,必须在导出命令中将 dynamic 选择为 True。否则将产生错误的推理结果。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档