昨儿立下来的flag,今天还是要含泪完成的,抓紧时间赶呀!!!
本次用yolov4来实现人佩戴安全帽检测,若未佩戴安全帽则将人脸框出来,若佩戴安全帽,则将安全帽以及人脸框出来,多说无益,直接看效果吧!!!
效果还是不错的,那么接下来就跟我一起进入yolov4的实操吧!!!
老规矩,环境走起!!!本次采用pytorch框架来实现
还是建议用anaconda通过虚拟环境的方式来快速搭建!
本次采用安全帽佩戴检测的数据集,为voc格式的数据集。数据集含图片以及需要检测物体的位置信息。如下图所示:
容我在正式开始介绍之前,要个抱抱!
由于yolov4的创新点很多,本次的话主要针对几个点介绍吧!
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张不同的图片镶嵌到一张图中,其优点是:
3.CIOU回归LOSS
IoU是比值的概念即预测框和真实框的交集比并集,对目标物体的scale是不敏感的。然而常用的BBox的回归损失优化和IoU优化不是完全等价的,寻常的IoU无法直接优化没有重叠的部分。
于是有人提出直接使用IOU作为回归优化loss,CIOU是其中非常优秀的一种想法。
CIOU将目标与anchor之间的距离,重叠率、尺度以及惩罚项都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。而惩罚因子把预测框长宽比拟合目标框的长宽比考虑进去。
4.MISH激活函数
激活函数改为Mish激活函数
5.Label Smoothing标签平滑
其主要针对之前的one-hot中存在的问题:
提出的一种针对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.自对抗的训练方式
针对这个还真没接触过,看网上的话作用是如下:
自对抗训练也是一种新的数据增强方法,可以一定程度上抵抗对抗攻击。其包括两个阶段,每个阶段进行一次前向传播和一次反向传播。
其它的点,看日后有空是否能填坑吧!!!
1.准备数据集
准备安全帽数据,使用VOC格式的数据进行训练
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
即可开始训练
6.测试图片
运行predict_img.py
,输入图片路径即可得到结果。
效果我觉得蛮好的,应该是比yolov3好些吧,当然我也用了efficientdet也尝试了,还没测试效果。这次就先到这里吧!!!
那这次就下次再更新吧,下次更新点一些之前做过的内容吧!!!当然手里头还有个抽烟的数据集,等之后拿efficientdet跑跑!!!