1.Darknet-53 模型结构
在论文中虽然有给网络的图,但我还是简单说一下。这个网络主要是由一系列的1x1和3x3的卷积层组成(每个卷积层后都会跟一个BN层和一个LeakyReLU)层,作者说因为网络中有53个convolutional layers,所以叫做Darknet-53(2 + 1*2 + 1 + 2*2 + 1 + 8*2 + 1 + 8*2 + 1 + 4*2 + 1 = 53 按照顺序数,不包括Residual中的卷积层,最后的Connected是全连接层也算卷积层,一共53个)。
说明:卷积的strides默认为(1,1),padding默认为same,当strides为(2,2)时padding为valid。
下图就是Darknet-53的结构图,在右侧标注了一些信息方便理解。
上图是以输入图像256 x 256进行预训练来进行介绍的,常用的尺寸是416 x 416,都是32的倍数。下面我们再来分析下YOLOv3的特征提取器,看看究竟是在哪几层Features上做的预测。
2.YOLOv3 模型结构
作者在论文中提到利用三个特征层进行边框的预测,具体在哪三层我感觉作者在论文中表述的并不清楚(例如文中有“添加几个卷积层”这样的表述),同样根据代码我将这部分更加详细的分析展示在下图中。
注意:原Darknet53中的尺寸是在图片分类训练集上训练的,所以输入的图像尺寸是256x256,下图是以YOLO v3 416模型进行绘制的,所以输入的尺寸是416x416,预测的三个特征层大小分别是52,26,13。
在上图中我们能够很清晰的看到三个预测层分别来自的什么地方,以及Concatenate层与哪个层进行拼接。
注意:Convolutional是指Conv2d+BN+LeakyReLU,和Darknet53图中的一样,而生成预测结果的最后三层都只是Conv2d。通过上图小伙伴们就能更加容易地搭建出YOLOv3的网络框架了。
3.目标边界框的预测
YOLOv3网络在三个特征图中分别通过(4+1+c) k个大小为11的卷积核进行卷积预测,k为预设边界框(bounding box prior)的个数(k默认取3),其中 c表示为预测目标的类别数对应的概率(默认为20),4表示负责预测目标边界框的偏移量(x,y, w, h),1表示预测目标边界框内包含目标的概率。
下图展示了目标边界框的预测过程(该图是本人重新绘制的,与论文中的示意图有些不同,个人感觉自己绘制的更便于理解)。图中虚线矩形框为预设边界框,实线矩形框为通过网络预测的偏移量计算得到的预测边界框。其中为预设边界框在特征图上的中心坐标,为预设边界框在特征图上的宽和高,分别为网络预测的边界框中心偏移量以及宽高缩放比,为最终预测的目标边界框,从预设边界框到最终预测边界框的转换过程如图右侧公式所示,其中函数是sigmoid函数其目的是将预测偏移量缩放到0到1之间(这样能够将预设边界框的中心坐标固定在一个cell当中,作者说这样能够加快网络收敛)。
下图给出了三个预测层的特征图大小以及每个特征图上预设边界框的尺寸(这些预设边界框尺寸都是作者根据COCO数据集聚类得到的):
4.损失函数的计算
关于YOLOv3的损失函数文章中写的很粗略,比如坐标损失采用的是误差的平方和,类别损失采用的是二值交叉熵,本人在github上也找了很多YOLO v3的公开代码,有的采用的是YOLOv1或者YOLOv2的损失函数,下面给出本人认为正确的损失函数
YOLOv3的损失函数主要分为三个部分:目标定位偏移量损失
, 目标置信度损失
,以及目标分类损失
,其中
是平衡系数。
4.1目标置信度损失
目标置信度可以理解为预测目标矩形框内存在目标的概率,目标置信度损失
采用的是二值交叉熵损失(Binary Cross Entropy),其中
,表示预测目标边界框i中是否真实存在目标,0表示不存在,1表示存在。表示预测目标矩形框i内是否存在目标的Sigmoid概率(将预测值通过sigmoid函数得到)。
4.2目标类别损失
目标类别损失
同样采用的是二值交叉熵损失(采用二值交叉熵损失的原因是,作者认为同一目标可同时归为多类,比如猫可归为猫类以及动物类,这样能够应对更加复杂的场景。但在本人实践过程中发现使用原始的多类别交叉熵损失函数效果会更好一点,原因是本人针对识别的目标都是固定归于哪一类的,并没有可同时归于多类的情况),其中
,表示预测目标边界框i中是否真实存在第j类目标,0表示不存在,1表示存在。表示网络预测目标边界框i内存在第j类目标的Sigmoid概率(将预测值
通过sigmoid函数得到)。
4.3目标定位损失
目标定位损失
采用的是真实偏差值与预测偏差值差的平方和,其中
表示预测矩形框坐标偏移量(注意网络预测的是偏移量,不是直接预测坐标),
表示与之匹配的GTbox与默认框之间的坐标偏移量,(
,
)为预测的目标矩形框参数,(
)为默认矩形框参数, (
)为与之匹配的真实目标矩形框参数,这些参数都是映射在预测特征图上的。
5、差异
5.1、backbone
整个yolo-v3结构里面,是没有池化层和全连接层的。
前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如stride=(2, 2),这就等于将图像边长缩小了一半(即面积缩小到原来的1/4)。
在yolo-v2中,要经历5次缩小,会将特征图缩小到原输入尺寸的1/32,输入为416x416,则输出为13x13(416/32=13)。
yolo-v3也和v2一样,backbone都会将输出特征图缩小到输入的1/32。所以,通常都要求输入图片是32的倍数。
5.2、Output
yolo v3输出了3个不同尺度的feature map,如上图所示的y1, y2, y3。
借鉴了FPN(feature pyramid networks),采用多尺度来对不同size的目标进行检测,越精细的grid cell就可以检测出越精细的物体。
yolo v3设定的是每个网格单元预测3个box;
yolo v2设定的是每个网格单元预测5个box;
yolo v1设定的是每个网格单元预测2个box;
yolo v3用上采样的方法来实现这种多尺度的feature map,两处拼接分别是26x26和52x52尺度。