YOLOv1详解

YOLOv1论文名称:You Only Look Once: Unified, Real-Time Object Detection

YOLOv1论文下载地址:https://arxiv.org/abs/1506.02640

目标检测是计算机视觉中十分重要的一个分支,是从分类问题发展而来,不仅需要判断目标类别,还需要确定目标位置。

YOLOv1:You Only Look Once: Unified, Real-Time Object Detection

YOLO(You only look once)你只需要看一次,提出了一种新的one stage类型的检测器,正如名字所说的那样,一步到位,直接预测出目标类别和位置。不同于之前的检测器,YOLO将目标检测视作回归问题,整个检测网络是单一的神经网络,输入是图像,输出直接给出目标类别和位置,不需要给出目标的区域建议再进行复杂的后处理。YOLO称这种架构为统一的架构,不仅速度得到了巨大的提升,mAP也是其他实时检测器的两倍。相比于其他检测器,YOLO更可能出现定位错误,而不是将背景误认为目标。通过迁移到对艺术作品的检测,证明YOLO相比于DPM、R-CNN有更好的泛化性能,这也说明YOLO网络能学到目标的表征特性,学习效果更好。

目标检测最初是基于滑动窗口的方法,比如DPM,这样检测的窗口十分多,且窗口不能很好得和目标大小相吻合,因此效率极低;之后发展为基于区域建议的方法,如选择性搜索、区域建议网络RPN,这样的检测方法需要检测的窗口因为进行了一定筛选,因此比滑动窗口少得多,但是检测效率仍然十分低下,需要先筛选检测框,再检测,再进行一系列的后处理过程。YOLO则将目标检测中的分类和检测合并为一个单一的回归问题,利用一个单一的检测网络统一预测目标类别和位置。

YOLOv1详解_第1张图片

过程:        

         1、输入图像大小:448 x 448

         2、运行卷积神经网络

         3、对检测结果阈值处理获得最终结果

YOLOv1将分类和检测问题统一为一个整体(使用一个网络一步到位):

        1、大大加快了检测速度。可以将YOLOv1的检测过程和Faster R-CNN比较,真的简单了好多,不需要先提取图像特征给出区域建议,不需要复杂的后处理过程,YOLO将检测问题作为回归问题,一步到位,这也说明之前的检测器没有利用好神经网络强大的”归纳“能力

        2、YOLOv1预测时对图像进行了全局推理。滑动窗口和区域建议会先给出一个检测范围,属于对局部进行检测,而YOLOv1是直接在整幅图像的基础上进行检测的,属于对全局进行检测,这也就不难解释为什么前两种方法容易将背景噪声误认为是目标了。正式YOLOv1检测是对全局推理,因此不太可能把背景噪声误认为目标。

        3、YOLOv1学习了目标的可概括性表征信息。通过将模型迁移到对艺术作品的检测,相比于其他模型可以看出YOLOv1具有更好的泛化性能,侧面说明YOLOv1相比于其他模型学习到了目标的表征信息(个人理解为能区分目标的关键性信息),学习效果更好。

缺点:

        YOLOv1准确性略微落后最先进的目标检测器,最主要的是对小目标的识别带有局限性,通过后面的介绍我们知道YOLOv1将图像划分为网格,分别进行检测,但是每个网格只分给了两个框,并且只能预测一个类别,因此一幅图像顶多识别网格个数的目标,一个网格有多个目标的时候识别能力就跟不上了。

统一检测

统一检测:用整幅图像预测每个边界框,且同时预测一幅图像中的所有类别的边界框(全局推理、一步到位)

统一检测的架构让YOLO实现了端到端的训练和推理,不仅大大加快了学习和推理速度,而且还能保持较高的准确率。

检测步骤:

        1、将输入图像划分为S x S个网格,每个网格检测中心落在该网格中的目标。

        2、将图像输入网络后,每个网格预测B个边界框和这些框的置信度分数,以及每个网格的C类概率。每个边界框包含x、y、w、h四个参数,置信度分数则为Pr(Object) ∗ IOU truthpred,网格C类概率是在置信度分数达标之后给出的,是基于置信度分数的条件概率,置信度为零,就没有类概率了。(注意类概率是给每个网格安排的,每个网格只有一组类概率。

\begin{equation} \color{DarkBlue} \operatorname{Pr}\left(\text { Class }_{i} \mid \text { Object }\right) * \operatorname{Pr}(\text { Object }) * \mathrm{IOU}_{\text {pred }}^{\text {truth }}=\operatorname{Pr}\left(\text { Class }_{i}\right) * \mathrm{IOU}_{\text {pred }}^{\text {truth }} \end{equation}

YOLOv1详解_第2张图片

基于此,网络输出的结果张量为S×S×(B∗5+C)【其中S x S为网格数量,B为给每个网格安排的框的数量,C为每个网格的一组目标概率】

为了在PASCAL VOC上评估YOLO,我们使用S=7,B=2。PASCAL VOC有20个标记的类,所以C = 20。

网络设计

网络模型是基于GoogLeNet修改来的,整个网络有24个卷积层、2个全连接层。整个网络十分简洁,就是卷积池化、卷积池化提取特征,然后全连接,全连接应该是为了将特征转换为预测的坐标和类概率,由于要输出S×S×(B∗5+C)的张量,最后输出层是S×S×(B∗5+C)。

YOLOv1详解_第3张图片

注意网络使用224 x 224的分辨率用ImageNet 1000数据集训练分类(使用前20个卷积层,然后是一个平均池化层和一个全连接层),用448 x 448的分辨率训练检测(检测使用的网络就是上图的网络架构)【这里检测应该是使用VOC数据集训练】。

注意:

        1、边界框坐标全部归一化了,x,y为目标中心坐标,不出所在网格范围,取得是网格偏移量,为0~1;w、h都是相对于整幅图像宽和高的,因此也在0~1。网络所有数据保持在0~1有利于网络计算和收敛。

        2、激活函数使用Leaky ReLU:

                Leaky ReLU改进了ReLU的负半轴”死区“问题,不会让神经元失活。

        3、损失函数:损失函数包含三大部分:坐标损失、置信度损失、类概率损失,具体如下:

\begin{equation} \color{DarkBlue} \begin{gathered} \lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left[\left(x_{i}-\hat{x}_{i}\right)^{2}+\left(y_{i}-\hat{y}_{i}\right)^{2}\right] \\ +\lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left[\left(\sqrt{w_{i}}-\sqrt{\hat{w}_{i}}\right)^{2}+\left(\sqrt{h_{i}}-\sqrt{\hat{h}_{i}}\right)^{2}\right] \\ +\sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left(C_{i}-\hat{C}_{i}\right)^{2} \\ +\lambda_{\text {noobj }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {noobj }}\left(C_{i}-\hat{C}_{i}\right)^{2} \\ +\sum_{i=0}^{S^{2}} \mathbb{1}_{i}^{\text {obj }} \sum_{c \in \text { classes }}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2} \end{gathered} \end{equation}

        其中\mathbb{1}_{i}^{\text {obj }}表示目标是否出现在单元格 i 中,\mathbb{1}_{i,j}^{\text {obj }}表示单元格 i 中的第 j 个边界框预测器对该预测 "负责"。

由于YOLO将检测归结为回归问题,那么损失函数采用平方误差损失也就很合理了,按原文话说平方误差损失函数优化起来更容易。

这个损失函数是存在一定问题的,略显简单粗暴。

        一方面是许多网格单元不包含目标,这些网格反馈到网络中的梯度更新时压倒了含有目标的网格部分的梯度更新,会使模型梯度更新不稳定;

        另一方面是位置损失和类损失不对等,每个网格坐标共八个,类却有20个(对于VOC数据集而言);

        最后相同大小的误差大框和小框的影响不同,小框对小误差更敏感。

针对第一个问题YOLOv1增加了边界框坐标预测的损失,减少了不包含物体的框的置信度预测的损失,使用两个参数,λcoord和λnoobj来实现这一目标。增加边界框损失在一定程度上也缓和了第2个问题(但是论文最后还是说误差主要来源于错误的定位)。我们设定λcoord = 5,λnoobj = 0.5;针对第三个问题,预测宽高的平方根而不是直接预测宽高,部分缓解了这个问题,因为在0~1中,小误差取平方根后会变大,算是取巧。

推理

网络是单一网络,推理也是十分快速和直接的,每张图像预测98(7x7x2)个边界框和每个框的类别概率。然后使用阈值筛选,去掉假阳性的框,再用非极大值抑制改善多重检测即可。

YOLOv1的局限性:

        1、每个网格只能预测两个框和一个类别,限制了对密集小目标的检测能力

        2、边界框是根据训练集目标来学习的,框的泛化性差

        3、网络多次卷积、池化(下采样)得到的特征图比较小,也就是比较粗糙,用于检测的特征太粗糙可能会影响检测效果

        4、YOLOv1损失函数对大框和小框同等对待,但是小误差对小框的影响更大,文章中说用平方根部分缓解(也不知道具体用了没?)

补充:

1、对于损失函数更详细的解读可以看:Yolo系列知识点梳理(Yolov1-v5)

你可能感兴趣的:(目标检测,计算机视觉,目标检测)