RCNN, fastRCNN, fasterRCNN

RCNN, fastRCNN, fasterRCNN

参考目录:

RCNN,fast-RCNN,faster-RCNN:https://zhuanlan.zhihu.com/p/64694855

RCNN

参考目录:

RCNN详解:https://blog.csdn.net/weixin_44338712/article/details/107343260

IoU,NMS和bbox回归:https://zhuanlan.zhihu.com/p/60794316

任务

输入:image

输出:1. 类别标签;2. 位置(Bounding box)

解决方法

  • 模块一:提取物体区域(Region proposal)
  • 模块二:对区域进行分类识别(Classification)

传统方法一般是在图片上穷举出所有问题可能出现的区域,然后对这些区域进行分类。对于能分类的区域,使用非极大值抑制(Non-maximumsuppression)去除冗余的区域,在输出结果。

RCNN使用的四个步骤:

  • 设置提取框
  • 对每个框提取特征
  • 图像分类
  • NMS

1. Region

RCNN采用Selective Search生成候选框并合并候选区。算法的主要流程如下:

输入:图片image
输出:物体可能的位置集合L
——————————————————————————————————————————————
使用图像分割算法获得初始区域R={r1,r2,...,rn}
定义相似度集合S={}
for each (ri,rj) in R: # ri,rj互为相邻区域
    计算相似度s(ri,rj)
    S = S ∪ s(ri,rj)
end for

while S ≠ 空:
    s_max(ri,rj) = amax(S)
    合并:rt = ri ∪ rj
    删除所有与ri、rj有关的相似度s(ri,r*),s(rj,r*)
    计算所有与rt相邻区域的相似度,并添加到集合S,S = S ∪ s(rt,r*)
    更新R,R = R ∪ rt
end while
从选区R中获取所有可能的bounding boxes集合L
return L
——————————————————————————————————————————————

2. 特征提取

使用CNN获取各个region proposal的特征。由于不同的region proposal的大小是不一样的,所以需要对图片进行缩放。两种缩放方法:

  1. 各向异性缩放

    即按照尺寸直接强行缩放,图像可能会发生扭曲。

  2. 各向同性缩放

    • 扩充bounding box:在原图上将bounding box扩充到需要的尺寸。
    • 扩充region:用bounding box中颜色的均值对图片的尺寸缺失区域进行填0.

然后使用pretrain后的CNN网络在目标数据集上fine tune。训练过程中会产生一些候选的bounding box,我们将候选框与人工标注的框进行IoU计算,大于0.5记为正样本,否则为负样本。随后通过这些样本进行训练。

3. 训练任务

训练任务主要包括两个:SVM分类和bounding box回归。

3.1 SVM分类

由于训练数据集的数据量很小,所以不适用CNN最后的softmax层进行分类,而是将提取出的特征送入SVM分类器进行分类。SVM适用于小样本训练:IoU<0.3为负例,IoU大于0.7为正例,其余的丢弃。

3.2 bounding box regression

现在设Ground truth的bounding box为\(G=(G_x,G_y,G_w,G_h)\),模型预测的bounding box为\(P=(P_x,P_y,P_w,P_h)\),则bounding boxregression的目标时找到一种映射关系\(f\),使得\(f(P)=G'\)\(G'\)是一个和\(G\)接近的框。

我们可以发现,该映射关系可以表示为平移加缩放:

  1. 平移\((\Delta x,\Delta y)\):

    \[G'_x = P_wd_x(P) + P_x \\ G'_y = P_hd_y(P) + P_y \]

    其中\(\Delta x = P_wd_x(P)\), \(\Delta y = P_hd_y(P)\)

  2. 缩放\((S_w,S_h)\):

    \[G'_w = P_w exp(d_w(P)) \\ G'_h = P_h exp(d_h(P)) \]

    其中\(S_w=exp(d_w(P))\), \(S_h=exp(d_h(P))\)

因此,我们所需要的缩放关系即为\(d_x(P)\), \(d_y(P)\), \(d_w(P)\), \(d_h(P)\),接下来我们可以针对这四个两设计算法。

设计回归

输入\(x\):region proposal对应的pool 5层的特征。

输出\(y\):平移和缩放的尺度\(d_x(P)\), \(d_y(P)\), \(d_w(P)\), \(d_h(P)\)

真实的平移和缩放量用\(t\)表示如下:

\[t_x = (G_x-P_x)/P_w \\ t_y = (G_y-P_y)/P_h \\ t_w = log(G_w/P_w) \\ t_h = log(G_h/P_h) \]

MSE下的损失函数可以定义为:

\[loss = \sum^N_{i=1}(t^i-W^Tx)^2 \]

加上L2正则化项后的损失函数:

\[loss = \sum^N_{i=1}(t^i-W^Tx)^2 + \lambda||W||^2 \]

4. 测试过程

  1. Region proposal的确定
  2. RP的特征提取
  3. SVM分类
  4. BBox回归
  5. NMS

RCNN的缺点

  1. 每一个region proposal需要单独计算feature map导致整体的时间变长,且占用空间大;
  2. 每个模块是相互独立的,导致整体精度不高;
  3. 测试时间长。

fastRCNN

参考目录:

ROI pooling:https://blog.csdn.net/fenglepeng/article/details/117885129

fast RCNN:https://blog.csdn.net/weixin_43702653/article/details/124002054?spm=1001.2014.3001.5501

0. 相对于RCNN的改进

  1. 不再对每个region proposal进行卷积,而是对整长图像进行卷积,减少重复计算;
  2. 使用ROI pooling对特征进行尺寸变换,因为全连接层的输入要求尺寸大小一样。
  3. 删除单独的bbox regressor,将regressor放入网络一起进行训练,每个类别对应一个regressor,并用softmax代替原先的SVM分类器。

1. ROI pooling

ROI的全称为region of interest,ROI pooling是池化层的一种,整个过程可以看作将region proposal拼成统一大小的feature map。

输入

  1. 从具有多个卷积池化的深度网络获得的固定大小的feature map;
  2. 一个N*5矩阵,其中N为ROI的数目。5列中,一列为image index,其余四列代表左上角和右下角的坐标。

输出

batch个vector,batch=roi的个数,vector的大小为channel*w*h

实质:将若干个不同大小的box矩形框映射成大小为w*h的矩形框。


具体操作

  1. 根据输入image,将ROI映射到feature map对应位置;
  2. 将映射后的区域划分为相同大小的section;
  3. 对每个section进行max pooling操作。

例如在下图中,我们在一个\(8\times 8\)的feature map,一个ROI,同时我们需要得到\(2 \times 2\)的输出。

设我们取得了一个region proposal的位置(左上角和右下角的坐标)为\((0,3)\)\((7,8)\),则我们按照下图示意进行划分,将区域不均等地划分为\(2 \times 2\),再取max pooling。

ROI pooling的好处

  1. 不需要进行warp才做,有效避免了物体被扭曲;
  2. 不需要对每个proposal提取特征,只需要用映射的方法从整张图片的feature map上获取ROI feature区域。

2. 模型结构

和RCNN进行对比,有两点主要不同:

  1. 最后一个卷积层后加了一个ROI pooling layer;
  2. 损失函数使用了multi-task loss,将边框回归bounding box regression直接加入了CNN网络的训练。

损失函数

分类器损失:

\[L_{cls}(p,u) = -logp_u \]

回归器损失:

\[L_{loc}(t^u,v) = \sum_{i\in {x,y,w,h}}smooth_{L1}(t_i^u - v_i) \]

where

\[smooth_{L1}(x) = \left\{ \begin{array}{} 0.5x^2 & if\ |x|<1 \\ |x|-0.5 & otherise \end{array} \right. \]

多任务损失函数:

\[L(p,u,t^u,v) = L_{cls}(p,u)+\lambda[u\geqslant 1]L_{loc}(t^u,v) \]

fasterRCNN

参考目录:

faster-RCNN:https://blog.csdn.net/weixin_43702653/article/details/124045469?spm=1001.2014.3001.5501

详解faster-RCNN:https://blog.csdn.net/weixin_42310154/article/details/119889682

RPN:https://zhuanlan.zhihu.com/p/106192020

联合训练:https://blog.csdn.net/Friedrichor/article/details/123943381

fast-RCNN的局限性:依旧使用selective search方法确定region proposal。faster-RCNN改为使用RPN网络提取region proposal。

fast-RCNN的三大模块:

  • Conv layers

    勇于提取输入图像的特征,输出feature map。

  • region proposal networks(RPN)

    最重要的模块,用于提取RP。

  • ROI head

    通过RPN模块确定RP后,后续的结构和fast-RCNN相似。

1. Conv layers

还有三种层,包括13个conv层,13个relu层和4个pooling层。

  • conv: kernel_size=3, pad=1, stride=1
  • pooling: kernel_size=2, pad=0, stride=2

假设输入为图像为\(M \times N\)大小的输入图像,经过网络后会变为\(M/16 \times N/16\)的feature map。

2. Region Proposal Networks

RPN包括以下部分:

  • 生成anchor boxes
  • 判断每个anchor box为foreground(前景,包含物体)或者background(背景)(二分类任务)
  • bbox regression对锚框进行微调,让positive anchor和ground truth更加接近

2.1 anchors

在feature map上,对于每个像素点,预设九个anchor,作为初始的检测框,如下图所示。后面会通过两次bounding box regression来修正检测框的位置。

2.2 cls layer(分类)

在分类任务中,feature map通过sfotmax得到两个值,分别对应目标为前景和背景的概率。RPN并不关心最终分类是什么,它只关心是前景还是背景。

2.3 reg layer (回归)

生成每一个anchor相对于ground truth的坐标偏移量。计算偏移量和缩放量的公式和前文提到的bounding box regression相同。

为什么不直接预测修正后的anchor坐标,而是要预测偏移量?

因为直接预测坐标的数量级较大,难以训练;同时坐标偏移具有较好的数学公式,方便求导。

2.4 生成proposal

proposal层的输入有三个:

  • cls层生成的\((M/16) \times (N/16) \times 2k\)向量
  • reg层生成的\((M/16) \times (N/16) \times 4k\)向量
  • \(im\_info = [M,N,scale\_factor]\)

修正偏移量的要点:

  • 利用 reg layer的值对原始的anchor进行修正;
  • 边界处理:把超出图像边界的positive anchor超出的部分收俩到图像边界处,防止ROI pooling的过程中超出边界;
  • 剔除尺寸非常小的positive anchor;
  • 利用cls layer的score对positive layers进行排序;然后使用NMS;
  • 输出一堆RP的左上角和右下角的坐标值。

3. fasterRCNN的训练方法

3.1 四步交替迭代训练

  1. 训练RPN,使用大型预训练模型共享卷积核权重,端到端训练RPN;
  2. 训练fastRCNN,冻结第一步训练好的RPN,使用和第一步中相同的大型预训练模型共享卷积,训练从RP到最终输出的网络;
  3. 冻结共享卷积,调优RPN;
  4. 冻结RPN和共享卷积,调优fastRCNN;
  5. 重复3,4进行迭代训练。

3.2 联合训练

将四个部分融合到一个网络中,实现端到端的训练过程。

posted @ 2023-11-13 15:36  PaB式乌龙茶  阅读(101)  评论(0)    收藏  举报