yolo v1 发表在 CVPR2016 上,是经典的 one-stage 检测算法。在没接触 yolo 之前,我曾经就和师兄争论过,是否能把 bounding box 的坐标和宽高像分类网络那样预测出来,Yolo v1 的出现证明了我的猜测是对的。


论文标题: 《You Only Look Once: Unified, Real-Time Object Detection》
论文地址:https://arxiv.org/pdf/1506.02640.pdf


v1 是 yolo 系列的开山之作,以简洁的网络结构,简单的复现过程 (作者给出详细教程) 而受到 CVer 们的追捧。
yolo_v1 奠定了 yolo 系列算法 “分而治之” 的基调,在 yolo_v1 上,输入图片被划分为 7X7 的网格,如下图所示:
YOLO系列之yolo v1_木盏-CSDN博客_yolov1 - 图1

如上图所示,输入图片被划分为 7x7 个单元格,每个单元格独立作检测。
在这里很容易被误导:每个网格单元的视野有限而且很可能只有局部特征,这样就很难理解 yolo 为何能检测比 grid_cell 大很多的物体。其实,yolo 的做法并不是把每个单独的网格作为输入 feed 到模型,在 inference 的过程中,网格只是物体中心点位置的划分之用,并不是对图片进行切片,不会让网格脱离整体的关系。
可以通过 yolo_v1 的 structure 来进一步理解,相比 faster r-cnn 那种 two-stage 复杂的网络结构而言,yolo_v1 的网络结构显得亲民得多。基本思想是这样:预测框的位置、大小和物体分类都通过 CNN 暴力 predict 出来。
YOLO系列之yolo v1_木盏-CSDN博客_yolov1 - 图2

上面是结构图 yolo_v1 结构图,通过结构图可以轻易知道前向传播的计算过程,是很便于读者理解的。v1 的输出是一个 7x7x30 的张量,7x7 表示把输入图片划分位 7x7 的网格,每一个小单元的另一个维度等于 30。30=(25+20)。*代表能预测 2 个框的 5 个参数 (x,y,w,h,score) 和 20 个种类

SxSx(B∗5+C) = 7x7x(2*5 + 20)
SxS 表示网格数量,B 表示每个网格生成框的个数,C 表示能检测识别的种类。

可以看出输出张量的深度影响 yolo_v1 能检测目标的种类。v1 的输出深度只有 30,意味着每个单元格只能预测两个框 (而且只认识 20 类物体),这对于密集型目标检测和小物体检测都不能很好适用


训练

正如前面所说的,yolo 是端到端训练,对于预测框的位置、size、种类、置信度 (score) 等信息的预测都通过一个损失函数来训练。
loss = λcoord∑i=0S2∑j=0Blijobj[(xi−xi)2]+
λcoord∑i=0S2∑j=0Blijobj[(wi−wi)2]+
∑i=0S2∑j=0Blijobj(ci−ci^)2+
λnoobj∑i=0S2∑j=0Blijnoobj(ci−ci^)2+
∑i=0S2∑c∈classes(pi(c)−pi^(c))2

S2 表示网格数,在这里是 7x7。B 表示每个单元格预测框的个数,这里是 2。
第一行就总方误差 (sum-squared error) 来当作位置预测的损失函数,第二行用根号总方误差来当作宽度和高度的损失函数。第三行和第四行对置信度 confidence 也用 SSE 作为损失函数。第五行用 SSE 作类别概率的损失函数。最后将几个损失函数加到一起,当作 yolo v1 的损失函数。
lijobj 取值为 0 和 1,即单元格内是否有目标。
λcoord = 5
λnoobj = 0.5
从上面公式也可以看得出来,yolo_v1 就是选用最简单的 SSE 作为损失函数 (PS:还没交叉熵复杂)。不过,能解决问题是王道。


总结

v1 对于整个 yolo 系列的价值,即 v2/v3 还保留的特性,可以总结为 3 点:

  1. leaky ReLU,相比普通 ReLU,leaky 并不会让负数直接为 0,而是乘以一个很小的系数 (恒定),保留负数输出,但衰减负数输出;公式如下:

y={x,x>00.1x,otherwise

  1. 分而治之,用网格来划分图片区域,每块区域独立检测目标;
  2. 端到端训练。损失函数的反向传播可以贯穿整个网络,这也是 one-stage 检测算法的优势。
    https://blog.csdn.net/leviopku/article/details/82588059