R-CNN 家族和 YOLO的比较

R-CNN

R-CNN (Girshick et al., 2014) 是 “Region-based Convolutional Neural Networks”的简称,主要分两步: 1,通过选择性搜索,选择出一堆bounding-box,这就是疑似目标(ROI or “region of interest”)。 2,采用CNN的特征对每个区域独立分类。 ## R-CNN的构架

R-CNN的构架 (Girshick et al., 2014)

##模型工作流

  • 先训练一个CNN网络来进行图像分类。通常,我们可以采用VGG或者ResNet的网络进行训练。
  • 通过选择性搜索来搜索目标区域,通常在2千目标/幅画。
  • 这些区域需要re-size到一个预设大小。
  • 持续调整CNN来使目标区域为k+1类(一类为无牧鞭)。因为这些区域大多数为背景,通常学习的速率不能设太高,oversample也不要太大。
  • 对于每一个图像区域,通过CNN的前向传播生成一个特征向量,然后这个特征向量需要输入二进制SVM。正样本通常IoU(联合交集)>= 0.3。
  • 回归模型被用于减少定位误差,矫正边界框。

速度瓶颈

在现实中,通常来说,一幅图像有2千个区域,每个区域生成一个特征向量,然后还需要CNN(图像分类和特征提取),SVM(物体识别),回归模型(调整边界),而且这三个模型数据不共享。R-CNN运算量非常大。

资源

paper

code

Fast R-CNN

为了使R-CNN更快,Girshick(2015)提出了Fast R-CNN。其中三个独立模型合并为了一个联合训练框架并共享计算结果。具体来说,我们不再为每个特征设置独立的特征向量,而是每个图像采用一个CNN正向通道,共享了特征矩阵。并且采用相同的特征矩阵来构建分类器和边界回归矩阵。

Fast R-CNN的构架

Fast R-CNN的架构。(Girshick,2015)

RoI Pooling

这个一种max pooling,它能将任意大小的图像区域转化为一个小的固定窗口。窗口被划分成H×W个网格,每个网格中都应用max-pooling。

图3. RoI Pooling(Stanford CS231n slides。)

##模型工作流 Fast R-CNN 的许多步骤都与R-CNN中的步骤相同: - 一个预训练的 CNN 被应用到了分类任务上。 - 通过选择性搜索来搜索目标区域,通常在2千目标/幅画。 - 改变这个预训练的 CNN: - 用 RoI pooling 层替换预训练的 CNN 的最后一个 max-pooling 层。RoI pooling 层会输出一个固定长度的特征向量。因为有许多图像都有很多区域高度重叠,所以共享 CNN 是十分可行的。 - 用一个全连接层和涵盖 k+1类的softmax替换最后一个全连接层和最后一个 k 类的 softmax。 - 最后,模型分为两个输出层: - K + 1类的softmax估计器(与R-CNN中的相同,+1是“背景”类),输出每个RoI的离散概率分布。 - 用于预测每个K类的相对于原始RoI的偏移量的边界框回归模型。

损失函数

该模型针对组合两个任务(分类+本地化)的损失进行了优化,通常采用的\(l_1\) 范数。

速度瓶颈

快速R-CNN在训练和测试时间上都快得多。然而,这种改善并不显着,因为RoI是由另一个模型单独生成的,而且运算非常昂贵。

资源

paper

code

Faster R-CNN

Faster R-CNN (Ren et al., 2016) 通过将区域提议分布整合到CNN模型来提高速度:构建由RPN(区域提议网络)和具有共享卷积特征层的fast R-CNN组成的统一模型。

Faster R-CNN的构架

Faster R-CNN的架构。(Girshick,2015)

##模型工作流 Fast R-CNN 的许多步骤都与R-CNN中的步骤相同: - 一个预训练的 CNN 被应用到了分类任务上。 - 为提议分布,算法通过一个预训练的图像分类,Fine-tune 一个端对端的的RPN(区域提议网络)。正样本IoU (intersection-over-union) > 0.7,负样本IoU < 0.3。 - 将整个图像的conv特征映射到一个小的n×n窗口 - 在每个窗口的中心,我们会尝试不同比例和比率的多个区域。 - 通过现在RPN的产生的提议分布来提出一个快速的R-CNN物体检查模型。 - 然后使用Fast R-CNN网络来初始化RPN训练。 在保留共享卷积层的同时,只调整RPN层。 在这个阶段,RPN和检测网络卷积层的共享的。 - 对Fast R-CNN的unique layer进行微调 - 重复4-5步来训练RPN或者Fast R-CNN。

资源

paper

code

Mask R-CNN

Mask R-CNN(He et al。,2017)是将faster R-CNN应用到像素级图像分割。 关键点是分类和生成像素级掩膜。基于更快的R-CNN框架,它添加了第三个分支(分类,定位和掩膜)。 掩膜分支是对于每个RoI生成一个小的全链接网络,并生成一个像素到像素的掩膜。

Mask R-CNN的架构。(He et al., 2017)

因为像素的切割需要更精准的边界框,所以它也对RoI pooling进行了修改(称为RoIAlign layer) Mask R-CNN的例子。(He et al., 2017)

RoIAlign

RoIAlign层的目的是为了提高RoI层的精度。因为移除了哈希量化所以能够更好地像素对其。浮点位置则由双线性插值法计算。

映射不在取整。(blog.athelas.com)

资源

paper

code

R-CNN家族

R-CNN结构对比。(lilianweng.github.io)

YOLO

YOLO模型 (“You Only Look Once”; Redmon et al., 2016) 将识别问题看成一个回归问题而不是分类问题。因为将整个图片作为输入,因此在全面了解背景的情况下,它可以更好地识别背景。这样做的特点就是快,对小物体和复杂物体识别率低。

YOLO的构架

YOLO的架构。(Redmon et al., 2016)

模型工作

  • 在图像分类任务上预训练一个CNN网络。
  • 将图像拆分为S x S单元格(cell)。每个单元只负责识别其中心位于该单元中的对象。每个单元格给出\(B\)个边界框和一个置信度(边界),以及在边界框中存在对象的信度。
    • 边界框由(x,y,宽度w,高度h) - (x,y,w,h)的元组定义。 x和y被归一化为cell位置的偏移量; w和h通过图像宽度和高度进行归一化,值在0-1之间。
    • 置信度分数是:概率(包含对象)x IoU(预测的)。
    • 如果单元格包含对象,则它预测该对象属于一个某一类的概率[p_1,p_2,...,p_c]。现阶段是每个cell给一个概率,与\(B\)无关。
  • 一个图像包含S x S x B边界框,每个框对应于4个位置预测,1个置信度分数和用于对象分类的c个条件概率。一个图像的总预测值是S×S×(5B + c)。
  • 预先训练的CNN的最后一层被修改以输出尺寸为S×S×(5B + K)的tensor。

资源

paper

code

对比视频

注 mark-RNN还要识别边界,Deeplab 还要输出分割。