Yolo系列再次更新——清华发布Yolov10端到端实时对象检测模型

智能也得细细瞧 2024-06-04 12:22:35

前期我们刚介绍过Yolo系列模型,还以为发布,也许今年不会再有什么更新。但是没有想到打脸如此之快,Yolov10端到端实时对象检测模型强势回归发布。

Yolov10端到端实时对象检测

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

模型框架

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

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

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

主要功能设计:

无 NMS 训练:利用一致的双重分配来消除对 NMS 的需求,从而减少推理延迟。整体模型设计:从效率和准确性的角度全面优化各种组件,包括轻量级分类头、空间通道去耦向下采样和等级引导块设计。增强的模型功能:纳入大核卷积和部分自注意模块,在不增加大量计算成本的情况下提高性能。轻量级分类头:通过使用深度可分离卷积,减少分类头的计算开销。空间信道解耦向下采样:将空间缩减与信道调制解耦,最大限度地减少信息损失和计算成本。梯级引导程序块设计:根据固有阶段冗余调整模块设计,确保参数的最佳利用。

YOLOv10 多种型号对比

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

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

yolov10性能对比

YOLOv10 采用双重标签分配,在训练过程中将一对多和一对一策略结合起来,以确保丰富的监督和高效的端到端部署。一致匹配度量使两种策略之间的监督保持一致,从而提高了推理过程中的预测质量。YOLOv10 在 COCO 等标准基准上进行了广泛测试,显示出卓越的性能和效率。与以前的版本和其他当代探测器相比,YOLOv10 在延迟和准确性方面都有显著提高。

在准确性和效率方面,YOLOv10 优于YOLO 以前的版本和其他最先进的模型。例如,在 COCO 数据集上,YOLOv10-S 的速度是RT-DETR-R18 的 1.8 倍,而 YOLOv10-B 与 YOLOv9-C 相比,在性能相同的情况下,延迟减少了 46%,参数减少了 25%。YOLOv10-S / X 比RT-DETR-R18 / R101 快 1.8 倍 / 1.3 倍,精度相似。在精度相同的情况下,YOLOv10-B 比 YOLOv9-C 减少了 25% 的参数,延迟时间缩短了 46%。YOLOv10-L / X 的性能比YOLOv8-L / X 高 0.3 AP / 0.5 AP,参数少 1.8× / 2.3×。

yolov10与其他模型对比

Yolov10端到端实时对象检测代码实现

在执行yolov10代码前,首先需要安装yolov10代码库,并下载相关的预训练模型,模型提供6个尺寸大小的预训练模型供开发者下载使用,其代码实现如下:

import osHOME = os.getcwd()print(HOME)!pip install -q git+https://github.com/THU-MIG/yolov10.git!pip install -q supervision !mkdir -p {HOME}/weights!wget -P {HOME}/weights -q https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10n.pt#!wget -P {HOME}/weights -q https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10s.pt#!wget -P {HOME}/weights -q https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10m.pt#!wget -P {HOME}/weights -q https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10b.pt#!wget -P {HOME}/weights -q https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10x.pt#!wget -P {HOME}/weights -q https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10l.pt!ls -lh {HOME}/weights

下载完成后,可以加载一张需要对象检测的图片或者视频,这里把图片或者视频放在home文件夹下的data文件夹下,当然图片可以放置在任何位置,只需要提供正确的文件位置即可。然后就可以使用命令行执行对象检测了,其中需要提供模型的预训练权重与需要对象检测的图片,其中task为detect对象检测任务,mode为预测,conf为检测置信度,save为是否保存对象检测的结果。

!mkdir -p {HOME}/data!ls -lh {HOME}/data%cd {HOME}!yolo task=detect mode=predict conf=0.25 save=True \model={HOME}/weights/yolov10n.pt \source={HOME}/data/dog.jpeg

运行以上代码,模型会自动执行对象检测任务,并把检测结果图片放置在如下文件夹下。当然可以直接打开文件夹查看图片执行效果。

runs/detect/predict/

对象检测结果

当然yolov10对象检测模型已经集成到了ultralytics里面,可以直接使用ultralytics来使用yolov10对象检测模型,其代码实现如下:

from ultralytics import YOLOv10model = YOLOv10(f'weights/yolov10n.pt')results = model(source=f'data/demo.jpeg', conf=0.25)

执行完成后,其结果保存在result中,可以打出对象的坐标,置信度以及对象标签。

results[0].boxes.xyxy#坐标tensor([[6.7041e+01, 2.5264e+02, 6.4549e+02, 9.6621e+02],[7.4646e-01, 3.4156e+02, 5.4170e+02, 1.2773e+03]], device='cuda:0')results[0].boxes.conf#置信度tensor([0.5090, 0.3536], device='cuda:0')results[0].boxes.cls#标签索引tensor([16., 0.], device='cuda:0') Properties: xyxy (torch.Tensor | numpy.ndarray): Boxes in [x1, y1, x2, y2] format. conf (torch.Tensor | numpy.ndarray): Confidence scores for each box. cls (torch.Tensor | numpy.ndarray): Class labels for each box. id (torch.Tensor | numpy.ndarray, optional): Tracking IDs for each box, if available. xywh (torch.Tensor | numpy.ndarray): Boxes in [x, y, width, height] format, calculated on demand. xyxyn (torch.Tensor | numpy.ndarray): Normalized [x1, y1, x2, y2] boxes, relative to `orig_shape`. xywhn (torch.Tensor | numpy.ndarray): Normalized [x, y, width, height] boxes, relative to `orig_shape`. Methods: cpu(): Moves the boxes to CPU memory. numpy(): Converts the boxes to a numpy array format. cuda(): Moves the boxes to CUDA (GPU) memory. to(device, dtype=None): Moves the boxes to the specified device.

yolov10对象检测结果

当然也可以使用可视化工具,把置信度,标签,坐标等信息标注到对象检测的图片上,其完整代码如下:

import cv2import supervision as svfrom ultralytics import YOLOv10model = YOLOv10(f'weights/yolov10n.pt')image = cv2.imread(f'data/demo.jpeg')results = model(image)[0]detections = sv.Detections.from_ultralytics(results)bounding_box_annotator = sv.BoundingBoxAnnotator()label_annotator = sv.LabelAnnotator()annotated_image = bounding_box_annotator.annotate( scene=image, detections=detections)annotated_image = label_annotator.annotate( scene=annotated_image, detections=detections)sv.plot_image(annotated_image)

也可以执行使用ultralytics进行对象的检测与对象的显示结果,其代码实现如下:

yolov10对象检测结果

from ultralytics import YOLOmodel = YOLO("yolov10n.pt")results = model("image.jpg")results[0].show()

仅仅4行代码就可以执行yolov10对象检测代码,当然这里检测的只是图片,其model函数里面可以直接传递一个视频,或者打开摄像头,传递实时的对象检测视频。

对象检测结果

无论是速度还是精度,其yolov10在与其他yolo系列对比都有了一定的提升,相信后期yolo系列的更新,将会带来更多的惊喜。

https://github.com/THU-MIG/yolov10https://huggingface.co/spaces/Xenova/yolov10-webhttps://github.com/THU-MIG/yolov10?tab=readme-ov-file

当然hugging face上面上线了demo体验,可以直接在hugging face上面直接体验yolov10对象检测模型。

0 阅读:0

智能也得细细瞧

简介:感谢大家的关注