您的位置 首页 PyTorch 项目

PyTorch 实现特征金字塔网络 Feature Pyramid Network (FPN)

PyTorch入门实战教程

论文地址: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):

modelGPUsBatch Sizelrlr_decaymax_epochSpeed/epochMemory/GPUmAP
Res-1018 TitanX241e-210120.22 hr9688MB74.2
PyTorch入门实战教程

发表评论

电子邮件地址不会被公开。 必填项已用*标注

返回顶部