• mmdetection 用yolox训练自己的coco数据集


    yolox作为当下地表最强的目标检测算法,用yolox来做工程必定能事半功倍。然而,mmdetection训练yolox的配置文件写法与faster-rcnn有些不太一样,如果直接套用faster-rcnn的配置文件会存在多个异常。且在网上很难找到mmdetection用yolox训练coco数据集的案例,为此博主经过多次实践通过实践,最终实现了yolox的训练,并找出了yolox与faster-rcnn的配置文件编写的不同。

    博主发现yolox与faster-rcnn的配置文件存在以下不同:1.在修改模型输出的class上有所不同、2。在设置数据集的方式上有所不同、3.在lr_config设置方式的上有所不同、4.设置输入数据size方式的不同。为此撰写博客分享经验,完整的yolox训练配置代码在博客的最后面。

    1、num_classes设置的区别

    faster-rcnn:

    1. model = dict(
    2. roi_head=dict(bbox_head=dict(num_classes=len(classes))))

    yolox:

    1. model = dict(
    2. #roi_head=dict(bbox_head=dict(num_classes=len(classes))))
    3. bbox_head=dict(type='YOLOXHead', num_classes=len(classes)))

    用faster-rcnn的方式设置yolox的输出头会报以下错误

    图1 yolox  oi_head报错

    2、在设置数据集的方式上有所不同

    虽然yolox与faster-rcnn都设置用coco数据集进行训练,但是yolox的config中会将训练数据的datatype调整为MultiImageMixDataset,具体可以下图所示

    图2 yolox的数据配置

    在相同的配置中,如下图所示。faster-rcnn已经可以正常训练模型了,而yolox则会保存,提示FileNotFoundError: CocoDataset: [Errno 2] No such file or directory: 'data/coco/annotations/instances_train2017.json'。

    图3 mmdet通用的数据配置(faster-rcnn的数据配置)

     这是因为yolox的train daset中多了一个dataset对象,因此需要对dataset进行设置,且要将train dataset的type调整为MultiImageMixDataset。所以,在yolox中数据的设置要按照以下格式调整。

    1. data = dict(
    2. samples_per_gpu=1, # batch size
    3. workers_per_gpu=1, # num_workers
    4. train=dict(
    5. type='MultiImageMixDataset',
    6. dataset=dict(
    7. type='CocoDataset',
    8. ann_file='data/voc07_train.json',
    9. img_prefix=data_root,
    10. classes=classes,
    11. filter_empty_gt=False),
    12. ),
    13. val=dict(
    14. img_prefix=data_root,
    15. classes=classes,
    16. ann_file='data/voc07_val.json'),
    17. test=dict(
    18. img_prefix=data_root,
    19. classes=classes,
    20. ann_file='data/voc07_test.json'))

    3、lr_config设置的区别

    博主一开始也是以为yolox的学习率调度方式应该是可以与faster-rcnn通用的,结果出乎意料。faster-rcnn与yolox支持的学习率调度方式不太一样。

    faster-rcnn默认的调度器:

    1. lr_config = dict(
    2. policy='step',
    3. warmup='linear',
    4. warmup_iters=500,
    5. warmup_ratio=0.001,
    6. step=[7])

    yolox默认的学习率调度器:

    1. lr_config = dict(
    2. _delete_=True,
    3. policy='YOLOX',
    4. warmup='exp',
    5. by_epoch=False,
    6. warmup_by_epoch=True,
    7. warmup_ratio=1,
    8. warmup_iters=5, # 5 epoch
    9. num_last_epochs=10,
    10. min_lr_ratio=0.05)

     如果yolox使用faster-rcnn的学习率调度器,则因为config的继承关系会报以下错误。因为yolox默认的学习率调度器(policy=‘YOLOX’)中存在num_last_epochs参数,而faster-rcnn默认的调度器(policy=‘step’)中不存在该参数。

    图4 yolox错用学习率调度器的报错

    num_last_epochs用于控制最后多少个epoch不使用 Mosaic 和 MixUp进行数据增强,且在该epoch后增加L1 loss。【yolox的tricks】。博主下面截图时设置的num_last_epochs=15,整体训练的epoch为300.

     

     

    4、设置数据输入size的区别

    faster-rcnn的模型配置文件中不存在图像size的设置参数,是通过设置configs\_base_\datasets\coco_detection.py中的size来控制输入图像的size,具体可见图5

    图5 coco数据size的调整

     然而,在yolox中,模型的配置文件对pipeline进行的调整,设置输入数据的size需要到configs\yolox\yolox_s_8x8_300e_coco.py中设置

    图6 yolox数据size的调整

    5、完整的yolox训练配置文件

    完整的训练配置文件如下所示,博主的数据集这里只有shoot一个类别,博主的图片路径在‘D:/AI比赛/基于可见光图像的柑橘花果梢识别’下,而coco数据在mmdetection的data下。因为博主的coco数据是由voc数据转换而来的,数据集转换方式可以参考下列链接的第一章,配置文件编写得按本博客的来。mmdetection2的使用教程从数据处理、配置文件到训练与测试(支持coco数据和pascal_voc数据)_万里鹏程转瞬至的博客-CSDN博客_mmdetection2本文主要讲述mmdetection的训练与测试,以数据处理为起点,到数据集划分、数据集转换、配置文件编写、模型训练与测试和使用。由于mmdetection2默认的数据格式是coco格式,而labelimg生成的标注文件却是xml(最贴近voc数据),为此以coco数据集为基准。我们可以使用mmdetection中的数据转换方法将pascal_voc数据集转换为coco数据集,从而实现对coco数据和pascal_voc数据的支持。pascal_voc数据集转换为coco数据集前需要注意,一定要先划分数据集(https://hpg123.blog.csdn.net/article/details/124617894

    1. # 这个新的配置文件继承自一个原始配置文件,只需要突出必要的修改部分即可
    2. _base_ = './configs/yolox/yolox_s_8x8_300e_coco.py'
    3. #1、 修改数据集相关设置----------
    4. #数据集类型
    5. dataset_type = 'COCODataset'
    6. #label值
    7. classes = ('shoot',)
    8. #2、 设置训练超参数----------
    9. #修改模型分类数
    10. model = dict(
    11. #roi_head=dict(bbox_head=dict(num_classes=len(classes))))
    12. bbox_head=dict(type='YOLOXHead', num_classes=len(classes)))
    13. #要加载的预训练权重
    14. #load_from="./work_dirs/faster_rcnn_r50_fpn_1x_coco/epoch_12.pth"
    15. #训练的epcoh数
    16. runner = dict(type='EpochBasedRunner', max_epochs=3)
    17. #3、 训练集与测试集的的预处理------------
    18. #多次测试发现在这里定义的pipeline是无效操作,且发现如果在后续的data中设置pipeline会导致报错
    19. #因此要修改_base_\datasets\下的数据集文件
    20. #4、 设置数据集的路径---------------
    21. data_root="D:/AI比赛/基于可见光图像的柑橘花果梢识别"
    22. data = dict(
    23. samples_per_gpu=1, # batch size
    24. workers_per_gpu=1, # num_workers
    25. train=dict(
    26. type='MultiImageMixDataset',
    27. dataset=dict(
    28. type='CocoDataset',
    29. ann_file='data/voc07_train.json',
    30. img_prefix=data_root,
    31. classes=classes,
    32. filter_empty_gt=False),
    33. ),
    34. val=dict(
    35. img_prefix=data_root,
    36. classes=classes,
    37. ann_file='data/voc07_val.json'),
    38. test=dict(
    39. img_prefix=data_root,
    40. classes=classes,
    41. ann_file='data/voc07_test.json'))
    42. #5、 训练策略设置
    43. optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001)
    44. optimizer_config = dict(grad_clip=None)
    45. # 学习策略
    46. lr_config = dict(
    47. _delete_=True,
    48. policy='YOLOX',
    49. warmup='exp',
    50. by_epoch=False,
    51. warmup_by_epoch=True,
    52. warmup_ratio=1,
    53. warmup_iters=5, # 5 epoch
    54. num_last_epochs=50,
    55. min_lr_ratio=0.05)

    训练方法:进入mmdetection的代码路径,将上述的配置文件保存为yolox_s.py,并执行训练代码即可。 

    训练代码: python ./tools/train.py .\yolox_s.py

    图7 yolox训练

    yolox模型的预训练模型下载链接为:mmdetection: 同步更新官方最新版 mmdetectionhttps://github.com/open-mmlab/mmdetection - Gitee.comhttps://gitee.com/monkeycc/mmdetection/tree/master/configs/yolox

  • 相关阅读:
    Linux0.11-进程管理
    Git分布式版本控制系统——git学习准备工作
    Getx系列之Dialog
    Cmd命令获取结果
    Tomcat
    Dynamo_修复导出EXCEL时出现的组件丢失问题
    spring boot 测试用例
    简单介绍Spring中的事物
    《论文阅读》开放域对话系统——外部信息融入对话的方法
    leetcode-hot100-矩阵
  • 原文地址:https://blog.csdn.net/a486259/article/details/125475666