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运算量非常大。
资源
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是由另一个模型单独生成的,而且运算非常昂贵。
资源
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。
资源
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)
资源
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。
资源
对比视频
注 mark-RNN还要识别边界,Deeplab 还要输出分割。