论文地址:https://arxiv.org/abs/1612.03144,这篇论文主要使用特征金字塔网络(Feature Pyramid Network)来融合多层特征,改进了CNN特征提取。论文在Fast/Faster R-CNN上进行了实验,在COCO数据集上刷到了第一的位置,意味着其在小目标检测上取得了很大的进步。论文整体思想比较简单,但是实验部分非常详细和充分。
背景知识
在做目标检测的时候,目标可大可小,如何检测出各种尺度下目标是计算机视觉面临的一个很大挑战。既然目标有多个尺度,那么我是不是可以提取多个尺度的特征呢?答案是肯定的,如下图(a)所示(蓝色的框代表 feature map,框的线条越粗,其表达语义的能力越强),我们可以获取输入图像的不同尺度、并在不同尺度上提取特征(如Sift、HOG),然后进行目标的预测。传统的做法是先获取图像的不同尺度,然后分别提取不同尺度图像的 feature maps。优势是,不同尺度 feature maps 的语义表达能力相当,缺点是计算量较大。
下图(b)示意了现在深度学习方法常用的策略,用深度网络提取的 feature maps 代替传统方法提取 feature maps(原因就是深度网络提取的特征表达能力更强)。从底层到高层,深度网络输出的 feature maps 语义表达能力逐渐增强,我们可以直接在高层 feature maps 基础上进行目标预测。如果我们把所有尺度的输入图像,都进行类似的处理,则可以进行不同尺度的目标的检测。由于深度网络计算量较大,这样做效率较低。如果针对各个尺度的输入图像设计端对端训练的网络结构,由于硬件资源的限制,较难。
为什么我们不直接利用深度网络本身就具有的多尺度特性呢?这正是图(c)所示方法的一个做法。这样做的一个坏处就是深度网络不同尺度的 feature maps 具有不同的“语义表达”水平。而如何使得深度网络不同尺度的 feature maps 具有相同的“语义表达”水平正是本文追求的一个目标。
这样我们就可以达到图(a)的效果,但是并没有针对各个尺度的输入图像都进行相同的 feature maps 提取过程。
PyTorch 代码实现
PyTorch 的代码实现可以在这里找到:https://github.com/jwyang/fpn.pytorch。这个实现主要有以下特点:
- 全部用 PyTorch 的函数实现。 所有的 numpy 实现都转化成了 PyTorch 的相应实现。
- 支持 batchsize > 1 来训练。重新实现了各层,包括 dataloader, rpn, roi-pooling, 等,支持每次训练多个图像。
- 支持多 GPUs 同时训练。 我们的代码支持同时使用多个 GPU 训练。
- 支持三种池化 pooling 方法。我们支持三种池化方法: roi pooing, roi align 和 roi crop.
运行结果
下面是在 PASCAL VOC 2007 上的运行结果 (Train/Test: 07trainval/07test, scale=600, ROI Align):
model | GPUs | Batch Size | lr | lr_decay | max_epoch | Speed/epoch | Memory/GPU | mAP |
---|---|---|---|---|---|---|---|---|
Res-101 | 8 TitanX | 24 | 1e-2 | 10 | 12 | 0.22 hr | 9688MB | 74.2 |
本站微信群、QQ群(三群号 726282629):