Yolo系列

Apr 25, 2024
1 views
Computer Vision
  • YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。
  • faster RCNN中也直接用整张图作为输入,但是faster-RCNN整体还是采用了RCNN那种 proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了,而YOLO则采用直接回归的思路。

YOLO v1

将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格中,则这个网格就负责预测这个object。

image

每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。 这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的: \(Pr(Object)*IOU_{pred}^{trith}\) ,其中,如果有object落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。

每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则SxS个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是\(S \times S \times (5B+C)\)的一个tensor。 注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。

举例说明: 在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。 整个网络结
构如下图所示:

image

在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:

\[ Pr(Class_i|Object)*Pr(Object)*IOU_{pred}^{truth}=Pr(Class_i)*IOU_{pred}^{truth} \]

等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。

得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。

注:由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。

虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或⻦群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。

损失函数

损失函数有四部分组成,

image

上文中的红圈符号表示是否开关,比如第一个符号表示i号格子j号坐标框中如果含有obj则为1,否则为0。

损失函数第一部分的宽高计算加根号,这是因为:一个同样将一个100x100的目标与一个10x10的目标都预测大了10个像素,预测框为110 x 110与20 x 20。显然第一种情况我们还可以稍微接受,但第二种情况相当于把边界框预测大了一倍,但如果不使用根号函数,那么损失相
同,都为200,如果使用根号则可以表示出两者的差异。

\(C_i\)表示第i个框含有物体的置信度,类似于RCNN中的二分类部分思想,由于大部分框中没有物体,为平衡损失函数,本部分的权取小为0.5, \(\hat{p}_i(c)\)中c为正确类别则值为1,否则为0

正负样例

正样本:

  1. 对象中心落在网格内:对于每个真实对象(ground truth object),其边界框(bounding box)的中心落在哪个网格单元内,那个网格单元就负责预测这个对象。因此,该网格单元和与之对应的预测边界框成为“正样本”
  2. 存在性置信度:与该网格相关联的“对象存在的置信度”应该接近1
  3. 类别标签:该网格单元还需要预测该对象的类别
    负样本:

  4. 对象中心不落在网格内:如果一个网格单元内没有任何真实对象(ground truth object)的中心,那么该网格单元就是一个“负样本”

  5. 存在性置信度:与这些负样本网格相关联的“对象存在的置信度”接近0

优缺点

优点:

  1. 速度:最显著的优点是速度
  2. 全局信息:由于YOLO在整个图像上进行推断,而不是在局部区域进行,因此它能更好地利用全局上下文信息
  3. 多尺度检测:虽然初版的YOLO主要用于固定尺度的检测,但其架构灵活地支持多尺度检测
  4. 迁移泛化能力强
  5. 实时应用:由于其高速和简洁性,YOLO 特别适用于实时或近实时的应用,比如自动驾驶、监控等
  6. 易于实现和部署:相对较少的组件和端到端的设计使得 YOLO 更容易实现和部署
    缺点:

  7. 准确性:初版的YOLO在小目标或密集排列目标的检测方面存在一定的局限性

  8. 定位误差:由于使用了较大的网格来预测边界框,YOLOv1对目标的定位不如基于候选区域的方法准确
  9. 每个网格只检测一个类别:在 YOLOv1 的设计中,每个网格只预测一个类别和一个边界框,这限制了它在一个小区域内检测多个目标的能力
  10. 高召回率但低准确率:通常有更高的召回率(检测到更多的真实目标)但更低的准确率(更多的误检)
  11. 在YOLOv1中,其backbone先在ImageNet上进行预训练,预训练时所输入的图像尺寸是224×224,而做检测任务时,YOLOv1所接收的输入图像尺寸是448×448
  12. 分类转换成了回归
  13. 训练阶段-中心点落到那个框中就由那个框产生的预测框负责预测-逐渐拟合
  14. 因为YOLO中每个cell只预测两个bbox和一个类别,这就限制了能预测重叠或邻近物体的数量,比如说两个物体的中心点都落在这个cell中,但是这个cell只能预测一个类别
  15. 此外,不像Faster R-CNN一样预测offset,YOLO是直接预测bbox的位置的,这就增加了训练的难度
  16. YOLO是根据训练数据来预测bbox的,但是当测试数据中的物体出现了训练数据中的物体没有的长宽比时,YOLO的泛化能力低
  17. 同时经过多次下采样,使得最终得到的feature的分辨率比较低,就是得到coarse feature,这可能会影响到物体的定位
  18. 损失函数的设计存在缺陷,使得物体的定位误差有点儿大,尤其在不同尺寸大小的物体的处理上还有待加强

YOLO v2

创新点简述

  1. YOLOv2在加入BN层之后mAP上升2%
  2. yolov1也在Image-Net预训练模型上进行fine-tune,但是预训练时网络入口为224 x 224,而fine-tune时为448 x 448,这会带来预训练网络与实际训练网络识别图像尺寸的不兼容。yolov2直接使用448 x 448的网络入口进行预训练,然后在检测任务上进行训练,效果得到3.7%的提升。
  3. YOLO一代包含有全连接层,从而能直接预测Bounding Boxes的坐标值。 Faster R-CNN的方法只用卷积层与Region ProposalNetwork来预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。 所以最终YOLO去掉了全连接层,使用Anchor Boxes来预测 Bounding Boxes。作者去掉了网络中一个Pooling层,这让卷积层的输出能有更高的分辨率。收缩网络让其运行在416416而不是448448。由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLO的卷积层采用32这个值来下采样图片,所以通过选择416416用作输入尺寸最终能输出一个1313的Feature Map。 使用Anchor Box会让精确度稍微下降,但用了它能让YOLO能预测出大于一千个框,同时recall达到88%,mAP达到69.2%。
  4. 输出从v1的S × S × (B × (coordinates + width + height+ confidence )+ C),变为v2的S × S × B × (coordinates + width + height+ confidence + C)。此时S=13,B=5,且从v1的一个cell预测一个类变为了一个anchor box预测一类。这是为了解决临近物体检测效果不好问题。
  5. 通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易,及anchor的设置是有其优越性的,至于每个格子中设置多少个anchor(即k等于几),作者使用了k-means算法离线对voc及coco数据集中目标的形状及尺度进行了计算。发现当k = 5时并且选取固定5比例值的时,平衡了复杂度和IOU。(引入anchors和采用k_means确定anchors的个数、形状是两个创新)
  6. 新的主干网络:模型的mAP值没有显著提升,但计算量减少了:
  7. 对细粒度特征做了加强,个人理解就是resnet的跳层
  8. YOLOv2中使用的Darknet-19网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。YOLOv2采用多尺度输入的方式训练,在训练过程中每隔10个batches,重新随机选择输入图片的尺寸,由于Darknet-19下采样总步⻓为32,输入图片的尺寸一般选择32的倍数{320,352,...,608}。采用Multi-Scale Training, 可以适应不同大小的图片输入,当采用低分辨率的图片输入时,mAP值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高mAP值,但速度有所下降。
  9. 本文对anchors的回归提出了更好的算法,这部分比较麻烦,贴出一篇讲解很透彻的文章。anchor的预测公式来自于Faster-RCNN,我们来看看人家是怎么写的:
    除此之外,YOLO_v2的实例YOLO9000在超多类分类(9000类)也做出了实践性质的创新,感兴趣的可以看一看。

优缺点

  1. Darknet-19:YOLOv2提出了一个全新的19层网络架构(Darknet-19),用于特征提取。该网络既轻量级也高效
  2. 锚框(Anchor Boxes):使用锚框可以更准确地检测不同形状和大小的物体,改进了对高度重叠物体的检测能力
  3. 多尺度检测:通过引入多尺度检测,YOLOv2能更好地检测不同大小的物体。这极大地提高了对小目标的检测能力
  4. 速度快:YOLOv2是为实时性能优化的。只需要一次前向传播,就能完成目标的检测
  5. 联合训练(Joint Training):YOLOv2可以同时在检测和分类任务上进行训练,这提高了其泛化性能
  6. 位置敏感性和类别预测:YOLOv2对于物体位置的敏感性减小,而对于类别预测的准确性提高
  7. 对小目标的检测不佳:尽管进行了多尺度检测,YOLOv2对小目标的检测性能仍然不如一些其他算法
  8. 处理高度重叠目标的挑战:尽管引入了锚框,但在高度重叠或密集的物体情况下,检测性能仍然有待提高
  9. 位置精度较低:虽然YOLOv2在类别识别方面表现出色,但在定位物体方面的精度相对较低

YOLO v3

image

改进之处

1.多尺度预测 (类FPN)
2.更好的基础分类网络(类ResNet)和分类器 darknet-53。
3.分类器-类别预测 YOLOv3不使用Softmax对每个框进行分类,主要考虑因素有两个:

结构

image

image

image

正负样本

image

image

$ Loss=loss_{N_1}+loss_{N_2}+loss_{N_3} $

x、y、w、h使用MSE作为损失函数,也可以使用smooth L1 loss(出自Faster R-CNN)作为损失函数。smooth L1可以使训练更加平滑。置信度、类别标签由于是0,1二分类,所以使用交叉熵作为损失函数

训练策略解释

  1. ground truth为什么不按照中心点分配对应的预测box?
    (1)在Yolov3的训练策略中,不再像Yolov1那样,每个cell负责中心落在该cell中的ground truth。原因是Yolov3一共产生3个特征图,3个特征图上的cell,中心是有重合的。训练时,可能最契合的是特征图1的第3个box,但是推理的时候特征图2的第1个box置信度最高。所以Yolov3的训练,不再按照ground truth中心点,严格分配指定cell,而是根据预测值寻找IOU最大的预测框作为正例

(2)笔者实验结果:第一种,ground truth先从9个先验框中确定最接近的先验框,这样可以确定ground truth所属第几个特征图以及第几个box位置,之后根据中心点进一步分配。第二种,全部4032个输出框直接和ground truth计算IOU,取IOU最高的cell分配ground truth。第二种计算方式的IOU数值,往往都比第一种要高,这样wh与xy的loss较小,网络可以更加关注类别和置信度的学习;其次,在推理时,是按照置信度排序,再进行nms筛选,第二种训练方式,每次给ground truth分配的box都是最契合的box,给这样的box置信度打1的标签,更加合理,最接近的box,在推理时更容易被发现

  1. Yolov1中的置信度标签,就是预测框与真实框的IOU,Yolov3为什么是1?
    (1)置信度意味着该预测框是或者不是一个真实物体,是一个二分类,所以标签是1、0更加合理

(2)笔者实验结果:第一种:置信度标签取预测框与真实框的IOU;第二种:置信度标签取1。第一种的结果是,在训练时,有些预测框与真实框的IOU极限值就是0.7左右,置信度以0.7作为标签,置信度学习有一些偏差,最后学到的数值是0.5,0.6,那么假设推理时的激活阈值为0.7,这个检测框就被过滤掉了。但是IOU为0.7的预测框,其实已经是比较好的学习样例了。尤其是coco中的小像素物体,几个像素就可能很大程度影响IOU,所以第一种训练方法中,置信度的标签始终很小,无法有效学习,导致检测召回率不高。而检测框趋于收敛,IOU收敛至1,置信度就可以学习到1,这样的设想太过理想化。而使用第二种方法,召回率明显提升了很高

  1. 为什么有忽略样例?
    (1)忽略样例是Yolov3中的点睛之笔。由于Yolov3使用了多尺度特征图,不同尺度的特征图之间会有重合检测部分。比如有一个真实物体,在训练时被分配到的检测框是特征图1的第三个box,IOU达0.98,此时恰好特征图2的第一个box与该ground truth的IOU达0.95,也检测到了该ground truth,如果此时给其置信度强行打0的标签,网络学习效果会不理想

(2)笔者实验结果:如果给全部的忽略样例置信度标签打0,那么最终的loss函数会变成\(Loss_{obj}\)\(Loss_{noobj}\)的拉扯,不管两个loss数值的权重怎么调整,或者网络预测趋向于大多数预测为负例,或者趋向于大多数预测为正例。而加入了忽略样例之后,网络才可以学习区分正负

优缺点

优点:

  1. 多尺度检测:YOLOv3在三个不同的尺度上进行检测,提高了模型对于不同大小物体的识别能力