深度学习在目标检测中的应用及其tensorflowAPI实践(二)

这系列文章的内容目录如下:

  • 目标检测的任务

  • 深度学习在目标检测中的应用

    • RCNN
    • fast RCNN
    • faster RCNN
    • RFCN
    • yolo
    • yolo V2
    • SSD
  • tensorflow目标检测API的使用

第一篇里说完了RCNN和fast RCNN,接下来继续说faster RCNN,建议不了解RCNN和fast RCNN的读者先回头了解了RCNN和fast RCNN在继续读下去。

faster RCNN的流程如下:
深度学习在目标检测中的应用及其tensorflowAPI实践(二)
faster RCNN首先通过一个RPN网络生成一堆候选框ROI,后面的操作和fast RCNN基本一致。
我们可以先看看RPN网络是个什么样的结构。
首先明确RPN网络的输入输出,RPN网络输入是一张图片,输出是这张图片上有可能是物体的一堆候选框,并对这些框做第一次的bbox-rg。
下图是一个RPN网络原理的示意图,我没有去画具体的CNN结构,因为这部分是可变的,可以用VGG,也可以用inceptionnet,只要知道一张图片经过一个CNN后会生成一堆feature map。
深度学习在目标检测中的应用及其tensorflowAPI实践(二)
下面依次解释上图的每一步都做了什么:
图片经过CNN输出一堆feature map,每个feature map相较原始图片是变小了的,取决于你使用的CNN结构,这时候作者基于这堆feature map为其上的每个点设定了一系列anchors(原文是9个),如下图所示:
深度学习在目标检测中的应用及其tensorflowAPI实践(二)
假设最后得到的feature map形状如上图左侧所示,为7x7,那么就会在整张图片上产生7x7x9个候选框,每个候选框的大小由不同的宽高比来设定。
这样对应到上图的RPN结构,左侧的分支softmax就负责预测这些候选框里是否有物体,可以看到作者设置了18个1x1的卷积,正好对应每个候选框是否有物体。
那么上面为什么还要接一个3x3的卷积呢?是为了能让feature map更好的结合周围的像素信息。
所以RPN网络的作用就是预测这7x7x9个候选框里是否有物体,并且对所有候选框做第一次的bbox-rg。
最后的proposal是对上面RPN的输出做一个整理的步骤,做了以下几件事:

  1. 对上面RPN输出的bbox-rg参数(宽高缩放比和横竖偏移量)对候选框进行修正
  2. 根据softmax输出的每个框里是否有物体的概率值对所有的框做一个排序,取出最有可能是物体的n个候选框
  3. 删除根据bbox-rg的结果修正后的候选框里严重超出边界的候选框
  4. 这时候仍然有很多框,所以做一个nms(非极大抑制),再对剩下的框执行步骤2,保留m个框(m小于n)

综合以上,我们经过RPN网络,得到了m个有可能是物体的候选框,和fast RCNN里的selective search步骤的结果一致,只不过现在由深度学习来完成这件事。
ok,绕了一大圈终于得到了我们要的候选框,接下来针对这些候选框的操作就和fast RCNN很类似了。需要注意的是在RPN的最后也是一个多任务的学习任务所以也设置了多任务的损失函数。
几乎所有的目标检测方法都会设置一个多任务的损失函数,分为两部分,一部分用来对分类做softmax损失,另一部分用来对bbox-rg做损失,学习平移量和缩放量,只是具体的损失函数需要对着各个方法的论文去看。
得到了RPN输出的候选框之后,我们首先对这些候选框进行ROIpooling,把他们做到相同大小,然后送入一个小网络做分类和再一次的bbox-rg,流程如下:
深度学习在目标检测中的应用及其tensorflowAPI实践(二)
上面这个过程的细节不做过多说明,结构很简单,最后的损失函数也是分两部分,分类的softmax损失和回归的学习平移缩放的损失。
细心的读者一定会发现,faster RCNN竟然涉及到了两个独立的网络,而且有一部分卷积层其实是共享的,但最后接的损失函数是不一样的,就像下面这样:
深度学习在目标检测中的应用及其tensorflowAPI实践(二)
上图中蓝色部分为RPN,红色部分为第二步类似fast RCNN中的处理,前面的卷积层部分其实是共享的。但两部分的训练目标是不一样的,于是作者提出了以下训练方法,这个方法在后续的RFCN中也用到了:

  1. 训练RPN,注意一般训练网络都不会从头开始训练,这里是用在ImageNet预训练的vgg权重初始化的(tensorflowAPI里用的不是VGG)
  2. 训练独立的fastRCNN检测网络,使用第一步中生成的ROI,初始化也是用ImageNet预训练的权重,此时两个网络是不共享卷积层的。
  3. 使用2中训练的fast r-cnn检测网络重新初始化RPN网络,然后固定共享卷积层不训练,只对RPN后面的几层进行微调。
  4. 保持3*享卷积层不训练,由3训练后得到的ROI,再训练fast r-cnn中的全连接层,这样一个完整的网络训练完毕。

这种两个网络交替统一训练的方法很有开创的意义,在后续的RFCN中也参考了这里的训练方法。
faster RCNN提出了anchors的概念,提出了两个网络共同训练的方法,对后续的发展起到了很大的推动作用。
下一篇继续介绍RFCN。戳这里>>>
持续更新中~