计算机视觉-目标检测(一):从 R-CNN 到 Faster R-CNN

1. 概要

目标检测的任务是检测图片中所有物体的类别标签位置(最小外接矩阵/Bounding Box),如下图所示
在这里插入图片描述
目标检测与其他任务的区别如下图所示
Alt
目标检测模型进化过程如下
Alt

2. 区域卷积卷积神经网络R-CNN

论文来源:CVPR-2014
论文链接:Rich feature hierarchies for accurate object detection and semantic segmentation
代码链接:RCNN-PyTorch实现

2.1 模型结构

总体按分类问题对待,分为两个模块
(1)模块1:提取物体区域(Region Proposal)
不同位置、不同尺寸,数量很多
(2)模块2:对区域进行分类识别(Classification)
CNN 分类器,计算量大

传统方法与R-CNN比较如下
在这里插入图片描述

在这里插入图片描述
R-CNN总体流程如上图所示:

  • 输入图片
  • 通过Selective Search(SS) 方法抽取候选区域(数量很多,大概有2k个左右)
  • 对候选区域进行warped,使得所有候选区域都变成相同大小
  • 将warped候选区域送入CNN网络提取特征,并进行分类

2.2 Selective Search

使用Felzenszwalb and Huttenlocher[1]的方法产生图像初始区域,使用贪心算法对区域进行迭代分组,具体步骤如下

  • 按照Felzenszwalb and Huttenlocher的方法产区域集R
  • 计算区域集R里每个相邻区域的相似度 S = { s 1 , s 2 , . . . } S=\{s_1, s_2, ...\} S={s1,s2,...}
  • 找出S中相似度最高的两个区域,将其合并为新集,并添加到R
  • 从S 中移除所有与step3中有关的子集
  • 计算新集与所有子集的相似度
  • 跳转至step3,直至S为空

在合并时优先合并四种区域

  • 颜色(颜色直方图)相近的
  • 纹理(梯度直方图)相近的
  • 合并后总面积小的
  • 合并后总面积在其BBOX中所占比例大的

2.3 warp

warp的方式主要包括如下几种

  • 在原始区域目标周围取一块区域进行等比缩放到CNN 需要的图片大小
  • 去除原始目标区域然后对目标区域进行填充,再等比缩放到CNN所需的图片大小
  • 直接将原始目标区域非等比缩放到CNN需要的图片大小

2.4 R-CNN训练

(1)CNN 模型微调

  • 先在ImageNet上对CNN模型进行pre-train
  • 在SS生成的所有区域上对模型进行fine tunne
    • Log Loss
    • softmax层改成(N+1) way
    • 正样本有N类:跟ground truth重合IoU>0.5
    • 负样本1类:IoU < 0.5

注意: I o U = A ∩ B A ∪ B IoU = \frac{A \cap B}{A \cup B} IoU=ABAB,即表示两个区域的重合度,如果IoU=1,表示两块区域完全重合
在这里插入图片描述

(2)训练分类部分
使用微调的CNN模型抽取候选区域特征,然后训练线性SVM分类器

  • 每个物体类别对应一个SVM分类器(即SVM是一对多的分类器)
  • 正样本:所有Groundtruth 区域
  • 负样本:更ground truth区域重合IoU < 0.3 的SS区域,如下图所示负样本包括不包括目标物体的区域,或者包括其他物体的区域

在这里插入图片描述

(3)回归部分
回归器主要用于对selective search生成的候选框进行修正。如下图所示,黄色框口P表示建议框Region Proposal,绿色窗口G表示实际框Ground Truth,红色窗口 G ^ \hat G G^ 表示Region Proposal进行回归修正后的预测窗口,现在的目标是找到P到 G ^ \hat G G^的映射,使得 G ^ \hat G G^与G越相近,这就相当于一个简单的最小二乘法解决的线性回归问题。
在这里插入图片描述
具体损失函数的定义如下:
定义 P P P 窗口的数学表达式: P i = ( P x i , P y i , P w i , P h i ) P^i=(P_x^i,P_y^i,P_w^i,P_h^i) Pi=(PxiPyiPwiPhi),其中 ( P x i , P y i ) (P_x^i,P_y^i) (PxiPyi)表示第一个 i i i窗口的中心点坐标, P w i P_w^i Pwi P h i P_h^i Phi 分别为第 i i i个窗口的宽和高;

G G G 窗口的数学表达式为: G i = ( G x i , G y i , G w i , G h i ) G^i=(G^i_x,G^i_y,G^i_w,G^i_h) Gi=(GxiGyiGwiGhi)

G ^ \hat G G^ 窗口的数学表达式为: G ^ i = ( G ^ x i , G ^ y i , G ^ w i , G ^ h i ) \hat G^i=(\hat G^i_x,\hat G^i_y,\hat G^i_w,\hat G^i_h) G^i=(G^xiG^yiG^wiG^hi)

则损失函数为:
Loss ⁡ = argmin ⁡ ∑ i = 0 N ( t ∗ i − w ^ ∗ T ϕ 5 ( P i ) ) 2 + λ ∥ w ^ ∗ ∥ 2 \operatorname{Loss}=\operatorname{argmin} \sum_{\mathrm{i}=0}^{\mathrm{N}}\left(\mathrm{t}_*^{\mathrm{i}}-\hat{\mathrm{w}}_*^{\mathrm{T}} \phi_5\left(\mathrm{P}^{\mathrm{i}}\right)\right)^2+\lambda\left\|\hat{\mathrm{w}}_*\right\|^2 Loss=argmini=0N(tiw^Tϕ5(Pi))2+λw^2
其中 ϕ 5 ( P i ) \phi_5(P^i) ϕ5(Pi) 表示目标 P i P^i PiCNN网络Pool5层特征(注意:上一章节中训练分类器使用的是全连接层输出结果), N N N 表示一共有N个bounding box(SS选出的BBOX中与Ground Truth的IoU>0.6的部分); t ∗ t_* t 分别表示表示 ( t x , t y , t h , t w ) (t_x, t_y, t_h, t_w) (tx,ty,th,tw)
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 ) \begin{gathered} \mathrm{t}_{\mathrm{x}}=\left(\mathrm{G}_{\mathrm{x}}-\mathrm{P}_{\mathrm{x}}\right) / \mathrm{P}_{\mathrm{w}} \\ \mathrm{t}_{\mathrm{y}}=\left(\mathrm{G}_{\mathrm{y}}-\mathrm{P}_{\mathrm{y}}\right) / \mathrm{P}_{\mathrm{h}} \\ \mathrm{t}_{\mathrm{w}}=\log \left(\mathrm{G}_{\mathrm{w}} / \mathrm{P}_{\mathrm{w}}\right) \\ \mathrm{t}_{\mathrm{h}}=\log \left(\mathrm{G}_{\mathrm{h}} / \mathrm{P}_{\mathrm{h}}\right) \end{gathered} tx=(GxPx)/Pwty=(GyPy)/Phtw=log(Gw/Pw)th=log(Gh/Ph)
因此该损失函数的意思为:拟合SS预测的BBOX和人工标注的BBOX的误差,训练完通过误差修正SS预测的BBOX,预测阶段如下所示,其中 d ∗ ( P ) = w ∗ T ϕ 5 ( P ) \mathrm{d}_*(\mathrm{P})=\mathrm{w}_*^{\mathrm{T}} \phi_5(\mathrm{P}) d(P)=wTϕ5(P) w ∗ T \text{w}_*^T wT为训练阶段的参数
G ^ x = P w d x ( P ) + P x G ^ y = P h d y ( P ) + P y G ^ w = P w exp ⁡ ( d w ( P ) ) G ^ h = P h exp ⁡ ( d h ( P ) ) \begin{gathered} \hat{\mathrm{G}}_{\mathrm{x}}=\mathrm{P}_{\mathrm{w}} \mathrm{d}_{\mathrm{x}}(\mathrm{P})+\mathrm{P}_{\mathrm{x}} \\ \hat{\mathrm{G}}_{\mathrm{y}}=\mathrm{P}_{\mathrm{h}} \mathrm{d}_{\mathrm{y}}(\mathrm{P})+\mathrm{P}_{\mathrm{y}} \\ \hat{\mathrm{G}}_{\mathrm{w}}=\mathrm{P}_{\mathrm{w}} \exp \left(\mathrm{d}_{\mathrm{w}}(\mathrm{P})\right) \\ \hat{\mathrm{G}}_{\mathrm{h}}=\mathrm{P}_{\mathrm{h}} \exp \left(\mathrm{d}_{\mathrm{h}}(\mathrm{P})\right) \end{gathered} G^x=Pwdx(P)+PxG^y=Phdy(P)+PyG^w=Pwexp(dw(P))G^h=Phexp(dh(P))
以下省去 i i i 上标。 d x d_x dx d y d_y dy 通过平移对 x x x y y y 进行变化 , d w d_w dw d h d_h dh通过缩放对 w w w h h h进行变化

2.5 R-CNN推理

  • (1)使用Selective Search提取大约2000个BBOX/区域
  • (2)将所有区域放大/缩小到 227*227
  • (3)使用fine tunne过的AlexNet计算两套特征。对于每个类别:
    • (a)FC7特征 -> SVM分类器 -> 分类分值
    • (b)使用非极大值抑制NMS(IoU>=0.5)获取无冗余的区域子集
    • (c)Conv5特征 -> BBOX回归模型 -> BBOX误差 -> 修正BBOX

非极大值抑制的具体做法如下
SVM分类器的输出结果为的维度为[2000, 20],即2000个框,每个框分成20类

① 对2000×20维矩阵中每列按从大到小进行排序;
② 从每列最大的得分建议框开始,分别与该列后面的得分建议框进行IoU计算,若IoU>阈值,则剔除得分较小的建议框,否则认为图像中存在多个同一类物体;
③ 从每列次大的得分建议框开始,重复步骤②;
④ 重复步骤③直到遍历完该列所有建议框;
⑤ 遍历完2000×20维矩阵所有列,即所有物体种类都做一遍非极大值抑制;
⑥ 最后剔除各个类别中剩余建议框得分少于该类别阈值的建议框

2.6 R-CNN性能评价

(1)平均精度(AP): 针对某一类别,计算PR曲线下的面积,是precision对于recall的积分
(2)mAP:针对所有类别,计算AP的均值

2.7 R-CNN的缺点

(1)训练时间很长(84h): Fine Tune(18h) + 特征提取(63h) + SVM/BBOX训练(3h)
(2)测试阶段很慢:VGG一张图片47s(每张图片的2000个都会计算CNN特征)
(3)复杂的多阶段训练:用于SVM,BBOX回归的特征需要存储到磁盘中,这将占用大量磁盘空间,此外特征提取也很慢

3. SPP-Net

3.1 SPP-Net对RCNN的改进

(1)直接输入整张图片,所有区域共享卷积计算(将CNN计算提前到SS之前,在Conv5输出上提取所有区域特征)
(2)引入空间金字塔结构(Spatial Pyramid Pooling),为不同尺寸的区域在Conv5输出上提取特征,将不同尺寸映射到尺寸固定的全连接层上

在这里插入图片描述

3.2 SPP-Net网络结构

具体结构如下图所示
在这里插入图片描述
(1)直接一整张图输入CNN网络,提取整个图片的特征,然后再根据region proposal的位置在整个feature map上截取出对应的feature,这样就避免了重复性用CNN对每个region proposal单独提取特征
(2)CNN网络的conv5层后加入了SPP layer,这样就可以不需要warp/crop region proposal了,因为SPP layer可以接受不同size的输入,并可以得到相同尺寸的输出

图片特征抽取
在SPP-net中,一整张图输入CNN网络中,然后经过5个卷积层得到整个图的feature map,然后从这整个feature map上截取出每个region proposal对应的feature。
如下图所示,在feature map中得到原图中蓝色的region对应的feature。定位一个矩形框,只要知道中心点的坐标和矩形框的宽高就可以。所以我们需要根据原图中的region proposal推导出对应的feature map的中心点和宽高。这就需要我们找到卷积网络中两个卷积层之间的映射关系:包括边的映射和点的映射。具体映射关系可以查看SPP-net
在这里插入图片描述
SPP层
CNN时需要输入固定size的图像,这主要是受CNN中的全连接层所限制。因为卷积层计算的方式类似于滑窗,因此对于不同size的输入,卷积层都可以正确计算。但是对于连接数固定的全连接层,例如4096*1000,那么这个全连接层的输入必须是4096维,否则就会出现错误。因此在训练CNN之前都需要先把图片resize到一个固定的尺寸,如3.1章节中图所示crop是从原图中裁剪出固定大小的图片,这样的方式会使得部分图像的信息丢失。warp是直接将图片resize到规定的大小,这样会导致图片发生形变。

在RCNN中通过selective search来提取出不同size的region proposal,然后对不同的region proposal提取出不同尺寸的feature map, 那这些feature map也要经过warp之后才输入之后的FC layer或SVM分类器,那这样或多或少会影响最后的检测结果。

在SPP-Net中增加了空间金字塔结构,如下图
在这里插入图片描述
具体来说就是把输入的feature map划分成不同尺度,比如图中(4, 4) (2, 2) (1, 1)三种不同的尺度,然后会产生不同的bin,比如分成(4, 4)就16个bin,然后在每个bin中使用max pooling,然后就变成固定长度为16的向量。如下图不同尺寸的输入,经过SPP层之后都得到了相同的长度的向量,之后再输入FC layer。所以,使用SPP Layer之后,不同size的输入就可以输出相同的size
在这里插入图片描述

3.3 SPP-Net训练过程

(1)在ImageNet上对CNN模型进行pretrain
(2)计算所有SS的候选区域的的spp特征
(3)使用SPP特征fine tunne后面的全连接层fc6, fc7, fc8
(4)取fc7层特征训练svm分类器
(5)使用SPP特征训练BBOX回归器

与RCNN区别:

  • fine tunne的时候只能fine tunne全连接层(感受野太大,fine tunne CNN困难)

3.4 SPP-Net的问题

(1)需要存储大量的特征
(2)复杂的多阶段训练
(3)训练时间仍然长(25.5h): fine tune(16h)+特征提取(5.5h)+SVM/BBOX训练(4h)
(4)SPP层之前的所有卷积层参数无法fine tune

4. Fast R-CNN

4.1 Fast R-CNN改进点

(1)比R-CNN, SPP-Net 更快的训练/测试速度
(2)更高的精度mAP
(3)实现端到端的单阶段训练(多任务损失函数)
(4)所有层参数都能fine tune
(5)不需要理想存储特征文件

综合来说,Fast R-CNN在SPP-Net上引入2个新技术

  • 感兴趣区域池化层(RoI Pooling Layer)
  • 多任务损失函数(Multi task Loss)

如下图所示
在这里插入图片描述

4.2 Fast R-CNN网络结构

在这里插入图片描述
RoI Pooling
下图展示RoI pooling和 SPP Pooling层的区别
ROI Pooling 是 SPP Pooling的单层特例,具体来说将CNN网络输出的图片特征只进行一次7*7的分割,然后将每个Bin中的所有特征做Max Pooling。
好处是输入特征尺寸不同,但输出尺寸都相同
在这里插入图片描述
在反向传播时,重叠的ROI区域如何处理?
多个区域的偏导之和
在这里插入图片描述
多任务损失
总体损失为分类器损失+回归损失
分类器损失为使用softmax得到每个类别的概率后,取负对数
而回归损失基本原理与SPP-Net一致,拟合误差,但是采用了smopth L1损失,如下图所示,防止两个预测BOX与Ground Truth相差太大造成影响( ∣ x ∣ < 1 |x|<1 x<1 部分)
在这里插入图片描述

4.3 训练

(1)在pretrain模型上做fine tunne

(2)采用了 mini batch sampling抽样的trick,具体做法为:
分层抽样法:每个batch大小为128(候选框的数量)=每个batch图片数量为2 * 每个图片的ROI数量64

ROI分类:基于RoI与Ground Truth重叠

  • 包含物体的RoI占25%(IoU>=0.5)
  • 背景占75%:IoU在[0.1, 0.5)

(3)采用SVD分解加速运算
由于要处理的RoI数量比较多,几乎一半的前向计算时间都被用于全链接层。就Fast R-CNN来说,RoI池化层后的全链接层需要进行约2k次计算,因此Fast R-CNN采用了SVD分解加速全连接层的计算
具体来说如下图所示,将两个矩阵相乘,分解成三个矩阵相乘,由于右边的中间层很小,所以总的参数量会比左边的计算小
在这里插入图片描述

5. Faster R-CNN

使用region proposal network(RPN)网络代替离线selective search模块,即Faster R-CNN = Fast R-CNN + RPN;基于attention机制引导Fast R-CNN关注区域,Region Proposal 量少(约300个)质高

5.1 Region Proposal Network(RPN)

RPN网络结构如下图所示
在这里插入图片描述
(1)输入图片的Conv5特征输入到RPN网络中,首先进行33 256-d卷积层 + RELU
(2)进行1
1, 4k-d卷积层,输出k组proposal的偏差(r, c, w, h)
(3)进行1*1, 2k-d卷积层,输出k组得分(包含目标和不包含目标)

k默认为9,是指预定义的9种大小的候选框(anchor);包含三种尺度scale (128, 256, 512)和三种宽高比(1:1, 1:2, 2:1)。Conv5特征图上每个点都有k个anchor,所以anchor的总量为W*H*k
在这里插入图片描述

RPN网络损失函数
总体损失函数如下所示
L ( { p i } , { t i } ) = 1 N c l s ∑ i L c l s ( P i , i i ∗ ) + λ 1 N r e g ∑ i p i ∗ L r e g ( t i , t i ∗ ) L\left(\left\{p_i\right\},\left\{t_i\right\}\right)=\frac{1}{N_{c l s}} \sum_i L_{c l s}\left(P_i, i_i^*\right)+\lambda \frac{1}{N_{r e g}} \sum_i p_i^* L_{r e g}\left(t_i, t_i^*\right) L({pi},{ti})=Ncls1iLcls(Pi,ii)+λNreg1ipiLreg(ti,ti)
分为两部分:

  • 分类损失 L c l s L_{cls} Lcls覆盖两类:框种存在目标,框中不存在目标
  • 回归损失 L r e g L_{reg} Lreg,与Fast RCNN基本一致,使用sooth L1,拟合候选框的偏差
    在这里插入图片描述
    同时在训练样本中也存在采样,保证正负样本的分布均衡。对于每一张图片,包含128个正样本:与groundth的IoU > 0.7的anchor(或若都小于0.7则取最大Iou);128个负样本:IoU<0.3的anchor框

5.2 Faster R-CNN训练过程

(1)训练RPN网络:通过ImageNet上预训练的模型参数初始化卷积层
(2)训练Fast R-CNN网络(除了RPN以外其他部分):卷积层由ImageNet上预训练的模型参数初始化;Region Proposal由step1RPN生成
(3)调优RPN:使用step2的参数初始化卷积层,然后固定卷积层,finetunne剩余层
(4)调优Fast R-CNN:固定卷积层,fine tune剩余层,Region Prosals由step3的RPN生成

6. 总结

从SPP-Net到Fast R-CNN是一个巨大的进步,从分别训练分类器和回归器的多任务,到分类器回归器合二为一一起训练
在这里插入图片描述
R-CNN 和 SPP-Net对比
在这里插入图片描述
SPP-Net和Fast R-CNN对比
在这里插入图片描述
Fast R-CNN 和 Faster R-CNN 对比
在这里插入图片描述

参考

[1] Felzenszwalb P F, Huttenlocher D P. Efficient Graph-Based Image Segmentation[J]. International Journal of Computer Vision, 2004, 59(2):167-181.
[2]. 知乎-SPP-net
[3]. R-CNN论文详解
[4]. 一文读懂Faster RCNN
[5]. b站-计算机视觉零基础入门

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测计算机视觉领域的重要任务,而Faster R-CNN作为目标检测领域的经典算法之一,具有较高的检测精度和鲁棒性。在睿智的目标检测系列中,我们将使用PyTorch搭建一个基于Faster R-CNN目标检测平台。 首先,我们将使用PyTorch构建一个深度学习模型的基础框架。PyTorch是一个开源的机器学习库,具有灵活的设计和易于使用的特点,因此非常适合用于搭建目标检测平台。我们将利用PyTorch提供的模块和工具,构建一个包含RPN模块、ROI pooling模块和分类回归模块的Faster R-CNN模型。 其次,我们将使用标记好的目标检测数据集,如COCO或PASCAL VOC数据集,对我们搭建的目标检测平台进行训练和验证。我们将利用PyTorch内置的数据加载和预处理工具,以及优化器和损失函数,对Faster R-CNN模型进行端到端的训练,以提高检测精度和泛化能力。 最后,我们将通过在真实场景下的目标检测任务中的应用,来验证我们搭建的Faster R-CNN目标检测平台的性能。我们将评估其在目标定位、多目标检测、不同尺寸目标检测等方面的表现,并对可能的改进和优化进行进一步的研究和实验。 通过这样一个基于PyTorch搭建的Faster R-CNN目标检测平台,我们将能够深入理解目标检测算法的原理和实现细节,提高对深度学习框架的应用能力,并为未来的研究和应用奠定基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值