YOLOv10:实时端到端目标检测
YOLOv10的官方PyTorch实现。
与其他方法在延迟-精度(左)和大小-精度(右)权衡方面的比较。
YOLOv10:实时端到端目标检测。
王奥、陈辉、刘立浩、陈凯、林子嘉、韩军功和丁贵广
摘要
近年来,由于YOLO系列在计算成本和检测性能之间取得了有效平衡,它们已成为实时目标检测领域的主导范式。研究人员探索了YOLO的架构设计、优化目标、数据增强策略等方面,取得了显著进展。然而,对非极大值抑制(NMS)进行后处理的依赖阻碍了YOLO的端到端部署,并对推理延迟产生不利影响。此外,YOLO中各个组件的设计缺乏全面和深入的检查,导致明显的计算冗余并限制了模型的能力。这造成了次优的效率,同时存在相当大的性能改进潜力。在本工作中,我们旨在从后处理和模型架构两个方面进一步推进YOLO的性能效率边界。为此,我们首先提出了用于YOLO无NMS训练的一致双重分配,同时实现了具有竞争力的性能和低推理延迟。此外,我们引入了YOLO的整体效率-精度驱动的模型设计策略。我们从效率和精度两个角度全面优化了YOLO的各个组件,大大减少了计算开销并增强了能力。我们努力的成果是一个用于实时端到端目标检测的新一代YOLO系列,称为YOLOv10。大量实验表明,YOLOv10在各种模型规模上实现了最先进的性能和效率。例如,我们的YOLOv10-S在COCO上与RT-DETR-R18达到相似的AP的情况下速度提高了1.8倍,同时参数数量和FLOPs减少了2.8倍。与YOLOv9-C相比,YOLOv10-B在相同性能下延迟减少了46%,参数减少了25%。更新 🔥
- 2024/06/01:感谢ErlanggaYudiPradana集成了C++ | OpenVINO | OpenCV
- 2024/06/01:感谢NielsRogge和AK在HuggingFace Hub上托管模型!
- 2024/05/31:youjiang构建了yolov10-jetsonDocker镜像!
- 2024/05/31:感谢mohamedsamirx使用BoxMOT库集成了BoTSORT、DeepOCSORT、OCSORT、HybridSORT、ByteTrack、StrongSORT!
- 2024/05/31:感谢kaylorchen集成了rk3588!
- 2024/05/30:感谢eaidova集成了OpenVINO™!
- 2024/05/29:添加了用于本地运行模型的Gradio演示。感谢AK!
- 2024/05/27:感谢sujanshresstha集成了DeepSORT!
- 2024/05/26:感谢CVHub520将其集成到X-AnyLabeling中!
- 2024/05/26:感谢DanielSarmiento04集成了c++ | ONNX | OPENCV!
- 2024/05/25:添加了Transformers.js演示和ONNX权重(yolov10n/s/m/b/l/x)。感谢xenova!
- 2024/05/25:添加了Colab演示、HuggingFace演示和HuggingFace模型页面。感谢SkalskiP和kadirnar!
性能
COCO
模型 | 测试尺寸 | 参数量 | 浮点运算次数 | APval | 延迟 |
---|---|---|---|---|---|
YOLOv10-N | 640 | 2.3M | 6.7G | 38.5% | 1.84ms |
YOLOv10-S | 640 | 7.2M | 21.6G | 46.3% | 2.49ms |
YOLOv10-M | 640 | 15.4M | 59.1G | 51.1% | 4.74ms |
YOLOv10-B | 640 | 19.1M | 92.0G | 52.5% | 5.74ms |
YOLOv10-L | 640 | 24.4M | 120.3G | 53.2% | 7.28ms |
YOLOv10-X | 640 | 29.5M | 160.4G | 54.4% | 10.70ms |
安装
推荐使用conda
虚拟环境。
conda create -n yolov10 python=3.9
conda activate yolov10
pip install -r requirements.txt
pip install -e .
演示
python app.py
# 请访问 http://127.0.0.1:7860
验证
yolov10n
yolov10s
yolov10m
yolov10b
yolov10l
yolov10x
yolo val model=jameslahm/yolov10{n/s/m/b/l/x} data=coco.yaml batch=256
或者
from ultralytics import YOLOv10
model = YOLOv10.from_pretrained('jameslahm/yolov10{n/s/m/b/l/x}')
# 或者
# wget https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10{n/s/m/b/l/x}.pt
model = YOLOv10('yolov10{n/s/m/b/l/x}.pt')
model.val(data='coco.yaml', batch=256)
训练
yolo detect train data=coco.yaml model=yolov10n/s/m/b/l/x.yaml epochs=500 batch=256 imgsz=640 device=0,1,2,3,4,5,6,7
或者
from ultralytics import YOLOv10
model = YOLOv10()
# 如果你想使用预训练权重进行微调,可以像下面这样加载预训练权重
# model = YOLOv10.from_pretrained('jameslahm/yolov10{n/s/m/b/l/x}')
# 或者
# wget https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10{n/s/m/b/l/x}.pt
# model = YOLOv10('yolov10{n/s/m/b/l/x}.pt')
model.train(data='coco.yaml', epochs=500, batch=256, imgsz=640)
推送到 🤗 Hub
你可以选择将微调后的模型推送到 Hugging Face hub 作为公开或私有模型:
# 假设你已经为作物检测微调了一个模型
model.push_to_hub("<你的-hf-用户名-或-组织/yolov10-finetuned-crop-detection")
# 如果你不想让所有人都看到你的模型,你也可以传入 `private=True`
model.push_to_hub("<你的-hf-用户名-或-组织/yolov10-finetuned-crop-detection", private=True)
预测
注意,可以设置较小的置信度阈值来检测较小的物体或远处的物体。详情请参考这里。
yolo predict model=jameslahm/yolov10{n/s/m/b/l/x}
或者
from ultralytics import YOLOv10
model = YOLOv10.from_pretrained('jameslahm/yolov10{n/s/m/b/l/x}')
# 或者
# wget https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10{n/s/m/b/l/x}.pt
model = YOLOv10('yolov10{n/s/m/b/l/x}.pt')
model.predict()
导出
# 端到端 ONNX
yolo export model=jameslahm/yolov10{n/s/m/b/l/x} format=onnx opset=13 simplify
# 使用 ONNX 进行预测
yolo predict model=yolov10n/s/m/b/l/x.onnx
# 端到端 TensorRT
yolo export model=jameslahm/yolov10{n/s/m/b/l/x} format=engine half=True simplify opset=13 workspace=16
# 或者
trtexec --onnx=yolov10n/s/m/b/l/x.onnx --saveEngine=yolov10n/s/m/b/l/x.engine --fp16
# 使用 TensorRT 进行预测
yolo predict model=yolov10n/s/m/b/l/x.engine
或者
from ultralytics import YOLOv10
model = YOLOv10.from_pretrained('jameslahm/yolov10{n/s/m/b/l/x}')
# 或者
# wget https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10{n/s/m/b/l/x}.pt
model = YOLOv10('yolov10{n/s/m/b/l/x}.pt')
model.export(...)
致谢
代码库基于ultralytics和RT-DETR构建。
感谢这些出色的实现!
引用
如果我们的代码或模型对您的工作有所帮助,请引用我们的论文:
@article{wang2024yolov10,
title={YOLOv10: Real-Time End-to-End Object Detection},
author={Wang, Ao and Chen, Hui and Liu, Lihao and Chen, Kai and Lin, Zijia and Han, Jungong and Ding, Guiguang},
journal={arXiv preprint arXiv:2405.14458},
year={2024}
}