文章目录

今天开始YOLO系列,这是一篇必读论文!给我冲!

YOLO系列:

论文题目:You Only Look Once:Unified, Real-Time Object Detection
下载连接:​​​https://arxiv.org/pdf/1506.02640.pdf​

这篇论文的题目叫”你仅需看一次:统一的实时目标检测“。

不得不说,这个题目其实在内涵R-CNN系列,我们都知道R-CNN全系列都是两阶段的目标检测,第一阶段提取候选框,然后对候选框分类。虽然R-CNN系列一直再改进,但是始终是挤牙膏式的,没有跳出两阶段的框架,所以导致速度一直没有革命性突破。而作者这个yolo就直接暗示R-CNN系列都是弟弟,速度太慢,咱这个yolo只需要过一边就能出结果,速度MAX。

之前除了最开始的R-CNN是精读的,后面基于他的改版版本都是泛读了一下,因为除了后面的FPN和mask R-CNN之外,其他模型基本现在都没什么用处了。而yolo不一样,现在各个地方都还在用yolo的改版,所以yolo我想着可能要全系列精读了吧。

我还是感觉要先看一下R-CNN再看yolo会比较好,毕竟那边会有很多目标检测的基础概念,看过之后再读yolo的时候就不会那么难了。​​R-CNN精读直达​

Abstract(摘要)

摘要部分作者继续内涵R-CNN的两阶段方法,然后说到之前的目标检测都是分类问题,yolo将分类问题变成了回归问题。
yolo将画框和分类放到了一个网络里,只需要走一边前馈就可以得到结果,并且还提出了一个轻量化yolo,普通版45 FPS,轻量化155 FPS。

作者也是很直白的在摘要部分就说了一些yolo的优缺点,定位较差,但减少物体和背景区分错误的情况发生(这其实比较好理解,之前的R-CNN模型都是对某个候选框进行操作,这让网络局限在一个框内,而yolo直接塞进去了整张图,视野很大,所以在物体和背景的区分上做的更好。),并且yolo可以检测各种物体,迁移泛化性非常好。

Introduction(引言)

引言还是那几个方面,首先作者介绍了一下当前目标检测等相关领域前人的痛点,一个是暴力枚举的滑动窗口方法(DPM),还有一个就是比较有代表性的两阶段方法R-CNN系列。

简单回顾一下R-CNN:

  • 第一阶段:每个图片使用选择性搜索SS方法提取2000个候选框。
  • 第二阶段:将每个候选框送入CNN网络进行分类(使用的SVM)。

第二阶段末尾还需要对结果微调,非极大值抑制NMS消除重复,然后还有BB回归修正候选框。

R-CNN的整套流程就像流水线,非常繁琐,每一块都要单独训练,不是端到端的过程。

作者说yolo将目标检测任务定义为回归问题,并且是端到端的过程,后面几段就开始介绍yolo的优却点了:

  • 检测快,结果准;
  • 输入的是整张图片,可以整体上去分析(更精准识别物体和背景);
  • 泛化迁移能力强;

作者说他的yolo模型泛化迁移能力强是得益于做了一个实验,将yolo和R-CNN还有传统的DPM模型在普通常见物体上训练,然后再迁移去识别艺术画,毕加索那种艺术画,发现yolo的识别能力比其他的都强,得到了yolo迁移泛化能力好的结论。

后面作者又说自己的模型对比非常强的R-CNN系列准确率少有下降,这是实力自我矛盾一波,开头说自己结果准,后面又对比了一下当下模型,发现准确率稍差哈哈,而且在定位和对小物体进行检测的方面比较差。

Unified Detection(统一的目标检测)

这一节就是在展开说作者是怎么将R-CNN流水线一样的多阶段检测变成端到端的一个神经网络的。

第二章开头到2.1之间说了很多东西,直接来看这个图就行了。

先看一下大致过程,其中的小细节后面再说。

【目标检测 论文精读】……YOLO-V1 ……(You Only Look Once: Unified, Real-Time Object Detection)_目标检测

这张图发生在验证阶段时:
就是模型已经训练好了,开始识别,预测的阶段。
最左边可以看到,模型将一张图片分割成S * S 的矩阵了。在本论文中是 7 * 7 的矩阵,里面有49个小格子。每一个小格子叫做 “grid cell”。

每一个 grid cell 都生成B个框(bounding boxes),在本论文中B=2,这两个框大小尺寸等等都随便,只有一个要求,就是生成框的中心点必须在grid cell里。

所有的grid cell生成的bounding boxes结果就是中间上面的这张图。

中间下面那一路分支就是每一个 grid cell的分类,将不同分类标成不同的颜色。
最后中间两幅图进行合并,得到最右边的那一幅图。

可以看到,因为每一个 grid cell只能有一个分类,也就是他只能预测一个物体,这也是导致yolo对小目标物体性能比较差的原因。如果所给图片极其密集,导致 grid cell里可能有多个物体,但是yolo模型只能预测出来一个,那这样就会忽略在本grid cell内的其他物体。

这张图发生在训练阶段时:
人工标注的框落在那个 grid cell里,就由那个grid cell产生的bounding boxes去预测这个物体,因为 gird cell 生成了B个框,所以由与真实框的IOU最大的那个 bounding boxes去负责预测这个物体,或者说去拟合真实框。

作者在后面贴出了整体的yolo结构:

【目标检测 论文精读】……YOLO-V1 ……(You Only Look Once: Unified, Real-Time Object Detection)_目标检测_02

整体的卷积结构交替的使用了 1 * 1 和 3 * 3卷积,一共24层卷积层,最后接全连接。使用1 * 1卷积老生常谈了,降维减小计算量。

输入使用的是imagenet数据集224 * 224的,但是作者放大到448 * 448了。因为目标检测通常需要很多的细节,用于框的定位分类等。

最后得到的是 7 * 7 * 30的张量,这里面包含的就是上面说到的那个被分成7 * 7 矩阵的 网格图片。因为每一个grid cell生成两个框,其中每个框有中心点的 x轴坐标,y轴坐标,长,宽,还有置信度五个信息,俩框就是10个信息。因为作者是在voc数据集上进行操作的,voc一共有20个分类,所以就是 10+20 = 30个信息。 这30个数据是一个grid cell里的,所以整张网格图就是 7 * 7 * 30的张量。

7 * 7 * 30的张量变为最终结果的过程

用一张图来表示这个过程。

【目标检测 论文精读】……YOLO-V1 ……(You Only Look Once: Unified, Real-Time Object Detection)_深度学习_03


每一个grid cell生成两个框,每个框又要预测20个类别,所以现在就是 7 * 7 * 2个 = 98个框,每个框对应20个类别,得到的就是一个矩阵,一共98个列,20行,行对应20个类别的概率(置信度 * 条件概率)。这个20 * 98的矩阵可视化就是中间的这个图。

现在的工作就是要除去很多没用的框,得到最后的结果图。

除去多余框用到一个方法叫NMS 极大值抑制,这个NMS我在之前复现R-CNN的时候说过简单点,就看名,意思就是 不是极大的值 我就压制你。

在yolo中的操作过程是,
对于上述的98列数据,先看某一个类别,也就是只看98列的这一行所有数据,先拿出最大值概率的那个框,剩下的每一个都与它做比较,如果两者的iou大于某个阈值,则认为这俩框重复识别了同一个物体,就将其中低概率的重置成0。

最大的那个框和其他的框比完之后,再从剩下的框找最大的,继续和其他的比,依次类推对所有类别进行操作。 注意,这里不能直接选择最大的,因为有可能图中有多个该类别的物体,所以iou如果小于某个阈值,则会被保留。算法过程类似于三重for循环,On³的复杂度。

最后得到一个稀疏矩阵,因为里面有很多地方都被重置成0了嘛,拿出来不是0的地方拿出来概率和类别,就得到最后的目标检测结果了。

NMS只发生在预测阶段,训练阶段是不能用NMS的,因为在训练阶段不管这个框是否用于预测物体的,他都和损失函数相关,不能随便重置成0。

因为yolo强制划分图片为s * s 个网格,每个网格 grid cell预测一个物体,对于大的物体或者靠近边缘的物体可能出现多个框预测同一个物体的情况,也使用了NMS非极大值抑制。

所有的bounding boxes的数据,比如 x,y,h,w 都经过归一化处理 在0-1之间。中心点坐标x,y相当于grid cell左上角的偏移量。

其中的卷积层使用了leaky Relu,和Relu函数稍微不同。

leaky Relu公式

【目标检测 论文精读】……YOLO-V1 ……(You Only Look Once: Unified, Real-Time Object Detection)_损失函数_04


普通Relu 在otherwise的时候等于0,这里等于0.1 * X。

损失函数使用平方和误差(回归问题常用的损失函数),

平方和误差易于优化,但对定位和分类误差具有一致性,对框包含物体或背景图也是一视同仁,绝对误差使得对大小框也是一视同仁。

弥补平方和误差的缺点:
在前面说yolo过程的时候提到,每一个grid cell生成两个 bounding boxes,我们用置信度最高的哪一个框用于预测物体,所以对用于预测物体的哪一个bounding boxes设置较高权重,其他的设置较低权重(论文中为5和0.5)。

使用平方和误差导致大小框误差一视同仁,就是产生误差在大小框中的占比不同,大框产生的误差会导致损失函数较大波动,小框同样的偏移却没有大款的损失多,也就是偏移同样的比例,大框明显,小框不明显。改进方法就是计算h和w的平方根之差,消弱大框的误差。

作者给出的损失函数:

【目标检测 论文精读】……YOLO-V1 ……(You Only Look Once: Unified, Real-Time Object Detection)_目标检测_05


这套损失函数很明显。

第一行就是平方和误差用于计算负责预测物体的那个框的中心点定位误差。

第二行用于计算负责预测物体的那个框的高宽误差,可以看到其中加根号了,这个根号的作用就是上面说的为了修正对大小框一视同仁的缺点,削弱大框的误差。

第三行用于计算负责预测物体的那个框的置信度误差。

第四行用于计算不负责预测物体的那个框的置信度误差。

最后一行用于计算负责预测物体的grid cell分类的误差。

2.4小节作者在讨论yolo的缺陷,实际上yolo的缺陷在前面已经说的差不多了。一个是因为grid cell只能预测一个分类的原因,导致对小物体的识别效果差,另一个是因为网络中含有下采样层,导致特征变的没那么细致。最后一个缺点是因为对大框小框一视同仁导致分类正确但定位误差大。

Comparison to Other Detection Systems(和其他模型对比)

读这一章节的主要作用:学一学如何优美的拉踩,如何优美的喷一边前人的工作。

先介绍了一下在yolo之前的计算机视觉模型。

DPM:用传统的HOG特征方法,也用的是传统的支持向量机SVM分类器,然后人工造一个模板,再用滑动窗口方法不断的暴力搜索整个待识别图,去套那个模板。这个方法比较大的问题就是在于设计模板,计算量巨大,而且是个静态的,没办法匹配很多变化的东西,鲁棒性差。DPM已经完全性过时了,差不多知道个大概就行,没必要深究。

R-CNN:这个模型这两天说了无数遍了,开头也说过了,这里简单点,直接一句话,SS方法提取候选框,然后送CNN 最后分类+回归。

YOLO对比他们俩都很强,YOLO和R-CNN也有相似的地方,比如也是提取候选框,YOLO的候选框就是上面说过的那98个 bounding boxes,也是用到了NMS非极大值抑制,也用到了CNN提取特征。

Fast和Faster R-CNN
这俩模型都是基于R-CNN的改版,速度和精度都提升了很多,但是也没办法做到实时监测,也就是说FPS到不了30,作者在这里并没有谈准确度的问题,实际上yolo的准确度在这里是不占优势的,甚至于比他们低。

关于R-CNN各种模型系列我在前几天读了一边,并且整理出来了,详细的可以去看看,​​点我直达​​!

后续又说了Deep MultiBox,overfast等各种模型,总之就是给前人的工作都数落一边,凸显自己模型的厉害,学到了 学到了。。。。

Experiments(实验)

这一章实验有很多数据啊图啊和其他模型对比什么的,直接放结果。

  • yolo有很强的泛化能力(比如识别艺术作品 );
  • 实时目标检测(FPS>30),yolo最准,fast yolo最快;
  • 非实时目标检测(FPS<30),Faster R-CNN + VGG-16最准, yolo+VGG-16最快。
  • 总结各种模型对比yolo,比它快的没他准,比他准的没他快!

这里面还有一个错误分析,拿出来说一下吧。

论文里给了一张图:

【目标检测 论文精读】……YOLO-V1 ……(You Only Look Once: Unified, Real-Time Object Detection)_泛化_06


其中:

  • correct:类别预测正确且 IOU > 0.5;
  • loc:类别预测正确且 0.1 < IOU < 0.5;
  • sim:类别相似且 0.1 < IOU;
  • other:类别预测错误且 0.1 < IOU;
  • background:将背景误判为目标,且 0.1 < IOU;
    结论:Fast R-CNN 比yolo准,比yolo定位误差低,背景和物体的区分精准度上没有yolo高。
    后续作者又做了实验,得到结论:YOLO和Fast R-CNN做模型融合可以得到比较好的效果(优势互补)。

小总结

  • YOLO提出了对目标检测的革命性创新,由两阶段变成一阶段且统一的模型;
  • YOLO可以达到实时检测。
  • YOLO的主要误差来源是定位误差大;
  • 各种模型对比yolo,比它快的没他准,比他准的没他快;
  • 做模型集成学习的时候,要非近亲同类,找优势互补的;
  • 损失函数由五部分组成(负责预测物体的那个框的中心点定位误差、负责预测物体的那个框的高宽误差、负责预测物体的那个框的置信度误差、负责预测物体的那个框的置信度误差、负责预测物体的grid cell分类的误差)
  • 查了很多资料发现,由grid cell生成的bbox框,这个框是随机生成的,并且没有任何尺寸限制,也没有根据物体的不同而生成不同的bbox。

yolo整体过程:

训练阶段:

真实框的中心点落在那个grid cell里,就由那个grid cell所生成的B个bbox中与真实框IOU最大的那个框去负责拟合真实框。

每个grid cell还要预测20个类别(VOC数据集)的条件类别概率,然后整合+后处理(NMS等),得到最后结果。

预测、验证阶段:

直接将图片放到模型里(某种CNN),模型输出7 * 7 * 30维的张量,然后进行后处理(NMS等),最后可视化结果。

7 * 7 * 30的含义:
一开始画的 7 * 7 的 网格。每个网格有两个bbox,每个bbox里有 中心坐标x和y,还有框的w和h,再加一个置信度,所以一个bbox就有5个信息,每个grid cell有两个bbox就是10个信息,再加上20种类别,就是30个信息。
7 * 7 * 30公式化为:
公式:S * S * (5 * B + C)
其中 S是一开始网格的参数 比如yolov1中的7 *7 。
B是每个grid cell画多少个bbox。
C是数据集的类别有多少个。

读完这篇论文给我的印象就是相较于R-CNN不断更新前人的版本而言,yolo的创新更加革命性,不过我现在对yolo的吸收还不是很好,有很多地方还不是特别清晰,后面要继续学习yolo系列。