图像分割
图像分类(只关注类别)→目标检测(要框出位置)→语义分割(分割不同物品,但是相同类别的物品视为同一个)→实例分割(分割每一个物体,相同类别的不同物体视为不同个体)
目的:
预测目标:
任务类型:
语义分割、实例分割(目标检测+语义分割)
常用数据集:
PASCAL VOC,城市风光数据集(Cityspaces,用于自动驾驶)、coco数据集
评价指标:像素精度、类别平均像素准确率、交并比、平均交并比
-
像素精度(Pixel Accuracy,PA):**图像中正确分类的像素百分比,即分类正确的像素占总像素的比例(二分类对应机器学习中的准确率(Accuracy))
-
类别平均像素准确率(Mean Pixel Accuracy,MPA): 分别计算每个类被正确分类像素数的比例,然后累加求平均。
-
交并比(Intersection over Union,IoU): 交并比表示的含义是模型对某一类别预测结果和真实值的交集与并集的比值。只不过对于目标检测而言是检测框和真实框之间的交并比,而对于图像分割而言是计算预测掩码和真实掩码之间的交并比。
对于二分类问题,
-
平均交并比(Mean Intersection over Union,MIoU),即预测区域和实际区域交集除以预测区域和实际区域的并集,这样计算得到的是单个类别下的IoU,然后重复此算法计算其它类别的IoU,再计算它们的平均数即可。它表示的含义是模型对每一类预测的结果和真实值的交集与并集的比值,之后求和再计算平均。
对于二分类问题,
FCN
FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全连接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。
最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本。
其核心思想为:
- 使用不包含全连接的全卷积网络,所以可以输入任意大小的图片。
- 使用跳跃连接,以结合不同尺度的图像特征,使得模型具备更高的精度与鲁棒性。
- 使用反卷积对提取后的低分辨率图像进行上采样,输出与原图同分辨率的分割图片,保留了原始图像的空间信息,从而能够对原图的每一个像素都进行预测。
反卷积:输入:n x n,padding = p, stride = s (在中间插入0的个数), kernal_size = k,则输出 m = s(n-1) + k - 2p
跳跃连接:
实验发现再融合效果会变差
UNet
Encoder 由卷积操作和下采样操作组成,所用卷积结构统一为 3x3
的卷积核,padding=0
,striding=1
。没有 padding 所以每次卷积之后特征图的 H 和 W 变小了,在跳层连接(Skip connection)时需注意特征图的维度。
Decoder 用以恢复特征图的原始分辨率,除了卷积以外,该过程的关键步骤就是上采样与跳层连接。上采样常用转置卷积和插值两种方式实现。在插值实现方式中,双线性插值(bilinear)的综合表现较好也较为常见 。要想网络获得好的效果,跳层连接基本必不可少。UNet 中的跳层连接通过拼接将底层的位置信息与深层的语义信息相融合。需要注意的是,在 FCN 中,特征图是以相加的方式进行融合
FCN:通过特征图对应像素值的相加来融合特征;
UNet :通过通道数的拼接,以形成更厚的特征(当然这样会更佳消耗显存)。
相加方式:特征图维度没有变化,但每个维度包含了更多特征。对于普通分类任务这种不需要从特征图复原到原始分辨率的任务来说,这是一个高效的选择;
拼接方式:保留了更多的维度/位置信息,这使得后面的网络层可在浅层特征与深层特征间自由选择,这对语义分割任务来说更具优势。在实际中,融合的两张特征图尺寸可能不同,一般可采用裁剪和padding(UNet采用方式)两种方式进行解决;
UNet 的优点主要有:
深/浅层特征有着各自意义:网络越深,感受野越大,网络关注那些全局特征(更抽象、更本质);浅层网络则更加关注纹理等局部特征特征;通过特征拼接来实现边缘特征的找回。通过上采样(转置卷积)固然能够得到更大尺寸的特征图,但特征图的边缘是缺少信息的。毕竟每一次下采样提取特征的同时,必然会损失一些边缘特征,而上采样并不能找回这些失去的特征。
RCNN
-
传统目标检测
-
RCNN算法分为4个步骤
-
一张图像生成1K~2K个候选区域
使用了Selective Search1方法从一张图像生成约2000-3000个候选区域。基本思路如下:
- 使用一种过分割手段,将图像分割成小区域
- 查看现有小区域,合并可能性最高的两个区域。重复直到整张图像合并成一个区域位置
- 输出所有曾经存在过的区域,所谓候选区域
-
对每个候选区域,使用深度网络提取特征
- 使用深度网络提取特征之前,首先把候选区域归一化成同一尺寸227×227
- 特征提取:使用AlexNet对每一个候选区域提取特征,得到2000*4096维的特征向量。
-
特征送入每一类的SVM 分类器,判别是否属于该类
- 候选区域类别判断:将2000*4096维特征向量送入到21个(20个类别+1个背景)SVM分类器中,每一个SVM分类器包含4096个参数,所以可以看成两个矩阵相乘,这样就得到了每一个候选区域是某个类别的概率值
-
使用回归器精细修正候选框位置
-
因为一张图片出现有上千个物品的可能性微乎其微,所以必定有大量的候选区域是重叠的,因此需要去除冗余的候选框。作者在此处使用非极大值抑制(NMS)方法来去除冗余候选框,对于每一个类别中IoU大于给定阈值的候选区域。这样就得到了每一个类别得分最高的一些候选区域。
-
对于上一步经过NMS筛选后的候选区域,其精度必定不够,所以需要进行进一步的调整。
-
-
Fast R-CNN
-
SPPNet:
-
在神经网络中输入图片的尺寸必须是固定的,这是因为在设计的时候FC层中神经元的个数都是固定的,导致输入图片尺寸必须是固定的;
-
CNN是可以适应不同尺寸的输入图片,说明在CNN后面加入某种机制就可以让FC层也适应不同尺寸的输入图片,某种机制就是何凯明大神提出的空间金字塔池化(SPP);
-
R-cnn中将2000个框输入到神经网络中,而SPPNet中将整张图片丢到神经网络中,得到原图的feature map,而在R-CNN中有候选框,我们就可以将feature map中可能存在物体的候选框截取下来,这时截取出来的框尺寸会不同,但是通过SPP后,就被固定为长度一定的特征向量,将向量输入到后面的FC层。
-
还是多阶段的,先提取特征(要先储存),再训练一个SVM分类器
-
-
RoI Pooling:这一方法参考了SPPNet的空间金字塔池化,可以将RoI Pooling看做空间金字塔池化的一个简化版
- RoI Pooling 就是将每一个候选区域的特征图分割成7x7=49等分,对于每一个区域使用最大池化操作,这样就能将所有输入统一到7x7的大小
-
Fast R-CNN的流程主要分为三步:
-
使用 Selective Search 方法生成2K个图片候选区域。
-
对整张图片进行特征提取得到相应的特征图(这是对R-CNN的一大改进,参考了SPPNet),并将上一步生成的候选区域映射到特征图中。
-
使用ROI Pooling将所有的候选区域特征统一缩放到7*7大小,然后将这2K个特征向量展平,并连接到全连接层上,得到两个输出结果,一个是K+1类(类别数+背景类)的概率,还有一个是每个类的预测边框。
-
-
使用了多任务的损失函数来简化R-CNN中的多阶段训练(网络直接输出各类概率(softmax),比SVM分类器性能略好)
Faster R-CNN
-
Fast RCNN不足:
- 候选区域的选取还是通过selective search,并且只能在CPU中运行这个算法,所以这个阶段浪费了大量时间。(这也是Faster RCNN改进的点)
-
RPN(Region Proposal Networks)
- RPN网络接受任意尺寸大小的featmap作为输入,然后会生成9K个(为什么是9K,而不是K个,下面会有说明)anchor,并且RPN有两个输出,一个是anchor的类别信息,也就是该anchor是背景还是前景(只要有要识别的物品就属于前景),还有一个输出是该anchor的位置偏移信息(如果该anchor是背景,则该输出不重要)
- 对anchor的一些筛选工作:
-
现在我们已经有一堆经过修正后的anchor,并且也知道了每一个anchor属于前景的概率,但是现在anchor的数量是不是太多了,如果全部作为RoI(Region of Intererst,也就是感兴趣区域或者说候选区域)输入到后续网络中,这计算量属实有点大,所以就需要进行一些筛选工作,这其实也就是RPN网络中Proposal层所做的工作。
-
首先,现在我们的anchor有许多因为是在边缘生成的,所以它们的坐标可能是负值,或者简单来说就是超出了图片的范围,那么就需要对这些anchor进行裁剪,把它们统一裁剪到图片范围内,也就是将anchor左上角坐标小于0的值用0代替,右下角坐标的X轴数值大于W就用W代替,Y轴数值大于H的用H代替。
-
经过上一步的裁剪工作,就会有许多anchor会变得很小,这里我们设定一个阈值,凡是小于16*16的anchor,我们都把它丢弃掉。
-
接着,因为我们已经有了每一个anchor属于前景的概率,那么很明显如果一个anchor属于前景的概率太小,那么也没有留着的必要性,所以对这些anchor的前景概率从大到小进行argsort,得到每一个anchor的排序索引,只取前6000个,到这一步anchor还是很多,但此时不能再鲁莽的去除anchor,因为有可能会有误判(毕竟这个前景概率只是rpn的预测,并不是真实的),此时需要用NMS方法把IoU大于0.7的进行合并,对于合并完的anchor再取前300个,这样就把输入到RoI网络的anchor的数量大大减少了。
-
-
具体算法步骤如下
- 输入图像到特征提取器中,得到整张图片的feature map。
- 使用RPN生成候选框,并投影到feature map上,得到每一个候选区域的特征矩阵。
- 将每一个特征矩阵经过ROI Pooling缩放到7*7大小,然后经过展平处理后通过全连接层获得预测的分类以及候选区域位置偏移信息。
MaskRCNN
Mask R-CNN的提出动机:结合FCN和Faster R-CNN不仅可以是模型同时具有物体检测和语义分割两个功能,还可以是两个功能互相辅助,共同提高模型精度。
Yolo
-
思想:
-
yolo固定维度的办法是把模型的输出划分成网格形状,每个网格中的cell(格子)都可以输出物体的类别和bounding box的坐标。
-
物体落在哪个cell,哪个cell就负责预测这个物体:在训练阶段,如果物体中心落在这个cell,那么就给这个cell打上这个物体的label(包括xywh和类别)。也就是说我们是通过这种方式来设置训练的label的。换言之,我们在训练阶段,就教会cell要预测图像中的哪个物体
-
-
网络构架:
-
从图中可以看到,yolo网络的输出的网格是7x7大小的,另外,输出的channel数目为30。一个cell内,前20个元素是类别概率值,然后2个元素是边界框confidence,最后8个元素是边界框的 (x, y,w,h) 。
-
也就是说,每个cell有两个predictor,每个predictor分别预测一个bounding box的xywh和相应的confidence。但分类部分的预测却是共享的。正因为这个,同个cell是没办法预测多个目标的。
-
一个cell只能预测一个目标,为什么还要预测两个bounding box(或者更多)?这个还是要从训练阶段怎么给两个predictor安排训练目标来说。在训练的时候会在线地计算每个predictor预测的bounding box和ground truth的IOU,计算出来的IOU大的那个predictor,就会负责预测这个物体,另外一个则不预测。这么做有什么好处?我的理解是,这样做的话,实际上有两个predictor来一起进行预测,然后网络会在线选择预测得好的那个predictor(也就是IOU大)来进行预测。通俗一点说,就是我找一堆人来并行地干一件事,然后我选干的最好的那个。
-
-
模型输出的意义
-
confidence表示:cell预测的bounding box包含一个物体的置信度有多高并且该bounding box预测准确度有多大,用公式表示为:
- 对于训练阶段来说,我们要给每个bounding box的confidence打label,如果一个物体中心没有落在cell之内,那么每个bounding boxPr(Object)=0;如果物体的中心落在了这个cell之内,这个时候Pr(Object)=1,因此confidence变成了。注意这个IOU是在训练过程中不断计算出来的,网络在训练过程中预测的bounding box每次都不一样,所以和ground truth计算出来的IOU每次也会不一样。
- 对于预测阶段,网络只输出一个confidence值,它实际上隐含地包含了 。
-
bounding box的预测包括xywh四个值。xy表示bounding box的中心相对于cell左上角坐标偏移,宽高则是相对于整张图片的宽高进行归一化的。偏移的计算方法如下图所示。
-
类别预测
- 对于训练阶段,对于一个cell,如果物体的中心落在了这个cell,那么我们给它打上这个物体的类别label,并设置概率为1。换句话说,这个概率是存在一个条件的,这个条件就是cell存在物体。
- 对于测试阶段来说,网络直接输出Pr(classi/object),就已经可以代表有物体存在的条件下类别概率。但是在测试阶段,作者还把这个概率乘上了confidence。
- 为什么这么做呢?举个例子,对于某个cell来说,在预测阶段,即使这个cell不存在物体(即confidence的值为0),也存在一种可能:输出的条件概率p(class/object)=0.9,但将confidence和p(class/object)乘起来就变成0了。这个是很合理的,因为你得确保cell中有物体(即confidence大),你算类别概率才有意义。
-
-
训练loss:坐标误差+IOU误差+分类误差
- 有物体中心落入的cell,需要计算分类loss,两个predictor都要计算confidence loss,预测的bounding box与ground truth IOU比较大的那个predictor需要计算xywh loss。
- 特别注意:没有物体中心落入的cell,只需要计算confidence loss。
- 另外,我们发现每一项loss的计算都是L2 loss,即使是分类问题也是。所以说yolo是把分类问题转为了回归问题。