导航:首页 > 源码编译 > fasterrcnn源码

fasterrcnn源码

发布时间:2022-11-25 16:17:36

‘壹’ mac下怎么编译fast-rcnn

Caffe刚出来的时候我就一直再用了,前后大概用了RCNN,Fast-RCNN, 目前在等待Faster-rcnn的代码release! 回答下你的问题,目前我已经基于Fast-rcnn实现了caltech行人检测数据库与kitti数据库的车辆与行人检测,总的来说效果非常不错,在训练速度。

‘贰’ Faster R-CNN:使用RPN实时目标检测

论文: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

目标检测网络大多依靠 区域生成 (region proposal)算法来假设目标的位置。 R-CNN 是采用 Selective Search 算法来提取(propose)可能的 RoIs(regions of interest) 区域,然后对每个提取区域采用标准 CNN 进行分类。选择性搜索(Selective Search )方法就是在目标对象周围设定2000个形状大小位置不一的候选区域,目标物体在候选区域的可能性还是比较大的。然后对这些区域卷积,找到目标物体,虽然大多数区域都是无用的。与寻找几乎个区域比起来,这种方法要高效的多。

Fast R-CNN ,不在原始图像生成备选区域,而是先整张图片通过卷积网络得到特征图,然后在特征图上使用备选区域算法得到感兴趣的区域在特征图的映射,之后使用 Rol Pool将所有区域变成同样尺寸,大大减少了这些目标检测网络的运行时间,但是区域生成的计算成为整个检测网络的瓶颈。

Faster R-CNN 引入了一个 区域生成网络(Region Proposal Network,RPN) ,该网络与检测网络共享输入图像的卷积特征,从而使接近零时间成本的区域生成成为可能。 RPN是一个全卷积网络,可以同时在每个位置预测目标边界和目标分数。RPN经过端到端的训练,可以生成高质量的区域候选框,然后提供给Fast R-CNN用于检测。

Faster R-CNN 由两个模块组成:第一个模块是区域生成的深度全卷积网络,第二个模块是使用备选区域的Fast R-CNN检测器。整个系统是一个单个的,统一的目标检测网络。使用最近流行的“注意力”机制的神经网络术语,RPN模块告诉Fast R-CNN模块在哪里寻找目标。

针对一张图片,需要获得的输出有:

Faster R-CNN 第一步是采用基于分类任务(如ImageNet)的 CNN 模型作为特征提取器。输入图片表示为 H × W × D 的形式,经过预训练 CNN 模型的处理,得到卷积特征图(conv feature map)。

Faster R-CNN 最早是采用在 ImageNet 训练的 ZF 和 VGG ,其后出现了很多其它权重不同的网络.。如 MobileNet 是一种小型效率高的网络结构,仅有 3.3M 参数;而ResNet-152 的参数量达到了 60M;新网络结构,如 DenseNet 在提高了结果的同时,降低了参数数量。

以 VGG16 为例:

VGG16 图片分类时,输入为 224×224×3 的张量(即,一张 224×224 像素的 RGB 图片)。网络结构最后采用 FC 层(而不是 Conv 层)得到固定长度的向量,以进行图片分类.。对最后一个卷积层的输出拉伸为1维的向量,然后送入 FC 层。官方实现中是采用的卷积层 conv5/conv5_1 的输出。

在深度上,卷积特征图对图片的所有信息进行了编码,同时保持相对于原始图片所编码 “things” 的位置。例如,如果在图片的左上角存在一个红色正方形,而且卷积层有激活响应,那么该红色正方形的信息被卷积层编码后,仍在卷积特征图的左上角。因此利用特征图检测目标所在的位置是可行的。

ResNet 结构逐渐取代 VGG 作为基础网络,用于提取特征。ResNet 相对于 VGG 的明显优势是,网络更大,因此具有更强的学习能力.。这对于分类任务是重要的,在目标检测中也应该如此。另外,ResNet 采用残差连接(resial connection) 和 BN (batch normalization) 使得深度模型的训练比较容易。

然后,RPN(Region Propose Network) 对提取的卷积特征图进行处理,寻找可能包含 目标的 预定义数量的区域(regions,边界框) 。为了生成候选区域,在最后的共享卷积层输出的卷积特征图上做 3x3 卷积,卷积核共有512个(VGG),后面是ReLU,这样每个 3x3 区域会得到一个512维的特征向量。然后这个特征向量被输入到两个全连接层——一个边界框回归层(reg)和一个边界框分类层(cls)。

下面解释 k, 2k, 4k 的含义。

基于深度学习的目标检测中,可能最难的问题就是生成长度不定(variable-length)的边界框列表(bounding-boxes),边界框是具有不同尺寸(sizes)和长宽比(aspect ratios )的矩形。在构建深度神经网络时,最后的网络输出一般是固定尺寸的张量输出(采用RNN的除外)。例如,在图片分类中,网络输出是 (C, ) 的张量,C是类别标签数,张量的每个位置的标量值表示图片是类别的概率值。

在 RPN 中,通过采用 anchors(锚) 来解决边界框列表长度不定的问题,即在原始图像中统一放置固定大小的参考边界框。上面说到RPN对特征图做3x3的卷积,假设每一次卷积需要预测 k 个候选区域,因此,reg层具有 4k 个输出,编码 k 个边界框的坐标,cls层输出 2k 个分数,估计每个区域是目标或是背景的概率。这 k 个区域就是 被 k 个参考边界框初始化, k 个参考框就是 k 个锚点,作为第一次预测目标位置的参考 boxes。锚点的中心位于卷积核滑动窗口的中心。默认情况下每个滑动位置使用3个不同尺度(128 2 , 256 2 , 512 2 )3个不同长宽比(1:2, 1:1, 2:1)的锚点,k=9。对于大小为W×H(通常约为2400)的卷积特征图,总共有 W×H×k 个锚点。对于RPN的最后两个全连接层,参数的个数为 512×(4+2)×k.

不同于直接检测目标的位置,这里将问题转化为两部分。对每一个 anchor 而言:

有一种简单的方法来预测目标的边界框,即学习相对于参考边界框的偏移量。假设参考 box:( ),待预测量:( ),一般都是很小的值,以调整参考 box 更好的拟合所需要的。

虽然 anchors 是基于卷积特征图定义的,但最终的 anchos 是相对于原始图片的.

由于只有卷积层和 pooling 层,特征图的维度是与原始图片的尺寸成比例关系的. 即,数学地表述,如果图片尺寸 w×h,特征图的尺寸则是w/r×h/r. 其中,r 是下采样率(subsampling ratio). 如果在卷积特征图空间位置定义 anchor,则最终的图片会是由 r 像素划分的 anchors 集。在 VGG 中, r=16。

RPN 利用所有的参考边界框(anchors),输出一系列目标的良好的 proposals。针对每个 anchor,都有两个不同的输出:

RPN是全卷积网络。

对于分类层,每个 anchor 输出两个预测值:anchor 是背景(background,非object)的 score 和 anchor 是前景(foreground,object) 的 score.

对于回归层,也可以叫边界框调整层,每个 anchor 输出 4 个预测值:
(Δxcenter,Δycenter,Δwidth,Δheight),用于 anchors 来得到最终的 proposals。根据最终的 proposal 坐标和其对应的 objectness score,即可得到良好的 objects proposals.

RPN 有两种类型的预测值输出:二值分类和边界框回归调整。

为了训练RPN,我们为每个锚点分配一个二值类别标签(是目标或不是目标)。我们给两种锚点分配一个正标签:(i)具有与实际边界框的重叠最高交并比(IoU)的锚点,或者(ii)具有与实际边界框的重叠超过0.7 IoU的锚点。注意,单个真实边界框可以为多个锚点分配正标签。通常第二个条件足以确定正样本;但我们仍然采用第一个条件,因为在一些极少数情况下,第二个条件可能找不到正样本。对于所有的真实边界框,如果一个锚点的IoU比率低于0.3,我们给非正面的锚点分配一个负标签。既不正面也不负面的锚点不会有助于训练目标函数。

然后,随机采样 anchors 来生成batchsize=256 的 mini-batch,尽可能的保持 foreground 和 background anchors 的比例平衡。

RPN 对 mini-batch 内的所有 anchors 采用二分类交叉熵来计算分类 loss。然后,只对 mini-batch 内标记为 foreground 的 anchros 计算回归 loss。为了计算回归的目标targets,根据 foreground anchor 和其最接近的 groundtruth object,计算将 anchor 变换到 object groundtruth 的偏移值 Δ。

Faster R-CNN没有采用简单的 L1 或 L2 loss 用于回归误差,而是采用 Smooth L1 loss. Smooth L1 和 L1 基本相同,但是,当 L1 误差值非常小时,表示为一个确定值即认为是接近正确的,loss 就会以更快的速度消失.

由于 Anchors 一般是有重叠,因此,相同目标的候选区域也存在重叠。

为了解决重叠 proposals 问题,采用 NMS 算法处理,丢弃与一个 score 更高的 proposal 间 IoU 大于预设阈值的 proposals.

虽然 NMS 看起来比较简单,但 IoU 阈值的预设需要谨慎处理. 如果 IoU 值太小,可能丢失 objetcs 的一些 proposals;如果 IoU 值过大,可能会导致 objects 出现很多 proposals。IoU 典型值为 0.7。

NMS 处理后,根据 sore 对topN 个 proposals 排序. 在 Faster R-CNN 论文中 N=2000,其值也可以小一点,如 50,仍然能的高好的结果.

当获得了可能的相关目标和其在原始图像中的对应位置之后,问题就更加直接了,采用 CNN 提取的特征和包含相关目标的边界框,采用 RoI Pooling 处理,并提取相关目标的特征,得到一个新的向量。

RPN 处理后,可以得到一堆没有分类得分的目标 proposals。待处理问题为,如何利用这些边界框并分类。

一种最简单的方法是,对每个 porposal,裁剪,并送入pre-trained base 网络,提取特征;然后,将提取特征来训练分类器. 但这就需要对所有的 2000 个 proposals 进行计算,效率低,速度慢。Faster R-CNN通过重用卷积特征图来加快计算效率,即采用 RoI(region of interest) Pooling 对每个 proposal 提取固定尺寸的特征图。然后 R-CNN 对固定尺寸的特征图分类。

目标检测中,包括 Faster R-CNN,常用一种更简单的方法,即:采用每个 proposal 来对卷积特征图裁剪crop,然后利用插值算法(一般为双线性插值 bilinear)将每个 crop resize 到固定尺寸14×14×ConvDepth. 裁剪后,利用 2×2 kernel 的 Max Pooling 得到每个 proposal 的最终7×7×ConvDepth 特征图.

之所以选择该精确形状,与其在下面的模块(R-CNN)中的应用有关。

R-CNN利用RoI Pooling提取的特征进行分类,采用全连接层来输出每个可能的 目标类别的分类得分,是Faster R-CNN框架中的最后一个步骤。

R-CNN 有两个不同的输出:

R-CNN 对每个 proposal 的特征图,拉平后采用 ReLU 和两个大小为 4096 维的全连接层进行处理。然后,对每个不同目标采用两个不同的全连接层处理:一个全连接层有 N+1 个神经单元,其中 N 是类别 class 的总数,包括 background class;一个全连接层有 4N 个神经单元,是回归预测输出,得到 N 个可能的类别分别预测 Δcenterx,Δcentery,Δwidth,Δheight。

R-CNN 的目标基本上是与 RPN 目标的计算是一致的,但需要考虑不同的可能的 object 类别 classes.

根据 proposals 和 ground-truth boxes,计算其 IoU。与任何一个 ground-truth box 的 IoU 大于 0.5 的 proposals 被设为正确的 boxes。IoU 在 0.1 到 0.5 之间时设为 background。这里忽略没有任何交叉的 proposals。这是因为,在此阶段,假设已经获得良好的 proposals。当然,所有的这些超参数都是可以用于调整以更好的拟合 objects。

边界框回归的目标计算的是 proposal 与其对应的 ground-truth间的偏移量,只对基于 IoU 阈值设定类别后的 proposals 进行计算。随机采用一个平衡化的 mini-batch=64,其中,25% 的 foreground proposals(具有类别class) 和 75% 的background proposals.

类似于 RPNs 的 losses,对于选定的 proposals,分类 loss 采用 multiclass entropy loss;对于 25% 的 foreground proposals 采用 SmoothL1 loss 计算其与 groundtruth box 的匹配。

由于 R-CNN全连接网络对每个类别仅输出一个预测值,当计算边框回归loss 时需谨慎,只需考虑正确的类别。

类似于 RPN,R-CNN 最终输出一堆带有类别分类的objects,在返回结果前,再进一步进行处理。

为了调整边界框,需要考虑概率最大的类别的 proposals. 忽略概率最大值为 background class 的proposals.

当得到最终的 objects 时,并忽略被预测为 background 的结果,采用 class-based NMS. 主要是通过对 objects 根据类别class 分组,然后根据概率排序,并对每个独立的分组采用 NMS 处理,最后再放在一起.

最终得到的 objects 列表,仍可继续通过设定概率阈值的方式,来限制每个类的 objects 数量.

Faster R-CNN在论文中是采用分步方法,对每个模块分别训练再合并训练的权重. 自此,End-to-end 的联合训练被发现能够得到更好的结果.

当将完整的模型合并后,得到 4 个不同的 losses,2 个用于 RPN,2 个用于 R-CNN。4 种不同的 losses 以加权和的形式组织. 可以根据需要对分类 loss 和回归 loss 设置权重,或者对 R-CNN 和 RPNs 设置不同权重.

采用 SGD 训练,momentum=0.9. 学习率初始值为 0.001,50K 次迭代后衰减为 0.0001. 这是一组常用参数设置。

‘叁’ fasterrcnn用什么软件好

用tensorflow配置并运行Faster-RCNN,
配置好笔记本的环境,下载好各个需要用到的库。

‘肆’ fasterrcnn最少要训练多少次

50次
50个,FasterR-CNN是很多人进行目标检测领域学习的必经之路。本文将从实战的角度出发,对FasterR-CNN的结构、损失函数以及令人难以理解的anchor进行详细说明。本文将结合代码从以下几个部分进行解析。
代码是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。

‘伍’ 我将fasterrcnn的损失函数由softmaxloss改为sigmoidloss后进行训练

一般都是你的维数没设置对,发一下你的prototxt。还有你运行的时候应该有日志文件产生的吧,你看下日志文件,里面应该有 SIGMOID_CROSS_ENTROPY_LOSS 层之前的那一层的输出特征图的维数,能找到的话找到这个也发一下吧。

‘陆’ fasterrcnn0.4.0和1.0.0的差异

功能不同。
功能不同,Resnet50_Faster_RCNN网络结构下面两张图中,第一张是Resnet50_Faster_RCNN的网络结构流程图,第二张是详细展开后的网络卷积模块。
网络是由若干节点和连接这些节点的链路构成的图,表示诸多对象及其相互联系。网络有资源共享、快速传输信息、提高系统可靠性、易于进行分布式处理和综合信息服务等特性。

‘柒’ 如何提高fasterrcnn速度

RCNN:RCNN可以看作是RegionProposal+CNN这一框架的开山之作,在imgenet/voc/mscoco上基本上所有top的方法都是这个框架,可见其影响之大。RCNN的主要缺点是重复计算,后来MSRA的kaiming组的SPPNET做了相应的加速。

Fast-RCNN:RCNN的加速版本,在我看来,这不仅仅是一个加速版本,其优点还包括:
(a) 首先,它提供了在caffe的框架下,如何定义自己的层/参数/结构的范例,这个范例的一个重要的应用是python layer的应用,我在这里支持多label的caffe,有比较好的实现吗? - 孔涛的回答也提到了。
(2) training and testing end-to-end 这一点很重要,为了达到这一点其定义了ROIPooling层,因为有了这个,使得训练效果提升不少。

‘捌’ 超详细解读Faster R-CNN-FPN

2021年了,竟然还有人写关于Faster R-CNN的文章?我的原因主要有两点:

我们先从全局上了解Faster R-CNN-FPN,然后再关注其中涉及的细节。下面是Faster R-CNN-FPN的网络框架图(或称为tensor流动图)。

众所周知,Faster R-CNN-FPN(主要是Faster R-CNN)是个两阶段的对象检测方法,主要由两部分网络组成,RPN和Fast R-CNN。

RPN的作用是以bouding box(后简称为box)的方式预测出图片中对象可能的位置,并过滤掉图片中绝大部分的背景区域,目标是达到尽量召回图像中感兴趣的对象,预测box尽量能够与实际对象的box贴合,并且保证一定的预测精度(Precision)。另外,RPN并不需要指出预测的box中对象具体的类别,RPN预测的box称为RoI(Region of Interest),由于是以box的方式输出,所以后面我们统一将其称为proposal box。

Fast R-CNN则是在FPN预测的proposal box基础上进一步预测box中对象具体的类别,并对proposal box进行微调,使得最终预测的box尽量贴合目标对象。大致的做法是根据RPN预测的proposal box,从原图backbone的feature map上通过RoIPooling或RoIAlign(Faster R-CNN-FPN使用RoIAlign)提取每个proposal box对应区域的feature map,在这些区域feature map上进一步预测box的类别和相对proposal box的偏移量(微调)。另外,RPN和Fast R-CNN共用同一个backbone网络提取图像的feature map,大大减少了推理耗时。

从上面的介绍可以看出,RPN和Fast R-CNN的配合作用其实可以理解为一种注意力机制,先大致确定目标在视野中的位置,然后再锁定目标仔细观察,确定目标的类别和更加精确的位置,简单来说就是look twice,相比单阶段的look once,当然是比较耗时的,但也换来了更好的效果(虽然很多单阶段方法号称已经获得相当或好于两阶段的效果)。

下面以Faster R-CNN-FPN发展顺序的汇总介绍每个改进的核心思想。

在R-CNN中,CNN只被用来作为特征抽取,后接SVM和线性回归模型分别用于分类和box修正回归。在此基础上,Fast R-CNN直接对原输入图进行特征抽取,然后在整张图片的特征图上分别对每个RoI使用RoIPooling提取(后面会介绍RoIPooling的原理)特定长度的特征向量(论文中空降尺寸为7*7),去掉SVM和线性回归模型,在特征向量上直接使用若干FC层进行回归,然后分别使用两个FC分支预测RoI相关的类别和box,从而显着提升速度和预测效果。 整体框架图如下:

在Fast RCNN的基础上进一步优化,用CNN网络代替Fast R-CNN中的region proposal模块(使用传统Selective Search方法),从而实现了全神经网络的检测方法,在召回和速度上都超过了传统的Selective Search。作者将提供proposal region的网络称为RPN(Region Proposal Network),与检测网络Fast RCNN共享同一backbone,大大缩减了推理速度。

RPN在backbone产生的feature map(图中的conv feature map)之上执行 的滑窗操作,每个滑窗范围内的feature map会被映射为多个proposal box(图中的reg layer分支)以及每个box对应是否存在对象的类别信息(图中的cls layer分支)。由于CNN天然就是滑窗操作,所以RPN使用CNN作为窗口内特征的提取器(对应图中的intermediate layer,后面简称为“新增CNN层”),窗口大小 ,将feature map映射为较低维的feature map以节省计算量(论文中为256)。虽然只使用了 的卷积,但是在原图上的有效的感受野还是很大的,感受野大小不等于网络的降采样率,对于VGG网络,降采样率为16,但是感受野为228像素。类似于Fast-RCNN,为了分别得到box和box对应的类别(此处类别只是表示有没有目标,不识别具体类别),CNN操作之后会分为两个子网络,它们的输入都是新增CNN层输出的feature map,一个子网络负责box回归,一个负责类别回归。由于新增CNN层产生的feature map的每个空间位置的特征(包括通道方向,shape为 )都被用来预测映射前窗口对应位置是否存在对象(类别)和对象的box,那么使用 的CNN进行计算正合适(等效于FC层),这便是RPN的做法。综上所述,所有滑窗位置共享一个新增CNN层和后续的分类和box回归分支网络。下图是RPN在一个窗口位置上执行计算的原理示意。

由于滑窗操作是通过正方形的CNN卷积实现的,为了训练网络适应不同长宽比和尺寸的对象,RPN引入了anchor box的概念。每个滑窗位置会预置k个anchor box,每个anchor box的位置便是滑窗的中心点,k个anchor box的长宽比和尺寸不同,作者使用了9种,分别是长宽比为 、 和 ,尺寸为 , 和 的9种不同组合。分类分支和box回归分支会将新增CNN层输出的feature map的每个空间位置的tensor(shape为 )映射为k个box和与之对应的类别,假设每个位置的anchor box数量为k(如前所述, ),则分类分支输出的特征向量为2k(两个类别),box回归分支输出为4k(4为box信息,box中心点x坐标、box中心点y坐标、box宽w和box高h)。box分支预测的位置(x,y,w,h)都是相对anchor box的偏移量。从功能上来看,anchor box的作用有点类似于提供给Fast RCNN的propsal box的作用,也表示目标可能出现的位置box,但是anchor box是均匀采样的,而proposal box是通过特征抽取(或包含训练)回归得到的。由此可以看出,anchor box与预测的box是一一对应的。从后文将会了解到,通过anchor box与gt box的IoU的关系,可以确定每个预测box的正负样本类别。通过监督的方式让特定的box负责特定位置、特定尺寸和特定长宽比的对象,模型就学会了拟合不同尺寸和大小的对象。另外,由于预测的box是相对anchor box的偏移量,而anchor box是均匀分布在feature map上的,只有距离和尺寸与gt box接近(IoU较大)的anchor box对应的预测box才会与gt box计算损失,这大大简化了训练,不然会有大量的预测box与gt box计算损失,尤其是在训练初始阶段,当一切都是瞎猜的时候。

在Faster RCNN基础上,将backbone替换为ResNet50或ResNet101,涉及部分细节的改动,我们放在本文的细节部分进行描述。

在Faster RCNN-ResNet基础上,引入FPN(特征金字塔网络)模块,利用CNN网络天然的特征金字塔特点,模拟图像金字塔功能,使得RPN和Fast RCNN可以在多个尺度级别(scale level)的feature map上分别预测不同尺寸的对象,大大提高了Faster RCNN的检测能力。相比图像金字塔大大节省了推理时间。原理如下图所示:

从上图中可以看出,FPN并不是简单地使用backbone的多个CNN层输出的feature map进行box回归和分类,而是将不同层的feature map进行了top-down和lateral connection形式的融合后使用。这样便将CNN网络前向传播(bottom-up)产生的深层语义低分辨率特征与浅层的浅语义高分辨率的特征进行融合,从而弥补低层特征语义抽象不足的问题,类似增加上下文信息。其中,top-down过程只是简单地使用最近邻插值将低分辨率的feature map上采样到即将与之融合的下层feature map相同的尺寸(尺寸上采样到2倍),lateral connection则是先将低层的feature map使用 的卷积缩放为即将与之融合的上层feature map相同的通道数(减少计算量),然后执行像素级相加。融合后的feature map不仅会用于预测,还会继续沿着top-down方向向下传播用于下层的特征融合,直到最后一层。

mask R-CNN提出的RoI Align缓解了RoIPooling的缺陷,能够显着提升小目标物体的检测能力。网上介绍RoIPooling和RoIAlign的文章很多,此处不再赘述,推荐阅读个人觉得比较好的两篇博客: RoIPooling 和 RoIAlign 。

此处稍微啰嗦下个人对RoIPooling的思考: 为什么RoIPooling不使用自适应的池化操作,即根据输入的feature map的尺寸和希望输出的feature map尺寸,自动调整池化窗口的大小和步长以计算想要尺寸的feature map,类似于自适应池化操作,而不是将输入的feature map划分成均匀的小区域(bins,论文中划分为 个bins),然后每个小区域中分别计算MaxPooling。不管计算上是否高效,至少这种做法在输入的feature map尺寸(比如 )小于期望的输出feature map尺寸(比如 )时会失效,因为在3*3的feature map上如果不使用padding的话是无法得到 的特征的,而使用padding又是很低效的操作,因为要扩展局部feature map的尺寸,而使用划分bins的方法,即使输出的feature map尺寸远小于要输出的feature map尺寸,也仅仅是在同一位置采样多次而已。

本人之前介绍YOLOv3的 文章 也介绍过anchor box的作用,再加上本文1.1.2节中的介绍应该比较全面了,不再赘述。

此处的绝大部分细节来自论文,论文中未提及的部分,主要参考了mmdetection中的 实现 。

整个模型的网络结构可以划分为四个部分,分别为backbone、FPN、RPN head和Fast RCNN head。

1.backbone: 原图短边被resize到800像素,这里值得注意的是,如此resize后一个batch内的每张图片的大小很有可能并不一致,所以还无法合并为一个输入矩阵,普遍的做法是将batch内的每张图片的左上角对齐,然后计算resize后batch内所有图片的最大宽和高,最后按照最大宽或高分别对每张图片的宽或高进行0值padding;输出为4个不同尺寸的feature map(C2、C3、C4、C5)。

2.FPN: ResNet backbone产生的4个不同尺寸的feature map(C2、C3、C4、C5)作为输入,输出5个不同尺寸的feature map(P2、P3、P4、P5、P6),P6是对P5进行2倍降采样得到,每个feature map的通道数为固定的256;使用P6的原因是为了预测更大尺寸的对象。

3.RPN:输入为FPN产生的feature map(P2、P3、P4、P5、P6);由于RPN是在5个输入feature map上进行独立的预测,则每个feature map都会输出 proposal box,因此不可能将所有的proposal box都提供给Fast R-CNN,这里的做法是对每个feature map上产生的proposal box按类别概率进行排序(每个feature map上的proposal box独立进行),然后选择前k个proposal box, 5个feature map一共会 产生 个proposal box,训练时 ,推理时 。最后,将所有的 个proposal box合并后统一进行NMS(IoU threshold=0.7)去掉冗余的box,最后选择前m个输出给Fast R-CNN,训练和测试时m都取1000。

训练时将gt box通过下面的公式转换为相对anchor box的偏移值,与网络的预测计算loss,至于将每个gt与具体的哪个anchor box计算偏移,则需要根据2.3.1节中的正负样本方法来确定。测试时将预测的box通过该公式中的逆运算计算出当前box相对原图的位置和大小, , , , 指相对全图的box中心点坐标以及宽和高, , , , 指每个anchor相对全图的box中心点坐标以及宽和高。由此可以看出,box回归分支直接预测的便是相对anchor的偏移值,即公式中的 、 、 和 。

以上提到的2000和1000是作为Fast R-CNN的输入proposal box,在训练时参与RPN loss计算的anchor boxs数量为256个,正负样本数量为 ,正样本不足128的用负样本补足。这里的256是从所有feature map中的anchor box中选择的,并非每个feature map都独立取得256个正负样本。这也是合理的,因为每个gt box由于尺寸的原因,几乎不可能与所有feature map上的anchor box的IoU都大于一定的阈值(原因参考2.3.1节)。注意选择前并未进行NMS处理,而是直接根据2.3.1节中确定正负样本的方式确定每个预测box正负类别,然后分别在正样本中随机选择128个正样本,在负样本中随机选择128个负样本。

4.Fast R-CNN:输入为FPN产生的前4个feature map和RPN输出的proposal box,4个feature map为P2、P3、P4、P5,与backbone对应,不使用P6。那么,如何确定在哪个feature map上执行每个proposal box对应的RoIAlign操作并得到 大大小的feature map呢?论文中的做法是通过下面的公式将特定尺寸的proposal box与FPN产生的4个feature map中尺寸最适合的对应起来,即让感受野更接近对象尺寸的feature map预测该对象 ,其中224为backbone在ImageNet上预训练的尺寸,w和h为proposal box的长和宽,k表示适合尺寸为w和h的propsal box的feature map的位置,即4个feature map为P2、P3、P4、P5的下标,k_0为proposal box大致为224*224时对应feature map位置值( ),表示proposal box大致为 时在P4上执行RoIAlign,小于 时,在P2或P3上执行,大于则在P5上。

网络都会针对每个RoI会输出一个类别概率分布(包括背景类别)和一个相对RoI box的长度为4的box偏移向量。概率分支由softmax激活函数得到。与RPN的类似,训练时,如2.4.2节loss计算中所述,会将gt box通过下面的公式转换为相对proposal box(前提是该RoI是正样本)的偏移量,然后使用loss计算公式直接与预测的相对偏移量进行loss计算;测试时,会通过下列公式的逆运算将偏移值换算回相对原图的位置box,然后使用NMS去掉冗余的box,最终输出。

训练时,通过2.3.2中的方式确定每个proposal box属于正样本或负样本后,随机选择512个样本,其中正负比例为1:3进行loss计算,正样本不足的由负样本补足。

在RPN中,由于每个feature map的每个滑窗位置上的张量( 维张量,C为feature map的通道数)会被用来预测k个box和每个box对应的类别概率,那么具体哪个box才能参与gt box的损失计算(包括类别和box回归损失)?这便需要在所有预测的box中确定正负样本,因为一个anchor对应一个预测的box和类别,那么确定预测的box是正例还是负例等价于确定anchor box的是正例还是反例。为了便于训练,RPN中使用双IoU阈值的方式确定正负样本,与gt box的IoU为最大或者大于0.7的anchor box被设置为正样本,这会导致一个gt box与多个预测box计算损失,即允许多个box预测同一对象,与gt box的IoU小于0.3的anchor box被设置为负样本,其余的忽略掉,即不参与loss计算。在此基础上,如2.2节中所述,会对正负样本进行随机采样,总数为256,其他不参与损失函数计算。

与gt box的IoU大于0.5的proposal box作为正样本,注意,是将proposal box与gt box计算IoU,Fast-RCNN中的proposal box的作用与anchor box有些类似,即确定正负样本和预测的box 都是针对它们的偏移值 ,其余IoU在 之间的作为负样本,低于0.1的作为难例挖掘时的启发式样本(mmdetection中的做法是单阈值方式,与gt box的IoU大于0.5的proposal box作为正样本,小于的都是负样本)。

Faster R-CNN中是以分步的方式联合训练RPN和Fast R-CNN,大致的过程为:

但在mmdetection中,已经将RPN和Fast R-CNN的loss进行权重加和,从而进行联合训练,训练流程简化很多,且能够达到相同的效果。

确定了每个预测box或anchor box的正负类别后,便可以计算损失函数了,类似于Fast RCNN的做法,只有正样本的box才会参与box损失计算,损失函数如下:

为类别损失为类别损失函数,使用交叉熵损失, 为box回归损失,使用smooth L1损失,论文中平衡因子lambda为10。 表示第i个anchor box对应的gt 类别(背景为0,对象为1), 为gt box相对anchor box的偏移量(如果该anchor box被确定为正样本),通过下面的公式计算得到, 即表示只有 ,即为正样本时才会计算box的损失。

Fast R-CNN的loss类似于RPN,只有proposal box为非背景类别(正样本)时才计算box损失, 为类别损失, 为box损失, 表示proposal box的 , 时表示背景(通过2.3.2的方式确定proposal box的类别)。 为平衡因子,作者所有实验中 。为了防止box回归的L2 loss放大噪声(异常loss)从而影响训练,作者将L2 loss修改为 loss,当box尺寸的差异较大时使用L1 loss,抑制异常值对梯度的贡献。

其中v是通过下面的公式将gt box( , , , )转换得到,其中,( , , , )为proposal box的在原图中的中心点坐标和宽与高。

在Faster R-CNN和Faster R-CNN-ResNet中,由于RPN只是在单尺寸的feature map上进行滑窗,为了缓解多尺寸的问题,每个滑窗位置会设计多个尺寸的anchor,但是在Faster R-CNN-FPN中使用了FPN,则天然就具有了适应对象多尺寸的问题,因此不用再为每个滑窗设计多个尺寸的anchor。即在Faster RCNN-FPN中,为每种尺寸feature map上的滑窗只设计了单一尺寸多种长宽比的anchor,长宽比有 、 和 ,不同feature map上anchor的尺寸为: , , , 和 ,依次对应P2、P3、P4、P5和P6。

COCO上的训练细节:RPN的weight decay为0.0001,SGD的 ,初始学习率为0.002,学习率调整使用step decay方式。

‘玖’ [图像算法]-Faster RCNN详解

paper: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Tensorflow-faster r-cnn github: Tensorflow Faster RCNN for Object Detection

faster rcnn是何凯明等大神在2015年提出目标检测算法,该算法在2015年的ILSVRV和COCO竞赛中获得多项第一。该算法在fast rcnn基础上提出了RPN候选框生成算法,使得目标检测速度大大提高。

(1)image input;
(2)利用selective search 算法在图像中从上到下提取2000个左右的Region Proposal;
(3)将每个Region Proposal缩放(warp)成227*227的大小并输入到CNN,将CNN的fc7层的输出作为特征;
(4)将每个Region Proposal提取的CNN特征输入到SVM进行分类;
(5)对于SVM分好类的Region Proposal做边框回归,用Bounding box回归值校正原来的建议窗口,生成预测窗口坐标.
缺陷:
(1) 训练分为多个阶段,步骤繁琐:微调网络+训练SVM+训练边框回归器;
(2) 训练耗时,占用磁盘空间大;5000张图像产生几百G的特征文件;
(3) 速度慢:使用GPU,VGG16模型处理一张图像需要47s;
(4) 测试速度慢:每个候选区域需要运行整个前向CNN计算;
(5) SVM和回归是事后操作,在SVM和回归过程中CNN特征没有被学习更新.

(1)image input;
(2)利用selective search 算法在图像中从上到下提取2000个左右的建议窗口(Region Proposal);
(3)将整张图片输入CNN,进行特征提取;
(4)把建议窗口映射到CNN的最后一层卷积feature map上;
(5)通过RoI pooling层使每个建议窗口生成固定尺寸的feature map;
(6)利用Softmax Loss(探测分类概率) 和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练.

相比R-CNN,主要两处不同:
(1)最后一层卷积层后加了一个ROI pooling layer;
(2)损失函数使用了多任务损失函数(multi-task loss),将边框回归直接加入到CNN网络中训练
改进:
(1) 测试时速度慢:R-CNN把一张图像分解成大量的建议框,每个建议框拉伸形成的图像都会单独通过CNN提取特征.实际上这些建议框之间大量重叠,特征值之间完全可以共享,造成了运算能力的浪费.
FAST-RCNN将整张图像归一化后直接送入CNN,在最后的卷积层输出的feature map上,加入建议框信息,使得在此之前的CNN运算得以共享.
(2) 训练时速度慢:R-CNN在训练时,是在采用SVM分类之前,把通过CNN提取的特征存储在硬盘上.这种方法造成了训练性能低下,因为在硬盘上大量的读写数据会造成训练速度缓慢.
FAST-RCNN在训练时,只需要将一张图像送入网络,每张图像一次性地提取CNN特征和建议区域,训练数据在GPU内存里直接进Loss层,这样候选区域的前几层特征不需要再重复计算且不再需要把大量数据存储在硬盘上.
(3) 训练所需空间大:R-CNN中独立的SVM分类器和回归器需要大量特征作为训练样本,需要大量的硬盘空间.FAST-RCNN把类别判断和位置回归统一用深度网络实现,不再需要额外存储.
(4) 由于ROI pooling的提出,不需要再input进行Corp和wrap操作,避免像素的损失,巧妙解决了尺度缩放的问题.

(1)输入测试图像;
(2)将整张图片输入CNN,进行特征提取;
(3)用RPN先生成一堆Anchor box,对其进行裁剪过滤后通过softmax判断anchors属于前景(foreground)或者后景(background),即是物体or不是物体,所以这是一个二分类;同时,另一分支bounding box regression修正anchor box,形成较精确的proposal(注:这里的较精确是相对于后面全连接层的再一次box regression而言)
(4)把建议窗口映射到CNN的最后一层卷积feature map上;
(5)通过RoI pooling层使每个RoI生成固定尺寸的feature map;
(6)利用Softmax Loss(探测分类概率) 和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练.

相比FASTER-RCNN,主要两处不同:
(1)使用RPN(Region Proposal Network)代替原来的Selective Search方法产生建议窗口;
(2)产生建议窗口的CNN和目标检测的CNN共享

改进:
(1) 如何高效快速产生建议框?
FASTER-RCNN创造性地采用卷积网络自行产生建议框,并且和目标检测网络共享卷积网络,使得建议框数目从原有的约2000个减少为300个,且建议框的质量也有本质的提高.

从上面的三张图可以看出,Faster R CNN由下面几部分组成:
1.数据集,image input
2.卷积层CNN等基础网络,提取特征得到feature map
3-1.RPN层,再在经过卷积层提取到的feature map上用一个3x3的slide window,去遍历整个feature map,在遍历过程中每个window中心按rate,scale(1:2,1:1,2:1)生成9个anchors,然后再利用全连接对每个anchors做二分类(是前景还是背景)和初步bbox regression,最后输出比较精确的300个ROIs。
3-2.把经过卷积层feature map用ROI pooling固定全连接层的输入维度。
4.然后把经过RPN输出的rois映射到ROIpooling的feature map上进行bbox回归和分类。

SPP-Net是出自论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》
由于一般的网络结构中都伴随全连接层,全连接层的参数就和输入图像大小有关,因为它要把输入的所有像素点连接起来,需要指定输入层神经元个数和输出层神经元个数,所以需要规定输入的feature的大小。而SPP-NET正好解决了这个问题。

如果原图输入是224x224,对于conv5出来后的输出,是13x13x256的,可以理解成有256个这样的filter,每个filter对应一张13x13的activation map.如果像上图那样将activation map pooling成4x4 2x2 1x1三张子图,做max pooling后,出来的特征就是固定长度的(16+4+1)x256那么多的维度了.如果原图的输入不是224x224,出来的特征依然是(16+4+1)x256;直觉地说,可以理解成将原来固定大小为(3x3)窗口的pool5改成了自适应窗口大小,窗口的大小和activation map成比例,保证了经过pooling后出来的feature的长度是一致的.

总结而言,当网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量)。

ROI pooling layer实际上是SPP-NET的一个精简版,SPP-NET对每个proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采样到一个7x7的特征图.对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个7*7*512维度的特征向量作为全连接层的输入.

为什么要pooling成7×7的尺度?是为了能够共享权重。Faster RCNN除了用到VGG前几层的卷积之外,最后的全连接层也可以继续利用。当所有的RoIs都被pooling成(512\×7\×7)的feature map后,将它reshape 成一个一维的向量,就可以利用VGG16预训练的权重,初始化前两层全连接.

那么经过何种变换才能从图11中的窗口P变为窗口呢?比较简单的思路就是:

注意:只有当Proposal和Ground Truth比较接近时(线性问题),我们才能将其作为训练样本训练我们的线性回归模型,否则会导致训练的回归模型不work(当Proposal跟GT离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理).这个也是G-CNN: an Iterative Grid Based Object Detector多次迭代实现目标准确定位的关键. 线性回归就是给定输入的特征向量X,学习一组参数W,使得经过线性回归后的值跟真实值Y(Ground Truth)非常接近.即.那么Bounding-box中我们的输入以及输出分别是什么呢?

如上图中标识:
① rpn_cls:60*40*512-d ⊕ 1*1*512*18 > 60*40*92 逐像素对其9个Anchor box进行二分类
② rpn_bbox:60*40*512-d ⊕ 1*1*512*36>60*40*9*4 逐像素得到其9个Anchor box四个坐标信息

逐像素对Anchors分类标记
① 去除掉超过1000*600这原图的边界的anchor box
② 如果anchor box与ground truth的IoU值最大,标记为正样本,label=1
③ 如果anchor box与ground truth的IoU>0.7,标记为正样本,label=1
④ 如果anchor box与ground truth的IoU<0.3,标记为负样本,label=0
剩下的既不是正样本也不是负样本,不用于最终训练,label=-1

逐像素Bbox回归纠正
除了对anchor box进行标记外,另一件事情就是计算anchor box与ground truth之间的偏移量
令:ground truth:标定的框也对应一个中心点位置坐标x ,y 和宽高w ,h
anchor box: 中心点位置坐标x_a,y_a和宽高w_a,h_a
所以,偏移量:
△x=(x -x_a)/w_a △y=(y -y_a)/h_a
△w=log(w /w_a) △h=log(h /h_a)
通过ground truth box与预测的anchor box之间的差异来进行学习,从而是RPN网络中的权重能够学习到预测box的能力

接着进一步对Anchors进行越界剔除和使用nms非最大值抑制,剔除掉重叠的框;比如,设定IoU为0.7的阈值,即仅保留覆盖率不超过0.7的局部最大分数的box(粗筛)。最后留下大约2000个anchor,然后再取前N个box(比如300个);这样,进入到下一层ROI Pooling时region proposal大约只有300个。

参考文献:

阅读全文

与fasterrcnn源码相关的资料

热点内容
app易语言post怎么学 浏览:963
地梁的箍筋加密区位置 浏览:300
二分法排序程序及编译结果 浏览:677
日语命令形和禁止型 浏览:283
安装软件用管理员解压 浏览:503
编译原理代码块 浏览:398
小孩可以用压缩面膜吗 浏览:12
锥形倒角怎么计算法 浏览:880
java合并链表 浏览:505
pic单片机编译器 浏览:803
丽水四轴加工中心编程 浏览:689
国产系统怎么解压 浏览:552
战双程序员 浏览:483
him触摸编程软件 浏览:931
植物大战僵尸存档怎么转移安卓 浏览:852
java栈的元素 浏览:739
程序员与篮球事件 浏览:676
app反编译不完整 浏览:789
电脑上的文件夹怎么调整 浏览:8
服务器无响应是什么原因呀 浏览:985