yolov1-v3系列学习

参考:https://zhuanlan.zhihu.com/p/51727352
https://blog.csdn.net/qq_18941713/article/details/90776197

yolo系列算法是one stage思想的,即直接提取特征来预测物体的类别和位置。

yolov1

其核心思想是输入整个图片,提取特征后直接进行回归/分类
yolov1-v3系列学习_第1张图片

论文细节如下:

  • 首先将图片分为sxs的网格,图中为7x7=49个网格(grid),如果待检测物体的中心点落在其中一个网格上,那么这个网格负责去预测这个物体。其中,每个网格只能产生2个预测框(bounding box),那么共产生了98个bbox并且带有置信度confidence,这些框基本覆盖了整个图片。
    不同于一般的iou,训练的时候,这里的iou是这样计算的:
    yolov1-v3系列学习_第2张图片
    这样设计
    其中,若中心点在这个网格中,Pr(Object)=1,否则为0。
    测试的时候:
    在这里插入图片描述
    这样子设计,即保证了预测bbox属于某一类的概率,又反应了bbox是否包含目标以及坐标的信息。
  • 对每一个网格,将其对应的bbox输入神经网络后,输出有(x,y,w,h,confidence)。其中x,y是指当前格子预测得到的物体的bounding box的中心位置的坐标。w,h是bounding box的宽度和高度。注意:实际训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是bounding box中心位置相对于当前格子位置的偏移值,并且被归一化到[0,1]。此外,还有分类信息,即样本总共有c类。B为每个网格产生的bbox的个数,则对整个图片来说,输入神经网络后,输出的个数为 SxSx(5*B+c)。例如, 在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。
    关于x,y的计算,如下图:
    yolov1-v3系列学习_第3张图片
    假设椭圆为目标,绿色长方形为标定的目标框,红点为框的中心点,即其坐标为(3,7),其处在(1,4)的网格中
    对于网格,红点坐标为(0.5,0.5)。根据原图位置计算得到相对于特征图位置的公式如下:可根据下面公式验证。
    x = x ∗ S w i d t h − i n t ( x ∗ S w i d t h ) y = y ∗ S w i d t h − i n t ( y ∗ S w i d t h ) {} x = \frac{{x*S}}{{width}} - {\mathop{\rm int}} \left( {\frac{{x*S}}{{width}}} \right)\\ y = \frac{{y*S}}{{width}} - {\mathop{\rm int}} \left( {\frac{{y*S}}{{width}}} \right) x=widthxSint(widthxS)y=widthySint(widthyS)

网络结构如下:
yolov1-v3系列学习_第4张图片
激活函数:最后一层使用的是标准的线性激活函数,其他的层都使用leaky relu 。
3.损失函数
  由上一步可知,yolov1的损失分为3个方面,坐标损失,置信度损失,分类损失,作者全部使用了mse作为损失函数,但如果直接相加的话,无法权衡8维坐标(因为是2个bbox)损失和2维的置信度损失和20维的分类损失的重要程度。考虑到每个损失的贡献率,作者给坐标损失权重 λ c o o r d {{\bf{\lambda }}_{{\bf{coord}}}} λcoord=5。又因为在一幅图片中,没有目标的网格占多数,所给给没有目标的置信度损失权重 λ n o o b j {{\bf{\lambda }}_{{\bf{noobj}}}} λnoobj=0.5,有目标的置信度损失为1。如下:
yolov1-v3系列学习_第5张图片
其中 1 i j o b j = { 1 , 0 } {\bf{1}}_{ij}^{obj} = \left\{ {1,0} \right\} 1ijobj={1,0},表示第i个网格第j个bbox是否包含目标。 1 i o b j {\bf{1}}_i^{obj} 1iobj表示包含目标的第i个网格。对应到输出tensor上如下图:
注意到,对于分类损失,只有当网格包含目标时,才会计算,不包含目标时,分类全置为0,不参与运算,可参考吴恩达的相关课程。
yolov1-v3系列学习_第6张图片
  注意到,坐标损失中关于w和h,采用的是开根号的形式,映射到下面这张图上。这时因为,对于不同大小的bbox,宽和高计算出的偏移量损失贡献率是不一样的,采用根号的形式,可以尽量减小对小bbox的敏感度。这样子可以稍微平衡一下大bbox和bbox对损失的贡献率。这样子可以使得训练波动更小一点。

yolov1-v3系列学习_第7张图片
总的来说,这样设计损失函数可以让坐标,置信度,分类概率三者达到一个较好的平衡。
但仍存在一些不足

  • 虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体,对于多个小目标中心在同一个网格中时,只能检测出一个,对于小物体的召回率不够高,群体小物体检测也不合适。

  • 文中产生的bbox的长宽是根据数据集的特性设定的,对于具有特殊长宽的物体,该网络的泛化能力偏弱。

  • 对于不同大小目标的坐标损失函数的设定权重是相同的,虽然采用了开根号的设定,但该loss function有待加强。

  • 因为网络的最后一层为全连接层,导致测试时输入图像的分辨率要与训练时的相同。

yolov2

yolov1的精度相对于其他网络还比较低。
1)Batch normnization
2)相比于v1,采用了anchor box,把预测类别的机制从空间位置(cell)中解耦,由anchor box同时预测类别和坐标。因为YOLO是由每个cell来负责预测类别,每个cell对应的2个bounding box 负责预测坐标(回想YOLO中 最后输出7730的特征,每个cell对应1130,前10个主要是2个bounding box用来预测坐标,后20个表示该cell在假设包含物体的条件下属于20个类别的概率,具体请参考 图解YOLO 的图示) 。YOLOv2中,不再让类别的预测与每个cell(空间位置)绑定一起,而是让全部放到anchor box中。下面是特征维度示意图(仅作示意并非完全正确)
yolov1-v3系列学习_第8张图片

在yolov1中,对每一个网格,作者都设计了2个预测框来预测里面的目标,这两个框的产生是人为选择的,大小的人为设置的。yolov2不用自定义anchor box的尺寸,而是在训练集上对anchor box进行kmeans聚类,自动找到良好的anchor box 尺寸,作者设置anchor box数量为5。
传统的kmeans算法,采用欧氏距离最小原则来更新质心,但是对于本文来说,由于anchor box刻画形式为(x1,y1,w,h),采用欧式距离的话,会导致大框比小框产生更多的误差。所以,作者巧妙设计了用iou来度量这个距离公式。因为不同尺寸的anchor box 与ground truth 的iou值与anchor box的尺寸无关。公式如下

注意,在计算anchor boxes时,将所有boxes中心点的x,y坐标都置为0,这样所有的boxes都处在相同的位置上,方便我们通过新距离公式计算boxes之间的相似度,聚类只针对w和h,即以w和h为特征维度的anchor box
d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d\left( {{\rm{box,centroid}}} \right) = 1 - IOU\left( {{\rm{box,centroid}}} \right) d(box,centroid)=1IOU(box,centroid)

  由于待计算的anchor boxes的width和height都是相对于整张图片的比例,而YOLOv2通过anchor boxes得到最优的框坐标时,坐标是相对于网格边长的比例(0到1之间),因此要将anchor boxes的width和height也转换为相对于栅格边长的比例。转换公式如下:
w=anchor_width * input_width / downsamples
h=anchor_height * input_height / downsamples
例如;卷积神经网络的输入为416*416时,YOLOv2网络的降采样倍率为32,例如K-means计算得到的一个anchor
box的anchor_width=0.2,anchor_height=0.6,则:

w=0.2 * 416 / 32=0.2 * 13=2.6
h=0.6 * 416 / 32=0.6 * 13=7.8
参考:https://blog.csdn.net/hrsstudy/article/details/71173305?utm_source=itdadao&utm_medium=referral

3)高分辨率的分类器
在训练物体检测任务时,会使用在imagenet数据集上的预训练模型作为特征提取器,而这个预训练模型,输入的图像分辨率通常在224x224而在训练物体检测任务时,需要的图像分辨率要更高(原因是图像越大,物体越清晰,越容易检测到物体),这样会造成两者的输入图像尺寸不一致。在YOLO V1中,作者先是在224x224大小的输入图像上训练检测模型,然后将图像分辨率提升至448x448,在检测数据集上Finetune。
为了更好地适应分辨率的差异,YOLO V2选择先在ImageNet上Finetune高分辨率(448x448)的模型(10 epochs),然后再训练检测模型,这样就“弱化”了分类模型和检测模型在输入图像分辨率上的“不一致”。

你可能感兴趣的:(多目标检测)