基于锚点框的目标检测方法

该方法为空间每一个位置设定多个矩形框,以便尽可能地覆盖图像中所有存在的物体。该方法可分为两类:两阶段目标检测方法(e.g. R-CNN,Fast R-CNN,Faster R-CNN)和单阶段目标检测方法(e.g. YOLO,SSD)

YOLO v1

Redmon, Joseph, et al. “You only look once: Unified, real-time object detection.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.

预测阶段

由下图的预测示例中,对于每个图片分成 7 × 7 的 grid cell

  • 每个 grid cell 包含:

    • 预测出两个 bounding box

    • 20个类别的条件概率:Class Score ~ P(obj is class_i | obj in box)

      可理解为:在当前grid cell下已经包含物体的条件(即它是候选框)下,各类别的概率

  • 每个 bounding box 对应着五个值:x, y, w, h, c相对于grid cell左上角格点的中心点坐标及宽高,置信度)

所以,输出结果为:S×S×(B×5+C)=7×7×(2×5+20)=7×7×30 tensor=1470S\times S \times (B \times 5 + C) = 7 \times 7 \times(2 \times 5 + 20) = 7 \times 7 \times 30 \ \text{tensor} = 1470

置信度(Confidence Score):

  • 训练阶段:Pr(Obj)IOUpredtruth\text{Pr}(Obj)*\text{IOU}^{truth}_{pred} 即为 Confidence Score 的标签值,其中,Pr(Obj)\text{Pr}(Obj) 的标签值为 0 或 1,IOUpredtruth\text{IOU}^{truth}_{pred} (Bounding Box与人工标注框的交并比)则按实际计算

    我们希望,预测出来 Confidence Score 越接近于标签值越好

    显然,负责预测该物体的Bounding box,其标签值直接等于IOUpredtruth\text{IOU}^{truth}_{pred} (即Pr(Obj)=1\text{Pr}(Obj) = 1);相反地,

  • 预测阶段:回归出多少就是多少,无需计算Pr(Obj)IOUpredtruth\text{Pr}(Obj)*\text{IOU}^{truth}_{pred}

预测阶段后处理

(1)遍历所有grid cell,计算每一个bounding box所对应的 20 * 1 尺寸的张量(总共 7 * 7 * 2 个张量)

(2)对于每一个类别,判断所有张量(bb)在该位置(该类别)下的元素值是否低于阈值,若低于则置0

(3)对于每一个类别,使用NMS算法去除冗余的bboxes

NMS(Non-Maximum Suppression)算法流程如下:

1
2
3
4
5
6
7
8
9
10
for c in class_list: # 对于每一个类别
bbox_list = bb_vec[c] # 从每个张量(bbox)中取出类别c下对应的分数
sort(bbox_list) # 降序排序
for bbox_max in bbox_list: # 从左到右枚举bbox,相当于枚举局部最大值
if bbox_max.score == 0:
continue
for bbox_cur in bbox_list[bbox_max.idx : ]:
if IoU(bbox_max, bbox_cur) > 0.5: # 若当前bbox和bbox_max的交并比大于某个阈值
bbox_cur.score = 0 # 则去除该bbox
drawbbox(bbox_list) # 绘制bbox

训练阶段

损失函数 loss function 中每一项均是平方和误差——将目标检测问题视为回归问题

  • 负责检测物体的 bbox 中心点定位误差
  • 负责检测物体的 bbox 宽高定位误差
  • 负责检测物体的 bbox confidence 误差
  • 负责检测物体的 bbox confidence 误差
  • 负责检测物体的 grid cell 分类误差

小细节:

  • λcoord\lambda_{\text{coord}} 要远高于λnoobj\lambda_{\text{noobj}}

由于图片中大部分 grid cell 中并不会包含物体,将会导致这些 grid cell 的置信度会趋向于0,其梯度也会比包含物体的 grid cell 更有影响力。

为此,需要加强「定位误差损失」的权重,削弱「不包含物体的bbox置信度损失」

  • 宽高误差使用了平方根

没有使用绝对误差,而是使用了平方根,从而使得小框对误差更加地敏感(联系x\sqrt{x} 的导数变化——xx 越大,其导数越小)

特点:

速度快但mAP较低,定位性能较差,召回率较低(该检的检不出),小目标或密集目标检测效果较差

YOLO v2

Redmon, Joseph, and Ali Farhadi. “YOLO9000: better, faster, stronger.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2017.

网络结构:https://ethereon.github.io/netscope/#/gist/d08a41711e48cf111e330827b1279c31

Batch Normalization

参考链接:https://zhuanlan.zhihu.com/p/34879333

问题: Internal Covariate Shift——深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化

  • 上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低

    中间层变量可能具有更广的变化范围,若一个层的可变值是另一层的100倍,则可能需要对学习率进行补偿调整

  • 网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度

训练算法: 对于一个 mini-batch:B={x1...m}\mathcal{B} = \{x_1 ... m\},有两个超参数:γ,β\gamma, \beta

  1. 求出mini-batch的均值

μB1mi=1mxi\mu_{\mathcal{B}} \leftarrow \frac{1}{m} \sum^m_{i = 1} x_i

  1. 求出mini-batch的方差

    σB21mi=1m(xiμB)2\sigma^2_{\mathcal{B}} \leftarrow \frac{1}{m} \sum^m_{i = 1}(x_i - \mu_{\mathcal{B}})^2

  2. 正则化

    x^ixiμBσB2+ϵ\hat{x}_i \leftarrow \frac{x_i - \mu_{\mathcal{B}}}{\sqrt{\sigma^2_\mathcal{B} + \epsilon}}

  3. Scale and shift:引入γ\gammaβ\beta 是为了恢复数据本身的表达能力,对规范化后的数据进行线性变换

    特别地,当γ2=σ2,β=μ\gamma^2 = \sigma^2, \beta = \mu,时可实现等价变化且保留原始输入特征的分布信息

yiγx^i+βBNγ,β(xi)y_i \leftarrow \gamma \widehat{x}_i+\beta \equiv \mathrm{BN}_{\gamma, \beta}\left(x_i\right)

测试/预测阶段:由于预测阶段样本数量少,我们可使用整个训练样本的统计量来对Test数据进行归一化。因此训练时需要保留每组mini-batch训练数据在网络中每一层的μB\mu_{\mathcal{B}}σB2\sigma^2_{\mathcal{B}},计算均值与方差的无偏估计:

μtest =E(μbatch )σtest 2=mm1E(σbatch 2)\mu_{\text {test }} =\mathbb{E}\left(\mu_{\text {batch }}\right) \\ \sigma_{\text {test }}^2 =\frac{m}{m-1} \mathbb{E}\left(\sigma_{\text {batch }}^2\right)

在训练过程中,我们无法得知使用整个数据集来估计平均值和方差,所以只能根据每个小批次的平均值和方差不断训练模型。

意义:

  1. 更容易训练,允许较大的学习率,加快收敛
  2. 改善梯度,远离梯度饱和区
  3. 对初始化不敏感
  4. 正则化作用,避免过拟合

高分辨率分类模型(High Resolution Classifier)

为了适应高分辨率的输入图像,先在448×448448 \times 448 分辨率使用 ImageNet 数据集上训练 10 epochs,再在目标检测训练中进行微调

Anchor

将 YOLOv1 最后的全连接层去掉、部分汇聚层去掉(更高分辨率)

输入图像尺寸变为416×416416 \times 416,经过一系列的下采样(倍数为3232),输出的Feature Map 中包含13×1313\times 13 的 grid cell

  • 每个 grid cell 包含:
    • 预测出55 个 Anchor Box
  • 每个 Anchor Box 对应着2525 个值:tx,ty,th,tw,to,20t_x, t_y, t_h, t_w, t_o, 20 个类别的条件概率
    • 每个 Anchor Box 已预先设置好比例(先验框)

所以,输出结果为13×13×5×25 tensor13 \times 13 \times 5 \times 25 \ \text{tensor}

总性能下降,RecallRecall 增大,PrecissionPrecission 降低(预测框个数大大增加)

Anchor Boxes 机制的后处理

  • Anchor Boxes 的尺寸(长宽比)需要手动挑选——训练集中进行 K-Means 聚类,挑选出若干类的合适的尺寸比例(调参:5)

    距离度量指标,不使用欧氏距离(大框错误更多),使用如下式子:

    d(box,centroid)=1IOU(box,centroid)d(box, centroid) = 1 - \text{IOU}(box, centroid)

  • 候选框中心点坐标公式不受约束导致模型不稳定——预测相对于 grid cell 的偏移量(通过sigmoidsigmoid 函数进行限制,使得其中心约束在grid cell 之内,大小不一定)

    bounding boxes 的尺寸计算公式:

    虚线框为 Anchor ,蓝线框为预测框

    (bx,by)(b_x,b_y) 即为预测框的(x,y)(x, y)(cx,cy)(c_x, c_y) 即为 grid cell 左上角(x,y)(x, y)pwp_wphp_h 为 Anchor 的宽高

passthrough 层检测细粒度特征(Fine-Grained Features)

输入图像经过多层网络提取特征后输出 Feature Map,较小的目标的特征有可能会被忽略掉。

为了检测更小的目标, 引入了 passthrough layer ——在最后一个 pooling 之前,其 Feature Map 尺寸为26×26×51226\times 26 \times 512 ,将其1144 ,直接传递(passthrough)到 pooling 后(并且又经过一组卷积)的Feature Map,两者叠加到一起作为输出的 Feature Map

多尺度图像训练(Multi-scale training)

YOLOv2 模型中仅使用卷积层和池化层,因此输入图像的尺寸不局限于416×416416 \times 416,为此,不妨可以利用该特性,增强模型的鲁棒性,采用多尺度训练策略:

每隔 10 个 batch,输入图像的尺寸就从该尺寸集合中进行随机挑选{320,352,...,608}\{ 320, 352, ... , 608 \} (对应输出的Feature Map 尺寸为{10,11,...,19}\{ 10, 11, ..., 19 \}),使网络能够适应各种尺度的目标检测

尺寸集合中均是3232 的倍数,是因为 YOLOv2 下采样倍数为3232