R-CNN(Rich feature hierarchies for accurate object detection and semantic segmentation)
RCNN算法流程可分为4个步骤:
- 一张图像生成1K~2K个候选区域(使用 Selective Search方法)
- 对每个候选区域,使用深度网络提取特征
- 特征送入每一类的SVM分类器,判别是否属于该类
- 使用回归器精细修正候选框位置
1. 生成候选区
利用 Selective Search算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就包含着可能需要的物体。
2. 对每个候选区,使用深度网络提取特征
将2000候选区域缩放到227x227pixel,接着将候选区域输入事先训练好的 AlexNet CNN网络获取4096维的特征得到2000×4096维矩阵。
3. 特征送入每一类的SVM分类器,判定类别
将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘,获得2000×20维矩阵表示每个建议框是某个目标类别的得分。分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框。
非极大值抑制剔除重叠建议框
计算IoU(Intersection over Union): $\frac {A \cap B}{A \cup B}$
4. 使用回归器精细修正候选框位置
对NMS处理后剩余的建议框进一步筛选。接着分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。
如图,黄色框口$P$表示建议框 Region Proposal,绿色窗口$G$表示实际框 Ground Truth,红色窗口$\hat$表示 Region Proposal进行回归后的预测窗口,可以用最小二乘法解决的线性回归问题。
R-CNN存在的问题
- 预测速度慢
- 训练速度慢
- 训练所需空间大
Fast R-CNN
Fast R-CNN算法流程可分为3个步骤
- 一张图像生成1K~2K个候选区域(使用 Selective Search方法)
- 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵
- 将每个特征矩阵通过R0I pooling层缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果
一次性计算整张图像特征
Fast-RCNN将整张图像送入网络,紧接着从特征图像上提取相应的候选区域。这些候选区域的特征不需要再重复计算。
训练中不是直接使用SS算法提供的所有候选区域,而是随机采样一部分正样本(IoU > 0.5)和负样本(0.1 < IoU < 0.5)。
ROI Pooling Layer
将用于训练的样本的候选框通过ROI Pooling层,将其缩放至统一的尺寸:
ROI Pooling层:
图中表示的是特征图上的一个channel的操作:左侧为候选区域在特征图上对应的特征矩阵,然后将特征矩阵划分为7x7的小区域,然后对每个区域进行最大值池化,从而得到7x7的特征矩阵。
这样可以对任意输入尺寸的图像进行处理。
分类器
输出N+1个类别的概率(N个检测目标种类,1个背景),所以分类器FC层共N+1个节点。
边界框回归器
输出对应N+1个类别的候选边界框回归参数($d_x, d_y, d_w, d_h$),边界框回归器FC层共(N+1)x4个节点。
损失函数
损失函数包括分类损失和边界框回归损失两个部分:
$$
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)= \begin0.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大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果
Faster R-CNN可以视为RPN + Fast R-CNN
RPN(Region Proposal Network)
RPN的输入为Backbone得到的特征图,在特征图上使用滑动窗口生成多个一维的向量(256-d,取决于Backbone生成的特征图通道数,ZF:256/VGG16:512),然后通过两个全连接层(cls layer和reg layer)得到目标概率及边界框回归参数。
每个anchor box对应两个类别概率(背景和非背景)和4个边界框回归参数(中心点x、y坐标和高宽)
anchor box
对于特征图上的每个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
对于一张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)= \begin0.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的方法:
- 利用ImageNet预训练分类模型初始化前置卷积网络层参数,并开始单独训练RPN网络参数;
- 固定RPN网络独有的卷积层以及全连接层参数,再利用ImageNet预训练分类模型初始化前置卷积网络参数,并利用RPN网络生成的目标建议框去训练Fast RCNN网络参数。
- 固定利用Fast RCNN训练好的前置卷积网络层参数,去微调RPN网络独有的卷积层以及全连接层参数。
- 同样保持固定前置卷积网络层参数,去微调Fast RCNN网络的全连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积网络层参数,构成一个统一网络。