如下图所示,很简单,输入图像,经过一个网络,最终直接输出检测框的位置和类别,经过NMS处理后得到最终的目标检测结果。
将图像划分为7×7的网格,每个网格都要产生2个预测框,所以一共98个预测框。因为训练数据集是有标签的,所以某目标的GT框的中心点落在哪个网格里了,这个网格就得负责预测这个目标。意思如下图所示,将该网格的标签真实值设置为如下。
注意,宽高误差加了根号是因为这个误差对小物体影响大,对大物体影响小。所以加根号可以中和两者误差的差距。因为更重视坐标误差,所以λ=5。不负责检测物体的候选框的置信度误差λ=0.5。
很简单,图像输入网络,得到7 * 7 * 30的向量。
yolov1速度快,但准确度与Fast RCNN、Faster RCNN有差距。
产生的候选框只有98个,太少了,而且只能预测49个物体,限制了能预测重叠或邻近物体的数量。由于下采样操作,细节信息丢失,对于检测框的精度也不如fast-rcnn。对大物体检出能力强,但是检测小物体不好。
相对yolov1,yolov2有以下的变动
每个卷积层后均使用Batch Normalization操作,可以提升模型收敛速度、起到一定正则化效果,降低模型的过拟合。
如图所示,先在ImageNet上使用224 * 224的图像预训练模型,训练得准确率还不错后,再使用448 * 448的ImageNet图像训练10轮微调模型;这可以使得模型在目标检测数据集上finetune之前已经适用高分辨率输入。
借鉴Faster RCNN的anchor box,输出有13 * 13个网格,每个网格预测5个框,然后包含类别数概率和坐标位置和置信度。
如何确定出第3点的每个网格有5种anchor box,是通过K-means聚类得到的。
YOLO1时,预测框的位置是野蛮生长,会出现模型不稳定,尤其是在早期。这个不稳定来源于预测x和y。
引入Sigmoid函数预测offset,解决了anchor boxes的预测位置问题,采用了新的损失函数。
作者借鉴了RPN网络使用的anchor boxes去预测bounding
boxes相对于图片分辨率的offset,通过(x,y,w,h)四个维度去确定anchor
boxes的位置,但是这样在早期迭代中x,y会非常不稳定,因为RPN是一个区域预测一次,但是YOLO中是13 *
13=169个网格一起预测,处于A gird cell 的x,y可能会跑到B gird
cell中,到处乱跑,导致不稳定。作者巧妙的引用了sigmoid函数来规约x,y的值在(0,1)轻松解决了这个offset的问题。关于w,h的也改进了YOLOv1中平方差的差的平方的方法,用了RPN中的log函数。
t x t_x tx和 t y t_y ty是要学习的参数。由于 t x t_x tx和 t y t_y ty 的取值没有任何约束,因此预测边框的中心可能出现在任何位置,训练早期阶段不容易稳定。YOLO2调整了预测公式,将预测边框的中心约束在特定gird网格内。公式如下:
c x c_x cx和 c y c_y cy是当前网格左上角到图片左上角的距离,网格的大小要归一化为1 * 1.
限制函数都是sigmoid函数, t t t 都是要学习的参数。所以根据上面的计算公式,预测边框的蓝色中心点被约束在蓝色背景的网格内。约束边框位置使得模型更容易学习,且预测更为稳定。
使用passthrough层检测细粒度特征,mAP提升了1%。
YOLO2引入一种称为passthrough层的方法在特征图中保留一些细节信息。在最后一个pooling之前,特征图的大小是26 * 26 * 512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
但根据YOLO2的代码,和论文中不一样,特征图先用1 * 1卷积从 26 * 26 * 512 降维到 26 * 26 * 64,再做1拆4并passthrough。
为了进一步提升速度,YOLO2提出了Darknet-19(有19个卷积层和5个MaxPooling层)网络结构。DarkNet-19比VGG-16小一些,精度不弱于VGG-16,但浮点运算量减少到约1/5,以保证更快的运算速度。
和VGG类似,大部分卷积核都是3 * 3,每次池化操作后卷积核数量都加倍。1 *1 卷积核置于3 * 3卷积核之间,可以达到压缩特征的目的。去掉了全连接层,使用GAP层(global average pooling)。使用BN层加快收敛、保证训练稳定、正则化模型。
在以上训练所得分类模型的基础上:
结构图如下
22、23、24是增加的3层;
25层将16层输出作为输入,也就是细粒度,经过26层的64个卷积核卷积,输出38 * 38 * 64;
27层将38 * 38 * 64划分为4份并拼接,得到19 * 19 * 256
28层将27层输出与24层输出拼接,得到19 * 19 * 1280
综上所述,虽然YOLO2做出了一些改进,但总的来说网络结构依然很简单,就是一些卷积+pooling,从4164163 变换到 13135*25。稍微大一点的变化是增加了batch normalization,增加了一个passthrough层,去掉了全连接层,以及采用了5个先验框。
对比YOLO1的输出张量,YOLO2的主要变化就是会输出5个先验框,且每个先验框都会尝试预测一个对象。输出的 13 * 13 * 5 * 25 张量中,25维向量包含 20个对象的分类概率+4个边框坐标+1个边框置信度。
误差包含3个部分:
YOLO3是在YOLO1和YOLO2基础上进行改进的。
2018年提出。包含Darknet-53网络结构、anchor锚框、FPN等非常优秀的结构。
该网络用于图像提取特征,有53个卷积层,借鉴了残差网络(Residual Network),在一些层之间设置了快捷链路(shortcut connections),其结构如下图所示:
YOLO3在YOLO2采用passthrough检测细粒度特征的基础上,采用了3个不同尺度的特征图来进行对象检测:
在第79层,经过下方几个黄色的卷积层得到一种尺度的检测结果。相比输入图像,这里用于检测的特征图有32倍的下采样。比如输入是416 * 416的话,这里的特征图就是13 * 13了。由于下采样倍数高,这里特征图的感受野较大,因此适合检测图像中尺寸比较大的对象。
为了实现细粒度的检测,第79层的特征图又作上采样(从79层往右开始上采样卷积),然后与第61层特征图融合(Concatenation),这样得到第91层较细粒度的特征图,同样经过几个卷积层后得到相对输入图像16倍下采样的特征图。它具有中等尺度的感受野,适合检测中等尺度的对象。
第91层特征图再次上采样,并与第36层特征图融合(Concatenation),最后得到相对输入图像8倍下采样的特征图。它的感受野最小,适合检测小尺寸的对象。
如上表可见,Darknet-53是综合平衡了速度与准确率。
由于特征图的数量和尺度的变化,先验框的尺寸也需要相应的调整。YOLO3延续YOLO2采用K-means聚类的方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
感受一下9种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框是GT框,红框是对象中心点所在的网格。
预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样能够支持多标签对象(比如一个人有Woman 和 Person两个标签)。
3种尺度的特征图,各有3个先验框,因此总共有 13 * 13 * 3 + 26 * 26 * 3 + 52 * 52 * 3 = 10647 个预测。每一个预测是一个(4+1+80)=85维向量,这个85维向量包含边框坐标(4个数值),边框置信度(1个数值),对象类别的概率(对于COCO数据集,有80种对象)。
对比一下,YOLO2采用13135 = 845个预测,YOLO3的尝试预测边框数量增加了10多倍,而且是在不同分辨率上进行,所以mAP以及对小物体的检测效果有一定的提升。
如果采用COCO mAP50做评估指标(不是太介意预测框的准确性的话),YOLO3的表现相当惊人,如下图所示,在精确度相当的情况下,YOLOv3的速度是其它模型的3、4倍。
不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。
2020年4月提出。
网络结构如下所示,虽然看起来很复杂,很陌生,但是其实分解开来理解后会发现其实很熟悉。
接下来一一介绍里面的组件:
Concat: 张量拼接,维度会扩充。
add: 张量相加,不会扩充维度。
主要包括Mosaic数据增强、cmBN、SAT自对抗训练.
Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接。
相当于是CBM+CSP1+CSP2+CSP8+CSP8+CSP4.
所以卷积层有:1+(5 + 2 * 1)+(5 + 2 * 2)+(5 + 2 * 8)+(5 + 2 * 8)+(5 + 2 * 4)=72个卷积层。
每个CSP模块前面的卷积核的大小都是3*3,stride=2,因此可以起到下采样的作用。
因为Backbone有5个CSP模块,输入图像是608*608,所以特征图变化的规律是:608->304->152->76->38->19
经过5次CSP模块后得到19*19大小的特征图。
CSPNet全称是Cross Stage Paritial Network,主要从网络结构设计的角度解决推理中从计算量很大的问题。
CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。
因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。
Mish激活函数的公式和图如下
Yolov4作者实验测试时,使用backbone网络在ImageNet数据集上做图像分类任务,发现使用了Mish激活函数的TOP-1和TOP-5的精度比没有使用时都略高一些。
大家应该都很熟悉dropout,随机丢弃一些神经元,Dropblock与之区别如下图所示。
Dropblock的研究者认为,卷积层对于这种随机丢弃并不敏感,因为卷积层通常是三层连用:卷积+激活+池化层,池化层本身就是对相邻单元起作用。而且即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。
因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。
所以右图Dropblock的研究者则干脆整个局部区域进行删减丢弃。
主要就是一些CBL模块,和上采样后进行Concat操作,以及SPP。
在SPP模块中,使用k={ 1 * 1, 5 * 5, 9 * 9, 13 * 13 }的最大池化的方式,再将不同尺度的特征图进行Concat操作。
这里的最大池化采用padding操作,移动的步长为1,比如13×13的输入特征图,使用5×5大小的池化核池化,padding=2,因此池化后的特征图仍然是13×13大小。
下图中标出来的76 * 76,38 * 38,19 * 19的地方就是一个FPN结构。
再具体一点就是这样的结构。
PAN结构实际上是在FPN结构之后的处理操作。
本论文中是对PAN有一些修改,不是直接add,而是Concat。
在此之前,有用过以下几种loss。
①IOU_Loss
公式:1-A/B(A是交集,B是并集)
问题:如果A=0,那么导数为0,损失函数不可求导。另外如果当两个预测框大小相同,两个IOU也相同,IOU_Loss无法区分两者相交情况的不同。
②GIOU_Loss
公式:1-(IOU-差集/最小外接矩阵)
问题:状态1、2、3都是预测框在目标框内部且预测框大小一致的情况,这时预测框和目标框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系。
③DIOU_Loss
考虑了重叠面积、中心点距离
公式如下图所示。
问题:目标框包裹预测框,本来DIOU_Loss可以起作用。但预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。
④CIOU_Loss
应考虑三个重要几何因素:重叠面积、中心点距离,长宽比。
CIOU_Loss和DIOU_Loss前面的公式都是一样的,不过在此基础上还增加了一个影响因子,将预测框和目标框的长宽比都考虑了进去。
效果会比普通的IOU nms好。
想要知道yolov4的具体网络结构,可在这个网址中查看详细。
https://blog.csdn.net/nan355655600/article/details/106246422
未完待续。。。。。。。