YOLOv2(论文题目:YOLO9000:Better(更准确),Faster(更快),Stronger(类别更多))
Precision(准确率):指的是预测的框里面包含目标的比例;
Recall(召回率):指的是所有真实目标中被检测出来的比例。
anchor box是根据预测的形状来设计的box,bounding box是根据预测的分类来设计的。(举例,现在要预测男人、女人、汽车,那么根据他们的形状,用2种anchor box来预测,长条的、扁平的,但是还需要预测目标的类别,需要3种bounding box,即c1=男人,c2=女人,c3=汽车。)
作者在YOLOv2中每一个卷积之后增加了BN层,提高了网络训练的速度,加快了收敛,BN层的主要思想:BN是对每一个神经元的响应进行标准化,而不是对某一层的输出进行标准化。在训练阶段
:比如batch size为32,表示每次训练的时候喂进去32张图片,某层的某个神经元会输出32个响应值,对这32个响应值减去均值除以标准差,将其变成以0为均值,标准差为1的分布,再做归一化,把归一化后的响应值乘上γ再加上β,即yi = γxi+β,每个神经元都训练一组γ、β。在测试阶段
:测试阶段均值、方差、γ、β都用训练阶段全局求出的参数,BN层相当于做线性变换。这么做使得损失函数能发生较大的变化,从而使得梯度变大,避免了梯度消失的问题,同时梯度变大能够加快模型的收敛速度,提高训练的速度。
BN层的作用:因为在神经网络的训练过程中,若每一层的输入都保持相同的分布,随着网络层数的加深,训练会变得困难,则BN层的作用是加快收敛、改善梯度,因为很多的激活函数比如说sigmoid激活函数,在0附近是非饱和区,如果输入太大或者太小的话,就会进去饱和区,就意味着梯度消失难以训练。(训练和测试时的BN层不一样)
BN层一般在神经网络线性计算之后,激活函数之前进行BN操作。
关于BN的参考资料:
https://www.bilibili.com/video/BV1Lx411j7GT
https://zhuanlan.zhihu.com/p/34879333
YOLOv1一开始是先使用224×224的分辨率在ImageNet上进行预训练分类器的,之后为了提高定位精度,才更改分辨率为448×448的,在VOC2007上继续训练,而YOLOv2一开始就使用了448×448这个更大的分辨率,这样网络就可以适应大分辨率的输入。
YOLOv1中通过全连接层直接预测bounding box的坐标值,在YOLOv2中作者发现通过anchor box的偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。所以最终YOLOv2去掉了全连接层,使用anchor boxes来预测bounding boxes,同时去掉了网络中的一个池化层,收缩网络让其运行在416×416分辨率上,卷积层采用32这个值进行下采样,最终可以输出一个13×13的特征图,这样就引入了下一个细粒度特征的改进点。
这个是关于初始anchor boxes的大小和数量的,v2中使用了5个,v3中使用了9个,这些个数和大小是作者基于他训练集的物体边框数据集上通过Kmeans聚类得到的,个数是作者通过实验得到的经验值,关于大小,各个数据集适用的anchor boxes大小不同,所以我们在训练自己的数据集时,也要通过Kmeans聚类生成自己的anchor boxes大小。
在维度聚类中,关于Kmeans聚类,如果用欧式距离来度量的话,显示是不合理的,因为大的预测框会产生大的欧式距离,小的预测框会产生小的欧氏距离,但我们需要大小框产生同样的效果影响,所以使用IOU,IOU是和box的大小无关的,公式如下:
d(box, centroid) = 1 - IOU(box, centroid)
(式中box表示某个类别的ground truth,centroid表示聚类中心框)
在YOLOv2中作者引入anchor box容易遇到模型不稳定的问题,主要来自预测box的中心点坐标(x,y)值,公式如下:
这个公式是没有约束的,预测的边界框很容易向任何方向偏移,可以落在图片上任何位置,这就导致了模型的不稳定性。作者这里并未采用这种方式,而是将预测边框中心点相对于对应网格grid cell左上角位置的相对偏移值,使用sigmoid函数将值约束在0~1,这使得模型训练更稳定,避免了预测框bounding box的野蛮生长。
将高层的信息与相对低层的信息进行融合,在YOLOv2中得到的最终预测的特征层大小为13×13分辨率的,作者融合相对更低层的特征信息26*26分辨率的,通过Passthrough layer来
进行实现。实现结合的过程如下:
从上图可以发现,Passthrough layer可以将原特征图(W、H、C)变换为W/2、H/2、C×4。(W表示宽,H表示高,C表示通道数)
上图解读:首先将26×26×512的卷积层通过与1×1的卷积核进行一个降维变成26×26×64维度,再通过PassThrough Layer这一层将宽和高会变为原来的一半,通道数×4,则变成13×13×256维度,这是从低层的特征得来的,再与原来的高层信息13×13×1024进行融合,相加后得到13×13×1280维度的信息。
YOLOv1的输入尺寸是448×448,YOLOv2中加入了anchor boxes,为了获得奇数×奇数特征图,输入尺寸变成了416×416,作者为了增加模型的鲁棒性,即在不同尺寸输入图片上都可以进行稳健检测,在训练的过程中每经过10个batch就会随机选择新的图片输入尺寸,更改的尺寸范围是{320,352…,608},都是32的倍数,使得小尺寸图片在YOLOv2上运行更快,在速度和精度上达到了平衡。
为什么模型的网络结构没有改变,却可以输入不同尺寸的图片?
因为Darknet19有Global Average Pooling(全局平均池化)
层,它会把输出的每一个feature map的通道求平均,来替代全连接层(就是不管你的输入图像尺寸是什么,只要通道数是一样的,最后都会变成一个固定维度的数1000)。同时这么做还有一个副作用,就是如果输入大的图片,识别的精度就很准但时间较慢,如果输入的是小图片,识别的精度较低但速度很快,所以就可以在速度和精度之间做一个权衡。
在YOLOv2原论文的Faster章节中,作者主要提到了Darknet-19这个BackBone(YOLO中网络部分分为Input输入:比如YOLOv4的输入图片大小为608×608×3或416×416×3;Backbone主干网络
:大多时候指的是提取特征的网络;Neck
:放在Backbone和Head之间是为了更好的利用Backbone提取的特征;Head
:获取网络输出内容的网络,利用之前提取的特征做出预测),这个19指的是Darknet网络有19个卷积层,在实际使用中作者使用448×448高分辨率分类器进行计算,而这里网络采用的是224×224作为网络输入,因为要和当时的同类别分类网络进行一个对比,它们都是224×224的输入,控制变量法。
上图表示的是用于分类的Darknet19网络结构图。
YOLOv1中
网格划分是7×7,最后输出的是7×7×(2×5+20)维度的张量,因为是2个bounding box,每个bounding box有4个位置参数和1个定位参数,最后再加上20个类别。
YOLOv2
使用的是Darknet-19骨干网络(Darknt-19网络有19个卷积层,5个最大池化层),输入图像是416×416×3,YOLOv2会把它划分成13×13的网格,对应的输出结果就是13×13的feature map,这13×13的grid cell每个都会生产生一个125维的向量,每个125维的向量都包含5个anchor,每个anchor都包括4个位置参数,1个置信度参数,20个类别概率。(13×13×5×(5+20))
上图表示的是用于检测的Darknet19网络结构图
如上图所示,Filters表示的是卷积核的个数,如第一行Size只标注了大小3×3,步距为1,则默认padding也为1(YOLOv1中的padding默认为SAME),这就用到了那个卷积计算公式,以第二层最大池化后网络尺寸为208×208×32,则再经过3×3×64卷积,得到OH =(H+2P-FH)/ S + 1 =(208+2×1-3)+ 1 = 208,即208×208×64。
注意,图中的每个Convolutional都是由Conv2d卷积层+BN层+LeakyReLU激活函数组成。(注意其中的卷积层是不包括偏置bias的,因为如果要使用BN层,卷积中的bias是不起任何作用的,因为bias在BN的过程中消掉了)
最后的输出Conv2d,就是一个卷积层,没有BN层也没有激活函数,就是一个分类器。YOLOv1中是2×5+20,因为YOLOv1是直接预测目标框,而YOLOv2是基于anchor预测目标框,是(5+20)×5。
左图是分类的Darknet19,右图是检测的Darknet19(因为作者是拿ImageNet分类数据集进行训练的,拿COCO目标检测数据集进行预测的)
骨干网络BackBone分为分类的Darknet19和检测的Darknet19
用于分类的Darknet19:网络中大量采用1×1的卷积核进行降维和升维,输入是224×224×3,最后输出的是7×7×1000的张量,用Global Average Pooling(全局平均池化)层对这1000个通道求平均得到1000个值,正好是1000个类别的概率。
用于检测的Darknet19:除了分类中的最后一步不同,其他的模型结构分类和检测的都一样,在此基础上加上3个3×3的卷积层和PassThrough层,最后再通过1个1×1的卷积层,得到13×13×125维度的张量。