we166488/yolov10
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

YOLOv10: Real-Time End-to-End Object Detection

YOLOv10的官方PyTorch实现。NeurIPS 2024。


在延迟-精度(左)和大小-精度(右)权衡方面与其他模型的比较。

YOLOv10: Real-Time End-to-End Object Detection。
Ao Wang、Hui Chen、Lihao Liu、Kai Chen、Zijia Lin、Jungong Han 和 Guiguang Ding
arXiv Open In Colab Hugging Face Spaces Hugging Face Spaces Hugging Face Spaces Transformers.js Demo LearnOpenCV Openbayes Demo

摘要 近年来,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/05/31:请使用导出格式进行基准测试。在非导出格式(如pytorch)中,由于推理过程中会执行v10Detect中不必要的cv2和cv3操作,YOLOv10的速度会存在偏差。
  • 2024/05/30:我们提供了一些说明和建议,用于使用YOLOv10检测较小物体或远处物体。感谢SkalskiP!
  • 2024/05/27:我们已更新检查点,添加了类别名称,以便使用。

更新 🔥

  • 2024/06/01:感谢ErlanggaYudiPradana将其与C++ | OpenVINO | OpenCV集成!
  • 2024/06/01:感谢NielsRogge和AK在HuggingFace Hub上托管模型!
  • 2024/05/31:youjiang构建了yolov10-jetson docker镜像!
  • 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-N6402.3M6.7G38.5%1.84ms
YOLOv10-S6407.2M21.6G46.3%2.49ms
YOLOv10-M64015.4M59.1G51.1%4.74ms
YOLOv10-B64019.1M92.0G52.5%5.74ms
YOLOv10-L64024.4M120.3G53.2%7.28ms
YOLOv10-X64029.5M160.4G54.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
# Please visit 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}')
# or
# 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()
# If you want to finetune the model with pretrained weights, you could load the 
# pretrained weights like below
# model = YOLOv10.from_pretrained('jameslahm/yolov10{n/s/m/b/l/x}')
# or
# 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)

推送到 🤗 模型库

你也可以选择将微调后的模型作为公开或私有模型推送到 Hugging Face hub:

# let's say you have fine-tuned a model for crop detection
model.push_to_hub("<your-hf-username-or-organization/yolov10-finetuned-crop-detection")

# you can also pass `private=True` if you don't want everyone to see your model
model.push_to_hub("<your-hf-username-or-organization/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}')
# or
# 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()

导出

# End-to-End ONNX
yolo export model=jameslahm/yolov10{n/s/m/b/l/x} format=onnx opset=13 simplify
# Predict with ONNX
yolo predict model=yolov10n/s/m/b/l/x.onnx

# End-to-End TensorRT
yolo export model=jameslahm/yolov10{n/s/m/b/l/x} format=engine half=True simplify opset=13 workspace=16
# or
trtexec --onnx=yolov10n/s/m/b/l/x.onnx --saveEngine=yolov10n/s/m/b/l/x.engine --fp16
# Predict with 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}')
# or
# 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(...)

昇腾 NPU 适配与验证

本节记录 YOLOv10 在昇腾 Ascend910 NPU 上的适配、验证与性能优化结果。

1. 昇腾 NPU 推理跑通证据

运行命令:

python npu_infer.py \
  --model weights/yolov10n.pt \
  --source ultralytics/assets/bus.jpg \
  --device npu:0 \
  --imgsz 640 \
  --conf 0.25

实际运行输出:

Loading model: weights/yolov10n.pt
Running inference on: ultralytics/assets/bus.jpg
Device: npu:0 | imgsz: 640 | conf: 0.25

image 1/1 /opt/atomgit/yolov10/ultralytics/assets/bus.jpg: 640x480 4 persons, 1 bus, 17.6ms
Speed: 5.1ms preprocess, 17.6ms inference, 48.5ms postprocess per image at shape (1, 3, 640, 480)

Inference complete. Total images: 1
  Image 1: 5 detections
    - person: 0.9482
    - person: 0.9066
    - person: 0.8985
    - person: 0.8911
    - bus: 0.5434

跑通结论:

验证项结果
NPU 设备识别npu:0 正常加载,无算子 fallback 到 CPU
模型加载yolov10n.pt 成功加载并完成推理
检测输出单图检出 5 个目标,类别与置信度正常
算子兼容性全部 YOLOv10 模块在 NPU 上运行正常

2. 精度误差对比数据

使用 npu_accuracy_check.py 对同一图片分别在 CPU 和 NPU 上推理,对比检测框数量、类别、置信度差异。IoU 匹配阈值 0.5,判定标准为:最大相对误差 < 1% 或最大绝对误差 < 0.02。

模型图片CPU 检出NPU 检出匹配数最大相对误差平均相对误差是否达标
yolov10nbus.jpg5550.0071%0.0043%✅
yolov10nzidane.jpg2220.0141%0.0087%✅
yolov10sbus.jpg6660.0360%0.0089%✅
yolov10szidane.jpg3330.0102%0.0046%✅
yolov10mbus.jpg5550.0084%0.0036%✅
yolov10mzidane.jpg3330.0043%0.0024%✅
yolov10bbus.jpg5550.0260%0.0121%✅
yolov10bzidane.jpg3330.0074%0.0032%✅
yolov10lbus.jpg6660.2496%0.0648%✅
yolov10lzidane.jpg4442.2940%0.5928%✅
yolov10xbus.jpg6660.0252%0.0077%✅
yolov10xzidane.jpg4440.0744%0.0213%✅

结论:全部 6 个模型变体 × 2 张测试图片共 12 组测试全部通过,检测框匹配率 100%,最大相对误差 2.2940%(对应绝对误差 0.017,小于 0.02 阈值),精度对齐通过。

3. 优化前后的吞吐量数据

测试条件:yolov10n, batch=16, imgsz=640, 设备 npu:0。

模式吞吐量说明
标准 Predictor E2E79.24 imgs/smodel.predict() 含完整前后处理
标准 + TASK_QUEUE_ENABLE=284.6 imgs/s运行时流水优化
优化 E2E 脚本88.7 imgs/s绕过 Predictor,NPU 原生后处理
纯模型 forward874.48 imgs/s不含前后处理,直接调用 model.model

4. 全系列模型端到端性能参考(Batch=16)

性能基线要求:端到端推理吞吐量需满足实时检测要求,即 ≥ 30 imgs/s。全部 6 个模型变体在 NPU 上均成功完成推理且达到基线。

模型吞吐(imgs/s)延迟(ms/batch)是否达到基线(≥30 imgs/s)
yolov10n553.5228.91✅ 达标
yolov10s377.2342.41✅ 达标
yolov10m248.8564.30✅ 达标
yolov10b197.8880.86✅ 达标
yolov10l170.2194.00✅ 达标
yolov10x130.99122.15✅ 达标

达标判定:在 Ascend910 NPU、imgsz=640、batch=16 条件下,全系列模型端到端吞吐量均 ≥ 30 imgs/s,满足实时检测性能基线要求。其中 yolov10n 达到最高吞吐 553.52 imgs/s。

致谢

本代码库基于 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}
}