YOLOv1学习笔记

YOLO 全称You Only Look Once,属于目标检测算法的One-Stage算法,One-Stage和Two-Stage算法的区别在于算法的过程中有没有进行Region Proposal的操作。R-CNN家族都有Region Proposal的过程,YOLO是直接对建议区进行预测,并且YOLO还将分类与边框回归融为一体。

YOLO Architecture

先来看看YOLO论文中的网络结构,由24个卷积层后面接着两个全连接层组成,除了最后一个全连接层用的是线性激活函数其他都是用的ReLU Leaky,最后输出的是一个7x7x30的张量,那么这个张量是个什么意思嘞?

图片来源YOLO论文
输入输出映射关系图

YOLOv1是没有Region Proposal的因此只能够通过预测Bounding Box然后根据Ground Truth进行回归使得模型能够学会去预测框的大小和位置。YOLO的设计思想是首先将输入图片划分成7X7的grid cell那么图片中的物体中心点一定落在某个grid cell之内,中心点落在哪个grid cell之内就由其预测该物体。输出层张量为7x7x30的张量,这个7X7X30对应的就是原始图片分割之后的每个网格,值不过是由一个小块通过卷积和池化变成了一个30维度的向量。因为每个grid cell负责预测两个bounding box,每个bounding box有4个参数前面两个是中心点相对于图片左上角的坐标,后两个是bbox的宽和高因此这8个参数就占据了8个维度,每个bbox还有一个置信度(confidence),置信度是用来衡量bbox中有物体且框相对于GT准确程度的量。剩下的20个维度是物体分类的概率。总的来说如果将输入图片划分成SxS个网格则其输出张量的公式为SxSx((4+1)*B+C)其中4+1为边框参数数量加上置信度B为预测的bbox数量,C为分类物体物体总数。

image.png

看到论文中网络模型输出为7x7x30的张量之后可能你我本能的都会想到模型的标签如何设定,7x7网格每一个负责预测一类对象,但30维张量中却饱含了两个bbox(注意YOLO中两个bbox只负责预测一类对象)两个置信度而对每一个grid cell而言我们的Ground Truth却只有一个。不像R-CNN家族有Region Proposal操作、Faster-RCNN有anchor机制,在YOLOv1中两个bbox都是通过网络前向传播预测出来的。因此对于训练阶段而言到底主要选择哪一个 bbox更新权重还需要商榷,YOLO原始论文中对有对象grid cell而言是根据两个bbox的置信度哪个大则将对应标签对应上去的。


置信度由模型存在对象的概率乘上交并比,对有对象grid cell中的两个bbox而言选着大的那个令另一个则为零。
假设网络输出某grid cell(落在其中的对象为自行车)的向量形式如下:

grid cell input

则其对应的label如下:
counterpart label

上面的label形式是对应原图中的物体中心落在某grid cell中的情形,显然当图中物体不是很多的时候grid cell是稀疏的很多grid cell都是背景(负样本),这时候的label直接设置为全部都是零即可。

Loss

在损失函数中第一行为有对象存在的grid cell中负责预测对象的bounding box的中心坐标与GT的均方误差即中心点回归:

第二行为有对象的grid cell负责预测对象的 bbox的边框回归,注意其中的开根号是为了提高损失函数对小边框的敏感性:

第三行为有对象的置信度误差:

第四行为没有对象的置信度误差:

第五行为对象预测概率误差:

其中是权重用来设置各损失项的更新权重的重要性。

因为我们使用的检测数据集数据量有限且成本很大对分类任务来说很艰难因此需要预训练之后进行模型的迁移。论文中模型预训练使用的是DarkNet网络框架(DarkNet网络框架比VGG16计算量更小但是准确度更大)上前20层卷积层是通过添加平均池化层和全连接层在ImageNet1000类的数据集上进行的训练,之后去掉平均池化层和全连接层保留前20层卷积层然后通过添加4个卷积层和2个全连接层将模型变成检测模型。
又因为我们的检测模型往往需要检测细粒度(fine-grained)的物体信息,而我们预训练卷积层是输出图像的分辨率(resolution)是224x224因此我们修改网络输入层的分辨率为448x448(VOC数据集)。
在网络训练之前将图片的大小和没个bbox的宽高、偏移都进行了归一化处理。

模型输出每个grid cell有2个bbox总共有98个bbox我们不可能将每个bbox都输出因此在计算得分之后采用非极大值抑制(Non-Maximun Suppresion)进行边框减除。
假设某grid cell输出如下

image.png

计算最后得分指标为boundingbox的置信度乘上每一类的预测概率:
这个等式实际上是一个条件概率,表示预测某类和定位的正确程度
然后将每一个 bbox都计算得分将得分排列如下图:
image.png

每一个grid cell中有2个boundingbox每个box预测20类对象则每个grid cell有40个得分,49个cell一共1960个得分,之后我们对其进行非极大值抑制:
(1) 通过设置一个阈值直接将低于该阈值的得分设置为零.
(2) 遍历每一个对象.
(2.1) 选出对象98个得分中最大得分的boundingbox.
(2.1.1) 设置IOU值计算最大得分的box与其他 box的IOU值
当大于设定的IOU值时将得分设置为零.
(2.1.2) 如果98个得分中除了最大的得分中还有未归零的得
分则除去除最大得分选择次大得分进行(2.1)操作.
(2.1.2.1) 直到对象得分不能在设置为零(continue)
(3)输出所有bbox

论文泛化结果

YOLOv1算法比Tow-stage算法在速度上提升了很多,但是在mAP和召回率上都有待改善,尤其在对小物体进行目标检测时候,每一个gridcell中有多个对像而由于每一个gridcell都只预测一类对象因此准确率比较低。

YOLO论文:https://arxiv.org/pdf/1506.02640.pdf
https://zhuanlan.zhihu.com/p/46691043
https://blog.csdn.net/qq_43602882/article/details/105910176

你可能感兴趣的:(YOLOv1学习笔记)