R-CNN

R-CNN 流程

  • 对输入图片使用 select search 选择 2000 个区域
    • select search 有区域合并的操作
  • 拉伸缩放图片到固定尺寸(227 * 227)传入 CNN 生成 4096 维的特征向量
  • 对于特征用 SVM 预测每个类别(C+1,1是背景),通过 IoU 来打分
  • 预测最大的判别为一类
  • 最后对这些区域根据极大值抑制来合并和省略

对于每一个类,都训练一个 SVM 分类器,优化的核心是建立一个 loss 方程,对于 SVM 的 loss function 我们要有 predict 的正负样本,以及 groundtruth 的正负样本

  • predict:对于每一个区域的对应的类 SVM 直接返回 0/1(负样本或者正样本)
  • groundtruth:把所有的框和真实手工标注的框做一个 IoU 的计算,然后根据 IoU 的阈值来生成 data 的负样本与正样本,然后还要进行一次极大值抑制,尽管有些框的 IoU 大于阈值了,但是依旧判为负样本,因为它周围已经有比他更大的了。。

我们还可以对位置进行一个修正(用修正后的位置来计算 IoU):输入为深度网络pool5层的4096维特征,输出为 xy 方向的缩放和平移。 训练样本判定为本类的候选框中,和真值重叠面积大于 0.6 的候选框,loss 为真实框和预测框的二范数。这个预测应该是在一次识别操作之后进行的。。


SPPnet

R-CNN 对于每一个 region 图片都进行了卷积,这样效率很低,一个直观的 idea 就是直接做一次卷积生成一个 feature map,然后在这个 feature map 中找到对应的 region,但是这样有一个问题,就是最后我们的全连接层是固定尺寸的,在 R-CNN 中,我们通过 warp 区域来使输入一致,在 SPPnet 中,我们在 feature map 上面,是否也可以 warp 呢 ?答案是不可以的。。。因为在图像进行 warp,伸展以后图像的意义仍然保留了,但是特征图 warp 以后,不经过修正,就失去意义了。。。所以我们要对 feature 重新提取特征。

SPP 全名是 Spatial Pyramid Pooling,借用了图像金字塔的概念,如上图所示,我们将图像分成 $4\times 4$
, $2\times 2$, $1\times 1$ 的区域,然后做这些区域的 max-pooling,假设经过卷积我们得到的 feature map 是 $n\times m\times 256$ 的,经过 SPP 以后,就变成了 $21\times 256$ 的了

SPP 还有要解决的点就是根据 region 在图像中的位置找到,对应在 feature map 中的位置。。
计算公式是这样的:$(x, y) = (Sx^{\prime}, Sy^{\prime})$,其中 S 是所有步长的乘积,实际中的公式为:

论文中用到的 ZF-5 模型,它的 S 就是 $2^4$ 也就是里面的四个 str 2


Fast R-CNN

R-CNN 缓慢的原因是因为,对于每一张图片都进行来深度网络的卷积
SPPnet 解决 R-CNN 的这个问题,但是 SPPnet 还是有缺陷的,就是和 R-CNN 一样仍然是 multi-stage 的框架

Fast R-CNN 的优点是:

  • 更高的探测精度
  • 在一个 stage 上通过不同任务的 loss 完成训练
  • 训练可以更新网络的每一层
  • feature 的存储不需要放在硬盘上

在 fast R-CNN 中,每一个要训练 ROI 都有一个真实的类别 u(u=0 表示是背景) 和真实的目标区域 v
于是 loss function 可以表示为两个 loss 之和:

  • p 是 softmax 得出的预测结果
  • $u\geq 1$ 说明背景的 loss 不计入考虑范围

faster FC by SVD

位置修正和分类都是全连接层,一次前向传播可以由线性变换表示 $y=Wx$ 复杂度为 $u\times v \times v$

现在我们对这个变换矩阵做一个奇异值分解,取前 t 大的 特征值保留下来复杂度变为 $(u\times t + t\times v) \times v$

训练的过程中应该不会用 SVD 分解。。

ROI Pooling BP

这是这个文章的计算细节中的难点,我还没完全理解。。以后用到再说。。


Faster R-CNN

Faster R-CNN 将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classification都整合在了一个网络中,faster R-CNN 的整体结构如下所示:

Bounding Box 回归系数

原始的边框表示为左上角点和长宽 $(O_x,O_y,O_w,O_h)$,目标边框表示为 $(T_x,T_y,T_w,T_h)$,regression 可以看作是一个框与框之间的移动过程,这个过程的参数如下表示,并且这样的表示对于图像的缩放是 robust 的

Faster R-CNN Procedure__

Anchor Generation Layer

这一层为每个像素点生成 9 个不同大小,不同长宽比的框

Region Proposal Layer

Proposal Layer: 将每一个 anchor 做一个位置修正,同时生成生成这些 anchor 的概率,然后根据极大值抑制对这些 anchor 做一个筛选

Anchor Target Layer
和 gt 相比较,判断 anchor 是前景还是背景,如果是前景的话,计算出对应的框与它待修正偏移

Calculating RPN Loss:loss 等于框的 regression loss 加上 classification loss 这里面的分类是二分类,来判断是前景还是背景

Proposal Target Layer:proposal layer 提供了初步筛选的框,这里再进行一次删选,这里的筛选是根据 gt 进行的,对每个标定的 ground true box 区域,与其重叠比例最大的 ancho r记为 正样本 (保证每个 ground true 至少对应一个正样本anchor)

对上一步剩余的 anchor,如果其与某个标定区域重叠比例大于0.7,记为正样本(每个 ground true box可能会对应多个正样本 anchor。但每个正样本 anchor 只可能对应一个 grand true box);如果其与任意一个标定的重叠比例都小于0.3,记为负样本

Classification Layer


上面 softmax 出现了两个分支,其中一个是要加入 loss function 的另一个是为了找到 target bounding-box 的。。

Training Method

源代码里用了一种叫做4-Step Alternating Training的方法

  1. 用ImageNet模型初始化,独立训练一个RPN网络
  2. 仍然用ImageNet模型初始化,但是使用上一步RPN网络产生的proposal作为输入,训练一个Fast-RCNN网络,至此,两个网络每一层的参数完全不共享
  3. 使用第二步的Fast-RCNN网络参数初始化一个新的RPN网络,但是把RPN、Fast-RCNN共享的那些卷积层的learning rate设置为0,也就是不更新,仅仅更新RPN特有的那些网络层,重新训练,此时,两个网络已经共享了所有公共的卷积层
  4. 仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,形成一个unified network,继续训练,fine tune Fast-RCNN 特有的网络层,此时,该网络已经实现我们设想的目标,即网络内部预测proposal并实现检测的功能

Mask R-CNN


再加一个输出,用来做 mask 的 loss,并且把这个 loss 加入到总的 loss 里面

ROI 和 GT 的 IOU 大于 0.5 就认为是 positive

loss_mask 只在 positive 的样例上进行定义

Mask RCNN 相对于 faster RCNN 的一个很大的改进就是 ROI pooling 变成了 ROI align

我们来看一下 ROI pooling 的问题是什么,下面是一个 ROI pooling 的过程

ROI 在原图的区域对应到了 feature map 中的区域,为此,我们要将原图的 ROI 缩减 S 倍,这里 S 是 32,然后对于感知域,要进行 ROI pooling,要得出 pooling 的 subregion,我们要,除以 pooling 的变长,也就是 7,但是这里面的除法结果是要取整的,取完整以后,我们发现一些区域被边缘化了。。。

ROI align 保留了所有的浮点计算结果,对于完整的 ROI 进行均匀的采样

ROI pooling 的 BP 求导公式为:

$y_{rj}$ 是最后的输出也就是 pooling 得到的最大像素值

$x_i^*(r,j)$ 表示 $y_{rj}$ 的来源
$r$ 表示的是每个做 pooling 的区域
$j$ 是 $r$ 中选择的先像素点

ROI align 是先进行一次双线性插值(bilinear interpolation)也就是,红色区域最近的四个点通过距离加权得到一个值,得到一个中间层,然后对这个中间层进行 max pooling.

ROI align 的 BP 求导公式为:

$d()$ 操作是计算两点的坐标距离的

$\Delta h$ 和 $\Delta w$ 表示 $x_i$ 与 $x_i^*(r,j)$ 横纵坐标的差值

FCN

FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类

Results

Backbone architecture 指的是最前面的特征提取的部分


Reference

https://zhuanlan.zhihu.com/p/31426458
https://zhuanlan.zhihu.com/p/23006190
https://blog.csdn.net/xjz18298268521/article/details/52681966
http://www.telesens.co/2018/03/11/object-detection-and-classification-using-r-cnns/
https://ardianumam.wordpress.com/
https://blog.csdn.net/WZZ18191171661/article/details/79453780
http://blog.leanote.com/post/afanti.deng@gmail.com/b5f4f526490b