yolov4训练自己的数据集实现安全帽佩戴检测

昨儿立下来的flag,今天还是要含泪完成的,抓紧时间赶呀!!!

本次用yolov4来实现人佩戴安全帽检测,若未佩戴安全帽则将人脸框出来,若佩戴安全帽,则将安全帽以及人脸框出来,多说无益,直接看效果吧!!!

效果还是不错的,那么接下来就跟我一起进入yolov4的实操吧!!!

一、环境配置

老规矩,环境走起!!!本次采用pytorch框架来实现

  • Python: 3.7.4
  • Torch==1.2.0
  • Keras: 2.2.4
  • numpy:1.17.4

还是建议用anaconda通过虚拟环境的方式来快速搭建!

二、数据准备

本次采用安全帽佩戴检测的数据集,为voc格式的数据集。数据集含图片以及需要检测物体的位置信息。如下图所示:

三、YoloV4理论介绍

容我在正式开始介绍之前,要个抱抱!

由于yolov4的创新点很多,本次的话主要针对几个点介绍吧!

  • 网络的改进:主干特征提取网络的改进由DarkNet53变为CSPDarkNet53;并对特征提取网络也进行了改进,使用了SPP和PANet结构
  • 数据增强:使用了Mosaic数据增强方式
  • LOSS改进:使用CIOU作为回归LOSS
  • 激活函数改进:使用了MISH激活函数
  • 标签平滑Smoothing:一种用于防止数据过拟合的trick
  • 余弦退火学习率:可以使网络收敛速度加快
  • 自对抗训练:自对抗训练也是一种新的数据增强方法,可以一定程度上抵抗对抗攻击。

1.网络改进

a.主干提取网络:DarkNet53->CSPDarkNet53

其中具体关于CSPDarkNet53的介绍,可以先去看一下有关CSPNet这个网络,其用来增强CNN的学习能力。

CSPnet结构并不算复杂,就是将原来的残差块的堆叠进行了一个拆分,拆成左右两部分:

  • 主干部分继续进行原来的残差块的堆叠;
  • 另一部分则像一个残差边一样,经过少量处理直接连接到最后。

b.特征加强网络SPP

同上,具体有关SPP的介绍,参考SPPNet特征金字塔这个网络。

在特征加强网络SPP中,分别利用四个不同尺度的最大池化进行处理,其可以它能够极大地增加感受野,分离出最显著的上下文特征。最大池化的池化核大小分别为13x13、9x9、5x5、1x1(1x1即无处理)。

c.特征再次加强PANet网络结构

其在之后又采取了进一步反复的特征提取的工作,上采样,下采样,拼接等操作,其思路来源于2018年的PANet,一种实例分割算法,其具体结构由反复提升特征的意思特征金字塔从下到上的特征提取后,还需要实现(b)中从上到下的特征提取。

2.数据增强方式

采用Mosaic数据增强方式,即

将4张不同的图片镶嵌到一张图中,其优点是:

  • 混合四张具有不同语义信息的图片,可以让检测器检测超出常规语境的目标,增强模型的鲁棒性。
  • 由于BN是从四张图片计算得到的,所以可以减少对大的mini-batch的依赖。

3.CIOU回归LOSS

IoU是比值的概念即预测框和真实框的交集比并集,对目标物体的scale是不敏感的。然而常用的BBox的回归损失优化和IoU优化不是完全等价的,寻常的IoU无法直接优化没有重叠的部分。

于是有人提出直接使用IOU作为回归优化loss,CIOU是其中非常优秀的一种想法。

CIOU将目标与anchor之间的距离,重叠率、尺度以及惩罚项都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。而惩罚因子把预测框长宽比拟合目标框的长宽比考虑进去。

4.MISH激活函数

激活函数改为Mish激活函数

5.Label Smoothing标签平滑

其主要针对之前的one-hot中存在的问题:

  • 无法保证模型的泛化能力,容易造成过拟合;
  • 全概率和0概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知,这种情况很难适应。会造成模型过于相信预测的类别。

提出的一种针对one-hot的标签采取的措施:

new_onehot_labels = onehot_labels * (1 - label_smoothing) + label_smoothing / num_classes

例如:原始的标签是0、1,在平滑后变成0.005(如果是二分类)、0.995,也就是说对分类准确做了一点惩罚,让模型不可以分类的太准确,太准确容易过拟合。

6.余弦退火学习率

也是目前在pytorch框架中比较常见的trick,上升的时候使用线性上升,下降的时候模拟cos函数下降。执行多次。

9.自对抗的训练方式

针对这个还真没接触过,看网上的话作用是如下:

自对抗训练也是一种新的数据增强方法,可以一定程度上抵抗对抗攻击。其包括两个阶段,每个阶段进行一次前向传播和一次反向传播。

  • 第一阶段,CNN通过反向传播改变图片信息,而不是改变网络权值。通过这种方式,CNN可以进行对抗性攻击,改变原始图像,造成图像上没有目标的假象。
  • 第二阶段,对修改后的图像进行正常的目标检测。

其它的点,看日后有空是否能填坑吧!!!

四、训练过程

1.准备数据集

准备安全帽数据,使用VOC格式的数据进行训练

  • 训练前将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中。
  • 训练前将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中。
  • 在训练前利用voc2yolo4.py文件生成对应的txt。
VOCdevkit
   -VOC2007
   	├─ImageSets    # 存放数据集列表文件,由voc2yolo3.py文件生成
   	├─Annotations  # 存放数据集中图片文件
   	├─JPEGImages   # 存放图片标签,xml 格式
   	└─voc2yolo4.py # 用来生成数据集列表文件

2.运行生成Yolov4所需的数据

再运行根目录voc_annotation.py,运行前需要将voc_annotation文件中classes改成你自己的classes。
每一行对应其图片位置及其真实框的位置

3.修改voc_classes.txt

在训练前需要修改model_data里面的voc_classes.txt文件,需要将classes改成你自己的classes。

4.修改yolo_anchors.txt

运行kmeans_for_anchors.py生成yolo_anchors.txt

5.运行

运行train.py 或者train_with_tensorboard即可开始训练

  • 在main函数下:Cosine_lr参数可用于控制使用余弦退火衰减学习率
  • 在main函数下:mosaic参数用于控制实现mosaic数据增强
  • 在main函数下:smooth_label用于控制是否实现标签平滑
  • 在main函数下:model_path用于加载预训练模型
  • save_dir用于控制模型保存位置和tensorboard可视化保存的位置
  • 训练分两次:先冻结模型参数后解冻,两次采取不同的学习率

6.测试图片

运行predict_img.py,输入图片路径即可得到结果。

效果我觉得蛮好的,应该是比yolov3好些吧,当然我也用了efficientdet也尝试了,还没测试效果。这次就先到这里吧!!!

那这次就下次再更新吧,下次更新点一些之前做过的内容吧!!!当然手里头还有个抽烟的数据集,等之后拿efficientdet跑跑!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章