模型训练篇 | yolov10来了!手把手教你如何用yolov10训练自己的数据集(含网络结构 + 模型训练 + 模型推理等)

时间:2024-11-23 07:00:12

前言:Hello大家好,我是小哥谈。YOLOv9还没捂热乎,YOLOv10就推出来了,太卷了,太快了,坐等YOLOv9000!自今年2月YOLOv9发布之后, YOLO(You Only Look Once)系列的接力棒传到了清华大学研究人员的手上。YOLOv10推出的消息引发了AI界的关注,它被认为是计算机视觉领域的突破性框架,以实时的端到端目标检测能力而闻名,通过提供结合效率和准确性的强大解决方案,延续了YOLO系列的传统。新版本发布之后,很多人已经进行了部署测试,效果不错,本节课就带领大家如何基于YOLOv10训练模型并推理测试!~????

     目录

????1.算法介绍

????2.网络结构

????3.数据标注

????4.模型训练

第1步:准备数据集

第2步:创建yaml文件

第3步:下载预训练权重

第4步:新建Python文件

第5步:调节参数

第6步:开始训练

????5.模型推理

????6.导出模型

????7.本节总结

????1.算法介绍

在我们深入探讨YOLOv10之前,让我们回顾一下YOLO的发展历程。YOLO在实时目标检测领域一直是先驱,兼顾速度准确性。从YOLOv1到YOLOv9,每个版本在架构、优化和数据增强方面都引入了显著的改进。然而,随着模型的发展,某些限制依然存在,特别是对后处理依赖非极大值抑制(NMS),这会减慢推理速度。YOLOv10正面解决了这些挑战,使其成为实时应用中稳健高效的模型。

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

YOLOv10亮点:

  1. 无 NMS 设计:利用一致的双重分配来消除对NMS的需求,从而减少推理延迟。

  2. 整体模型设计:从效率和准确性的角度全面优化各种组件,包括轻量级分类头、空间通道去耦向下采样和等级引导块设计。

  3. 增强的模型功能:纳入大核卷积和部分自注意模块,在不增加大量计算成本的情况下提高性能。

自从Ultralytics发布YOLOv5以来,我们已经习惯了每次YOLO发布时提供各种模型尺寸:nanosmallmediumlargexlarge。YOLOv10也不例外,清华大学的研究人员也提供了一系列预训练模型,可以用于各种目标检测任务。

所有这些模型在延迟和平均精度(AP)方面表现出优于之前YOLO版本的性能,如下图所示:

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

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

论文题目:《YOLOv10: Real-Time End-to-End Object Detection》

论文地址:  /pdf/2405.14458

代码实现:  GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection

关于YOLOv10的完整源码+权重文件,作者已经上传至我的“资源”中,大家可自行下载。

或者,可通过百度网盘下载。

链接:/s/1ED95U7zYoq3QQ6ViCl86rQ?pwd=k75s 
提取码:k75s 
--来自百度网盘超级会员V4的分享

 备注:上述源码作者已测试成功。


????2.网络结构

关于YOLOv10的网络结构图具体如下图所示:

备注:后续关于改进就是基于上述YOLOv10网络结构图,请大家提前熟悉其基础组件。 


????3.数据标注

利用labelimg或者make sense软件来标注数据,关于如何使用labelimg或者make sense软件来为自己的数据集打上标签,请参考作者专栏文章:????

说明:♨️♨️♨️

数据标注工具的使用教程:

YOLOv5入门实践(1)— 手把手教你使用labelimg标注数据集(附安装包+使用教程)

YOLOv5入门实践(2)— 手把手教你使用make sense标注数据集(附工具地址+使用教程)


????4.模型训练

第1步:准备数据集

将数据集放在datasets文件夹中。datasets属于放置数据集的地方,位于PycharmProjects中,C:\Users\Lenovo\PycharmProjects(这是我的电脑位置,跟你的不一定一样,反正位于PycharmProjects中,如果没有,可自行创建),属于项目的同级文件夹。

具体如下图所示:

打开datasets文件夹,可以看到本次安全帽训练所使用的数据集。

安全帽佩戴检测数据集是我手动标注好的,可以在我的博客“资源”中下载。

打开数据集文件,我们会看到数据集文件包括imageslabels两个文件夹,其中,images放的是数据集图片,包括trainval两个文件夹,labels放的是经过labelimg标注所生成的标签,也包括trainval两个文件夹。

关于此处数据集的逻辑关系,用一张图总结就是:⬇️⬇️⬇️

第2步:创建yaml文件

打开pycharm,选择yolov10-main项目源码文件,在datasets下新建一个,具体位置是ultralytics/cfg/datasets,如下图所示:????

打开,其内容如下:

  1. # Train/val
  2. train: C:\Users\Lenovo\PycharmProjects\datasets\SafetyHelmetWearingDataset\images\train
  3. val: C:\Users\Lenovo\PycharmProjects\datasets\SafetyHelmetWearingDataset\images\val
  4. test: # test images
  5. # Classes
  6. nc: 2 # number of classes
  7. names: ['helmet','nohelmet']

说明:♨️♨️♨️

1.trainval为绝对路径地址,可根据自己数据集的路径地址自行设置。

2.nc指的是分类,即模型训练结果分类,此处为在用labelimg或者make sense为数据集标注时候确定。

3.由于本次进行的是安全帽佩戴检测模型训练,所以分两类,分别是:helmet(佩戴安全帽)nohelmet(不佩戴安全帽)

打开文件,可以看到里面写的是相对路径,和我们的写法不同,但是都可以使用,据我所知还有很多种数据集读取方式:

  1. # Ultralytics YOLO ????, AGPL-3.0 license
  2. # COCO 2017 dataset by Microsoft
  3. # Documentation: /datasets/detect/coco/
  4. # Example usage: yolo train data=
  5. # parent
  6. # ├── ultralytics
  7. # └── datasets
  8. # └── coco ← downloads here (20.1 GB)
  9. # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
  10. path: ../datasets/coco # dataset root dir
  11. train: # train images (relative to 'path') 118287 images
  12. val: # val images (relative to 'path') 5000 images
  13. test: # 20288 of 40670 images, submit to /competitions/20794
  14. # Classes
  15. names:
  16. 0: person
  17. 1: bicycle
  18. 2: car
  19. 3: motorcycle
  20. 4: airplane
  21. 5: bus
  22. 6: train
  23. 7: truck
  24. 8: boat
  25. 9: traffic light
  26. 10: fire hydrant
  27. 11: stop sign
  28. 12: parking meter
  29. 13: bench
  30. 14: bird
  31. 15: cat
  32. 16: dog
  33. 17: horse
  34. 18: sheep
  35. 19: cow
  36. 20: elephant
  37. 21: bear
  38. 22: zebra
  39. 23: giraffe
  40. 24: backpack
  41. 25: umbrella
  42. 26: handbag
  43. 27: tie
  44. 28: suitcase
  45. 29: frisbee
  46. 30: skis
  47. 31: snowboard
  48. 32: sports ball
  49. 33: kite
  50. 34: baseball bat
  51. 35: baseball glove
  52. 36: skateboard
  53. 37: surfboard
  54. 38: tennis racket
  55. 39: bottle
  56. 40: wine glass
  57. 41: cup
  58. 42: fork
  59. 43: knife
  60. 44: spoon
  61. 45: bowl
  62. 46: banana
  63. 47: apple
  64. 48: sandwich
  65. 49: orange
  66. 50: broccoli
  67. 51: carrot
  68. 52: hot dog
  69. 53: pizza
  70. 54: donut
  71. 55: cake
  72. 56: chair
  73. 57: couch
  74. 58: potted plant
  75. 59: bed
  76. 60: dining table
  77. 61: toilet
  78. 62: tv
  79. 63: laptop
  80. 64: mouse
  81. 65: remote
  82. 66: keyboard
  83. 67: cell phone
  84. 68: microwave
  85. 69: oven
  86. 70: toaster
  87. 71: sink
  88. 72: refrigerator
  89. 73: book
  90. 74: clock
  91. 75: vase
  92. 76: scissors
  93. 77: teddy bear
  94. 78: hair drier
  95. 79: toothbrush
  96. # Download script/URL (optional)
  97. download: |
  98. from import download
  99. from pathlib import Path
  100. # Download labels
  101. segments = True # segment or box labels
  102. dir = Path(yaml['path']) # dataset root dir
  103. url = '/ultralytics/yolov5/releases/download/v1.0/'
  104. urls = [url + ('' if segments else '')] # labels
  105. download(urls, dir=dir.parent)
  106. # Download data
  107. urls = ['/zips/', # 19G, 118k images
  108. '/zips/', # 1G, 5k images
  109. '/zips/'] # 7G, 41k images (optional)
  110. download(urls, dir=dir / 'images', threads=3)
第3步:下载预训练权重

打开YOLOv10官方仓库地址,可以根据需要下载相应的预训练权重。

预训练权重下载地址:

GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection

下载完毕后,在主目录下新建weights文件夹(如果已存在,就不需要新建,直接使用即可),然后将下载的权重文件放在weights文件夹下。具体如下图所示:????

第4步:新建Python文件

通过查看YOLOv10官方文档可知,YOLOv10提供CLIpython两种训练方式。区别在于:

  • 方式1:CLI就是直接在终端运行指令
  • 方式2:python需要你新建一个python文件,然后运行代码

方式1:

训练模型的话直接用命令行就可以了

yolo detect train data=custom_dataset.yaml model= epochs=300 batch=8 imgsz=640 device=0,1

device:设备id,如果只有一张显卡,则device=0,如果有两张,则device=0,1,依次类推。

imgsz:图像放缩大小resize,默认是640,如果资源不够可以设置为320试试。

方式2:

考虑到部分同学不喜欢使用命令行方式,在YOLOv10源码目录下新建Python文件,命名为具体如下图所示:

关于文件的完整代码如下所示:

  1. # coding:utf-8
  2. from ultralytics import YOLOv10
  3. # 模型配置文件
  4. model_yaml_path = "ultralytics/cfg/models/v10/"
  5. # 数据集配置文件
  6. data_yaml_path = 'ultralytics/cfg/datasets/'
  7. # 预训练模型
  8. pre_model_name = ''
  9. if __name__ == '__main__':
  10. # 加载预训练模型
  11. model = YOLOv10("ultralytics/cfg/models/v10/").load('')
  12. # 训练模型
  13. results = (data=data_yaml_path,epochs=100,batch=8,name='train_v10')
第5步:调节参数

YOLOv10关于模型的各种参数都在ultralytics/cfg/(其实是与YOLOv8一致的),通过调节这些参数我们就可以实现各种我们所需的操作。

第6步:开始训练

点击运行文件即可进行训练了,可以看到所打印的网络结构如下所示。


????5.模型推理

模型推理测试(默认读取yolov10/ultralytics/assets文件夹下的所有图像)

yolo predict model=

如果测试别的路径下的文件可以在上面命令后面加上source='xxx/',如果想测试视频,可以使用source='xxx/bus.mp4'

也可以在YOLOv10根目录下创建文件,该文件源代码如下所示:

  1. from ultralytics import YOLOv10
  2. # Load a pretrained YOLOv10n model
  3. model = YOLOv10("runs/detect/train_v10/weights/")
  4. # Perform object detection on an image
  5. # results = model("")
  6. results = ("ultralytics/assets/")
  7. # Display the results
  8. results[0].show()

备注:上面的相对路径地址为训练后的权重文件和所检测的图片地址,根据实际绝对地址填写。

点击运行,模型推理结果如下所示:


????6.导出模型

本节课提供两种导出模型的方法:

方法1:CLI命令方式

  1. yolo export model= format=onnx # export official model
  2. yolo export model=path/to/ format=onnx # export custom trained model

方式2:Python文件方式

  1. from ultralytics import YOLOv10
  2. # Load a model
  3. model = YOLOv10('') # load an official model
  4. model = YOLOv10('path/to/') # load a custom trained model
  5. # Export the model
  6. (format='onnx')

????7.本节总结

清华大学研究人员推出的YOLOv10,作为首个无NMS目标检测模型,代表了计算机视觉领域的重大进步。与YOLOv8相比,YOLOv10显著减少了推理延迟,使其更适合高速实时应用,如自动驾驶视频监控交互式AI系统。这种推理过程中计算步骤的减少突显了YOLOv10的效率和响应能力。

此外,YOLOv10采用了新的无NMS训练方法,对其各部分进行了微调以提高性能,并在速度准确性之间达到了很好的平衡。这些升级使得模型的部署更容易,性能更强,速度更快,响应更迅速。无论你是研究人员、开发人员还是技术爱好者,YOLOv10都是值得关注的模型。