YOLO
假期将YOLO从v1看到v4。总结一下,整体来讲是更快更强:v1提出核心思想;v2开始使用Darknet-19作为主干网络,用维度聚类找出合适的anchor进行预测;v3主干网络Darknet-53增加了残差结构,并在多尺度特征图层面上进行预测;v4综合很多小技巧,总结性偏强。
YOLO v1
开山之作,简单粗暴,主打就是快,直接运用回归进行一步预测。在VOC 2007数据集中,基本模型45FPS(mAP:63.4),快速模型155FPS。源码:https://pjreddie.com/darknet/yolov1/
网络结构
作者文章开头就写出三步走策略:1.调整图片大小;2.输入到单个卷积网络中;3.根据置信度阈值出结果.
网络结构也很清晰,就是24个卷积层和2个全连接层。卷积层负责特征提取,而全连接层负责输出预测结果。
这个预测结果是。输入为,网络下采样率为64,特征图变为,此时,可以理解为将原图直接切割成个格子。如果物体的中心在格子里,那么该格子就是预测物体的类别,VOC中是20分类,因此每个格子会有的值来预测类别。同时,每个格子也预测个bbox。每个bbox有4个与位置相关的值:中心坐标(相对于格子边界值);高和宽(相对于整张图像)。每个bbox还有1个值是置信度得分(confidence score)代表这个bbox包括物体的概率和对象匹配程度的得分,表示为:。如果想得到特定类别的概率:
示意图如下:
损失计算
整个模型是一个回归问题,有了预测结果和真实值,损失的采用易于优化的平方误差,并对各个损失权重的进行设定。
(1)不包括物体格子数量占比大,这些格子的置信度得分趋于0,会影响模型的稳定,因此对不包含物体的格子降低权重,设定。
(2)相比于大物体,小物体的小偏移量应该更为重要,因此将先开方,降低大物体的偏移对损失的影响程度。
(3)在每个格子中会预测个bbox,在训练阶段,只希望1个bbox代表每个物体,根据最高的IOU选定作为预测的bbox,记作第个格子中第个bbox作为选定bbox。最终,各个部分损失计算如下:
局限
(1)每个格子只有2个bbox,只能预测一类,使用粗糙特征进行预测,不适用于空间距离很近的小物体,比如一群鸟。
(2)特征图是必须要固定输入图像的尺寸。
(3)损失函数设定中,大小物体的损失计算方法一致,但是小物体的小误差会对识别性能影响大。
(4)相比于Faster RCNN,YOLO产生更多的位置错误,召回率低。
YOLO v2
v2平衡了准确率和识别速度,将特征提取的骨干网络改为Darknet-19,借鉴了anchor的思想,用维度聚类提出合适的anchor,并直接预测位置。源码:https://pjreddie.com/darknet/yolov2/
在VOC 2007数据集中,速度67FPS,准确率76.8mAP;速度40FPS,准确率78.6mAP。同时联合分类数据和检测数据集,提出了9000类目标识别框架YOLO9000。
准确率提升
在保证速度的同时,主要是提升定位准确度和召回率。
1.BN
在所有卷积之后增加BN,同时去掉了dropout,这其实也是当时主流分类网络的提升之处。
2.高分辨率预训练分类器
v1版本预训练特征提取分类网络输入是,而识别网络要求的输入是。v2直接用的高分辨率图进对分类网络预训练。
3.用Anchor预测bbox
作者发现v1直接运用全连接层预测bbox太粗暴了,而Faster RCNN中根据anchor预测偏移量使网络更易学习,因此在v2版本中借鉴了anchor的思想。
(1)首先,移除一个池化层,提升特征的分辨率。原先输入是448,网络下采样率为64,得到的特征图;减少一个池化层,网络下采样率为32,按照原输入会得到的特征图,但是一些大物体中心可能落在图片中心,14为偶数,大物体的中心会落在多个格子中。因此,作者调整图片输入为,这样特征图变为.
(2)然后特征图每个位置提出9个anchor,这样得到个候选框进行预测,而v1版本只提出个候选框。预测时和v1一致,也是预测置信度得分,4个位置值和类别概率。
增加Anchor后,mAP从69.5降低到69.2,但是召回率从81%增加到88%。虽然准确率下降,但是召回率提升很大,作者采用后续的方案(4.维度聚类和5.直接位置预测)进一步提升准确率。
4.维度聚类
anchor的选取相当于时一个先验,会直接影响位置预测的准确性。作者提出维度聚类的方法训练已知的bbox,找到最合适数目和大小的anchor。相比传统的k-means使用欧式距离进行聚类,大物体的误差高于小物体,因此采用IOU作为判定标准:
作者在VOC和COCO上比较聚类数目和平均IOU,取5类(取5个anchor)可以很好的平衡模型大小和召回率,具体anchor大小在VOC和COCO上略有差异。
每个格子取5个anchor,对于VOC,每个anchor预测5个值(x, y, w, h, confidence score)和20个分类值,每个格子就要预测个值。
5.直接位置预测
当在YOLO中采用anchor时,模型会产生不稳定,主要体现在预测bbox的位置(x,y)。RPN网络预测的是偏移量,而在YOLO v2中采用预测相对于网格位置的坐标,并且利用逻辑激活函数将预测值固定在0到1之间。
网络预测bbox的5个值,4个坐标有关的值和对应bbox坐标关系如上图;还有一个置信度得分,其表示:。
6.细粒度特征
对于小目标,希望在高分辨率的特征图上进行预测,SSD和Faster RCNN都采用多尺度特征图聚合的方法。YOLO采用类似于残差网络,将前一层高分辨率特征图经过卷积变换和低分辨率特征图进行拼接。
7.多尺寸输入训练
由于将全连接层移掉,网络只剩下卷积和池化层,网络输入尺寸不受限,经过一定轮数的迭代,网络随机选择输入图片尺寸,这使得网络适用于不同分辨率的检测。
速度提升
特征提取网络更换为Darknet-19,保证性能的同时,降低计算量。采用卷积池化结构,但是相邻卷积之间增加的卷积来降低维度,减小计算量。
YOLO 9000
这一部分其实是结合分类数据集和检测数据集。检测数据集数目有限,分类数据集种类繁多但没有位置标签。在分类数据集只反向传播分类损失,而在检测数据集同时传播分类和定位损失,这样可以充分利用类别信息。作者提出多标签模型,进行分级分类,有点类似于自然界的界门纲目那种分类方法,综合两个数据集的类别信息,预测时采用条件概率,实现9000类的检测。
YOLO v3
这是一篇佛系的论文,v3将骨干网络更换为增加残差结构的Darknet-53,并在多尺度特征图层面上进行预测。说白了就是更快更好,放个性能图瞅瞅。源码:https://pjreddie.com/darknet/yolo/
提升细节
1.预测
bbox预测也是5个值(4个位置x, y, w, h 和1个置信度得分 confidence score),和v2一样,也是根据维度聚类,提出anchor直接预测位置。对于目标的置信得分,v3采用逻辑回归进行预测,当IOU时处于最大为1。与RPN不同,系统只为真实目标框指定一个bbox,这样就可以去掉一些不必要的anchor,减少计算量。
对于损失函数,除了w, h的损失函数依然采用平方误差之外,其他部分(x, y, confidence score,80类预测 )的损失函数用的是二值交叉熵。
2.特征提取网络
特征提取网络采用Darknet-53,相比v2的特征提取网络,网络变大,并且增加了残差结构。
3.多尺度预测
相比v2仅增加一个类似残差网络引入高分辨率特征进行预测,v3在3个不同的尺度上预测bbox,实现对小目标的准确预测。在COCO数据集中找到9个聚类,将其分配在3个不同分辨率尺度上,这样,每个尺度将每个格子均提出3个anchor。每个尺度预测下的预测的就是
其中为格子数,3为每个尺度上anchor数,4个位置预测,1个置信度得分,80类。多尺度特征提取的方式有点类似特征金字塔FPN,低分辨率特征图经过上采样与高分辨率特征图进行拼接,作为不同尺度特征,如下图y1,y2,y3。
大神的总结
大神Joe甚至写出来一些没用的改进,大家就别尝试了,啊哈哈哈。对anchor偏移x,y的预测;线性预测x,y 而不用逻辑激活函数;采用focal loss;双IOU门限(Faster RCNN中)。
YOLO的速度时不可否认的,虽然在mAP-75表现得不是很好,但是mAP-50表现出众,更何况人类难以区分0.3-0.5IOU的误差,这个速度下的准确率很优秀了。当然,大神退出CV界,也是佛系了。
YOLO v4
在Joe退出CV之后,Alexey使用多个小tricks对YOLO改进,针对于当今多GPU训练识别网络,v4强掉在单GPU就能实现网络的训练和实时检测,着重优化并行计算能力,并进一步提升准确率。对于显卡急缺的同学们,看起来很是友好啊。源码:https://github.com/AlexeyAB/darknet
不过我感觉这篇文章的作者总结的是真不错,把现有对检测网络改进的小tricks基本总结了一下。
tricks总结篇
1.整体构架总结
检测主要分三部分:一是Backbone作为特征提取,二是Head作为预测。其实前两部分就可以构成传统的检测结构,但是为了提升准确率,增加第三部分Neck,引入多尺度特征进行多尺度预测。
2. Bag of freebies
主要是一些改变训练策略或者增加训练成本的方法,主要涉及三个方面:数据增强,语义分布和bbox回归。
(1)数据增强:像素层面利用裁剪翻转等方法模拟物体被遮挡的情况;特征图层面选用dropout防止过拟合;也利用多个图像结合或者风格转移GAN进行数据增强。(2)语义分布:不同类别之间的数据不平衡问题,可以运用focal loss解决数据不均衡;一些相互之间有关联的类别不宜用one-hot表示,通过标签平滑来解决。(3)bbox回归的目标函数:传统目标检测器用均方误差MSE对此进行估计,但是这样把每个坐标值当作单独的变量处理,忽略对象整体性,因此考虑预测bbox和真实bbox的覆盖范围,提出IOU损失。又引申为与形状有关的GIOU损失和与中心点距离有关的CIOU损失。
3. Bag of specials
一些增强模型特定属性的方法,通过一定程度增加推理成本,却显著提高目标检测的准确度。主要涉及增加感受野,注意力机制,特征聚合,激活函数和后处理方法。
(1)增加感受野:比如使用SPP模块,最初用于不限定网络的输入,确保全连接层输入不变,v3对SPP改进,特征图经过{1,5,9,13}步长为1的最大池化,然后进行拼接,不同感受野特征结合。(2)注意力机制:主要有针对于通道(SENet)核针对于点的(SAM)。(3)特征聚合:多尺度特征预测FPN的方法为基础,开展一系列的多尺度特征拼接。(4)激活函数:激活函数不增加计算成本,但是可以有效提升反向传播的能力,以ReLU为主流等一系列改进激活函数缓解梯度消失的问题。(5)后处理方法:针对anchor的识别器,最后利用非极大抑制NMS的方法来筛选一些重复的候选框。
改进结构
作者思路很清晰了,直接放出来:
为了让模型在单GPU上更好的训练,还从以下三个方面提升:
1.数据增强
采用Mosaic和自对抗训练(SAT)。Mosaic是融合4幅训练图像进行增强,如下图,由于4张图合为一张训练,可以一定程度降低batch的尺寸。
SAT将训练分两个阶段。在第一阶段,神经网络改变原始图像,网络与自身进行对抗,改变原始图像。在第二阶段,用正常的方法训练神经网络去检测目标。
2.选择最优的超参数进行训练
3.对现有方法改进
改进的SAM,改进的PAN和CmBN(Cross mini-Batch Normalization)。
CmBN是对CBN(交叉迭代批归一化)的改进,CBN在4个迭代上进行BN,而CmBN将一个batch分成了4个mini-batch,仅收集mini-batch中的统计信息进行归一化。
对PAN( Path Aggregation Network)改进,将特征图相加变为拼接。
对于注意力机制SAM的改进,将空间上的注意力改为点的注意力
相关推荐:
【程序喵笔记】目标识别1.0: Faster RCNN
【程序喵读论文】分类网络进阶版