计算机视觉-检测和分割
在第一章我们了解过常见的CV任务,主要有:图像分类、语义分割、分类+定位、目标检测、实例分割
图像分类
CV最常见的就是图像分类了,比如说利用AlexNet对图像进行分类,最后输出对图像的预测分数
在图像分类的基础上,延伸出来几个其他作用,下面一一介绍
语义分割
语义分割就是对于输入的图片,将每一个像素划分成一个类别。如下:
方法
那么语义分割怎么做呢?
对于图像分类,是对图像整体进行类别预测,而对于语义分割,是对每一个像素进行分类。同时,不区分相同类别的个体。
Naive Idea: 滑窗
我们可以拿一个窗口再图像上滑动,每次滑动一个像素点,然后用CNN去判断这个滑窗属于什么类别,然后将滑窗的中心点划为这个类。
虽然利用滑窗可以达到比较好的效果,但是这个方法的计算代价及其昂贵
对所有像素点同时进行预测
我们可以对整个图像进行卷积
将损失函数定义为 对所有像素点进行分类的交叉熵之和,然后最小化损失函数得到预测结果。这个方法相比于滑窗效率有所提升,但是对内存的要求很大,卷积计算依然昂贵。
因此我们要在中间过程中对feature map 进行下采样,得到隐层向量,然后再进行上采样复原图片,进行损失函数的计算。
上采样
下采样是池化和卷积,上采样就是下采样的逆转方法——反池化和反卷积。
比如说,反池化有几种选择:我们可以将一个元素的邻居都赋相同的值,也可以将只赋值给区域中的固定位置,其他位置设为0
当然,还有一种就是借鉴池化反向传播的方法,将值赋给池化时的对应位置
不管是max unpooling, nearest neigbor 还是Bed of Nails,都和池化一样是没有参数的。 还有一种上采样方法:deconvolution,则需要用参数,而且是可学习的。
如下图, 我们将输入值乘以一个 $3\times 3$的”反卷积核” ,就相当于”扩张”了。如下图所示:
然后,对每个输入值乘以卷积核,并对重叠的位置进行累积(当然平均也可以),得到上采样后的结果,可以得到如下图所示:
分类+定位
分类加定位(单目标检测),就是识别出一张图片最主要的对象,然后框起来。如下
方法
和图像分类的区别就在于,经过卷积之后,需要做两个全连接层,一个全连接层做的工作是分类,另一个则是输出一个长度为4向量,代表了这个框的四个坐标。这样就完成了分类的预测和定位的预测。
分类的预测用softmax 损失函数,定位的预测用L2损失函数(回归),将这两个损失函数相加,共同优化,得到最终的结果。
因此,理论上只要有固定数量的点位,我们都可以对其进行预测。这项技术可以用于姿态估计
目标检测
将分类+定位中的单个物体拓展为多个物体,就变成了目标检测任务
方法
在进行分类+定位任务的时候,我们可以将问题简化为预测5个值(类别以及框的定位);但是对于目标检测任务,由于一张图片中存在多个目标,我事先是不知道有多少物体的,因此需要预测很多数值以及很多类别。
Naive idea
一个朴素的额方法就是,用不同的大小、位置、长宽比的矩形区域对图片进行卷积计算,用来预测类别以及框框位置。但很显然这种方法的代价极其昂贵。
R-CNN
因此我们设想,可不可以预先寻找一些可能存在物体的区域? 这就是 Region Proposals(RP)
我们可以用 Selective Search 这种传统的图形学算法,来找到几个很可能存在物体的区域。通常速度为 2000区域/秒
在一张图片中经过RP之后,会在图片上标记出一些区域,我们称其为(Regions of Interest,ROI) 由于区域大小存在差异,因此会先转换成大小统一的feature map
然后经过CNN 对每一个区域进行分类以及利用回归来校正 ROI 的坐标
虽然这个算法效果非常好,肯定包含了我们需要检测的目标,但是,这种方法也很慢,需要对至少好几千个ROI分别做卷积。
Fast R-CNN
为了优化上面这个算法,我们可以先卷积,后RP,这就是所谓的 Fast R-CNN . 示意图如下:
Faster R-CNN
比 Fast R-CNN更快的,是Faster R-CNN。 这种方法优化了RP方法,使用RPN来进行物体检测。其示意图如下:
该方法使用了4个损失函数:
- RPN 是否包含物体
- RPN 边框坐标
- 物体的最终类别
- 边框的额最终目标
RPN 不同于传统的图像算法,是基于数据驱动、会不断优化自己的。训练完成以后,当RPN得到了feature map,它会去预测到底哪些区域是存在目标物体的,而不是使用selective search的方法去检索。
因此,到最后PR会被优化成一个线性计算,效率会非常高。
那么,RPN 是怎么被训练的呢?
首先,得到了一个 20x15 的feature map,我们就将其划分为20x15个block.
接着,我们把每一个block 为中心,构建一个 anchor box. 如下图所示
然后,我们去预测每个anchor box 里面是否包含物体。也就是输出 $1\times20\times15$ 个预测数据
在预测是否包含物体的时候,还需要预测每一个anchor box的真是坐标,因此又要输出$4\times20\times15$个数据
通常,每一个像素点,有k 个大小不同的anchor box 需要我们去预测,因此,还要在原来的基础上乘以 $K$
最后,我们会选取含物体概率最高的100个区域作为 Region Proposal
整个训练一共分为两个阶段
- 第一阶段
- CNN 提取 feature
- RPN
- 第二阶段
- ROI Pooling
- 分类
- 回归(校正 ROI)
YOLO
YOLO 是 You Only Look Once 的缩写。
YOLO 是直接在图片上划分出base boxes(类似于anchor boxes),对每个base box进行回归,并预测这个框有多大概率真的包含目标物体(背景)。
YOLO在实际项目中的效果是很好的,比faster R-CNN更快。但是由于没有提取feature map,所以精度会差一点
SSD: Single-Shot MultiBox Detector
总结
Feature 提取网络
- VGG 16
- ResNet-101
- Inception V2
- Inception V3
- Mobile Net
主体结构
- 两阶段: Faster R-CNN
- 一阶段: YOLO/SSD
- 混合:R-FCN
经验总结
Faster R-CNN 相对较慢但精度较高
YOLO/SSD 速度更快,但精度较低
Feature 提取可以使用更深更大的模型
实例分割
在实例分割任务中,需要将检测到的目标用不同的颜色标注出来。但在语义分割里面,可能这些目标都是一个颜色的。
方法
实例分割就是将前面的一些方法整合起来。其中最经典的一个模型就是Mask R-CNN
Mask R-CNN
Mask R-CNN前面的结构和Faster R-CNN 非常像
先利用目标检测的方法,检测图片中那些区域可能存在物体
再利用语义分割的方法,将这个区域里面的像素点进行分类
https://openaccess.thecvf.com/content_ICCV_2017/papers/He_Mask_R-CNN_ICCV_2017_paper.pdf