论文题目:《You Only Look Once:Unified, Real-Time Object Detection》
论文地址:
https://arxiv.org/pdf/1506.02640.pdf
一文读懂YOLOv2:
YOLOv2
一文读懂YOLOv3:
YOLOv3
一文读懂YOLOv4:
YOLOv4
1. 概述
相比起Faster R-CNN的两阶段算法,2015年诞生的YOLOv1创造性地使用一阶段结构完成了物体检测任务。直接预测物体的类别和位置,没有RPN网络,也没有Anchor的预选框,因此速度很快。
YOLOv1是YOLO系列的基准,后续的YOLOv1、YOLOv2都是在原来的基础上做的改进,因此完全掌握和理解YOLOv1是学好YOLO系列的关键。
2. 核心思想
将输入图像分成SxS个网格(gird cell),如果某个物体的中心落在这个网格中,那么就由这个网格负责预测这个物体。
如上图所示,自行车中心点是黄色格子,小汽车中心点是红色格子。中心点是根据Groud True的标注信息算出来的(标注的中心点坐标除以将采样率)。
3. 基本步骤和实现方法
3.1. 基本步骤
- 将图像resize到448*448大小作为网络的输入。
- 运行神经网络,得到一些bounding box坐标、bounding box中包含物体的置信度(confidence)以及类别概率(class probabilites)。
- 使用非极大值抑制(NMS)筛选bounding box。
3.2. 实现方式
每一个grid cell预测B个bounding boxes,以及这些bounding boxes的得分:confidence score。confidence score反映了模型对于grid cell中预测是否含有物体,以及是这个物体的可能性是多少。confidence定义为:
(如果这个cell中不存在object,则confidence score为0;否则的话,confidence score则为predicted box与ground truth之间的IOU。)
每一个bounding box由5个预测值组成:x,y,w,h,confidence。坐标(x,y)代表了bounding box的中心与grid cell边界的相对值。width,height则是相对于整幅图像的预测值(边框的宽和高),confidence就是预测框和真实框的IOU。每一个grid cell还要预测C个conditional class probability(条件类别概率):Pr(Class|Object),即在一个cell包含Object的前提下,它属于某个类的概率,只为每个cell预测一组(C个)类概率,而不考虑框B的数量。
注意:class信息是针对每个网格的,confidence信息是针对每个bbox,即每个网格最多只能预测一个物体。如果一个物体的中心点落在了某个区域内,具体是该区域的两个bounding box与真实物体框进行匹配,IoU更大的bounding box负责回归该真实物体。
在测试阶段,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
(等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bbox预测的confidence,这个乘积即encode了预测的bbox属于某一类的概率,也有该bbox准确度的信息)。
得到每个bbox的class-special confidence score以后,设置阈值,滤掉的得分低的bboxes,对保留的bboxes进行NMS处理,就得到最终的检测结果。
示例:
对于PASCAL VOC数据集,图像输入为448×448,取S=7(即在经过神经网络之后的最终输出特征图大小为7*7),B=2(即每个grid cell中有两个bounding box负责预测落在这个gird cell中的物体),C=20(即一共有20个类别)。则输入图片经过网络的最终输出为一个7×7×30的tensor,如下图所示。且一张图片最多可以检测出49个对象,一共生成7×7×2=98个bounding box。
4. 网络结构
YOLO的网络结构由24个卷积层和2个全连接层组成,网络结构借鉴了GoogLeNet分类网络结构,但是没有使用Inception module,使用的1×1卷积(交替的1×1卷积用来减少前几层的特征空间)和3×3卷积简单替代。网络输入的图片大小为448×448,最终输出为7×7×30的张量(在PASCAL VOC数据集上)。
5. 训练
5.1. 训练细节
1)预训练分类网络:在ImageNet 1000-class competition dataset上预训练一个分类网络,预训练的网络即为整个网络结构的前20个卷积层+池化层+全连接层。(此时的网络输入是224*224,因为ImageNet数据集图像大小是224×224)
2)训练检测网络:转换模型去执行检测任务。(在预训练网络中增加卷积和全连接层可以改善性能)。在预训练网络的基础上添加4个卷积层和2个全连接层,随机初始化权重。(输入从224×224 变为448×448)。
最后一层预测类概率和bounding box坐标。通过图像宽度和高度对bounding box的宽度和高度进行归一化,使它们下降到[0,1]之间,同时将(x,y)坐标参数化为特定网格单元位置的偏移,因此它们也在[0,1]之间。
5.2. 正负样本划分
通过卷积网络得到每个边框的预测值后,为了进一步计算网络训练的损失,还需要确定每一个边框是对应着真实物体还是背景框,即区分开正、负样本。YOLOv1在确定正负样本时,有以下两个原则:
● 当一个真实物体的中心点落在了某个区域内时,该区域就负责检测该物体。具体做法是将与该真实物体有最大IoU的边框设为正样本,这个区域的类别标签为该真实物体的类别,该边框的置信度标签为1。
● 除了上述被赋予正样本的边框,其余边框都为负样本。负样本没有类别损失与边框位置损失,只有置信度损失,其置信度真值为0。
5.3. 损失计算
YOLOv1的Loss一共由5个部分组成,均使用均方误差(sum-square error,MSE)损失,如下图所示:
如上图所示,1obj其实是Mask,用来筛选哪一个对应的是正样本,用来指明哪一个cell是用来预测物体的。
6. 总结
总体上,YOLOv1利用了回归的思想,使用轻量化的一阶网络同时完成了物体的定位与分类,处理速度极快,可以达到45FPS,当使用更轻量的网络时,甚至可以达到155FPS。得益于其出色的处理速度,YOLOv1被广泛应用在实际的工业场景中,尤其是追求实时处理的场景。当然,YOLOv1也有一些不足之处,如下:
● 由于每一个区域默认只有两个bounding box做预测,并且只有一个类别,因此YOLOv1有这天然的检测限制。这种限制会导致模型对于小物体,以及靠得特别近的物体检测效果不好(一个cell只能预测一个物体)。
● 由于没有类似于Anchor的先验框,模型对于新的或者不常见宽高比例的物体检测效果不好。另外,由于下采样率较大,边框的检测精度不高。
● 在损失函数中,大物体的位置损失权重与小物体的位置损失权重是一样的,这会导致同等比例的位置误差,大物体的损失会比小物体大,小物体的损失在总损失中占比比较小,会带来物体定位的不准确(虽然加了平方根,还是差点事)。