YOLOv1
1.论文思想
(1)将一副图像分为SxS个网格(grid cell),如果某个目标的中心落在这个网格中,则这个网格负责预测这个目标。
(2)每一个网格要预测B个bounding box,每个bounding box除了要预测位置(x,y,w,h)之外,还要附带预测一个confidence值。每个网格还要预测C个类别的分数。
SxS个网格,每个网格要预测B个bounding box,还要预测C个类别。网络输出是一个SxSx(5xB+C)的张量。
x和y在0~1之间,用中心网格的相对坐标表示;
w和h在0~1之间,是相对与整个图像来表示;
confidence是预测目标和真实目标的交并比(IoU)。
2.网络结构
网络输入:448×448×3的彩色图片。
中间层:由若干卷积层和最大池化层组成,用于提取图片的抽象特征。
全连接层:由两个全连接层组成,用来预测目标的位置和类别概率值。
网络输出:7×7×30的预测结果。
YOLOv1进行了二十多次卷积还有四次最大池化,其中3x3卷积用于提取特征,1x1卷积用于压缩特征,最后将图像压缩到7x7xfilter的大小,相当于将整个图像划分为7x7的网格,每个网格负责自己这一块区域的目标检测。
整个网络最后利用全连接层使其结果的size为(7x7x30),其中7x7代表的是7x7的网格,30前20个代表的是预测的种类,后10代表两个预测框及其置信度(5x2)。
3.损失函数
损失由三部分组成,分别是:坐标预测损失、置信度预测损失、类别预测损失
(1)使用的是误差平方和。需要注意的是,w和h在进行误差计算的时候取的是它们的平方根,原因是对不同大小的bounding box预测中,相比于大bounding box预测偏移,小box预测偏一点会造成结果很差。偏移相同的距离,小目标误差会更大,因此将bounding box的w和h取平方根代替原本的w和h。
(2)λ_record=5,λ_noobj=0.5
YOLOv1局限
1.YOLO对相互靠近的物体,以及很小的群体检测效果不好,这是因为一个网格只预测了2个框,并且都只属于同一类。
2.由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。(因为对于小的bounding boxes,small error影响更大)
3.YOLOv1对不常见的角度的目标泛化性能偏弱。
YOLOv2
1.论文思想
相比于YOLOv1是利用全连接层直接预测Bounding Box的坐标,YOLOv2借鉴了Faster R-CNN的思想,引入Anchor机制。利用K-means聚类的方法在训练集中聚类计算出更好的Anchor模板,大大提高了算法的召回率。同时结合图像细粒度特征,将浅层特征与深层特征相连,有助于对小尺寸目标的检测。
2.论文改进
原论文Better章节:
- Yolov2中作者在每个卷积层后面增加了BN层,提升了2%的mAP,使用BN层后可以不使用Dropout操作
- 采用更高分辨率的分类器能够提升4%的mAP(224x224->448x448)
- 使用基于anchor的目标边界框进行预测,提高召回率(map略为下降)
- 采用K-means聚类的方法来获得相应的anchor
- 限制预测的坐标信息(让每个anchor只负责预测目标中心点落在某个grid cell区域内的目标),使得网络更加容易学习并且更加稳定
- 将底层与高层特征图融合(yolov2中得到的最终预测特征层大小为13x13,为了提升小目标的检测效果,将13x13的特征层与26x26的特征层融合,通过PassThrough Layer实现),提升模型的检测效果
- 采用多尺度训练方法来提升检测鲁棒性
原论文Faster章节:
YOLOv2的主干特征提取网络Darknet-19
网络使用了较多的3 x 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,把1 x 1的卷积核置于3 x 3的卷积核之间,用来压缩特征。使用batch normalization稳定模型训练,加速收敛,正则化模型。
2.网络结构
以416x416输入为例,其中Filters代表卷积核个数,size代表卷积核大小、步长默认为1,整个网络由卷积层和最大池化组成(图中的Convolutional由Conv2d、BN层和LeakyReLU激活函数组成)。
YOLOv3
1.论文改进
(1)主干特征提取网络Darknet-53
Darknet53,它具有两个重要特点:
(1)Darknet53具有一个重要特点是使用了残差网络Residual,Darknet53中的残差卷积就是首先进行一次卷积核大小为3X3、步长为2的卷积,该卷积会压缩输入进来的特征层的宽和高,此时我们可以获得一个特征层,我们将该特征层命名为layer。之后我们再对该特征层进行一次1X1的卷积和一次3X3的卷积,并把这个结果加上layer,此时便构成了残差结构。通过不断的1X1卷积和3X3卷积以及残差边的叠加,便大幅度的加深了网络。残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。
(2)Darknet53的每一个卷积部分使用了特有的DarknetConv2D结构,每一次卷积的时候进行l2正则化,完成卷积后进行BatchNormalization标准化与LeakyReLU。普通的ReLU是将所有的负值都设为零,Leaky ReLU则是给所有负值赋予一个非零斜率。
2、提取多特征层进行目标检测,一共提取三个特征层,它的shape分别为(13,13,75),(26,26,75),(52,52,75)最后一个维度为75是因为该图是基于voc数据集的,它的类为20种,yolo3只有针对每一个特征层存在3个先验框,所以最后维度为3x25。
3、采用反卷积UmSampling2d设计,逆卷积相对于卷积在神经网络结构的正向和反向传播中做相反的运算,其可以更多更好的提取出特征。
2.网络结构
输入是一个416x416x3的图片—>进行下采样,宽高会不断的被压缩,通道数不断的扩张–>获得特征层,可以表示输入进来的图片的特征
1.从特征获取获取预测结果:
YoloV3提取多特征层进行目标检测,一共提取三个特征层(52,52,256)、(26,26,512)、(13,13,1024):
13,13,1024的特征层进行5次卷积后输出13,13,75的预测结果;13,13,75可以分解为13,13,3,25—>13,13,3,20(属于某一个类的概率)+1(判断是否有物体)+4(先验框的调整参数)
26,26,512
13,13,1024进行五次卷积后的结果会进行上采样,然后与25,25,512进行堆叠,这个过程事实上就是构建特征金字塔的过程,利用特征金字塔可以进行多尺度融合,提取出更有效的特征;堆叠之后也会进行五次卷积—>26,26,75分解为26,26,3,25—>26,26,3,20+1+4。
52,52,256
同上,输出为52,52,75。
可以理解为利用三个特征层(52,52,256)、(26,26,512)、(13,13,1024)构建FPN特征金字塔,将不同shape的特征层进行特征融合,提取出更好的特征。
2.进行特征融合后的加强特征输入Yolo Head中进行结果的预测:
Yolo Head本质上是一次3x3卷积加上一次1x1卷积,3x3卷积的作用是特征整合,1x1卷积的作用是调整通道数。
Yolo Head对三个特征层分别进行处理,假设预测是的VOC数据集,输出层的shape则分别为(13,13,75),(26,26,75),(52,52,75)
13x13相当于将输入的图片划分成13x13的网格,在每一个网格上会预先设定三个先验框;
75是对于VOC数据集的,VOC数据集有20个类别,75可以分为3 x 25,25可以分为20+4+1
3相当于网格点上的三个先验框;20为VOC数据集有20个类别;4为先验框的调整参数(x_offset、y_offset、h和w);1为判断是否包含物体
YOLO HEAD会对网格上的先验框进行调整获得最终的预测结果
得到最终的预测结果后还要进行得分排序与非极大抑制筛选:
1、取出每一类得分大于self.obj_threshold的框和得分。
2、利用框的位置和得分进行非极大抑制。