目标检测方法简介:RPN(Region Proposal Network) and SSD(Single Shot MultiBox Detector)

最近几年深度学习在计算机视觉领域取得了巨大的成功,而在目标检测这一计算机视觉的经典问题上直到去年(2015)才有了完全使用深度学习的方法,也就是大名鼎鼎的Faster-RCNN以及和它同一时期的工作YOLO

目标检测就是要找到一张图中所有的物体和它们的位置,在这两篇文章之前,人们通常的做法是先用一些传统视觉的方法如selective search找到proposal,即比较可能是物体的一个区域,然后再用CNN判断这个物体究竟是不是物体,是哪个物体,以及用CNN去优化这个框的位置,这种方法最典型的代表就是Faster-RCNN的前身,RCNN和Fast-RCNN,当然它们也是同样出色的工作。Faster-RCNN和YOLO解决的问题是省去了selective search,直接用CNN得到最后的结果,并且性能比之前的方法有很大提升。这篇文章主要介绍一下Faster-RCNN中替换掉selective search的RPN(Region Proposal Network)以及对RPN的改进:SSD(Single Shot MultiBox Detector)。由于YOLO和它们非常相似但是性能稍差,就不再介绍。

Faster-RCNN由RPN和Fast-RCNN组成,RPN负责寻找proposal,Fast-RCNN负责对RPN的结果进一步优化。其实RPN已经可以找到图片中每个物体的种类和位置,如果更注重速度而不是精度的话完全可以只使用RPN。RPN是一个全卷积网络(FCN),由于没有全连接层,所以可以输入任意分辨率的图像,经过网络后就得到一个feature map,然后怎么利用这个feature map得到物体的位置和类别那?这里要先介绍一下文章中提到的anchor这个概念,把这个feature map上的每一个点映射回原图,得到这些点的坐标,然后着这些点周围取一些提前设定好的区域,如选取每个点周围5x5的一个区域,这些选好的区域可以用来训练RPN。假设我们对feature map上的每个点选取了K个anchor,feature map的大小为H*W*C,那么我们再对这个feature map做两次卷积操作,输出分别是H*W*num_class*K和H*W*4*K,分别对应每个点每个anchor属于每一类的概率以及它所对应的物体的坐标,那么怎么训练这个网络那?这个网络的loss function就是一个用于分类的softmax loss和一个用于回归的smooth L1 loss,输出对应的ground truth也很好得到,对于每个anchor,如果它和图片中某个物体的IOU(面积的交/面积的并)大于一个阈值,就认为它属于这一类,否则认为是背景,对于那些是背景的anchor回归的loss就是0,其他anchor位置的ground truth就是它们所对应的物体的位置。RPN其实也很简单,关键的地方就在于选取了一些anchor然后进行pixel-wise的学习。论文中RPN的插图如下图:

但是RPN也有缺点,最大的问题就是对小物体检测效果很差,假设输入为512*512,经过网络后得到的feature map是32*32,那么feature map上的一个点就要负责周围至少是16*16的一个区域的特征表达,那对于在原图上很小的物体它的特征就难以得到充分的表示,因此检测效果比较差。去年年底的工作SSD: Single Shot MultiBox Detector很好的解决了这个问题。

我个人认为SSD可以理解为multi-scale版本的RPN,它和RPN最大的不同在于RPN只是在最后的feature map上预测检测的结果,而最后一层的feature map往往都比较抽象,对于小物体不能很好地表达特征,而SSD允许从CNN各个level的feature map预测检测结果,这样就能很好地适应不同scale的物体,对于小物体可以由更底层的feature map做预测。这就是SSD和RPN最大的不同,其他地方几乎一样。下图是SSD的网络结构,可以看到不同层的feature map都可以做预测。

另外SSD的代码也写得非常简洁优雅,不得不感叹作者真是碉堡,即写得了paper又做得了coding,不得不服。

lufo /
Published under (CC) BY-NC-SA tagged with cnn  cv  deep_learning