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

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

  • 目标检测的任务

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

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

在第一篇里说完了RCNN和fast RCNN,第二篇里说了faster RCNN,这一篇来说RFCN。

如果看完了前面的两篇那么对深度学习在目标检测中的应用应该就已经有了一个还算不错的理解,很多概念也基本都有了,比如fast RCNN中提到的ROIpooling,faster RCNN中提出的RPN网络,anchors等。这些对理解RFCN都有很大的帮助。

faster RCNN把提取ROI和对ROI进行分类并且做bbox-rg都用深度学习的方式给解决了,检测精度在我写这篇文章的时候仍然是可以称得上是state-of-the-art的,但速度就不敢恭维了。不过在谷歌最近的一篇比较RFCN,faster RCNN和SSD的论文中指出(https://arxiv.org/abs/1611.10012),如果减少faster RCNN中RPN网络输出的bbox的个数,可以在精度损失有限的情况下,极大的提高faster RCNN的检测速度。

回到这篇的主角,开始说RFCN。
RFCN的全称是Region-based Fully Convolutional Networks,整个网络都是基于卷积的,没有全连接。RFCN中也有RPN网络,但相对faster RCNN,RFCN中的RPN和最后的softmax以及bbox-rg有了更多的共享计算,只在最后分开了,这样没有多余的计算,所以速度也有所提升。
RFCN的结构如下:
深度学习在目标检测中的应用及其tensorflowAPI实践(三)_第1张图片
首先一张图片输入一个CNN,这里原文使用的是101层的resnet。经过CNN后会得到一系列的feature map,然后根据上图中上方的RPN网络得到ROI(RPN网络请参考上一篇faster RCNN中的叙述,会输出很多经过一次bbox-rg的ROI)。
得到ROI后再回到下面的路,这时比如说你得到的feature map为W*H*1024(对应上图中从左往右第二个白色的方块,下面标着feature maps的),用 k2(C+1) 个1x1x1024的卷积核去做卷积,这样就会得到上图中彩色的一系列feature map,一共有 k2(C+1) 个feature map,这里k的含义稍后解释,C表示的是分类的类别数量,C+1是包含了背景的分类数量。
得到了 k2(C+1) 个feature map后的操作可参考下图,现在我们除了有这些feature map外还有ROI:
深度学习在目标检测中的应用及其tensorflowAPI实践(三)_第2张图片
下面的操作比较奇怪,说实话我不知道作者是怎么想到要这么做的,对任意的ROI,比如上图画出的这个ROI找到在这些彩色feature map上的对应区域,把这些区域抠出来( k2(C+1) 个feature map上的对应区域都抠出来),接下来把这个区域分成k=3的kxk个网格,就像图中画的那样,然后从后往前,每(C+1)个feature map依次取左上角,中上,右上……的区域,注意每(C+1)个feature map只取这一个小格子的区域,因为k=3,所以最终可以把取出来的部分拼成一个kxkx(C+1)这样的结构(注意这里对应不同大小的ROI,每个kxk方格里面的像素数量是不一样的)。下面是我对这部分操作做的一个示意图,应该比文字叙述要容易理解一些:

现在我们得到了一个ROI的kxkx(C+1)的网格,这里不同大小的ROI每个方格里的像素数量是不一样的,所以对每个方格里的数值取平均值,类似ROIpooling的操作,比如k=3的时候,经过这样的操作无论多大的ROI都会变成3x3x(C+1)的结构。
接下来的操作就简单的,把这3x3x(C+1)的网格里的数值都加起来,变成一个1x1x(C+1)的向量,然后通过softmax的方式计算该ROI是每个类别的概率:
深度学习在目标检测中的应用及其tensorflowAPI实践(三)_第3张图片 这里写图片描述
上面的公式中这里写图片描述表示的就是1x1x(C+1)的向量中的每一个值,经过这个公式转换成概率值。
到这里我们得到了每个ROI的分类结果,还有bbox-rg没做。
在RFCN里bbox-rg的过程和做分类很类似,上面是在CNN之后做 k2(C+1) 个1x1x1024个卷积核的操作,在bbox-rg时则改成 4k2 个1x1x1024的卷积核来做卷积,这样就会得到 4k2 个feature map,接下来的操作和上面分类的过程类似(这里要看源码实现,论文里写的比较粗略,应该是有一些不一样,但基本思路一致)。
同样的,RFCN的损失函数也分为分类损失和回归损失,这里不再叙述,感兴趣的可以看论文。
RFCN里和faster RCNN一样涉及到两个网络,一个RPN产生ROI,另一个网络负责分类和bbox-rg,所以训练时采用了和faster RCNN一样的方法,可以参考上一篇博客。
写到这篇为止,算是把分两步走的检测框架说完了,我似乎没有对损失函数说太多,因为我打算在写完所有方法后做一个总结,总结这些框架的共性,那时会再说明和比较这些损失函数。
下一篇开始说一步到位的检测框架,欢迎继续关注~戳这里>>>
持续更新中……

你可能感兴趣的:(深度学习,目标检测)