文章目录
0 回顾
(1)多通道卷积:
-
输入有3个通道,同时有2个卷积核。对于每个卷积核,先在输入3个通道分别作卷积,再将3个通道结果加起来得到卷积输出。所以对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量!
-
对多通道图像做1x1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把原图像中本来各个独立的通道“联通”在了一起。
(2)bounding box regression:
在真实值与预测值相差不大的情况下可采取线性变换,通过设定横向和纵向的两个平移参数和两个缩放参数进行线性变化,其损失函数通常采取soomth-L1损失。
1 Conv layers 卷积层
FasterRcnn对输入进来的图片尺寸没有固定,但是一般会把输入进来的图片短边固定成600,如输入一张1200x1800的图片,会把图片不失真的resize到600x900上。
- 如果conv层都是:kernel_size=3,pad=1,stride=1 则原图的大小不会改变。
扩边处理( pad=1,即填充一圈0),导致原图变为 (M+2)x(N+2)大小,再做3x3卷积后输出MxN。 - 所有的pooling层都是:kernel_size=2,pad=0,stride=2 则图片大小变为原来的一半。
2 RPN(Region Proposal Networks)区域建议网络
2.0 主干流程
生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals
2.1 anchors 先验框
anchors的产生及理解:
demo中的generate_anchors.py可以为Feature Map上的每一个点生成k个anchors,Anchor是通过一个代码生成的,不是通过rpn网络生成的。
取anchors=num_priors=9,为多尺度方法,保存左上和右下,比例分别为1:1,1:2,2:1,大小能够基本覆盖整张图片。
理解:Anchors是人为预设的一系列框的集合,就是把图像上所有可能的目标都先囊括进去,这些框位置当然不太准,而且也不知道那个才是真的,所以后面的任务就是微调框和分类。
如:scales = [8, 16, 32], ratios = [1/2, 1, 2], 每个预设点有9种组合;假设特征图shape:[c, fh, fw],那共有fw x fh个预设点,all anchors shape:[fw, fh, 9*4],每个框用[x1,y1,x2,y2]的表示方式,其中每个数值要对应到原图上去。
2.2 回归与分类
RPN完成positive/negative分类+第一次bounding box regression坐标回归.
- 如果输入为600×600,则feature为38×38(×256),共产生了50×38×9个anchors,之后通过两次bounding box regression 可以进行修正来得到正确的框。另外,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练
- 首先,做rpn_conv/3x3(这里的3x3卷积只是在进一步提取特征,与后面两路1x1卷积相配合,c,w,h,都没有发生变化)卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息,同时256-d不变。
- 后通过,两个1×1卷积进行全连接,对应每个点都是256维的向量。9 x 4的卷积用于预测公用特征层上每一个网格点上每一个先验框的变化情况;9 x 1的卷积用于预测 公用特征层上每一个网格点上每一个预测框内部是否包含了物体。假设每个点有k个anchor,对256维向量进行全连接256->2k,再经过softmax 2k->k,这样就可以获得每个anchor是否有目标分类的置信度。(问题是如何将anchors与卷积联系到一起?)
原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,故:
ceil(800/16)×ceil(600×16)×9=50×38×9=17100
2.3 Proposal Layer
(1)主要作用:Proposal Layer负责bbox reg变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。
(2)输入:Proposal Layer有3个输入:positive vs negative anchors分类器结果rpn_cls_prob_reshape;对应的bbox reg变换量rpn_bbox_pred,以及im_info;另外还有参数feat_stride=16。
im_info:对于一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息。然后经过Conv Layers,经过4次pooling变为WxH=(M/16)x(N/16)大小,其中feature_stride=16则保存了该信息,用于计算anchor偏移量。(能够正确计算损失进行学习的关键)
(3)具体操作顺序
A.生成anchors,利用bbox reg的四类参数对所有的anchors进行bbox regression回归(这里的anchors生成和训练时完全一致)。
B.按照输入的positive softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的positive anchors。
C.限定超出图像边界的positive anchors为图像边界,防止后续roi pooling时proposal超出图像边界。
D.剔除尺寸非常小的positive anchors。
E.对剩余的positive anchors进行NMS(nonmaximum suppression)。
F.输出:对应的bbox reg的(e.g. 300)结果作为proposal输出。输出proposal=[x1, y1, x2, y2],注意,由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输入图像尺度的。
3 RoI pooling
- 主要作用:RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。
- 2个输入:原始的feature maps与RPN输出的proposal boxes(大小各不相同,且相对于原始图像M×N)
- 好处:通过ROI pooling可以避免使用crop和wrap破坏图像原始形状信息
- 原理:即使大小不同的proposal输出结果都是 pooled_w×pooled_h 固定大小,实现了固定长度输出,计算出proposal feature maps,送入后续网络。
A.由于proposal是对应MxN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)x(N/16)大小的feature map尺度;
B.再将每个proposal对应的feature map区域水平分为 [公式] 的网格;
C.对网格的每一份都进行max pooling处理。
4 Classification
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred(第二次进行bbox reg),用于回归更加精确的目标检测框。
从RoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了;再次对proposals进行bounding box regression,获取更高精度的rect box。
全连接层InnerProduct layers:W和bias B都是预先训练好的,即大小是固定的,当然输入X和输出Y也就是固定大小。所以,这也就印证了之前Roi Pooling的必要性。
5 Faster-RCNN训练过程
(1)RPN网络
i表示anchors index,带星号的表示真实值,不带星号的表示可能性。
在训练和检测阶段生成和存储anchors的顺序完全一样,这样训练结果才能被用于检测。
- cls loss,即rpn_cls_loss层计算的softmax loss,用于分类anchors为positive与negative的网络训练
- reg loss,即rpn_loss_bbox层计算的soomth L1 loss,用于bounding box regression网络训练。注意在该loss中乘了 Pi*,相当于只关心positive anchors的回归(其实在回归中也完全没必要去关心negative)。
- 通过参数lameda来平衡两者之间的差距。
(2)通过训练好的RPN网络收集proposals
在该步骤中,利用之前的RPN网络,获取proposal rois,同时获取positive softmax probability。
(3) 训练Faster-RCNN网络
读取之前保存的pickle文件,获取proposals与positive probability。从data层输入网络。
- 将提取的proposals作为rois传入网络
- 计算bbox_inside_weights+bbox_outside_weights,作用与RPN一样,传入soomth_L1_loss layer
学习整理自:
- 一文读懂Faster-rcnn https://zhuanlan.zhihu.com/p/31426458
- https://blog.csdn.net/weixin_44791964/article/details/104451667
- https://mp.weixin.qq.com/s/yMg_WNMQwpjcJgZYwvzXjA