目录
U-Net: Convolutional Networks for Biomedical Image Segmentation(2015)
条件随机场Conditional Random Field,CRF
ASPP 空间金字塔池化 Atrous Spatial Pyramid Pooling
2.3.5 2023 Segment Anything(SAM)
关键词
语义分割,Semantic Segmentation,MMSeg,MMSegmentation,openmmlab,mmlan,滑窗,FCN,UNet,DeepLab,空洞卷积,PSPNet,ASPP,评估,上下文信息,IoU
经典语义分割算法
1. 语义分割的基础
1.1 什么是语义分割
任务: 将图像按照物体的类别分割成不同的区域 等价于: 对每个像素进行分类
1.2 语义分割的应用
- 无人驾驶:感知汽车周围的环境:车辆、行人等等
- 人像分割:换背景、扣人像等等
- 智能遥感:分析地表农作物、水域、道路、农田分布、船舶等等
- 医疗影像分析:X光、CT等等肿瘤分析
1.3 图像分割任务的不同层次
- mmdet是实例分割,先做检测
-
语义分割 : 仅考虑像素的类别 不分割同一类的不同实体
-
实例分割 : 分割不同的实体 仅考虑前景物体
-
全景分割 : 背景仅考虑类别 前景需要区分实体
三者的难度越来越高。
2. 深度学习时代演进历程
2.1 语义分割的基本思路
2.1.1 按颜色分割
先验知识:物体内部的颜色相近,边界的颜色变化
通过上面的先验知识就可以按颜色相近的色块进行聚类。
存在问题:可以实现抠图,但是不能得到语义。
1. 先验知识不完全准确
2. 不同物体内部颜色可能相近,物体内也可能包含多个颜色
2.1.2 逐像素分类
由于卷积神经网络的兴起给图像分类注入了新的血液,但之前都没有应用在图像分割领域。因此,最初的应用方式就是这种逐像素的分类,具体步骤如下:
- 提取一个卷积窗口图像
- 把这个图像输入卷积神经网络中预测一个类别,该类别作为提取的图像的中心点坐标的类别
- 返回 1 ,继续滑动窗口进行预测下个像素
优点:可以充分利用起 CNN 模型
缺点:存在大量重复计算的重叠区域
2.1.3 重复区域优化
这一块个人感觉视频中没讲太清楚,所以借用了上一期的内容:
简单地讲,就是两个相邻的滑窗中间的重叠区域卷积后表现为相同的特征,因此这一块是可以被优化地。
在滑窗上计算卷积等价于在原图中计算卷积,因此可以在原图先计算一次卷积,然后复用这个结果。就相当于,先滑窗再卷积变成先卷积再滑窗,这样就少了很多重复计算了。
2.1.4 全连接卷积化
1×1 的卷积核等价于全连接(来源:原来是 VGG 中提出的)。
关键在反向量化那步。
问题:全连接层的输入是固定,但是输入的图像是随即大小的,这样导致特征图大小也是随机的
解决——卷积取代全连接层
兼容任意尺寸的图,没有全连接层,这样每个通道代表了一个类别的概率。
直接应用,FCN(2015)使用卷积神经网络进行语义分割
和卷积进行对比:
升采样:双线性插值和转置卷积
池化,卷积降采样,语义分割需要升采样
2.2 深度学习下的语义分割模型
2.2.1 2016 全卷积网络(FCN)
2015 CVPR Best PaperFully Convolutional Networks for Semantic Segmentation(2015)
通过全连接卷积化,就把原来的图像分类的网络改成用于图像分割的网络,得到一张图片的概率图。
最后输出的图片是某个类别(图中是猫)的概率的热力图,然后再做聚类。
问题:卷积神经网路使用上采样,从热力图还原到原图的感受野如何确定呢?这是一个比较关键的问题:如何把预测的图还原到原来图片特征图?
技术:预测图升采样。恢复为原图的分辨率(小 Featur map --> 大 Feature map)
做法:1. 双线性插值;2. 转置卷积
双线性插值
一阶线性插值可以采用拉格朗日插值,二阶的相当于在基础上多做一次,只不过第二阶的输入是一阶的输出。
卷积操作替代双线性插值
同样地,这种做法可以用卷积替代:
优点:这样的卷积是预定义好的,和那些 Sobel 滤波算法类似,不用学习,
这个卷积核就相当于双线性插值
转置卷积:网络自行学习卷积核
如果卷积核是可学习的,那么就成为了转置卷积:
注:转置卷积和卷积在形状上有互逆的关系,在结果上没有。
FCN 的流程
和图像分类的区别就是中间升采样的部分,以及计算交叉熵的特征数会比图像分类网络多得多。
基于多层次特征的上采样
问题:基于顶层特征预测,再升采样 32 倍得到的预测图较为粗糙高层次特征语义丰富但是位置信息缺乏,导致还原到原图的时候区分糊成一片。
分析:高层特征经过多次降采样,细节丢失严重深层次的细粒度信息比较贫乏,而语义信息比较丰富;浅层则相反。因此结合深层和浅层的特征来还原语义分割图。
解决思路: 结合低层次和高层次特征图分别产生类别预测,升采样到原图大小,再平均得到最终结果
基于多层级特征的上采样
2.2.2 2015 UNet
U-Net: Convolutional Networks for Biomedical Image Segmentation(2015)
逐级融合高低层次特征
- 将输入图像逐级降采样,这个过程中,语义信息开始集中
- 通过中心裁剪至相同大小,再在通道维度与逐级升采样恢复细节信息的特征拼接,
- 最后输出逐像素分类图
2.2.3 上下文信息
图像周围的内容就是上下文信息,可以帮助模型进行更准确的判断。
滑动窗口会丢失上下文信息,并且低效,需要更大范围的信息
所以模型就要有更大的感受野,结合上下文信息。
如何在预测过程中使用上下文信息?
方案:增加感受野更大的网络分支,将上下文信息导入局部预测中
2.2.4 2016 PSPNet
流程: 多尺度融合+上采样
-
利用池化,特征有更大的感受野(小特征图对应大感受野;大特征图对应小感受野)
-
对特征图进行池化,得到不同尺度的上下文特征
-
上下文特征经过通道压缩和空间上采样之后拼接回原特征图→同时包含局部和上下文特征
-
基于融合的特征产生预测图
2.2.5 空洞卷积和 DeepLab 模型
DeepLab 系列进一步把多尺度融合的思路发扬光大,并引入了空洞卷积增加卷积的感受野。
其主要贡献为:
-
使用空洞卷积解决网络中的下采样问题
-
使用条件随机场 CRF 作为后处理手段,精细化分割图
-
使用多尺度的空洞卷积(ASPP 模块)捕上下文信息
空洞卷积解决下采样问题
问题:图像分类模型中的下采样层使输出尺寸变小
如果将池化层和卷积中的步长去掉
-
可以减少下采样的次数;
-
特征图就会变大,需要对应增大卷积核,以维持相同的感受野,但会增加大量参数
解决方案:
使用空洞卷积(Dilated Convolution/Atrous Convolution),在不增加参数的情况下增大感受野
空洞卷积=下采样+标准卷积
使用空洞卷积可以得到相同分辨率的特征图,且无需额外插值操作
DeepLab在图像分类网络做以下修改:
- 去除后半部分的下采样
- 后续的卷积采用膨胀卷积,逐步增加膨胀率维持原来的感受野
条件随机场Conditional Random Field,CRF
一种后处理,使得语义边界分割精确:结合原图颜色信息,对输出的特征进行边界精准化
问题:模型直接输出的分割图较为粗糙,尤其在物体边界处不能产生很好的分割结果
DeepLab v1&v2 使用条件随机场 (CRF) 作为后处理手段,
结合原图颜色信息和神经网络预测的类别得到精细化分割结果
具体的做法就是在边界处加一个惩罚(物体内部尽量不要变,边界处颜色尽量要变,可以看出也有本文开头提到逐颜色预测的那个先验的味道):
总的思路就是鼓励在颜色变化处认为类别是不一样的。
能量函数,可以看做一种损失函数
ASPP 空间金字塔池化 Atrous Spatial Pyramid Pooling
PSPNet 使用不同尺度的池化来获取不同尺度的上下文信息
DeepLab v2&v3 使用不同尺度的空洞卷积达到类似的效果
更大膨胀率的空洞卷积--->>>更大的感受野--->>>更多的上下文特征
DeepLab v3+
-
DeepLab v2 / v3 模型使用 ASPP 捕捉上下文特征
-
Encoder / Decoder 结构(如 UNet) 在上采样过程中融入低层次的特征图,以获得更精细的分割图
DeepLab v3+ 将两种思路融合,在原有模型结构上增加了一个简单的 decoder 结构
-
Encoder 通过ASPP 产生多尺度的高层语义信息
-
Decoder 主要融合低层特征产生精细的分割结果
2.2.5 小结
2.3 前沿的语义分割算法
相关论文:
2.3.1 SegFormer
Transformer block + 多尺度融合
2.3.2 K-Net
统一语义分割、实力分割、全景分割的模型
2.3.3 MaskFormer
作者提出实例级别的分类就足够了,并不用逐像素分类
2.3.4 Mask2Former
在 Transformer 块中用到了交叉注意力机制,作者这边说是 mask attention
2.3.5 2023 Segment Anything(SAM)
这是一种视觉大模型,任意一张图片都可以分割,并且这种分割是带语义的。
3. 语义分割模型的评价方法
3.1 基于交并集的评估指标
Accuracy = 交集面积 / 真实面积
IoU = 交集 / 并集
Dice = 2 x 交集 / GT + Pred
所有的平均值 mAcc mIoU mDice
并集的计算: GT + Pred - 交集
在机器学习分类项目中,我们一般:
用precision来评估某类别分类的准确性; 用accuracy来评估总体分类的准确性。
recall与precision区别:
(1)recall,召回率又名查全率,与漏报率有关,(漏报率,FN,即错误的预测为负样本,换句话说,将实际为正的样本预测为负),详情参照混淆矩阵,如下。
预测为正样本(positive,P) | 预测为负样本(negative,N) | |
---|---|---|
实际为正样本 (True, T) | TP | FN |
实际为负样本 (False, F) | FP | TN |
其中,T指预测正确(预测为正样本,实际也为正样本的情况),F指预测错误。
recall=TP/(TP+FN),可理解为,实际为正的样本中,预测正确的样本的比例。
应用于,医生预测病人癌症的情况,病人更关注的是是否漏报,漏报会导致病被忽略,延误治疗。 通过记忆漏报率,可清晰理解recall的概念。
(2)precision,精准率又名查准率,与误报率有关,(误报率,FP,即错误的预测为正样本,换句话说,将实际为负的样本预测为正)。
precision=TP/(TP+FP),可理解为,在预测为正的样本集合中,预测正确的样本的比例。
应用于,以一个不太合适的例子来说, 在诈骗活动中,相对诈骗团伙来说,是希望在预测为正(即为实施诈骗的对象)的样本中,实际真的是被忽悠就会被骗成功的样本。即诈骗人员更关注的是误报率,失误越少,诈骗成功率越高。
note:
另外,对准确率accuracy来说,样本预测分类正确的比例,accuracy=(TP+TN)/(P+N)
[MMSeg] 语义分割中的mDice,mIoU,mFscore评价标准 - 知乎 (zhihu.com)
原文链接:
机器学习评价标准,precision与recall通俗理解 CSDN博客
4. 思考
个人觉得语义分割是最底层的任务,因为它已经是深入到对像素的分类,有个小疑惑,
- 不知道类似矢量图那种图片有没有办法做分割?
- 分割的图片如果不是RGB的可以做吗?
- 其他颜色空间的图片是否有支持的模型?
5. 参考资料
本文主要参考了【7班】语义分割与MMSegmentation 理论课笔记-CSDN社区
其他参考资料
【7班】-OpenMMLab-实战营第二期-MMSeqmentation-CSDN社区
【七班】OpenMMLab AI实战营第八课——MMSegmentation-CSDN社区