AI学习笔记(十四)CNN之图像分割

图像分割

问题引入

在自动驾驶系统中,如果用之前的检测网络(例如Faster-Rcnn)。试想,如果前方有一处急转弯,系统址再道路上给出一个举行标识,这样一来车辆很可能判断不出该是避让还是径直向前,车祸一触即发。因此,对新技术的诉求应运而生,该技术需能识别具体路况,以指引车辆顺利过弯。
在这里插入图片描述

实现技术手段及分类

图像分割即为图片的每个对象创建一个像素级的掩膜,该技术可使大家对图像中的对象有更深入的了解。
在这里插入图片描述
图像分割可以分为两种:语义分割与实例分割。

  • 左图五个对象均为人,因此语义分割会将这5个对象视为一个整体。
  • 右图同样也有五个对象(已均为人),但同一类别的不同对象在此被视为不同的实例,这就是实例分割。
    在这里插入图片描述
    在这里插入图片描述

语义分割-FCN(Fully Convolutional Networks)

在这里插入图片描述
分类使用的网络通常会在最后连接几层全连接层,它会将原来二维的矩阵(图片)压扁成一维的,从而丢失了空间信息,最后训练输出一个标量,即分类标签。
FCN网络和一般的网络最大的不同是,FCN产生的输出和输入的维度保持一致,即改变原本的CNN网络末端的全连接层,将其调整为卷积层,这样原本分类网络最终输出一个热度图类型的图像。
在这里插入图片描述
总的来说,即FCN将传统卷积后面的全连接层换成了卷积层,这样网络输出不再是类别而是heatmap;同时为了解决因为卷积和池化对图像尺寸的影响,提出使用上采样的方式恢复尺寸。
其核心思想:

  • 不含全连接层(FC)的全卷积(Fully conv)网络,可适应任意尺寸输入;
  • 增大数据尺寸的反卷积(deconv)层,能够输出精细的结果。

FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题;
FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后再上采样的特征图上进行逐像素分类。
最后逐个像素计算softmax分类的损失,相当于每一个像素对应一个训练样本。

对全卷积网络的末端进行upsamping(上采样),即可得到和原图大小一样的输出,这就是热度图了。这里上采样采用了deconvolutional(反卷积)的方法;
反卷积/转置卷积:它并不是正向卷积的完全逆过程。反卷积是一种特殊的正向卷积,先按照一定的比例通过补0来扩大输入图像的尺寸,接着旋转卷积核,在进行正向卷积;实际上通过反卷积操作并不能还原出卷积之前的图片,智能还原卷积之前图片的尺寸,卷积和转置卷积的操作也是不可逆的。

FCN–deconv

反卷积(转置卷积)的作用:
1、反卷积在语义分割领域应用很广,如果说pooling层用于特征降维,那么再多个pooling层后,就需要用转置卷积来进行分辨率的恢复;
2、如果up-sampling采用双线性初值进行分辨率的提升,这种提升是非学习的。采用反卷积来完成上采样工作,就可以通过学习的方式得到更高的精度。
在这里插入图片描述

反卷积的具体步骤

1、将上一层的卷积核反转(并不是转置,而是上下左右方向进行反转)
2、将上一层结果作为输入,做补0扩充操作,即王每一个元素后面补0,这一步是根据步长来的,对于每个元素沿着步长方向补(步长-1)个0。例如,步长为1就不用补0了。
3、在扩充后的输入基础上再对整体补0。以原始输入的shape作为输出,按照卷积padding的规则,计算padding的补0的位置及个数,等得到补0的位置及个数;
4、将补0后的卷积结果作为真正的输入,反转后的卷积核为filter,进行步长为1的卷积操作。注意:计算padding按规则补0时,统一按照padding=‘SAME’,步长为 1 × 1 1\times 1 1×1的方式来计算。
在这里插入图片描述
{ 卷 积            o = i − k + 2 × p s + 1 反 卷 积        i = ( o − 1 ) × s + k − 2 × p \left\{\begin{array}{l}\mathrm{卷积}\;\;\;\;\;o=\frac{i-k+2\times p}s+1\\\mathrm{反卷积}\;\;\;i=(o-1)\times s+k-2\times p\end{array}\right. {o=sik+2×p+1i=(o1)×s+k2×p
反卷积的缺点
1、卷积矩阵是稀疏的(有大量0),因此大量信息是无用的;
2、求卷积矩阵的转置矩阵是非常耗费计算资源的

Unpool

池化操作中最常见的最大池化和平均池化,因此最常见的反赤化有反最大池化和反平均池化。反最大池化需要记录池化时最大值的位置,反平均池化不需要此过程。
在这里插入图片描述

DeconvNet

这样的对称结构有种自编码器的感觉在里面,先编码再解码。
在这里插入图片描述

实例分割

在这里插入图片描述
实例分割(instance segmentation)的难点在于:需要同时检测出目标的位置并且进行分割,所以这就需要融合目标检测(框处目标的位置)以及语义分割(对像素进行分类,分割出目标)方法。

Mask R-CNN

Mask R-CNN可算作是Faster R-CNN的升级版。
Faster R-CNN广泛应用于对象检测。对于给定图像,它会给图中每个对象加上类别标签与编辑框坐标
Mask R-CNN框架是以Faster R-CNN为基础而架构的。因此,针对给定图像,Mask R-CNN不仅会给每个对象添加类标签与边界框坐标,还会返回其对象的掩膜。
在这里插入图片描述
Mask R-CNN在进行目标检测的同时进行实例分割,取得了出色的结果。
在这里插入图片描述
在这里插入图片描述

Mask R-CNN和Faster R-CNN的区别

Mask R-CNN大体框架还是Faster R-CNN的框架,可以说在基础特征网络之后又加入了全连接的分割子网,由原来的两个任务(分类+回归)变味了三个任务(分类+回归+分割)、Mask R-CNN是一个两阶段的框架,第一阶段扫描图像并生成提议(porposals,即可能包含一个目标的区域),第二阶段分类提议并生成边界框和掩码。
其与Faster R-CNN区别主要在于:
1、使用了Resnet网络
2、将Roi Pooling层替换成了RoiAlign
3、添加并列的Mask层;
4、引入FPN
在这里插入图片描述

Mask R-CNN的具体步骤

1、输入一幅想要处理的图片,然后进行对应的预处理操作,获得预处理后的图片;
2、将其输入到一个预训练好的神经网络中(Resnet等)获得对应的feature map;
3、对这个feature map中的每一点设定预定个的ROI,从而获得多个候选ROI;
4、将这些候选的ROI送入RPN网络已进行二分类(positive或negtive)和BB回归,过滤掉一部分候选的ROI(截止到目前,Mask R-CNN和Faster R-CNN完全相同)
5、对这些剩下的ROI进行ROIAlign操作(ROIAlign为Mask R-CNN创新点1,比ROIPooling有长足进步);
6、最后,对这些ROI进行分类(N类别分类)、BB回归和MASK生成(在每一个ROI里面进行FCN操作)(引入FCN生成Mask是创新点2,使得此网络可以进行分割任务)。
在这里插入图片描述

  • backbone:Mask-RCNN使用Resnet101作为主干特征提取网络,对应着图像中的CNN部分。(当然也可以使用别的CNN网络);
  • 在进行特征提取后,利用长宽压缩了两次、三次、四次、五次的特征来进行特征金字塔结构的构造。
Resnet中Conv Block和Identity Block结构

其中Conv Block输入和输出的维度是不一样的,所以不能连续串联,它的作用是改变网络的维度;Identity Block输入维度和输出维度相同,可以串联,用于加深网络。
在这里插入图片描述

特征金字塔FPN(Feature Pyramid Networks)
  • 目标检测任务和语义分割任务里面常常需要检测小目标,但是当小目标比较小时,可能在原图里面只有几十个像素点;
  • 对于深度卷积网络,从一个特征层卷积到另一个特征层,无论步长是1还是2还是更多,卷积核都要遍布整个图片进行卷积,大的目标所占的像素点比小目标多,所以大的目标被经过卷积核的次数远比小的目标多,所以在下一个特征层里,会更多的反应大目标点的特点;
  • 特别是在步长大于2的情况下,大目标的特点更容易得到保留,小目标的特征更容易被跳过;
  • 因此,经过很多层的卷积之后,小目标的特点会越来越少。

在这里插入图片描述
特征图(feature map)用蓝色轮廓表示,较粗的轮廓表示语义上更强的特征图。
(a)使用图像金字塔构建特征金字塔。特征是根据每个不同大小比例的图像独立计算的,没计算一次特征都需要resize以下图片大小,耗时,速度很慢;
(b)检测系统都在采用的为了更快地检测而使用的但尺度特征提取;
(c)由卷积计算的金字塔特征层次来进行目标位置预测,但底层feature map特征表达能力不足;
(d)特征金字塔网络(FPN)和b,c一样快,但更准确。
FPN的提出是为了实现更好的feature maps融合,一般的网络都是直接是用最后一层的feature maps,虽然最后一层的feature maps语义强,但是位置和分辨率都比较低,容易检测不到比较小的物体。FPN的功能就是融合了底层到高层的feature maps,从而充分的利用了提取的各个阶段的特征(Resnet中的C2-C5)。
在这里插入图片描述

特征金字塔FPN的构建
  • 特征金字塔FPN的构建是为了实现特征多尺度的融合,在Mask R-CNN当中,我们去除在主干特征提取网络中长宽压缩了两次C2、三次C3、四次C4、五次C5的结果来进行特征金字塔结构的构造;
  • P2-P5是用于预测物体的bbox、box-regression、mask的;
  • P2-P6适用于训练RPN的,即P6只用于RPN网络中。
    在这里插入图片描述
为何需要RoI Pooling

对于传统的CNN(如AlexNet和VGG),当网络训练好后输入的图像尺寸必须是固定值,同时昂罗输出也是固定大小的vector或者matrix。如果输入图像大小不定,这个问题就变得比较麻烦。
有两种解决方法:
1、从图像中crop一部分传入网络(破坏了图像的完整结构)
2、warp成需要的大小传入网络(破坏了图像的原始形状信息)
在这里插入图片描述
RoI Pooling的原理:
新参数pooled_w、pooled_h和spatial_scale(1/16)
RoI Pooling layer forward过程:
1、由于proposal是对应 M × N M\times N M×N尺度的,所以首先使用spatial_scale参数将其映射回 ( M / 16 ) × ( N / 16 ) (M/16)\times (N/16) (M/16)×(N/16)大小的feature map尺度;
2、再将每个proposal对应feature map区域水平分为 p o o l e d w × p o o l e d h pooled_w \times pooled_h pooledw×pooledh的网格;
3、对网格的每一份都进行max pooling处理。
这样处理后,即使大小不同的proposal输出结果都是 p o o l e d w × p o o l e d h pooled_w \times pooled_h pooledw×pooledh固定大小,实现了固定长度输出。
在这里插入图片描述

RoI-align

Mask-RCNN中提出了一个新的思想就是RoIAlign,其实RoIAlign就是在RoI pooling上稍微改动过来的,但是为什么模型中不继续视同RoI Pooling呢?
在这里插入图片描述
在RoI Pooling中出现了两次的取整,虽然在feature maps上取整看起来只是小数级别的数,但是当把feature map还原到原图上是就会出现很大的偏差,比如第一次的取整是舍去了0.78 ( 885 / 32 = 20.78 ) (885/32=20.78) (885/32=20.78),还原到原图时是 20 × 32 = 640 20\times 32=640 20×32=640,第一次取整就存在了25个像素点的误差,但第二次的取整后的偏差更大。对于分类和物体检测来说可能这不是一个很大的误差,但是对于实例分割而言,这是一个非常大的偏差,因为mask出现没对齐的话在视觉上是很棉线的。而RoI-Align的提出就是为了解决这个不对齐问题。

RoI Align的思想其实很简单,就是取消了取整的这种粗暴方法,而是通过双线性插值来得到固定四个点坐标的像素值,从而使得不连续的操作变得连续起来,返回到原图的时候误差也更加的小;
它充分利用了原图中的虚拟点(比如20.56这个浮点数。像素为止都是整数,没有浮点数)四周的四个真实存在的像素值来共同决定目标中的一个像素值,既可以将20.56这个虚拟的位置点对应的像素值估计出来。

  • 蓝色的虚线框表示卷积后获得的feature map,黑色实线框表示ROI feature。
  • 最后需要输出的大小是 2 × 2 2\times 2 2×2,那么我们就利用双线性插值来估计这些蓝点(虚拟坐标点,又称双线性插值的网格点)处对应的像素值,最后得到相应的输出;
  • 然后在每一个橘红色的区域里面进行max pooling或者average pooling操作,获得最终 2 × 2 2\times 2 2×2的输出结果。我们的整个过程中没有用到量化操作,没有引入误差,即原图中的像素和feature map中的像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。

在这里插入图片描述

分割掩膜

mask分支采用FCN对每个RoI产生一个 K × m × m K\times m\times m K×m×m的输出,即k个分辨率为 m × m m\times m m×m的二值的掩膜,k为分类物体的种类数目。
K × m × m K\times m\times m K×m×m二值mask结构解释:最终的FCN输出一个K层的mask,每一层为一类。用0.5作为阈值进行二值化,产生背景和前景的分割Mask。
在这里插入图片描述
对于预测的二值掩膜输出,对每个像素点进行sigmoid或者softmax处理,整体损失定义为平均二值交叉损失熵,引入预测K个输出的机制,允许每个类都产生独立的掩膜,避免类间竞争,这样做解耦了掩膜和种类预测。
在这里插入图片描述
Mask R-CNN的损失函数定义为:
L = L c l s + L b o x + L m a s k L=L_{cls}+L_{box}+L_{mask} L=Lcls+Lbox+Lmask L m a s k L_{mask} Lmask使得网络能够输出每一类的mask,且不会有不同类别mask间的竞争:

  • 分类网络分支预测object类别标签,以选择输出mask。对每一个ROI,如果检测得到的ROI属于哪一个分类,就只使用哪一个分支的交叉熵误差作为误差值进行计算;
  • 举例说明:分类有3类(猫、狗、人),检测得到当前ROI属于“人”这一类,那么所使用的 L m a s k L_{mask} Lmask为“人”这一分支的mask,即每个class类别对应一个mask可以有效避免类间竞争(其他class不贡献Loss)
  • 对每一个像素应用sigmoid,然后取RoI上所有像素的交叉熵的平均值作为 L m a s k L_{mask} Lmask

最后网络输出为 14 × 14 14\times 14 14×14或者 28 × 28 28\times 28 28×28大小的mask,如何与原图目标对应?
需要一个后处理,将模型预测的mask通过resize得到与proposal中目标相同大小的mask。
在这里插入图片描述

Mask R-CNN的总结

主要改进点:
1、基础网络的增强,Resnet101+FPN的组合
2、分割loss的改进,二值交叉熵会使得每一类的mask不相互竞争,而不是和其他类别的mask比较
3、RoI-Align解决不对齐的问题,就是对feature map的插值。直接的RoI Pooling的那种量化操作会使得mask与实际物体位置有一个微小偏移,是工程上更好的实现方式。

Mask R-CNN–COCO数据集

MS COCO的全程是Microsoft Common Objects in Context,起源于微软与2014年出资标注的数据集,与ImageNet竞赛一样,被视为是计算机视觉领域最受关注和最权威的比赛之一。
COCO数据集是一个大型的、丰富的物体检测,分割和字幕数据集。这个数据集以scene understanding为标注,主要从复杂的日常场景中截取图像中的目标,经过精确的segmentation进行位置的标定。
其主要包括:
1、对象分割
2、在上下文中可识别
3、超像素分割
4、330K图像(>200K标记)
5、150万个对象实例
6、80个对象类别
7、91个类别
8、每张图片5个字幕
9、有关键点的250000人

结构化视频

视频结构化:原始的视频图像实际上是一种非结构化的数据,他不能直接被计算机读取或识别,为了让视频图像在安防领等领域更好的应用,就必须使用智能视频分析技术对视频图像进行结构化处理,也就是视频结构化。
视频结构化,及视频数据的结构化处理,就是通过对原始视频进行智能分析,提取关键信息。
一段视频里面,需要提取的关键信息通常包括两类:
1、运动目标的识别,也就是画面中运动对象的识别,是什么东西
2、运动目标特征的识别,也就是画面中的物体具有什么特征。

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值