当前位置:   article > 正文

基于YOLOv6开发构建道路交通场景下CCTSDB2021交通标识检测识别系统

cctsdb

交通标志检测是交通标志识别系统中的一项重要任务。与其他国家的交通标志相比,中国的交通标志有其独特的特点。卷积神经网络(CNN)在计算机视觉任务中取得了突破性进展,在交通标志分类方面取得了巨大的成功。CCTSDB 数据集是由长沙理工大学的相关学者及团队制作而成的,其有交通标志样本图片有近 20000 张,共含交通标志近 40000 个,但目前只公开了其中的 10000 张图片,标注了常见的指示标志、禁令标志及警告标志三大类交通标志。随着时间的更迭有了不同的版本数据集,本文的主要目的就是想要基于yolov6来开发构建CCTSDB2021数据集上的目标检测识别系统,首先看下实例效果:

在CCTSDB2021数据集中,训练集和正样本测试集中有17856幅图像。图像中的交通标志根据其含义分为强制性、禁止性和警示性。共有16356个训练集图像,编号为00000-18991。正样本测试集有1500张图像,编号为18992-20491。“XML”压缩包存储训练集和正样本测试集的XML格式注释文件。“train_img”压缩包存储训练集图像。“train_labels”压缩包存储训练集的TXT格式注释文件。“test_img”压缩包存储正样本测试集图像。“基于天气和环境的分类”压缩包存储了根据天气和照明条件分类的正样本测试集的XML格式注释文件。“基于交通标志大小的分类”压缩包存储了根据图像中交通标志大小分类的正样本测试集的XML格式注释文件。“负片样本”包含500张负片样本图像。

接下来看下数据集:

本文选择的是YOLOv6这一算法模型,Yolov6是美团开发的轻量级检测算法,截至目前为止该算法已经迭代到了4.0版本,每一个版本都包含了当时最优秀的检测技巧和最最先进的技术,YOLOv6的Backbone不再使用Cspdarknet,而是转为比Rep更高效的EfficientRep;它的Neck也是基于Rep和PAN搭建了Rep-PAN;而Head则和YOLOX一样,进行了解耦,并且加入了更为高效的结构。YOLOv6也是沿用anchor-free的方式,抛弃了以前基于anchor的方法。除了模型的结构之外,它的数据增强和YOLOv5的保持一致;而标签分配上则是和YOLOX一样,采用了simOTA;并且引入了新的边框回归损失:SIOU。
YOLOv5和YOLOX都是采用多分支的残差结构CSPNet,但是这种结构对于硬件来说并不是很友好。所以为了更加适应GPU设备,在backbone上就引入了ReVGG的结构,并且基于硬件又进行了改良,提出了效率更高的EfficientRep。RepVGG为每一个3×3的卷积添加平行了一个1x1的卷积分支和恒等映射的分支。这种结构就构成了构成一个RepVGG Block。和ResNet不同的是,RepVGG是每一层都添加这种结构,而ResNet是每隔两层或者三层才添加。RepVGG介绍称,通过融合而成的3x3卷积结构,对计算密集型的硬件设备很友好。

训练数据配置文件如下所示:

  1. # Please insure that your custom_dataset are put in same parent dir with YOLOv6_DIR
  2. train: ./dataset/images/train # train images
  3. val: ./dataset/images/test # val images
  4. test: ./dataset/images/test # test images (optional)
  5. # whether it is coco dataset, only coco dataset should be set to True.
  6. is_coco: False
  7. # Classes
  8. nc: 3 # number of classes
  9. # class names
  10. names: ['mandatory', 'prohibitory', 'warning']

这里选择使用的是最轻量级的n系列的模型,如下:

  1. # YOLOv6s model
  2. model = dict(
  3. type='YOLOv6n',
  4. pretrained='weights/yolov6n.pt',
  5. depth_multiple=0.33,
  6. width_multiple=0.25,
  7. backbone=dict(
  8. type='EfficientRep',
  9. num_repeats=[1, 6, 12, 18, 6],
  10. out_channels=[64, 128, 256, 512, 1024],
  11. fuse_P2=True,
  12. cspsppf=True,
  13. ),
  14. neck=dict(
  15. type='RepBiFPANNeck',
  16. num_repeats=[12, 12, 12, 12],
  17. out_channels=[256, 128, 128, 256, 256, 512],
  18. ),
  19. head=dict(
  20. type='EffiDeHead',
  21. in_channels=[128, 256, 512],
  22. num_layers=3,
  23. begin_indices=24,
  24. anchors=3,
  25. anchors_init=[[10,13, 19,19, 33,23],
  26. [30,61, 59,59, 59,119],
  27. [116,90, 185,185, 373,326]],
  28. out_indices=[17, 20, 23],
  29. strides=[8, 16, 32],
  30. atss_warmup_epoch=0,
  31. iou_type='siou',
  32. use_dfl=False, # set to True if you want to further train with distillation
  33. reg_max=0, # set to 16 if you want to further train with distillation
  34. distill_weight={
  35. 'class': 1.0,
  36. 'dfl': 1.0,
  37. },
  38. )
  39. )
  40. solver = dict(
  41. optim='SGD',
  42. lr_scheduler='Cosine',
  43. lr0=0.0032,
  44. lrf=0.12,
  45. momentum=0.843,
  46. weight_decay=0.00036,
  47. warmup_epochs=2.0,
  48. warmup_momentum=0.5,
  49. warmup_bias_lr=0.05
  50. )
  51. data_aug = dict(
  52. hsv_h=0.0138,
  53. hsv_s=0.664,
  54. hsv_v=0.464,
  55. degrees=0.373,
  56. translate=0.245,
  57. scale=0.898,
  58. shear=0.602,
  59. flipud=0.00856,
  60. fliplr=0.5,
  61. mosaic=1.0,
  62. mixup=0.243,
  63. )

终端执行:

python tools/train.py --batch-size 16 --conf configs/yolov6n_finetune.py --data data/self.yaml --fuse_ab --device 0 --name yolov6n --epochs 100 --workers 8

计算输出如下所示:

训练完成结果详情如下:

离线推理实例如下所示:

感兴趣可以动手做下!

如果自己不具备开发训练的资源条件或者是没有时间自己去训练的话这里我提供出来对应的训练结果可供自行按需索取。

单个模型的训练结果默认YOLOv6n

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/254034
推荐阅读
相关标签
  

闽ICP备14008679号