目标检测学习之YOLO《You Only Look Once: Unified, Real-Time Object Detection》

  • YOLO

  • 贡献

目前,基于深度学习算法的一系列目标检测算法大致可以分为两大流派:

  1. 两步走(two-stage)算法:先产生候选区域 (Region Proposals) 然后再进行CNN分类(RCNN系列)。分类问题
  2. 一步走(one-stage)算法:直接对输入图像应用算法并输出类别和相应的定位(YOLO系列)。回归问题

YOLO算法的优点:
1、YOLO的速度非常快。在Titan X GPU上的速度是45 fps(frames per second),加速版的YOLO差不多是150fps,而Faster R-CNN才7 fps。
2、YOLO是基于图像的全局信息进行预测的。这一点和基于sliding window以及region proposal等检测算法不一样。与Fast R-CNN相比,YOLO在误检测(将背景检测为物体)方面的错误率能降低一半多。
3、YOLO可以学到物体的generalizable representations。可以理解为泛化能力强。
4、准确率高,有实验证明。

在这里插入图片描述

  • 网络结构

YOLO的检测思想不同于R-CNN系列的思想,它将目标检测作为回归任务来解决。
下面来看看YOLO的整体结构:
在这里插入图片描述
在这里插入图片描述
由上两图所示,网络是根据GoogLeNet改进的,输入图片为448x448大小,输出为7x7x(2x5+20),现在看来这样写输出维度很奇怪,下面来看一下输出是怎么定义的。
将图片分为个单元格(原文中S=7),之后的输出是以单元格SxS为单位进行的:
1.如果一个object的中心落在某个单元格上,那么这个单元格负责预测这个物体。
2.每个单元格需要预测B个bbox值(bbox值包括座标和宽高,原文中B=2),同时为每个bbox值预测一个置信度(confidence scores)。也就是每个单元格需要预测B×(4+1)个值。
3.每个单元格需要预测C(物体种类个数,原文C=20,这个与使用的数据库有关)个条件概率值.
所以,最后网络的输出维度为SxSx(Bx5xC),这里虽然每个单元格负责预测一种物体(这也是这篇文章的问题,当有小物体时可能会有问题),但是每个单元格可以预测多个bbox值(这里可以认为有多个不同形状的bbox,为了更准确的定位出物体,如下图所示)。
在这里插入图片描述

因为这里是当作回归问题来解决的,所以所有的输出包括座标和宽高最好都定义在0到1之间。比较详细的图如下(抄自网上)。
在这里插入图片描述
来看一下每个单元格预测的B个(x,y,w,h,confidence)的向量和C的条件概率中,每个参数的含义(假设图片宽为{w_i}高为{hi},将图片分为S x S):

  1. (x,y)是bbox的中心相对於单元格的offset
    对于下图中蓝色框的那个单元格(座标为(xcol=1,yrow=4x_{col}=1,y_{row}=4)),假设它预测的输出是红色框的bbox,设bbox的中心座标为(xc,ycx_c,y_c),那么最终预测出来的(x,y)是经过归一化处理的,表示的是中心相对於单元格的offset,计算公式如下:
    x=xcwiSxcol,y=ychiSyrowx=\frac{x_c}{w_i}{S}−x_{col} , y=\frac{y_c}{h_i}{S}−y_{row}
  2. (w,h)是bbox相对于整个图片的比例
    预测的bbox的宽高为wb,hbw_b,h_b,(w,h)表示的是bbox的是相对于整张图片的占比,计算公式如下:
    w=wbwi,h=hbhiw=\frac{w_b}{w_i} , h=\frac{h_b}{h_i}
  3. confidence置信度
    这个置信度是由两部分组成,一是格子内是否有目标,二是bbox的准确度。定义置信度为Pr(Object)IOUpredtruthP_r(Object)∗IOU^{truth}_{pred}
    这里,如果格子内有物体,则Pr(Object)=1P_r(Object)=1,此时置信度等于IoU。如果格子内没有物体,则Pr(Object)=0P_r(Object)=0,此时置信度为0。
  4. C类的条件概率
    条件概率定义为Pr(ClassiObject)P_r(Class_i |Object),表示该单元格存在物体且属于第i类的概率。

在测试的时候每个单元格预测最终输出的概率定义为,如下两图所示(两幅图不一样,代表一个框会输出B列概率值)
Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruthP_r(Class_i|Object) ∗ P_r(Object) ∗ IOU^{truth}_{pred} = P_r(Class_i) ∗ IOU^{truth}_{pred}
在这里插入图片描述
在这里插入图片描述
最后将(S×S)×B×20(S\times S)\times B\times20 列的结果送入NMS(非极大值抑制),最后即可得到最终的输出框结果。

  • 训练YOLO使用的损失函数

在这里插入图片描述
这里需要注意两点:

  1. 每个图片的每个单元格不一定都包含object,如果没有object,那么confidence就会变成0,这样在优化模型的时候可能会让梯度跨越太大,模型不稳定跑飞了。为了平衡这一点,在损失函数中,设置两个参数和,其中控制bbox预测位置的损失,控制单个格内没有目标的损失。
  2. 对于大的物体,小的偏差对于小的物体影响较大,为了减少这个影响,所以对bbox的宽高都开根号。
  • 主要参考

[1] You Only Look Once: Unified, Real-Time Object Detection
[2] https://www.jianshu.com/p/13ec2aa50c12
[3] https://blog.csdn.net/u014380165/article/details/72616238
[4] https://blog.csdn.net/m0_37192554/article/details/81092514

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章