目标检测:即在一张图中找出目标所在的位置,然后告诉我们目标的种类和坐标。现在目标检测主要分为单阶段和双阶段。单阶段目检测如ssd、yolo等,双阶段的如faster-r-cnn、cascade--rcnn等。本文的faster-rcnn为双阶段目标检测的代表,一般来说双阶段的目标检测效果要强于单阶段的目标检测,但是速度上和单阶段的目标检测还是有差距的。所以需要根据使用场景进行选择。
双阶段的目标检测,其中第一阶段为获取目标所在位置的候选框,即在生成的全部的anchors中选出认为是目标的框。第二阶段为在第一阶段获取到的候选框的基础上,进一步区分详细 然后获的种类以及位置精细化。
下图为使用VGG16作为 backbone的faste-r-rcnn的网络结构图。
使用 resnet50backbone的特整体提取层取resnet得layer3 ,即[3,4,6,3]的6,layer4以及avgpool作为 classifier。还有inception等backbone。
1、获取特征图、生成锚点框。绿色16*16框的上部分为特征提取网络,截止到VGG16的最后一个maxpool。特征图尺寸为原始图下采样16倍得到的,由于选择的anchor_base 比例为【0.5, 1, 2】, 大小为8,16,32,所以在一个点会生成九个锚点框如下图1所示。
图1
在获取锚点框的时候,在特征图上的每一点对应回原图都会生成9个框,因为特征图大小为16*16所以原始图像中的锚点框个数为 16*16*9=2304(输入图片比较小 ,生成的锚点框也比较少) 。因为下采样了16倍所以在原图的坐标点为(0,0)(0,16),(0,32).....(16,0),(32,0)....... 原图变为一个步长为16的网格,在每个点上生成9个,如下图所示生成的anchors将会铺满整张图。 anchor的属性为(2034, 4)其中的4为锚框的 左上和右下的坐标。
2、rpn阶段。在原图上生成满满 上图的的anchors之后,我们不能直接使用这么多框进行预测,我们要对这些anchors进行筛选,选出包含目标可能性大的推荐框。如上图的左下分支为rpn,它的输出对应2034个框是目标的confidence和候选框与GT框坐标 的位置修正系数。首先根据softmax或者sigmoid得到的anchors是目标的得分进行由大到小的排序,选出前1000(个人设置的)框,然后对选出来的框进行NMS(非极大值抑制https://www.cnblogs.com/makefile/p/nms.html)在NMS后的框中选择300个框。这一部分没有GT信息参与,但是这300个框经过了rpn阶段的位置修正,对修正后的结果进行了限制使其坐标在0-W,0-H之间,这些框在训练阶段以及测试阶段都会用到。
上面的按照得分排序,起初也是随机的,我们需要训练这个rpn部分的网络使其预测目标的得分越来越高,背景的得分变低 ,这样它才能给我们推荐我们想要的anchors。
由于rpn网络输出为一个(2304,2 )的得分网络,一个(2304,4)的位置修正网络,所以我们也要得到一个包含2304个框的位置以及目标背景的label。首先,获取内框,生成的anchors有一部分是超出图像边界的,将超出边界的框label设置为-1。然后对内框与GT计算iou(交并比https://blog.csdn.net/u014061630/article/details/82818112),选择iou最大以及iou超过阈值0.7的框作目标框,选取前128个框作为目标候选框其label为1(实际也可能少于128,如果你的一张图像目标较多,也可以设置更大的数值)。然后选取iou小于阈值0.3 的128个框作为背景框其label为0,目标和背景框的总数为256,若目标小于128则背景为256-目标个数。我们得到了想要的256个框的坐标及种类,但是训练时候使用的不是候选框的坐标而是候选框与目标的修正系数,所以计算label为1的候选框与GT的修正系数。
最后使用上面的位置修正信息以及label信息与RPN网络的输出的计算loss,在计算分类loss时候忽略label为-1的框也就是只使用了刚刚获取的前景背景共256个,在计算坐标回归的时候只计算label为1的框即只计算前景。
如下图所示,在进行训练后,经过得分排序以后选取的anchors在目标区域较多大小也与目标接近,可以很好地为我们提供目标的候选框。
3、Head阶段 。上图的右下分支。
在训练时:首先我们在上一步得了300个框,这300个框称它为rois,它是根据目标可能性大小以及经过位置修正后的300个框。将GT包含的框加入到这300个框中,例如我的一张图是7个GT框,所以现在有307个框。首先,每个框分别与每个GT计算iou,选取iou超过阈值0.5的框,这个框的label为与GT得到的iou最大的类别。这一阶段一共选取128个框,目标背景比例1:3,所以目标的框的个数为32,对目标框与GT进一步计算修正系数(如下图为32目标框)。背景框为128-样本框的个数,背景框为与GT小于阈值 0.5的框,它的label为0。
最后得到128个rois,使用这128框在特征图上截取特征,因为下采样了16倍,所以每个rois都要除以16,然后截取。每个框的大小不同在后续使用线性链接的时候无法进行,所以使用roipooling或ROI Align,使其变为相同大小的特征。使用head阶段网络输出的128个框的label与位置修正与上面得到的128个label及位置修正信息计算loss,反向传播进而训练。
在测时:直接将上一步的300个框也可能更少输入到网络中,得到每一个框的得分以及修正每个框的位置,然后根据得分排序设置阈值筛选我们的目标框。
4、loss的计算。faster-r-cnn一共包含4个loss,分别为建议框生成时候位置修正的loss以及将anchor分为正负样本的loss,roi阶段的位置修正以及分类loss
这个网络的理解最好还是根据代码实现来理解,文字容易给人绕糊涂了。
------------------------------------------------------------end------------------------------------------------------------------------------