fasterRCNN论文和源码理解

    fasterRCNN是检测识别里面一个比较标志的方法,继承了RCNN,fastRCNN的方法。前段时间大概花了几天时间看了看fasterRCNN的论文,半知半解,最近又花了3天时间理解了下fasterRCNN的源码。结合论文和源码,终于感觉有所突破,如果有理解的不对的地方,大家一起讨论修改~

    我看的是基于pytorch的源码,地址:点击打开链接

    步入正题,fasterRCNN继承自fastRCNN,在fastRCNN的基础上,修改了其ss区域选择的方法,改用RPN区域建议网络来自动生成ROI,这样就可以end to end端到端的训练。


    网上盗图一张,我自己训练的时候也用的101层的resnet。res101原始网络总共有几个部分,最开始的一个卷积层conv1,然后是标准的4个block,记成conv2_x,conv3_x,conv4_x,conv5_x,最后是pool和分类的fc层。我们在这里只用resnet的前面几个block,即conv1,conv2_x,conv3_x,conv4_x和conv5_x,导入预训练后的resnet后,将最后的pool和fc层删掉,然后自己定义用于分类和bounding box回归的fc层。如上图所示,我们自定义的用于生成ROI的RPN网络连接在conv4_x之后,RPN网络包含一个卷积的rpn层和两个fc层(用于计算score和roi)。conv4_x的输出feature map分两部分(假设shape是1*1024*38*50,1是batch,1024是channel,38,50是经过resnet101前部conv后的H、W),一部分经过RPN网络,RPN网络最终的输出结果是256个ROI区域(也就是256个2对xy坐标),第二部分没有改变,然后这两部分共同通过一个ROIpooling层,这层会根据256个roi将第二部分输出的feature map池化成256个图,相当于是从feature map中根据这256个roi提取出新的feature map。然后共同送出resnet101的conv5_x,此时输入conv5_x的shape是[256, 1024, 7, 7],256是256个roi对应的区域,1024是conv4_x输出的原始的feature,7*7是fastRCNN里有提到过的维度。然后将conv5_x的输出分别连接class的fc层和regression的fc层,整个网络从前至后就定义好了。

    网络整个流程整理好,那我们就可以说训练了。其实整个fasterRCNN有两部分的loss,RPN网络有一个求损失的地方,最后RCNN有个求损失的地方。我最开始没分清这两个地方的差别,看了好久都理解不了。把这两个loss分开,再对应原文说的anchor就清晰多了。所以我们把这两个部分分开来讲,避免混淆。

    首先看第一个RPN网络部分,整个RPN网络的输入是1*1024*38*50的feature map,输出是256个roi。我们要训练RPN网络,该怎么训练呢,总得有loss吧。这里作者在RPN里面输出了两部分,一部分是score,另一部分是roi的bbox。通过RPN的网络结构,在RPN网络的分类fc层之后,输出的是1*18*38*50的维度,38*50对应的pixels,表明每个像素点有9*2个值,这个9指的作者说的每个pixels有9个anchor,面积128*128,256*256,512*512长宽比是1:1,1:2,2:1;剩下的2,我理解的是此anchor是前景还是背景的score,通过softmax可以算出前景和背景的概率。通过这个分类的fc层,就可以predict每个anchor前景和背景的概率。然后feature map通过RPN网络的回归fc层之后,输出维度1*36*38*50,可以计算出bbox的坐标,这里的36=9*4就表明9个anchor,每个anchor4个坐标。这两部分,score和anchor坐标就是你预测的值。预测的值有了,那么label呢?label这个时候就和作者定义的anchor有关系了,



猜你喜欢

转载自blog.csdn.net/cz_bykz/article/details/80940124