重点参考《图解YOLO》《论文阅读笔记:You Only Look Once: Unified, Real-Time Object Detection》

YOLO【1】是RBG挂名的目标检测算法。YOLO不再套用R-CNN的思路,而是将目标检测转换为回归问题,极大提升了检测速率:标准版达到45fps,简化版达到155fps


算法思路

从 r-cnn 到 faster-rcnn,算法一直采用的是 proposal+classify(前者提供位置信息,后者提供类别信息)的思路。精度很高,但检测速率不是很理想

YOLO以整张图为输入,直接在输出层回归 bounding box 的位置及其所属的类别。精度有所影响(图1),但大大提升了检测速率,满足实时的要求
         【R-CNN系列目标检测】(5)YOLO算法
                        图1. 检测精度mAP及检测帧率的对比

流程

  1. 将输入图像分成 SxS 个网格,如果某个 object 中心落在这个网格中那么这个网格就负责预测这个 object(也就是说一个网格最多仅负责一个object)
        【R-CNN系列目标检测】(5)YOLO算法
                           图2. YOLO检测流程
                           
  2. 每个网格预测 B 个 bounding box。每个 box 回归自身位置,并且预测一个置信度(xcenter,ycenter,w,h,confidence)
    其中 confidence 综合了 box 含有 object 的置信度和 box 位置准确度这两个信息:

    confidence=Pr(object)IOUtruthpred

    当 object 落在网格里,Pr(object)=1,否则为0;
    第二项表示预测的 box 与真实 box 之间的 IoU

  3. 假设一共有 C 个类别需要预测,那么按照上面的定义,一个网格的数据维度为:5B+C,一张图片整个的输出 tensor 为SS(5B+C)

  4. 在测试的时候,每个网格预测的类别概率和 box 预测的 confidence 相乘,就得到每个 box 的总置信度

    Pr(classi|object)Pr(object)IOUtruthpred=Pr(classi)IOUtruthpred

    得到总置信度后,通过阈值过滤,对剩下的 box 做 NMS 处理,就得到最终的结果

细节

  1. 每个 box 的坐标,x和y用对应网格的 offset 归一化到[0,1],w和h用图像的width和height归一化到[0,1]

    文章使用的网络,输入为 448*448,取 S=7, B=2, C=20。这样输出为 7*7*30

  2. 损失函数
    1)坐标损失
    a. B*4=8维的坐标损失权重λcoord=5
    b. 考虑到相同偏差下,小尺寸的 box 比大尺寸的更不能忍受,对width和height做取平方根的处理:
          【R-CNN系列目标检测】(5)YOLO算法
                图3. 平方根处理后小尺寸的偏移(横轴)对应的惩罚更大(纵轴)

    2)object损失
    a. 没有object的情况,λnoobj=0.5
    b. 有object的情况,包括类别的损失权重取1
    c. 一个网格预测 B 个 box,从这 B 个 IoU 中挑最大的作为该网格预测的 object 类别

        【R-CNN系列目标检测】(5)YOLO算法
                          图4. 总的损失函数(摘自这里


算法缺陷

  1. 对相互 靠的很近的物体 以及 很小的群体 检测效果不好。这是因为一个网格仅预测B=2个框,并且仅属于一类

  2. 当同一类物体出现了不常见的长宽比时,泛化能力不够

  3. 定位误差是影响检测效果的主要原因


代码实现

作者在 github 上提供了源代码
同时也在这里给出了详细的安装及解释


【1】Redmon J, Divvala S, Girshick R, et al. You Only Look Once: Unified, Real-Time Object Detection[J]. 2015:779-788.


相关文章: