R-CNN

  1. 使用大容量卷积神经网络(CNN)自下而上生成候选区域(region proposals),以便定位和分割对象。
  2. 标记训练数据稀缺,使用监督式预训练,基于特定领域的微调模型进行辅助,性能显著提升。

R-CNN系统综述

restful在线检查_池化

  1. 输入一张图像
  2. 自下而上提取出大约2000个候选区域,对每个候选区域,首先将框稍微扩张使其包括部分上下文信息,然后将扩张后的图像resize到227 × 227(CNN的输入大小)的大小
  3. 使用大型卷积神经网络计算每个候选区域特征,生成4096维的特征向量
  4. 使用SVM对每个区域分类

运行时分析

CNN参数共享,并且由CNN计算出的特征向量维度相比于当时其他方法的要低,因此使得检测很高效,同时占用内存空间更小,只占用1.5GB,而UVA检测系统要占用134GB。

目标类别分类

为每一个类分别训练一个SVM。

bounding box 回归

在对每个候选框使用SVM打分后,作者从CNN计算出的特征中使用bounding box回归来改进定位的性能。

restful在线检查_RCNN_02

一些不足

  1. 提取图像所有候选框的特征,并将第五个池化层的输出存到硬盘,这可能会占用大量磁盘空间。
  2. 每一个候选框都要经过CNN进行计算。
  3. 对每个类分别训练一个SVM,类别数越多要训练的SVM越多。
  4. 上面这些因素导致RCNN检测速度很慢,一张图大概需要47秒。

SPP-Net

  1. 不管图像多大,都能生成固定长度的特征表示。
  2. 在整张图像上只计算一次特征。

介绍

CNN普遍要求输入图像的大小是固定的(比如224 × 224),当给定任意一张图片,目前常见的做法是对图片进行crop(裁剪)或者warp(将bounding box内的图片进行resize),但是crop可能会漏掉一部分物体区域,而warp可能会产生变形导致图像失真:

restful在线检查_RCNN_03

CNN要求输入图像大小固定是因为在网络后面的全连接层需要固定大小的输入,从而导致CNN的输入大小也必须固定。因此,在SPP-Net中加入了一种神奇的操作,不管输入大小多少,都能使后面的全连接输入得到固定,这就是spatial pyramid pooling(SPP),在卷积层之后加入SPP层。

restful在线检查_SPP_04

  1. 对于任意输入大小,SPP可以生成固定大小的结果,而以前的滑动窗口池化做不到。
  2. 使用多尺度的输入,而滑动窗口池化只用一个同样大小的窗口。
  3. SPP能从不同尺度上提取特征。

RCNN在整张图上选取2000多张候选框,然后分别在这2000多张图片上进行计算,这种方式非常耗时,并且存在大量的冗余计算,SPP在整张图片上只进行一次卷积运算。因此速度比RCNN快大约100倍,处理一张图片只需0.5秒,并且准确率相当。

空间金字塔池化层(SPP)

在全连接层之前,使用SPP,使得不管输入图像大小多少,由SPP输出给全连接层的大小固定。这种神奇的操作是如何做到的?

不管输入图像的尺寸如何,都按照同样比例来调整池化窗口大小而得到同样大小的输出结果,因此输入全连接层的大小得到了固定,而输入图像可以是任意尺寸。

restful在线检查_SPP_05

SPP-Net目标检测

RCNN使用选择性搜索的方式从整张图像上提取大约2000个候选框,然后将它们resize到固定的大小(227 ×227),然后使用预训练的网络从每个候选框中提取特征。由于不断重复地在这大约2000多个候选框上进行深度卷积计算,因此非常耗时,而特征提取就成了主要性能瓶颈。

而SPP-Net只在整张图像上提取一次特征,然后在每个候选框对应的特征区域上使用SPP,从而节省了大量时间。

restful在线检查_池化_06