三、Fast R-CNN
Fast R-CNN綜合了R-CNN和SPP-Net的优点。 1.Fast R-CNN设计了类似SPP层的ROI Pooling,同样能够实现固定输出特征的功能,其能够延续SPP-Net的一次提取图像特征的优点。 2.采用SVD分解FC层,能够加快一点网络运算速度。 3.设计了新的损失函数,该损失函数融合分类损失和位置损失。
Fast R-CNN部分算法步骤和R-CNN相似,见Two-stage目标检测技术发展(一)R-CNN和SPP-Net 算法关键步骤: 1.提取候选区域,RP由SS算法提取 2.特征提取,依然是用CNN 3.全连接层分解 4.损失计算 5.反向传播 重复部分不再介绍了,RP提取和特征提取借鉴SPP-Net,SS算法提取RP区域坐标,CNN提取特征图,然后RP区域坐标在特征图上进行特征映射,找到RP区域对应的候选特征区域。 详情看上篇blogs,下面分析Fast R-CNN的不同之处。 部分内容参考RCNN系列文章之Fast RCNN详解
3.1 全连接层分解
全连接层在整个目标检测过程中会占用较多时间,所以Fast R-CNN采用了SVD来实现加速运算的效果。 SVD可以看这篇blog SVD分解 简单来说,SVD将原来FC层的权重矩阵分解为另一种矩阵。然后利用奇异值矩阵的特性(见下),用奇异值矩阵的一部分替换原FC层权重矩阵,可以在不损失运算效果的前提下,降低运算量,从而实现加速。
注:对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1 %的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。
3.2 损失计算
经过FC层会同时输出类别概率和位置,这两种输出会被分别处理:
第一个输出为K+1个类别的离散概率分布,而第二个输出为bbox回归的偏置,每一个正在训练的ROI均利用一个ground truth类别u与ground truth框v,采用多任务损失进行分类与边框回归: 第一部分是类别的log损失 第二部分是为止损失的回归损失,V为ground truth, t为预测值,方括号是一个指示函数,满足条件为1,否则为0,按照惯例,u=0为背景类,此时忽略回归损失,对于检测框的回归采用了smooth-L1损失,没有使用L2损失。
smooth L1的特性
当x值很大,即遇到的是离群点,异常值时,导数很大。所以在训练初期,预测值与 groud truth差异过于大时,L2 Loss对预测值的梯度十分大,训练不稳定。 L1 Loss的导数是常数,那么在训练后期,当预测值与 ground truth差异很小时, L1 Loss 损失对预测值的导数的绝对值仍然为 1,而 learning rate 如果不变,损失函数将在稳定值附近波动,难以继续收敛以达到更高精度 smooth L1在 x 较小时,对x 的梯度也会变小,而在 x 很大时,对 x 的梯度的绝对值达到上限 1,也不会太大以至于破坏网络参数。 smooth L1完美地避开了 L1 loss 和 L2 loss 损失的缺陷。
3.3 反向传播(fine-tune)
R-CNN实现了一个简化的训练过程,通过一个微调阶段联合优化Softmax分类器和bounding-box回归器,而不是将Softmax分类器、SVM和回归器训练在三个不同的阶段。 根本原因是当每个训练样本(即RoI)来自不同的图像时,通过SPP层的反向传播是非常低效的,这正是训练R-CNN和SPPnet网络的方法。低效的部分是因为每个RoI可能具有非常大的感受野,通常跨越整个输入图像。由于正向传播必须处理整个感受野,训练输入很大(通常是整个图像)。 (来自知乎某个大佬的解释:RoI-centric sampling和image-centric sampling的区别:SPP-net是先把所有图像用SS计算的RoIs存起来,再从中每次随机选128个RoIs作为一个batch进行训练,这128个RoIs最坏的情况来自128张不同的图像,那么,要对128张图像都送入网络计算其特征,同时内存就要把128张图像的各层feature maps都记录下来(反向求导时要用),所以时间和空间上开销都比较大;而Fast R-CNN虽然也是SS计算RoIs,但每次只选2张图像的RoIs(一张图像上约2000个RoIs),再从中选128个作为一个batch,那么训练时只要计算和存储2张图像的Feature maps,所以时间和内存开销更小)
**如何确定需要更新的权重索引:**Argmax方法,参考pooling的反向传播,在前向传播时记录ROI pooling获取值的索引,反向传播时判断要更新的权重索引和POI pooling索引是否一样,如果一样那就更新,不一样就不更新。
四、Faster R-CNN
经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster RCNN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classification都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。 要详细了解,可以看一文读懂Faster RCNN Faster R-CNN与之前三种算法的区别主要有两点:
- Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
- Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
算法关键步骤: 1.特征提取 2.RPN候选框提取 3.损失计算 从这两张图片能够很清楚的理解Faster R-CNN与其他网络的不同,主要体现在左下角也就是RPN网络,这个网络能够跟据特征图选出RP区域。以下重点介绍RPN网络的数据处理。
4.1 RPN网络
经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;如R-CNN使用SS方法生成检测框。而Faster R-CNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。 上图展示了RPN网络的具体结构。可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
4.2 Anchors生成
cls层第一部分功能是生成anchor。 Faster R-CNN设计了anchors函数来生成anchors,anchors就是一些框,这些框的功能类似RP区域,只不过一个是预设的,一个是算法输出的,anchors是先验信息,RP是后验信息,所以anchors size的设计会影响算法性能。 关于anchors size,其实是根据检测图像设置的。Faster R-CNN会把任意大小的输入图像reshape成800x600,再来看anchors的大小,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。 下面解释如何计算每张特征图输出的anchors数。 特征提取网络ZF model生成256张特征图。之后做RPN网络的3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息。 假设在feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2?k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4?k coordinates 补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练(什么是合适的anchors下文5.1有解释) 最终RPN输出的anchors数即:feature map数目 × anchor数目,feature map数目要看RPN 1×1卷积层设置,原因可以看注解:多通道图像卷积。
4.3 softmax判定样本正负
生成anchor后,如何给每个anchor添加正负标签,这就是cls层的第二部分功能。 判定anchors正负的方法有两种,1.与ground truth box有最大的IoU的anchors作为正样本;2.与ground truth box的IoU大于0.7的作为正样本。Faster R-CNN采取的第一种方式。定义的负样本为与ground truth box的IoU小于0.3的样本。 softmax前的reshape层用来调整特征大小以方便softmax 处理,后面的reshape将softmax的输出调整回输入前的大小。
4.4 reg layer回归
reg layer用来微调anchor位置,使位置预测更加准确。 (M/16)x(N/16)x256的特征通过1x1卷积得到(M/16)x(N/16)x4k的输出,因为这里是生成每个anchor的坐标偏移量(用于修正anchor),[tx,ty,tw,th]共4个所以是4k。注意,这里输出的是坐标偏移量,不是坐标本身,要得到修正后的anchor还要用原坐标和这个偏移量运算一下才行。
偏移值计算公式: 其中[xa,ya,wa,ha]是anchor的中心点坐标和宽高,[tx.ty,tw,th]是这个回归层预测的偏移量,通过这个公式计算出修正后的anchor坐标[x,y,w,h]。计算如下: [px,py,pw,ph]表示原始anchor的坐标 [dx,dy,dw,dh]表示RPN网络预测的坐标偏移 [gx,gy,gw,gh]表示修正后的anchor坐标。
可能会有的疑问:为什么不直接预测修正后的anchor坐标,而是预测偏移量?
- 如果直接预测修正后的anchor坐标了,那要这个预设anchor有何用?正是因为预测了偏移量,才能和预设anchor联动起来生成修正后的anchor
- 直接预测框坐标,数量级比较大,难以训练
- 坐标偏移一方面大小较小,且偏移具有较好的数学公式,求导方便
cls层生成的(M/16)x(N/16)x2k向量 reg层生成的(M/16)x(N/16)x4k向量 im_info=[M, N,scale_factor] (1)利用reg层的偏移量,对所有的原始anchor进行修正 (2)利用cls层的scores,按positive socres由大到小排列所有anchors,取前topN(比如6000个)个anchors (3)边界处理,把超出图像边界的positive anchor超出的部分收拢到图像边界处,防止后续RoI pooling时proposals超出边界。 (4)剔除尺寸非常小的positive anchor (5)对剩余的positive anchors进行NMS(非极大抑制) (6)最后输出一堆proposals左上角和右下角坐标值([x1,y1,x2,y2]对应原图MxN尺度)
综上所述,RPN网络总结起来其实就上面四个小标题: 生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals
通过上述几个步骤,通过RPN网络获取了RP区域,结合ZF model输出的特征图,得到候选特征区域,后续处理和Fast R-CNN类似,不过多介绍。
注解:基础知识介绍
(1)小批量采样策略 当及逆行fine-tune时,每个SGD的小批量由
N
=
2
N = 2
N=2个图像构成,均匀地随机选择(如通常的做法,我们实际上迭代数据集的排列)。 我们使用大小为
R
=
128
R = 128
R=128的小批量,从每个图像采样64个RoI。 从候选框中获取25%的RoI,这些候选框与检测框真值的IoU至少为0.5。 这些RoI只包括用前景对象类标记的样本,即
u
≥
1
u \ge 1
u≥1。 剩余的RoI从候选框中采样,该候选框与检测框真值的最大IoU在区间
[
0.1
,
0.5
)
\lbrack 0.1, 0.5)
[0.1,0.5)上。 这些是背景样本,并用
u
=
0
u = 0
u=0标记。0.1的阈值下限似乎充当难负样本重训练的启发式算法。 正负样本比例为1:3,防止易分负样本过多。 在训练期间,图像以概率0.5水平翻转。不使用其他数据增强
(2)多通道图像卷积 对于多通道图像+多卷积核做卷积,计算方式如下: 如图,输入有3个通道,同时有2个卷积核。对于每个卷积核,先在输入3个通道分别作卷积,再将3个通道结果加起来得到卷积输出。所以对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量! 对多通道图像做1x1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把原图像中本来各个独立的通道“联通”在了一起。
|