Yolov1 的学习

最近在看Yolov5,但总感觉是丈二和尚摸不着头脑,于是就想着把所有的Yolo整个系列看一下,顺便了解一下整个计算机视觉目标检测方面的内容

Yolo v1的简介

YOLO V1 (以下称为YOLO) 的论文是 You Only Look Once: Unified, Real-Time Object Detection ,这一篇论文发表在CVPR上面,CVPR 也是计算机视觉与模式识别的顶级会议。

YOLO 在当时首次出现就表现出了又快又准确的特点,简单来说就是:比我好的没我快,比我快的没我好。当时它快到一秒可以检测45张图片,也就是达到了 45FPS,即,实时检测。

与当时比较强的R-CNN类的框架相比,YoloV1是一个完成的一趟下来的框架,因此它没有中间繁琐的流程,一次搞定,这也就是它为什么快的原因。

YOLO 特点

YOLO is refreshingly simple: Yolo的识别如下图所示

Yolov1 Figure1

YOLO 是一个联合的完整的模型,有以下优点:

  • 它非常快,因为它把图像预测作为一个回归问题来进行,就是说将图片的像素当成数字,直接输出一串概率向量。
  • 它看整张图片,不像R-CNN,R-CNN使用的是一种滑动窗口的方式进行的,只能看到图片的一部分而不能看全局的内容,所以相对于R-CNN来说,YOLO会有更小的背景误差,即,它不会将背景识别成为一个物体。
  • 它有更好的泛化能力,在自然事物的图片上进行训练,在艺术作品上进行测试,mAP也不会降低的很小。

虽然YOLO当时表现的不是最好的,但是它却比较快。即,比它好的没它快,比它快的没它好。

YOLO统一检测

YOLO将原来所有的目标检测组件组合在一个简单的神经网络中。这个网络用整张图像的Feature来进行bounding boxes的预测,同时也预测出了所有类别的bounding boxes。YOLO的设计上就可以进行end-to-end的检测。

检测的步骤说明

  • 输入一张图片,将这张图片分为 $S \times S$个grid cell

  • 每一个grid cell会预测出$B$个待定的bounding boxes 和 对应的 confidence score,

    • 其中每个confidence score就是bounding box 中含有目标的概率$Pr(Object)$和 这个bounding box与 ground truth 的IOU的乘积。bounding box 的中心点需要落在grid cell中。
    • 如果没有目标在这个bounding box中,则confidece score 就会趋向于0。
    • 每一个bounding box 由五个预测值 $(x, y, w, h, c)$。其中$(x, y)$是bounding box 的中心点的位置。$(w,h)$ 是bounding box的宽度和高度。$c$ 为confidence score。
  • 每个grid cell 还会预测出 $C$ 个分类的条件概率即 bouding box中含有目标的条件下,是这个目标的概率,用公式来表示就是 $ Pr(Class_i | Object) $。

  • 经过网络之后最后输出的向量为 $(S, S, (B \times 5 + C))$,其中$S \times S$为grid cell 的个数,$B \times 5$ 表示每个bounding box的$5$个预测值 $(x, y, w, h, c)$,$C$ 表示$C$个类别的条件概率。

  • 后面进行一下计算,将条件概率和 bounding box 的 $Pr(Object)$相乘,得到最终的概率

    Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruth Pr(Class_i|Object)*Pr(Object)*IOU_{pred}^{truth}=Pr(Class_i)* IOU_{pred}^{truth}
  • 经过一个NMS,得到最终的预测值

NMS

可以通过下图理解什么是 YOLO中的NMS

NMS

在 YOLO 于 PASCAL VOC 数据集上,$S=7,B=2.C=20$

对于这个检测步骤,需要结合下面的架构来进行加深理解

YOLO 的架构

下面是YOLO的架构

Architecture For YOLO

YOLO采用了24个卷积层和两个全连接层。在ImageNet上的$224 \times 224$的图像上进行训练,在$448 \times 448$的图像上进行检测。还训练了一个Fast YOLO 使用了 9 个卷积层,替换了YOLO的24个卷积层

最后一层预测出了bounding box的坐标和类别的概率,将bounding box 的长和宽进行标准化,使它们都落在 $0 ~ 1$ 之间,同样的对于每个bounding box来说他们的长和宽相对于grid cell的偏移量也是在 $0 ~ 1$ 之间。

最后一层使用了一个线性的激活函数,其他层使用了leaky 这个激活函数。

phi(x)={x,ifx>00.1x,otherwise phi(x) = \begin{cases} x, if x>0 \\ 0.1x, otherwise \end{cases}

损失函数为

L=λcoordi=0S2j=0BAijobj[(xix^i)2+(yiy^i)2]+λcoordi=0S2j=0BAijobj[(wiw^i)2+(hih^i)2]+i=0S2j=0BAijobj(CiC^i)2+λnoobjj=0BAijnoobj(CiC^i)2+i=0S2Aiobj(pi(c)p^i(c))2 \mathcal{L} = \lambda_{\bold{coord} }\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{A}_{ij}^{obj} [(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2] \\ +\lambda_{ \bold{coord} }\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{A}_{ij}^{obj} [ ( \sqrt{w_i}-\sqrt{\hat{w}_i} )^2+(\sqrt{h_i}-\sqrt{\hat{h}_i})^2]\\ +\sum_{i = 0}^{S^2}\sum_{j=0}^{B}\mathbb{A}_{ij}^{obj} (C_i-\hat{C}_i)^2 \\ +\lambda_{ \bold{noobj} }\sum_{j=0}^{B}\mathbb{A}_{ij}^{noobj}(C_i-\hat{C}_i)^2 \\ +\sum_{ i = 0 }^{S^2}\mathbb{A}_i^{obj} (p_i(c)-\hat{p}_i(c))^2

这里的损失计算方法使用的是 SSE(Sum-Squared Error),因为这样求一次导就可以变成一次项,第二部分使用的是对 w 和 h 取根号,是要弱化小框产生的差异。(SSE反映了小框在大框中产生的问题会小于小框在小框中的差异,使用这种方法可以弱化)
上述Loss,对有目标的部分做了一个提升的权重,对没目标的部分做了一个减弱权重分别为 $ \lambda_{ coord } = 5,\lambda_{ noobj }=0.5 $

YOLO 干预

YOLO 非常快,因为它将所有过程都放在一个简单的网络中进行评估。可以达到45FPS,达到实时的检测,不像其他的R-CNN 和 DPM,加上NMS可以让YOLO提升 2~3%的mAP。

YOLO的局限性

因为YOLO强制每个grid cell 只能预测一种类别的物体,因此当物体非常密集的时候,YOLO的预测就没有太高的准确率了,如鸟群等密集型的图片。

YOLO使用的是粗粒度的预测,因为YOLO的架构中有许多下采样的层。

Loss 把小框和大框的损失计算相对均衡,但是一个小的error在大框中是良性的,但是对于一个小框来说的话,一个小的错误就失之毫厘,差之千里了,因此YOLO的定位能力有限(仅限于YOLO的v1版本)

英文说明

  • mAP:mean Average Precision, 即各类别AP的平均值,计算方法为PR曲线(Precision-Recall曲线)下的面积
  • FPS:每秒传输帧数(Frames Per Second),即1秒可以处理多少张图片
  • feature: 特征,使用卷积核来提取图像特征
  • bounding box: 最小包围框,一般是用做目标检测中预测框
  • IOU: Intersection over Union,bounding box 和 ground truth框的相交部分 / 二者的并的部分
  • grid cell: 网格,把图片平均分为S * S块,每一块就是一个 grid cell
  • confidence score: 置信度分数
  • NMS: 非极大抑制,如果不是极值,就对其进行抑制,在YOLO中,抑制为0