上面一条用softmax分类anchors得到positive以及negative的概率, 下面一条计算anchors的bounding box regression偏移量 两个分支的结果作为Proposal的输入
Proposal layer: 依照位置参数对所有的positive anchor做位置调整 按照输入的positive softmax scores由大到小排序anchors,提取前pre_nms_topN(如6000)个anchors 对超出图像边界的positive anchors做裁剪 之后输出proposal = [x1, y1, x2, y2],对应的是M * N图像尺寸
因为Proposal对应为M*N尺度,首先使用spatial_scale将其映射回(M/16)*(N/16)大小的feature map尺度 再将每个proposal对应的feature map区域水平分为pooled_w * pooled_h的网格 对网格每一份做max pooling处理 这样处理后,即使大小不同的proposal输出结果都为pooled_w * pooled_h固定大小
最后通过全连接层的softmax对proposals进行分类 再次对proposals进行bounding box regression,获取更高精度的bbox
注:anchor: backbone网络最后一层卷积层feature map上的元素点。anchor box是以每个anchor为中心而生成的一系列boxes。一个anchor对应的框的具体数量是由scales和aspect ratio两个参数控制。
假设每个anchor生成了k个box,每个anchor box会输入到2个卷积网络,分别是cls layer和reg layer cls layer是前景判断任务,最后会输出每个anchor boxes的前景分数和背景分数。假设anchor boxes数量是9,经过cls layer的1*1*18卷积输出后就是H * W * 18的feature map,每个anchor的维度是18 = 2 * 9,就代表了每个anchor作为前景和背景的分数
reg layer输出的是boxes与GT的(x,y,w,h)的offsets,(x, y)为中心点坐标。 经过reg layer的1 * 1 * 36的卷积核输出的是H * W * 36的feature map,每个anchor的维度36 = 4 * 9,代表了(x,y,w,h)的offsets。anchor boxes会根据模型预测输出来的offset来调整尺寸,作为RPN的输出。
3、ROI(Region of Interest)
RoI pooling首先应用在fast RCNN里面。
举例: input size:512 * 512 * 3 feature map size : 16 * 16 * 512 这里的缩小因子factor = 32 后续的RoI在缩小的时候,都需要除以32,得到缩小后的尺寸
如何从feature map上提取RoI?将原图上的RoI映射到VGG16输出的feature map上即可
原图上的RoI都有其原始坐标和尺寸 红框size是145*200,左上角坐标(192,296),factor = 32 将原图上的RoI映射到feature map上,其尺寸需要缩小32倍: width: 200 / 32 = 6.25, height: 145 / 32 = 4.53 x: 296 / 32 = 9.25, height: 192 / 32 = 6
注:在feature map上的坐标值量化(quantization of coordinates)就是将输入从一个大的值集(如实数)限制为离散的值集(如整数)的过程。
为什么需要量化?是因为我们不能直接在这个RoI上应用RoI pooling操作。有些cell没有与网格线对齐,要么多了一点,要么少了一点。解决措施就是量化操作,即向上取整。
4、RoI pooling
将原图上的RoI映射到feature map上之后,可以开始pooling操作。
为什么使用pooling:在RoI pooling层后,有固定尺寸的全连接层。由于成百上千的RoI有不同的尺寸,因而需要将它们pooling到相同的尺寸,如3 * 3 * 512 在上例中计算了量化后的RoI,size = 4 * 6 * 512。这里4无法被3整除,故需要再次量化(即去掉小数点)。 4 / 3 = 1.33,6/3 = 2,向下取整后,得到1 * 2的向量表示。
5、损失函数
使用Smooth L1 Loss
对边框的预测是一个回归问题。通常可以选择平方损失函数(L2损失)f(x) = x2,但是L2损失对比较大的误差的惩罚很高。本文采用的是稍微缓和一点的绝对损失函数(L1损失),f(x) = |x|,它随着误差线性增长,而不是平方增长。但是这个函数在0处是不可导的,故有可能会影响收敛。解决办法是采用分段函数,在0附近使用平方函数使得它更加平滑,也称为Smooth L1 loss。它通过参数𝒷来控制平滑区域。在faster-cnn里,参数取3。
Faster-RCNN损失函数:由RPN和fast rcnn两部分组成,两部分损失都包括分类损失(cls loss)和回归损失(bbox regression loss)。
其中,RPN分类损失:RPN网络产生的anchor只分为前景和背景两类,其中前景标签为1,背景标签为0。在RPN训练过程中,会选择256个anchor,256即公式中的Ncls。
分类损失为经典的二分类交叉熵损失,对每一个anchor计算对数损失,然后除以anchor数量Ncls
Fast RCNN分类损失:RPN的分类损失是二分类的交叉熵损失,而Fast RCNN是多分类的交叉熵损失。在Fast RCNN训练的时候会选出128个rois,即Ncls = 128。
RPN和Fast RCNN的回归损失:ti = {tx, ty, tw, th}是一个向量,在RPN训练阶段表示anchor( Fast RCNN 阶段表示RoIs)的预测的偏移量。 t*i表示GT,即实际的偏移量。
版权声明:本文为CSDN博主「xx9971」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/acx0000/article/details/123028392
暂无评论