R-CNN系列

R-CNN(Rich feature hierarchies for accurate object detection and semantic segmentation)

RCNN算法流程可分为4个步骤:

  1. 一张图像生成1K~2K个候选区域(使用 Selective Search方法)
  2. 对每个候选区域,使用深度网络提取特征
  3. 特征送入每一类的SVM分类器,判别是否属于该类
  4. 使用回归器精细修正候选框位置

image20220503221833765.png

1. 生成候选区

利用 Selective Search算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就包含着可能需要的物体。

image20220503215938851.png

2. 对每个候选区,使用深度网络提取特征

将2000候选区域缩放到227x227pixel,接着将候选区域输入事先训练好的 AlexNet CNN网络获取4096维的特征得到2000×4096维矩阵。
image20220503220221483.png

3. 特征送入每一类的SVM分类器,判定类别

将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘,获得2000×20维矩阵表示每个建议框是某个目标类别的得分。分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框。

image20220503220543831.png

非极大值抑制剔除重叠建议框

计算IoU(Intersection over Union): $\frac {A \cap B}{A \cup B}$

image20220503221147040.png

4. 使用回归器精细修正候选框位置

对NMS处理后剩余的建议框进一步筛选。接着分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。

如图,黄色框口$P$表示建议框 Region Proposal,绿色窗口$G$表示实际框 Ground Truth,红色窗口$\hat$表示 Region Proposal进行回归后的预测窗口,可以用最小二乘法解决的线性回归问题。

image20220503221408279.png

R-CNN存在的问题

  • 预测速度慢
  • 训练速度慢
  • 训练所需空间大

Fast R-CNN

Fast R-CNN算法流程可分为3个步骤

  1. 一张图像生成1K~2K个候选区域(使用 Selective Search方法)
  2. 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵
  3. 将每个特征矩阵通过R0I pooling层缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果

image.png

一次性计算整张图像特征

Fast-RCNN将整张图像送入网络,紧接着从特征图像上提取相应的候选区域。这些候选区域的特征不需要再重复计算。

image.png
训练中不是直接使用SS算法提供的所有候选区域,而是随机采样一部分正样本(IoU > 0.5)和负样本(0.1 < IoU < 0.5)。

ROI Pooling Layer

将用于训练的样本的候选框通过ROI Pooling层,将其缩放至统一的尺寸:
image.png
ROI Pooling层:
image.png
图中表示的是特征图上的一个channel的操作:左侧为候选区域在特征图上对应的特征矩阵,然后将特征矩阵划分为7x7的小区域,然后对每个区域进行最大值池化,从而得到7x7的特征矩阵。

这样可以对任意输入尺寸的图像进行处理。

分类器

输出N+1个类别的概率(N个检测目标种类,1个背景),所以分类器FC层共N+1个节点。
image.png

边界框回归器

输出对应N+1个类别的候选边界框回归参数($d_x, d_y, d_w, d_h$),边界框回归器FC层共(N+1)x4个节点。
image.png
image.png

损失函数

损失函数包括分类损失边界框回归损失两个部分:
$$
L\left(p, u, t, v\right)=L_(p, u)+\lambda[u \geq 1] L_\left(t, v\right)
$$
式中:

  • $p$是分类器预测的softmax概率分布$p=(p_0,...,p_k)$
  • $u$对应目标真实类别标签
  • $t$对应边界框回归器预测的对应类别$u$的回归参数$\left(t_, t_, t_, t_^\right)$
  • $v$对应真实目标的边界框回归参数$\left(\mathcal, \mathcal, \mathcal, \mathcal\right)$

分类损失

分类损失使用了交叉熵损失函数:
$$
L_
(p, u)=-\log p_
$$

边界框回归损失

$$
\lambda[u \geq 1] L_\left(t^, v\right)
$$

$L_\left(t^, v\right)$

边界框回归损失使用了$Smooth L_{1}$损失函数:
$$
L_
\left(t, v\right)=\sum_{i \in{x, y, w, h}} smooth_{L_{1}}\left(t_-v_\right)
$$
$$
smooth_{L_{1}}(x)= \begin
0.5 x^{2} & \text |x|<1 \ |x|-0.5 & \text \end
$$

$\lambda$

$\lambda$表示平衡系数,用于平衡分类损失和边界框回归损失。

$[u \geq 1]$

$[u \geq 1]$表示艾弗森括号:

  • 当$u \geq 1$时,取值为1,表示计算边界框回归损失
  • 当$u=0$(表示背景)时,取值为0,表示不计算边界框回归损失

Faster R-CNN

Faster R-CNN算法流程可分为3个步骤:

  • 将图像输入网络得到相应的特征图
  • 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
  • 将每个特征矩阵通过R0I pooling层缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果

image.png
Faster R-CNN可以视为RPN + Fast R-CNN

RPN(Region Proposal Network)

image.png
RPN的输入为Backbone得到的特征图,在特征图上使用滑动窗口生成多个一维的向量(256-d,取决于Backbone生成的特征图通道数,ZF:256/VGG16:512),然后通过两个全连接层(cls layer和reg layer)得到目标概率及边界框回归参数。

每个anchor box对应两个类别概率(背景和非背景)和4个边界框回归参数(中心点x、y坐标和高宽)

anchor box

image.png
对于特征图上的每个3x3的滑动窗口,计算出滑动窗口中心点对应原始图像上的中心点,并计算出k个anchor boxes(注意和 proposal的差异)。

anchor box常用的尺度及比例:

  • 三种尺度(面积):$1282, 2562, 512^2$
  • 三种比例:$1:1, 1:2, 2:1$

每个位置(每个滑动窗口)在原图上都对应3x3=9个anchor box。

滑动窗口针对不同Backbone在原图上的感受野:

  • 对于ZF的感受野:171
  • 对于VGG16的感受野:228
    image.png

对于一张1000x600x3的图像,大约有60x40x9(20k)个 anchor,忽略跨越边界的anchor以后,剩下约6k个 anchor。对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU设为0.7,这样每张图片只剩2k个候选框。

训练数据采样

对于每个图片,从生成的anchor中随机采样256个,其中包含正样本和负样本,比例为1:1,正样本不足时,用负样本补充。

区分正负样本:

  • 正样本
    • 与ground truth的IoU最大的anchor
    • anchor和ground truth的IoU > 0.7
  • 负样本:与所有的ground truth的IoU都小于0.3的anchor
  • 其余的anchor全部丢弃

RPN Multi-task loss

RPN的loss分为分类损失和边界框回归损失两部分:
$$
L\left(\left{p_
\right},\left{t_\right}\right)=\frac{1}{N_} \sum_ L_\left(p_, p_{*}\right)+\lambda \frac{1}{N_{\text }} \sum_ p_{} L_{\text }\left(t_, t_^{}\right)
$$
其中:

  • $p_i$表示第i个anchor预测为目标标签的概率
  • $p_i^*$当为正样本时为1,当为负样本时为0
  • $t_i$表示预测第i个anchor的边界框回归参数
  • $t_i^*$表示第i个anchor对应的GT Box(Ground Truth Box)
  • $N_$表示一个mini-batch中的所有样本数量256(采样的候选框个数)
  • $N_$表示anchor中心点的个数(不是anchor个数)约2400

分类损失

分类损失使用了交叉熵损失函数:
$$
L_
(p_i, p_i^*)=-\log p_
$$
其中:

  • $p_i$表示第i个anchor预测为目标标签的概率
  • $p_i^*$当为正样本时为1,当为负样本时为0

注意与二值交叉熵损失区分:
$$
L_
=-\left[p_{*} \log \left(p_\right)+\left(1-p_{*}\right) \log \left(1-p_\right)\right]
$$
使用BCE,cls layer输出为k个scores,而不是2k

边界框回归损失

$$
\lambda \frac{1}{N_{\text
}} \sum_ p_{*} L_{\text }\left(t_, t_{*}\right)
$$

边界框回归损失使用了$Smooth L_{1}$损失函数:
$$
L_{\text
}\left(t_, t_{*}\right)=\sum_ smooth_{L_{1}}\left(t_-t_*\right)
$$
$$
smooth_{L_{1}}(x)= \begin
0.5 x^{2} & \text |x|<1 \ |x|-0.5 & \text \end
$$

$\lambda$表示平衡系数,用于平衡分类损失和边界框回归损失。

Faster R-CNN训练

现在的Faster R-CNN训练直接采用RPN Loss+Fast R-CNN Loss的联合训练方法

原论文中采用分别训练RPN以及Fast R-CNN的方法:

  1. 利用ImageNet预训练分类模型初始化前置卷积网络层参数,并开始单独训练RPN网络参数;
  2. 固定RPN网络独有的卷积层以及全连接层参数,再利用ImageNet预训练分类模型初始化前置卷积网络参数,并利用RPN网络生成的目标建议框去训练Fast RCNN网络参数。
  3. 固定利用Fast RCNN训练好的前置卷积网络层参数,去微调RPN网络独有的卷积层以及全连接层参数。
  4. 同样保持固定前置卷积网络层参数,去微调Fast RCNN网络的全连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积网络层参数,构成一个统一网络。