引言
YOLOv10 概述和使用自定义数据训练模型
概述
由清华大学的研究团队基于 Ultralytics Python 包研发的 YOLOv10,通过优化模型结构并去除非极大值抑制(NMS)环节,提出了一种创新的实时目标检测技术。这些改进不仅实现了行业领先的检测性能,还降低了对计算资源的需求。大量实验结果证明,YOLOv10 在不同规模的模型上都能提供卓越的准确率和延迟之间的平衡。
架构
- Backbone:在 YOLOv10 中,主干网络负责提取特征,它采用了改进版的 CSPNet(跨阶段部分网络),这一改进有助于优化梯度传播,并降低计算过程中的重复性。
- Neck:连接层的作用是整合不同尺度上的特征,并将它们传递给网络的输出部分。它内部集成了 PAN(路径聚合网络)层,以实现多尺度特征的有效融合。
- One-to-Many Head:在训练过程中,对于每个目标对象生成多个预测结果,这样做可以提供更多的监督信号,从而提升模型的学习精度。
- One-to-One Head:在推理过程中,对于每个目标对象生成单一的最佳预测结果,这样做可以省去 NMS(非极大值抑制)的步骤,减少处理时间,提高整体的效率。
模型变体和性能
YOLOv10 提供了六种不同规模的模型:
YOLOv10-N:纳米版,专为资源极其有限的场合设计。
YOLOv10-S:小型版,兼顾速度与准确性。
YOLOv10-M:中型版,适用于一般用途。
YOLOv10-B:平衡版,通过增加模型宽度来提升准确性。
YOLOv10-L:大型版,牺牲一定的计算资源以换取更高的准确性。
YOLOv10-X:超大型版,追求极致的准确性和性能表现。
性能比较
让我们看一下不同模型在延迟和准确性方面的比较,这些模型是在 COCO 等标准基准上进行测试的。
显然,YOLOv10 是实时物体检测应用的尖端技术,能够以更少的参数提供更高的精度和速度性能。
实战训练
首先,克隆官方 YOLOv10 GitHub 存储库以下载必要的 yolov10n 模型。
pip install -q git+https://github.com/THU-MIG/yolov10.git
wget -P -q https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10n.pt
您可以在 Roboflow Universe 平台上开展任何自定义项目,自行构建数据集,还可以利用 Intel 赞助的 RF100 数据集。在本文中,我将采用一个专为检测 X 射线图像中的可疑物品而设计好的数据集。
通过 Roboflow API,您可以下载以 YOLOv8 格式封装的模型。
!pip install -q roboflow
from roboflow import Roboflow
rf = Roboflow(api_key="your-api-key")
project = rf.workspace("vladutc").project("x-ray-baggage")
version = project.version(3)
dataset = version.download("yolov8")
指定参数和文件路径,然后开始模型训练。
!yolo task=detect mode=train epochs=25 batch=32 plots=True \
model='/content/-q/yolov10n.pt' \
data='/content/X-Ray-Baggage-3/data.yaml'
示例 data.yaml 文件
names:
- Gun
- Knife
- Pliers
- Scissors
- Wrench
nc: 5
roboflow:
license: CC BY 4.0
project: x-ray-baggage
url: https://universe.roboflow.com/vladutc/x-ray-baggage/dataset/3
version: 3
workspace: vladutc
test: /content/X-Ray-Baggage-3/test/images
train: /content/X-Ray-Baggage-3/train/images
val: /content/X-Ray-Baggage-3/valid/images
让我们看看结果。
Image(filename='/content/runs/detect/train/results.png', width=1000)
让我们预测测试数据并在 5x2 网格中显示结果。
from ultralytics import YOLOv10
model_path = '/content/runs/detect/train/weights/best.pt'
model = YOLOv10(model_path)
results = model(source='/content/X-Ray-Baggage-3/test/images', conf=0.25,save=True)
import glob
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
images = glob.glob('/content/runs/detect/predict/*.jpg')
images_to_display = images[:10]
fig, axes = plt.subplots(2, 5, figsize=(20, 10))
for i, ax in enumerate(axes.flat):
if i < len(images_to_display):
img = mpimg.imread(images_to_display[i])
ax.imshow(img)
ax.axis('off')
else:
ax.axis('off')
plt.tight_layout()
plt.show()