小嘿嘿之卷积神经网络Faster R-CNN发展及原理

paper:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Tensorflow-faster r-cnn github:Tensorflow Faster RCNN for Object Detection
代码解析:https://blog.csdn.net/qq_41576083/article/details/82966489

论文的整个网络 { 公 共 的 特 征 提 取 网 络 , 目 前 在 看 的 源 码 中 可 以 选 择 V G G 16 等 网 络 来 作 为 特 征 提 取 网 络 , 继 而 在 特 征 提 取 网 络 的 最 后 输 出 的 基 础 上 R P N 网 络 , R P N 网 络 主 要 用 于 输 出 候 选 框 ( r o i ) 的 坐 标 修 正 量 以 及 针 对 每 一 个 候 选 框 的 可 靠 打 分 f a s t − r c n n 网 络 , 用 于 生 成 最 终 的 目 标 框 坐 标 以 及 目 标 框 内 的 类 别 信 息 。 \begin{cases} 公共的特征提取网络,目前在看的源码中可以选择VGG16等网络来作为特征提取网络,继而在特征提取网络的最后输出的基础上\\ RPN网络,RPN网络主要用于输出候选框(roi)的坐标修正量以及针对每一个候选框的可靠打分\\ fast-rcnn网络,用于生成最终的目标框坐标以及目标框内的类别信息。 \end{cases} VGG16RPNRPNroifastrcnn

1 发展历程

1.1 目前的卷积神经网络

{ 图 像 分 类 的 C N N : L e N e t 、 A l e x N e t 、 V G G 、 G o o g L e N e t 目 标 检 测 的 C N N : R C N N 、 F a s t R C N N 、 F a s t e r R C N N 、 Y O L O 、 Y O L O v 2 、 S S D \begin{cases} 图像分类的CNN:LeNet、AlexNet、VGG、GoogLeNet \\ 目标检测的CNN:RCNN 、Fast RCNN、Faster RCNN、YOLO、YOLOv2、SSD \end{cases} {CNN:LeNetAlexNetVGGGoogLeNetCNN:RCNNFastRCNNFasterRCNNYOLOYOLOv2SSD

1.2 Faster R-CNN发展由来

CNN → \to RCNN → \to Fast RCNN → \to Faster RCNN

1.2.1 CNN

在这里插入图片描述
算法步骤:
1.首先,我们把下面的图片用作输入;
2.之后,我们将图片分成多个区域;
3.将每个区域看作单独的图片;
4.把这些区域照片传递给CNN,将它们分到不同类别中;
5.当我们把每个区域都分到对应的类别后,再把它们结合在一起,完成对原始图像的目标检测。

1.2.2 RCNN(基于区域的卷积神经网络)

在这里插入图片描述
算法步骤:
1.首先取一个预训练卷积神经网络;

  • 根据需要检测的目标类别数量,训练网络的最后一层;
  • 得到每张图片的感兴趣区域(Region of Interest),对这些区域重新改造,以让其符合CNN的输入尺寸要求;
    4.得到这些区域后,我们训练支持向量机(SVM)来辨别目标物体和背景。对每个类别,我们都要训练一个二元SVM;
    5.最后,我们训练一个线性回归模型,为每个辨识到的物体生成更精确的边界框。
    注意:
  • 根据选择性搜索,要对每张图片提取2000个单独区域;
  • 用CNN提取每个区域的特征。假设我们有N张图片,那么CNN特征就是N*2000;
  • 用RCNN进行目标检测的整个过程有三个模型:
    1- 用于特征提取的CNN
    2- 用于目标物体辨别的线性SVM分类器
    3-调整边界框的回归模型。
1.2.3 Fast RCNN

在这里插入图片描述
在每张照片上只运行一次CNN,然后找到一种方法在2000个区域中进行计算。在Fast RCNN中,我们将图片输入到CNN中,会相应地生成传统特征映射。利用这些映射,就能提取出感兴趣区域。之后,我们使用一个Rol池化层将所有提出的区域重新修正到合适的尺寸,以输入到完全连接的网络中。
步骤:
1.输入图片;
2.输入到卷积网络中,它生成感兴趣区域;
3. 利用Rol池化层对这些区域重新调整,将其输入到完全连接网络中;
4.在网络的顶层用softmax层输出类别。同样使用一个线性回归层,输出相对应的边界框。

所 以 , 和 R C N N 所 需 要 的 三 个 模 型 不 同 , F a s t R C N N 只 用 了 一 个 模 型 就 同 时 实 现 了 区 域 的 特 征 提 取 、 分 类 、 边 界 框 生 成 。 \green{所以,和RCNN所需要的三个模型不同,Fast RCNN只用了一个模型就同时实现了区域的特征提取、分类、边界框生成。} RCNNFastRCNN

1.2.4 RCNN家族对比

在这里插入图片描述

2 Faster R-CNN算法

在这里插入图片描述
Faster RCNN是Fast RCNN的优化版本,二者主要的不同在于感兴趣区域的生成方法,Fast RCNN使用的是选择性搜索,而Faster RCNN用的是Region Proposal网络(RPN)。RPN将图像特征映射作为输入,生成一系列object proposals,每个都带有相应的分数。
步骤:
1.输入图像到卷积网络中,生成该图像的特征映射。
2. 在特征映射上应用Region Proposal Network,返回object proposals和相应分数。
3.应用Rol池化层,将所有proposals修正到同样尺寸。
4.最后,将proposals传递到完全连接层,生成目标物体的边界框。

2.1 算法过程

在这里插入图片描述

2.2 激活函数

激活函数的目的:引入非线性可以让模型解决线性不可分问题。
详情请见博客《小嘿嘿之常见分类算法之SVM/k-近邻/BP神经网络/朴素贝叶斯》BP神经网络节。

2.3 卷积层

Conv layers=conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
重 要 的 事 需 要 说 三 遍 ! ! ! \red{重要的事需要说三遍!!!}
1 、 所 有 的 c o n v 层 都 是 : k e r n e l s i z e = 3 , p a d = 1 , s t r i d e = 1 ; \red{1、所有的conv层都是:kernel_size=3,pad=1,stride=1;} 1convkernelsize=3pad=1stride=1
2 、 所 有 的 p o o l i n g 层 都 是 : k e r n e l s i z e = 2 , p a d = 0 , s t r i d e = 2 \red{2、所有的pooling层都是:kernel_size=2,pad=0,stride=2} 2poolingkernelsize=2pad=0stride=2
因为在Faster RCNN Conv layers中对所有的卷积都做了扩边处理( pad=1,即填充一圈0),导致原图变为 (M+2)x(N+2)大小,再做3x3卷积后输出MxN 。正是这种设置,导致Conv layers中的conv层不改变输入和输出矩阵大小。
在这里插入图片描述
类似的是,Conv layers中的pooling层kernel_size=2,stride=2。这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小。综上所述,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2。那么,一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)!这样Conv layers生成的feature map中都可以和原图对应起来。

2.4 softmax

softmax函数,又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。下图展示了softmax的计算方法:
在这里插入图片描述
首先,我们知道概率有两个性质:1)预测的概率为非负数;2)各种预测结果概率之和等于1。softmax就是将在负无穷到正无穷上的预测结果按照这两步转换为概率的。
1)将预测结果转化为非负数
softmax第一步就是将模型的预测结果转化到指数函数上,这样保证了概率的非负性。
2)各种预测结果概率之和等于1
为了确保各个预测结果的概率之和等于1。我们只需要将转换后的结果进行归一化处理。方法就是将转化后的结果除以所有转化后结果之和,可以理解为转化后结果占总数的百分比。这样就得到近似的概率。

2.5 Region Proposal Networks

经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如R-CNN使用SS(Selective Search)方法生成检测框。而Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
在这里插入图片描述
可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals

2.5.1 1 × \times × 1卷积

对于多通道图像+多卷积核做卷积,计算方式如下:
在这里插入图片描述
输入有3个通道,同时有2个卷积核。对于每个卷积核,先在输入3个通道分别作卷积,再将3个通道结果加起来得到卷积输出。所以对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量!
对 多 通 道 图 像 做 1 × 1 卷 积 , 其 实 就 是 将 输 入 图 像 于 每 个 通 道 乘 以 卷 积 系 数 后 加 在 一 起 , 即 相 当 于 把 原 图 像 中 本 来 各 个 独 立 的 通 道 “ 联 通 ” 在 了 一 起 。 \red{对多通道图像做1\times1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把原图像中本来各个独立的通道“联通”在了一起。} 1×1

2.5.2 anchor

anchor机制:
对于公共特征提取网络输出结果,stride和大概为16,即输入图片尺寸与输出特征图(也可以理解为是一个图片,反正都是一个矩阵)尺寸的比,假设最后输出特征图尺寸为60X60,那么可以理解为60X60个点,每一个点都可以作为一个窗口中心点,那么窗口的尺寸呢?这就是anchor的用处,每一个anchor即对应9个(一般是9个)窗口尺寸,再将每一个窗口应用在每一个中心点上,用来截取原图像,那么一共可以截取60X60X9约3W幅图片,即60X60X(9X4)个坐标。然后针对这些窗口,网络又需要预测窗口中是否存在目标,即对于每一个窗口还要有两个概率输出,也就是一共要有60X60X(9X2)概率得分,用于甄别对应的候选框里是否存在目标,达到候选窗筛选的功能。
所谓anchors,实际上就是一组由rpn/generate_anchors.py生成的矩形。
[[ -84. -40. 99. 55.]
[-176. -88. 191. 103.]
[-360. -184. 375. 199.]
[ -56. -56. 71. 71.]
[-120. -120. 135. 135.]
[-248. -248. 263. 263.]
[ -36. -80. 51. 95.]
[ -80. -168. 95. 183.]
[-168. -344. 183. 359.]]
其中每行的4个值 ( x 1 , y 1 , x 2 , y 2 ) (x_1,y_1,x_2,y_2) (x1,y1,x2,y2)表矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为{1:1,1:2,2:1}三种,实际上通过anchors就引入了检测中常用到的多尺度方法.
在这里插入图片描述
注 : 关 于 上 面 的 a n c h o r s s i z e , 其 实 是 根 据 检 测 图 像 设 置 的 。 在 p y t h o n d e m o 中 , 会 把 任 意 大 小 的 输 入 图 像 r e s h a p e 成 800 x 600 ( 即 2.1 节 中 的 M = 800 , N = 600 ) 。 再 回 头 来 看 a n c h o r s 的 大 小 , a n c h o r s 中 长 宽 1 : 2 中 最 大 为 352 x 704 , 长 宽 2 : 1 中 最 大 736 x 384 , 基 本 是 c o v e r 了 800 x 600 的 各 个 尺 度 和 形 状 。 \green{注:关于上面的anchors size,其实是根据检测图像设置的。在python demo中,会把任意大小的输入图像reshape成800x600(即2.1节中的M=800,N=600)。再回头来看anchors的大小,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。} anchorssizepythondemoreshape800x6002.1M=800N=600anchorsanchors1:2352x7042:1736x384cover800x600

那么这9个anchors是做什么的呢?借用Faster RCNN论文中的原图,遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确,不用担心,后面还有2次bounding box regression可以修正检测框位置。

在这里插入图片描述
解释:

  • 在原文中使用的是ZF model中,其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息,同时256-d不变
  • 假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4k coordinates
  • 补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练

其 实 R P N 最 终 就 是 在 原 图 尺 度 上 , 设 置 了 密 密 麻 麻 的 候 选 A n c h o r 。 然 后 用 c n n 去 判 断 哪 些 A n c h o r 是 里 面 有 目 标 的 p o s i t i v e a n c h o r , 哪 些 是 没 目 标 的 n e g a t i v e a n c h o r 。 所 以 , 仅 仅 是 个 二 分 类 而 已 ! \red{其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已!} RPNAnchorcnnAnchorpositiveanchornegativeanchor!
eg.那么Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor
所以:ceil(800/16) × \times ×ceil(600/16) × \times ×=50 × \times × 38 × \times × 9=17100
其中ceil()表示向上取整,是因为VGG输出的feature map size= 50 × \times × 38

在这里插入图片描述

2.5.3 bounding box regression原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在了解bounding box regression后,再回头来看RPN网络第二条线路
在这里插入图片描述

2.6 Roi Pooling

而RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。从图2中可以看到Rol pooling层有2个输入:
1、原始的feature maps
2、RPN输出的proposal boxes(大小各不相同)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值