计算机视觉-7.R-CNN、Fast R-CNN、Mask R-CNN
目标检测-Overfeat模型
滑动窗口
- 目标检测的暴力方法是从左到右、从上到下滑动窗口,利用分类识别目标。
- 为了在不同观察距离处检测不同的目标类型,我们使用不同大小和宽高比的窗口。如下图所示:
注:这样就变成每张子图片输出类别以及位置,变成分类问题。
- 为了在不同观察距离处检测不同的目标类型,我们使用不同大小和宽高比的窗口。如下图所示:
但是滑动窗口需要初始设定一个固定大小的窗口,这就遇到了一个问题,有些物体适应的框不一样
- 所以需要提前设定K个窗口,每个窗口滑动提取M个,总共K x M 个图片,通常会直接将图像变形转换成固定大小的图像,变形图像块被输入 CNN 分类器中,提取特征后,我们使用一些分类器识别类别和该边界框的另一个线性回归器。
Overfeat模型总结
这种方法类似一种暴力穷举的方式,会消耗大量的计算力量,并且由于窗口大小问题可能会造成效果不准确,但是提供了一种解决目标检测问题的思路。
目标检测R-CNN模型
首先从输入图像中选取若干个提议区域(锚框是选取方式的一种),并标注它们的类别和边界框(如偏移量)。然后用卷积神经网络来对每个提议区域(锚框)进行前向传播以抽取特征。最后用每个提议区域的特征来预测类别和边界框。
完整R-CNN结构
不使用暴力方法,而是用候选区域方法(region proposal method),创建目标检测的区域改变了图像领域实现物体检测的模型思路,R-CNN是以深度神经网络为基础的物体检测的模型 ,R-CNN在当时以优异的性能令世人瞩目,以R-CNN为基点,后续的SPPNet、Fast R-CNN、Faster R-CNN模型都是照着这个物体检测思路。
- 步骤(以AlexNet网络为基准)
- 1.找出图片中可能存在目标的侯选区域region proposal,这些侯选区域通常是在多个尺度下选取的,并具有不同的形状和大小;每个侯选区域都将被标注类别和真实边框
- 2.将候选区域调整为了适应AlexNet网络的输入图像的大小227×227,通过CNN对候选区域提取特征向量,2000个建议框的CNN特征组合成网络AlexNet最终输出:2000×4096维矩阵
- 3.将2000×4096维特征经过SVM分类器(20种分类,SVM是二分类器,则有20个SVM),获得2000×20种类别矩阵
- 4.分别对2000×20维矩阵中进行非极大值抑制(NMS:non-maximum suppression)剔除重叠建议框,得到与目标物体最高的一些建议框
- 5.修正bbox,对bbox做回归微调
候选区域(Region of Interest)得出
选择性搜索(SelectiveSearch,SS)中,首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI。
SelectiveSearch在一张图片上提取出来约2000个侯选区域,需要注意的是这些候选区域的长宽不固定。 而使用CNN提取候选区域的特征向量,需要接受固定长度的输入,所以需要对候选区域做一些尺寸上的修改。
CNN网络提取特征
在侯选区域的基础上提取出更高级、更抽象的特征,这些高级特征是作为下一步的分类器、回归的输入数据。
提取的这些特征将会保存在磁盘当中(这些提取的特征才是真正的要训练的数据)
特征向量训练分类器SVM
- 1、假设一张图片的2000个侯选区域,那么提取出来的就是2000 x 4096这样的特征向量(R-CNN当中默认CNN层输出4096特征向量)。
- 2、R-CNN选用SVM进行二分类。假设检测20个类别,那么会提供20个不同类别的SVM分类器,每个分类器都会对2000个候选区域的特征向量分别判断一次,这样得出[2000, 20]的得分矩阵,如下图所示
- 每个SVM分类器做的事情
- 判断2000个候选区域是某类别,还是背景
非最大抑制(NMS)
- 目的
- 筛选候选区域,目标是一个物体只保留一个最优的框,来抑制那些冗余的候选框
假设每个网格的输出为:
- 丢弃所有:的边界框
- while循环,遍历所有剩余的边界框:
2.1 取一个最大的边界框,记作max bounding box,作为预测输入
2.2删除与max bounding box交并比IoU>=0.5的边界框(抑制)
- 如下图,A、C候选框对应左边车辆,B、D、E对应右边车辆
假设现在滑动窗口有:A、B、C、D、E 5个候选框,
- 第一轮:对于右边车辆,假设B是得分最高的,与B的IoU>0.5删除。现在与B计算IoU,DE结果>0.5,剔除DE,B作为一个预测结果
- 第二轮:对于左边车辆,AC中,A的得分最高,与A计算IoU,C的结果>0.5,剔除C,A作为一个结果
最终结果为在这个5个中检测出了两个目标为A和B
SS算法得到的物体位置已经固定了,但是我们筛选出的位置不一定真的就特别准确,需要对A和B进行最后的修正
修正候选区域
那么通过非最大一直筛选出来的候选框不一定就非常准确怎么办?R-CNN提供了这样的方法,建立一个bbox regressor
- 回归用于修正筛选后的候选区域,使之回归于ground-truth,默认认为这两个框之间是线性关系,因为在最后筛选出来的候选区域和ground-truth很接近了
修正过程(线性回归)
- 给定:anchor 和
- 寻找一种变换F,使得:,其中
检测的评价指标
IoU交并比
- IoU(交并比)
- 两个区域的重叠程度overlap:侯选区域和标定区域的IoU值
- 两个区域的重叠程度overlap:侯选区域和标定区域的IoU值
- 通常Correct: 类别正确 且 IoU > 0.5
平均精确率(mean average precision)map
训练样本的标记:候选框(如RCNN2000个)标记
-
1.每个ground-truth box有着最高的IoU的anchor标记为正样本
-
2.剩下的anchor/anchors与任何ground-truth box的IoU大于0.7记为正样本,IoU小于0.3,记为负样本
-
定义:多个分类任务的AP的平均值
- mAP = 所有类别的AP之和 / 类别的总个数
- 注:PR曲线,而AP(average precision)就是这个曲线下的面积(ROC与AUC)
-
方法步骤:
- 1、对于其中一个类别C,首先将算法输出的所有C类别的预测框,按预测的分数confidence排序
- RCNN中就是SVM的输出分数
- 2、设定不同的k值,选择top k个预测框,计算FP和TP,计算Precision和AP
- 3、将得到的N个类别的AP取平均,即得到AP;AP是针对单一类别的,mAP是将所有类别的AP求和,再取平均:
- 1、对于其中一个类别C,首先将算法输出的所有C类别的预测框,按预测的分数confidence排序
-
首先回顾精确率与召回率
- 左边一整个矩形中的数表示ground truth之中为1的(即为正确的)数据
- 右边一整个矩形中的数表示ground truth之中为0的数据
- 精度precision的计算是用 检测正确的数据个数/总的检测个数
- 召回率recall的计算是用 检测正确的数据个数/ground truth之中所有正数据个数。
R-CNN总结
流程总结
缺点
- 1、训练阶段多:步骤繁琐: 微调网络+训练SVM+训练边框回归器。
- 2、训练耗时:占用磁盘空间大:5000张图像产生几百G的特征文件。(VOC数据集的检测结果,因为SVM的存在)
- 3、处理速度慢: 使用GPU, VGG16模型处理一张图像需要47s。
- 4、图片形状变化:候选区域要经过crop/warp进行固定大小,无法保证图片不变形
SPPNet
SPPNet主要存在两点改进地方,提出了SPP层
- 减少卷积计算
R-CNN模型 | SPPNet模型 |
---|---|
1.R-CNN是让每个候选区域经过crop/wrap等操作变换成固定大小的图像 2.固定大小的图像塞给CNN 传给后面的层做训练回归分类操作 |
1、SPPNet把全图塞给CNN得到全图的feature map 2、让SS得到候选区域直接映射特征向量中对应位置 3、映射过来的特征向量,经过SPP层(空间金字塔变换层),S输出固定大小的特征向量给FC层 |
- 映射
原始图片经过CNN变成了feature map,原始图片通过选择性搜索(SS)得到了候选区域(Region of Interest),现在需要将基于原始图片的候选区域映射到feature map中的特征向量。映射过程图参考如下:
整个映射过程有具体的公式,如下
假设表示特征图上的坐标点,坐标点表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关:,即:
- 左上角的点:
- x′=[x/S]+1
- 右下角的点:
- x′=[x/S]−1
其中 S 就是CNN中所有的strides的乘积,包含了池化、卷积的stride。论文中使用S的计算出来为2x2x2x2=16
- x′=[x/S]−1
spatial pyramid pooling
- 通过spatial pyramid pooling 将特征图转换成固定大小的特征向量
示例:假设原图输入是224x224,对于conv出来后的输出是13x13x256,其中某个映射的候选区域假设为:12x10x256
- spp layer会将每一个候选区域分成1x1,2x2,4x4三张子图,对每个子图的每个区域作max pooling,得出的特征再连接到一起就是(16+4+1)x256=21x256=5376结果,接着给全连接层做进一步处理,如下图:
- Spatial bins(空间盒个数):1+4+16=21
SPPNet总结
来看下SPPNet的完整结构
- 优点
- SPPNet在R-CNN的基础上提出了改进,通过候选区域和feature map的映射,配合SPP层的使用,从而达到了CNN层的共享计算,减少了运算时间, 后面的Fast R-CNN等也是受SPPNet的启发
- 缺点
- 训练依然过慢、效率低,特征需要写入磁盘(因为SVM的存在)
- 分阶段训练网络:选取候选区域、训练CNN、训练SVM、训练bbox回归器, SPPNet反向传播效率低
Fast R-CNN
R-CNN的主要性能瓶颈在于,对每个提议区域,卷积神经网络的前向传播是独立的,而没有共享计算。((这些提议区域通常有重叠,独立的特征提取会导致重复计算)) 由于这些区域通常有重叠,独立的特征抽取会导致重复的计算。 Fast R-CNN (Girshick, 2015)对R-CNN的主要改进之一,是仅在整张图象上执行卷积神经网络的前向传播。
上图中描述了Fast R-CNN模型。它的主要计算如下:
-
1.与R-CNN相比,Fast R-CNN用来提取特征的卷积神经网络的输入是整个图像,而不是各个提议区域。此外,这个网络通常会参与训练。设输入为一张图像,将卷积神经网络的输出的形状记为;
-
2.假设选择性搜索生成了个提议区域。这些形状各异的提议区域在卷积神经网络的输出上分别标出了形状各异的兴趣区域。然后,这些感兴趣的区域需要进一步抽取出形状相同的特征(比如指定高度和宽度),以便于连结后输出。为了实现这一目标,Fast R-CNN引入了兴趣区域汇聚层(RoI pooling):将卷积神经网络的输出和提议区域作为输入,输出连结后的各个提议区域抽取的特征,形状为;
-
3.通过全连接层将输出形状变换为,其中超参数取决于模型设计;
-
4.预测个提议区域中每个区域的类别和边界框。更具体地说,在预测类别和边界框时,将全连接层的输出分别转换为形状为(是类别的数量)的输出和形状为的输出。其中预测类别时使用softmax回归。
RoI pooling
在汇聚层中,我们通过设置汇聚窗口、填充和步幅的大小来间接控制输出形状。而兴趣区域汇聚层(RoI pooling)对每个区域的输出形状是可以直接指定的。
它的作用时将大小不一的锚框变成统一的形状
例如,指定每个区域输出的高和宽分别为和。 对于任何形状为的兴趣区域窗口,该窗口将被划分为子窗口网格,其中每个子窗口的大小约为。 在实践中,任何子窗口的高度和宽度都应向上取整,其中的最大元素作为该子窗口的输出。 因此,兴趣区域汇聚层可从形状各异的兴趣区域中均抽取出形状相同的特征。
例如:
上图中对的黑色方框中的区域进行的兴趣区域池化,由于的区域不能均匀地进行切割成 4 块,所以会进行取整(最终将其分割成为、、、四块),在做池化操作的时候分别对四块中每一块取最大值,然后分别填入的矩阵中相应的位置
End-to-End model
从输入端到输出端直接用一个神经网络相连,整体优化目标函数。
接着我们来看为什么后面的整个网络能进行统一训练?
特征提取CNN的训练和SVM分类器的训练在时间上是先后顺序,两者的训练方式独立,因此SVMs的训练Loss无法更新SPP-Layer之前的卷积层参数,去掉了SVM分类这一过程,所有特征都存储在内存中,不占用硬盘空间,形成了End-to-End模型(proposal除外,end-to-end在Faster-RCNN中得以完善)
- 使用了softmax分类
多任务损失-Multi-task loss
两个loss,分别是:
-
对于分类loss,是一个N+1路的softmax输出,其中的N是类别个数,1是背景,使用交叉熵损失
-
对于回归loss,是一个4xN路输出的regressor,也就是说对于每个类别都会训练一个单独的regressor的意思,使用平均绝对误差(MAE)损失即L1损失
-
fine-tuning训练:
- 在微调时,调整 CNN+RoI pooling+softmax
- 调整bbox regressor回归当中的参数
Fast R-CNN总结
- 缺点
使用Selective Search提取Region Proposals,没有实现真正意义上的端对端,操作也十分耗时
Fast R-CNN与R-CNN
- Faste R-CNN 的改进是:在拿到一张图片之后,首先使用 CNN 对图片进行特征提取(不是对图片中的锚框进行特征提取,而是对整张图片进行特征提取,仅在整张图像上执行卷积神经网络的前向传播),最终会得到一个 7 * 7 或者 14 * 14 的 feature map
- 抽取完特征之后,再对图片进行锚框的选择(selective search),搜索到原始图片上的锚框之后将其(按照一定的比例)映射到 CNN 的输出上
- 映射完锚框之后,再使用 RoI pooling 对 CNN 输出的 feature map 上的锚框进行特征抽取,生成固定长度的特征(将 n * m 的矩阵拉伸成为 nm 维的向量),之后再通过一个全连接层(这样就不需要使用SVM一个一个的操作,而是一次性操作了)对每个锚框进行预测:物体的类别和真实的边缘框的偏移
- 上图中黄色方框的作用就是将原图中生成的锚框变成对应的向量
- Fast R-CNN 相对于 R-CNN 更快的原因是:Fast R-CNN 中的 CNN 不再对每个锚框抽取特征,而是对整个图片进行特征的提取(这样做的好处是:不同的锚框之间可能会有重叠的部分,如果对每个锚框都进行特征提取的话,可能会对重叠的区域进行多次重复的特征提取操作),然后再在整张图片的feature中找出原图中锚框对应的特征,最后一起做预测
Faster R-CNN
在Fast R-CNN还存在着瓶颈问题:Selective Search(选择性搜索)。要找出所有的候选框,那我们有没有一个更加高效的方法来求出这些候选框呢?
在Faster R-CNN中加入一个提取边缘的神经网络,也就说找候选框的工作也交给神经网络来做了。这样,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。
Faster R-CNN可以简单地看成是区域生成网络+Fast R-CNN的模型,用区域生成网络(Region Proposal Network,简称RPN)来代替Fast R-CNN中的选择性搜索方法,结构如下:
- 1、首先向CNN网络(VGG-16)输入图片,Faster RCNN使用一组基础的conv+relu+pooling层提取feature map。该feature map被共享用于后续RPN层和全连接层。
- 2、Region Proposal Networks。RPN网络用于生成region proposals,faster rcnn中称之为anchors
- 通过softmax判断anchors属于foreground或者background
- 再利用bounding box regression修正anchors获得精确的proposals,输出其Top-N(默认为300)的区域给RoI pooling
- 生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals
- 3、后续就是Fast RCNN操作
RPN原理
RPN网络的主要作用是得出比较准确的候选区域。整个过程分为两步
- 用n×n(默认3×3=9)的大小窗口去扫描特征图,每个滑窗位置映射到一个低维的向量(默认256维),并为每个滑窗位置考虑k种(在论文设计中k=9)可能的参考窗口(论文中称为anchors)
anchors
- 3*3卷积核的中心点对应原图上的位置,将该点作为anchor的中心点,在原图中框出多尺度、多种长宽比的anchors,三种尺度{128,256,512}, 三种长宽比{1:1,1:2,2:1},每个特征图中的像素点有9中框
举个例子:
Faster RCNN训练
Faster R-CNN的训练分为两部分,即两个网络的训练。
- RPN训练:
- 目的:从众多的候选区域中提取出score较高的,并且经过regression调整的候选区域
- Fast RCNN部分的训练:
- Fast R-CNN classification (over classes) :所有类别分类 N+1,得到候选区域的每个类别概率
- Fast R-CNN regression (bbox regression):得到更好的位置
候选区域的训练
- 训练样本anchor标记
- 1.每个ground-truth box有着最高的IoU的anchor标记为正样本
- 2.剩下的anchor/anchors与任何ground-truth box的IoU大于0.7记为正样本,IoU小于0.3,记为负样本
- 3.剩下的样本全部忽略
- 正负样本比例为1:3
- 训练损失
- RPN classification (anchor good / bad) ,二分类,是否有物体,是、否
- RPN regression (anchor -> proposal) ,回归
- 注:这里使用的损失函数和Fast R-CNN内的损失函数原理类似,同时最小化两种代价
候选区域的训练是为了让得出来的 正确的候选区域, 并且候选区域经过了回归微调。在这基础之上做Fast RCNN训练是得到特征向量做分类预测和回归预测。
Faster R-CNN总结
- 优点
- 提出RPN网络
- 端到端网络模型
- 缺点
- 训练参数过大
可以改进的需求:
- 训练参数过大
- RPN(Region Proposal Networks) 改进对于小目标选择利用多尺度特征信息进行RPN
- 速度提升,如YOLO系列算法,删去了RPN,直接对proposal进行分类回归,极大的提升了网络的速度
Mask R-CNN
如果在训练集中还标注了每个目标在图像上的像素级位置,Mask R-CNN 能够有效地利用这些相近地标注信息进一步提升目标检测地精度.
Mask R-CNN 是基于 Faster R-CNN 修改而来的,改进在于
- 假设有每个像素的标号的话,就可以对每个像素做预测(FCN)
- 将兴趣区域汇聚层替换成了兴趣区域对齐层(RoI pooling -> RoI align),使用双线性插值(bilinear interpolation)保留特征图上的空间信息,进而更适于像素级预测:对于pooling来说,假如有一个3 * 3的区域,需要对它进行2 * 2的RoI pooling操作,那么会进行取整从而切割成为不均匀的四个部分,然后进行 pooling 操作,这样切割成为不均匀的四部分的做法对于目标检测来说没有太大的问题,因为目标检测不是像素级别的,偏移几个像素对结果没有太大的影响。但是对于像素级别的标号来说,会产生极大的误差;RoI align 不管能不能整除,如果不能整除的话,会直接将像素切开,切开后的每一部分是原像素的加权(它的值是原像素的一部分)
- 兴趣区域对齐层的输出包含了所有与兴趣区域的形状相同的特征图,它们不仅被用于预测每个兴趣区域的类别和边界框,还通过额外的全卷积网络预测目标的像素级位置
总结
- R-CNN 是最早、也是最有名的一类基于锚框和 CNN 的目标检测算法(R-CNN 可以认为是使用神经网络来做目标检测工作的奠基工作之一),它对图像选取若干提议区域,使用卷积神经网络对每个提议区域执行前向传播以抽取其特征,然后再用这些特征来预测提议区域的类别和边框
- Fast/Faster R-CNN持续提升性能:Fast R-CNN 只对整个图像做卷积神经网络的前向传播,还引入了兴趣区域汇聚层(RoI pooling),从而为具有不同形状的兴趣区域抽取相同形状的特征;Faster R-CNN 将 Fast R-CNN 中使用的选择性搜索替换为参与训练的区域提议网络,这样可以在减少提议区域数量的情况下仍然保持目标检测的精度;Mask R-CNN 在 Faster R-CNN 的基础上引入了一个全卷积网络,从而借助目标的像素级位置进一步提升目标检测的精度
- Faster R-CNN 和 Mask R-CNN 是在追求高精度场景下的常用算法(Mask R-CNN 需要有像素级别的标号,所以相对来讲局限性会大一点,在无人车领域使用的比较多)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)