无监督语义分割综述

引言

语义分割是计算机视觉领域的一个重要任务,旨在将图像中的每个像素分配给特定的语义类别。然而,传统的语义分割方法通常依赖大量标注数据,获取这些数据既费时又昂贵。无监督语义分割方法旨在通过不依赖标注数据或仅需少量标注数据的情况下,实现对图像的精确分割。这些方法通过利用数据的内在结构、图像特征和自监督学习技术,从大量未标注的数据中提取有用的信息,显著降低了对标注数据的依赖。本文综述了无监督语义分割的主要方法,包括基于聚类的方法、基于图割的方法、基于生成模型的方法、基于自监督学习的方法以及基于领域自适应性的方法。

基于聚类的方法

基于聚类的方法是无监督语义分割中的一种重要技术,通过将图像中的像素按照其特征进行分组,从而实现对图像的语义分割。这些方法不需要预先标注的数据,通常通过特征提取和聚类算法来完成。

K-Means聚类

聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。

K-均值聚类算法描述:

  • 随机选取聚类中心。
  • 根据当前聚类中心,利用选定的度量方式,分类所有样本点。
  • 计算当前每一类的样本点的均值,作为下一次迭代的聚类中心。
  • 计算下一次迭代的聚类中心与当前聚类中心的差距,如若差距小于迭代阈值时,迭代结束。

分割的步骤:

  • 图像预处理:在应用K-means算法之前,通常需要对图像进行预处理。预处理步骤可以包括图像大小调整、颜色空间转换、滤波等操作,以提取图像中的关键特征并减少噪音。
  • 数据表示:将图像转换为适合K-means算法处理的数据表示形式。常见的表示形式包括每个像素的颜色特征向量或像素的位置特征向量。
  • 选择聚类数:根据实际需求选择合适的聚类数K。聚类数决定了分割后的图像区域数量。
  • 运行K-means算法:将图像数据输入K-means算法,并迭代更新聚类中心,直到算法收敛或达到预定的迭代次数。
  • 分割结果可视化:根据聚类结果,将图像中的像素分配到不同的聚类簇,并使用合适的颜色或灰度级别将不同区域进行可视化展示。

谱聚类

谱聚类利用图像的相似性矩阵(或拉普拉斯矩阵)来执行聚类。它通常比K-means更灵活,因为它不需要预先指定聚类的数量,并且可以发现任意形状的聚类。这种算法特别适合于发现复杂形状的聚类,并且不需要预先指定聚类的数量。

相似度计算的常用方法的有余弦相似度、高斯函数。

聚类过程

  • 计算相似度矩阵
  • 利用相似矩阵W 计算出对角矩阵D和规范化Laplacian 矩阵L
  • 计算出矩阵L前K个最小特征值及其对应的特征向量,组成新的矩阵,矩阵的行数为样本数N,列数为K;

  • 利用Kmeans 算法进行聚类。

基于图割方法

图割算法(Graph Cut)是一类基于图论的图像分割方法,通过将图像像素建模为图结构,并使用图论中的割(cut)技术来实现分割。这种方法主要用于解决图像分割中的优化问题,常见的图割算法包括最小割/最大流(Min-cut/Max-flow)和规范化割(Normalized Cut)。

Min-cut/Max-flow

最小割最大流算法是指在一个有向的图中,能够从源点(source)到达汇点(terminal)的最大流量等于如果从图中剪除就能够导致网络流中断的边的集合的最小容量和。即在任何网络中,最大流的值等于最小割的容量。

**其基本原理是将图像中的像素建模为图中的节点,并通过求解图中的最小割来实现分割。**最小割将图像中的像素分为前景和背景,使得割集中的边权重之和最小。

具体步骤如下

  • 构建图:将每个像素表示为一个节点,定义 t-link 和 n-link 边。
  • 设置权重:根据像素特征设置边的权重。t-link 权重反映了像素属于前景或背景的可能性,n-link 权重反映了像素间的相似度,从而有效地将像素分割为前景和背景。
  • 求解最大流:使用最大流算法求解图中的最大流。
  • 确定最小割:根据最大流结果确定最小割,分割前景和背景。
  • 生成分割图像:根据最小割结果生成分割后的图像。

最小割

现在要求剪短图中的某几条边,使得不存在从s到t的路径,并且保证所减的边的权重和最小。相信大家能很快想到解答:剪掉边"s -> a"和边"b -> t"。

图中已经不存在从源点到终点的路径,所割掉的边的权重值之和为5,是所有的切割方式中权重值最小的,像这样的切割方法我们将其称之为最小割。

最大流

  • s -> a -> t:流量被边"s -> a"限制,最大流量为2
  • s -> b -> t:流量被边"b -> t"限制,最大流量为3
  • s -> a -> b-> t:边"s -> a"的流量已经被其他路径占满,没有流量
  • 所以,顶点t能够流入的最大水流量为:2 + 3 = 5。
  • 这就是最大流问题。所以,图1的最大流为:2 + 3 = 5。

代码:

import networkx as nx

# 创建有向图
G = nx.DiGraph()

# 添加节点和边
G.add_edge('s', 'a', capacity=2)
G.add_edge('s', 'b', capacity=6)
G.add_edge('a', 'b', capacity=1)
G.add_edge('a', 't', capacity=3)
G.add_edge('b', 't', capacity=3)

# 计算最大流和最小割
flow_value, flow_dict = nx.maximum_flow(G, 's', 't')
cut_value, partition = nx.minimum_cut(G, 's', 't')
reachable, non_reachable = partition

print(f"最大流量: {flow_value}")
print(f"最小割: {cut_value}")
print(f"属于目标物体的节点: {reachable}")
print(f"属于背景的节点: {non_reachable}")

结果:

最大流量: 5
最小割: 5
属于目标物体的节点: {'s', 'b'}
属于背景的节点: {'a', 't'}

具体来说,由于 𝑠s 到 𝑏b 的容量是 6,这是从 "s" 到任何节点的最大容量,我们可以预期 "b" 会与 "s" 连接,因为它可以承载更多的 "流量"(在这里,流量可以类比为相似度)。然而,𝑎a 到 𝑡t 的容量是 3,这是从 "a" 到 "t" 的最大容量,所以 "a" 可能会被分割到 "t"。

基于生成模型的方法

生成对抗网络(GANs)在无监督语义分割中的应用是通过生成网络和判别网络之间的博弈,逐步学习图像的语义信息,从而实现分割。

a. 预训练生成器

使用大量无标签的图像数据预训练生成器,使其能够生成逼真的图像。

b. 自监督预训练

利用自监督学习方法为生成器生成伪标签。常见的方法包括:

  • 图像修复任务:生成器从部分图像片段生成完整图像,进而生成对应的分割掩码。
  • 图像翻译任务:使用生成器将图像从一个域翻译到另一个域(例如从RGB到灰度),同时生成分割掩码。

c. 对抗训练

引入判别器来区分生成的分割掩码和通过其他手段生成的伪标签。通过对抗训练,生成器逐渐提高其生成逼真分割掩码的能力。

d. 伪标签优化

生成器生成初步分割掩码后,通过某些规则(例如一致性正则化、多尺度融合)优化这些伪标签,提升其质量。

基于自监督学习的方法

自监督语义分割是一种在没有人工标注的数据情况下,通过设计自监督任务来自动生成训练信号,进而训练语义分割模型的方法。自监督学习利用数据本身的内在结构来生成监督信号,使得模型能够从未标注的数据中学习有用的特征表示。核心思想是设计辅助任务(自监督任务),这些任务不需要人工标注,而是通过数据的某种内在属性或关系生成监督信号。通过训练模型解决这些辅助任务,模型能够学习到有用的特征表示,进而应用于主任务(如语义分割)。

《Fully Convolutional Network-Based Self-Supervised Learning for Semantic Segmentation》

在论文中,分割过程实际上是通过自监督学习获得的特征来进行的,而不是直接在分割任务中进行。

自监督学习阶段

  • 图像块划分:首先将输入图像划分为多个小块,例如3x3的网格,得到9个或25个非重叠的图像块。
  • 随机打乱:将这些图像块随机打乱,形成一个新的图像布局。
  • 特征提取:使用FCN对打乱后的图像布局中每个图像块提取特征。
  • 拼接特征:将每个图像块的特征与中心图像块的特征拼接,形成用于位置预测的特征向量。
  • 位置预测:通过多层感知机(MLP)预测每个图像块的原始位置。

训练网络

  • 使用交叉熵损失函数来训练FCN,使其能够准确预测图像块的原始位置。

迁移学习阶段

  • 预训练模型:通过自监督学习任务训练得到的FCN模型,其参数可以作为预训练模型。
  • 微调(Fine-tuning):将预训练模型应用于语义分割任务,根据具体任务对网络进行微调。这通常涉及解冻某些层的参数,并在语义分割数据集上进行额外的训练。

语义分割

  • 在微调阶段,使用标准的语义分割损失函数(如交叉熵损失和Dice损失)来进一步优化网络参数。
  • 网络的输出是一个与输入图像大小相同的分割图,其中每个像素都预测了一个类别标签。

基于域自适应性

域自适应语义分割是一种旨在解决训练数据(源域)和测试数据(目标域)分布不一致问题的方法。其目标是通过在源域上进行训练,并将模型适应到目标域,从而提高目标域上的分割性能。

对抗训练

对抗训练通过在源域和目标域之间引入对抗机制,使得模型在两个域上的特征分布一致。

源域和目标域数据

  • 源域(Source Domain):包含标注的图像数据,例如图中的城市街景图像。
  • 目标域(Target Domain):不包含标注的图像数据,例如另一组不同分布的城市街景图像。

分割网络(Segmentation Network)

  • 这是一个共享的卷积神经网络,用于提取特征并进行语义分割。该网络同时处理源域和目标域的图像。
  • 特征提取后的输出(特征图)分别输入到领域自适应模块和分割模块中。

领域自适应模块(Domain Adaptation Module)

  • 特征图(Feature Map):分割网络提取的源域和目标域的特征图。
  • 源域输出(Source Output):源域的分割预测结果。
  • 目标域输出(Target Output):目标域的分割预测结果。

判别器网络(Discriminator Network)

  • 判别器网络的作用是区分输入的特征图是来自源域还是目标域。通过对抗学习,使得特征提取网络在源域和目标域上提取的特征分布一致,从而实现领域自适应。

风格迁移

风格转换通过将源域图像风格转换为目标域风格,使得训练数据和测试数据在视觉上更加一致。

1. 风格迁移模块

Adaptive Appearance Normalization (AAN):AAN模块用于将源域和目标域的图像风格进行归一化,使得源域图像的风格更加接近目标域,从而减少域间差异。

2. 全卷积网络(Fully Convolutional Networks, FCN)

特征提取:风格迁移后的源域和目标域图像输入到共享的全卷积网络中,提取图像的语义特征。这些语义特征分别用于语义分割和对抗学习。

3. 联合学习模块(Joint Learning)

语义分割:对源域图像提取的语义特征进行语义分类,利用Softmax损失函数(Softmax Loss)计算分割损失(Segmentation Loss),指导网络学习准确的语义分割。

对抗学习

  • 通过对抗学习使源域和目标域的特征在特征空间中对齐。
  • 使用ASPP(Atrous Spatial Pyramid Pooling)模块和1x1卷积对提取的特征进行处理,并通过域判别器(Domain Discriminator)区分源域和目标域的特征。
  • 对抗损失(Adversarial Loss)用于训练判别器网络,使得源域和目标域的特征分布更加一致。

伪标签

伪标签方法通过在目标域上生成伪标签来进行自监督学习。

  • 源域训练:使用源域数据集(GTA-5)的标注数据训练模型,确保模型能够在源域上生成准确的分割结果。
  • 伪标签生成:将训练好的模型应用到目标域数据集(Cityscapes)上,生成初步的伪标签。
  • 自监督学习:利用伪标签对目标域数据进行自监督训练,不断优化模型。
  • 评估和改进:对比适应前后的分割结果,评估模型在目标域上的性能提升。

总结

无监督语义分割方法通过利用数据的内在结构和特征,有效地解决了传统语义分割方法对大量标注数据的依赖问题。基于聚类的方法通过对图像像素或超像素进行聚类分析,实现语义分割;基于图割的方法利用图论中的最小割算法,在图像中找到最佳的分割界限;基于生成模型的方法则通过生成对抗网络等技术,生成高质量的分割结果;基于自监督学习的方法设计代理任务,使模型从未标注的数据中学习到有用的特征表示;基于领域自适应性的方法通过对抗训练、伪标签生成等技术,使模型在不同数据分布下均能保持良好的分割性能。尽管无监督语义分割方法在一定程度上仍面临挑战,但其在减少数据标注成本、提高模型泛化能力等方面展现出巨大的潜力。未来的研究应继续探索和优化这些方法,以进一步提升无监督语义分割的效果和应用范围。

[参考文章]

相关推荐
IT古董24 分钟前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
centurysee26 分钟前
【最佳实践】Anthropic:Agentic系统实践案例
人工智能
mahuifa26 分钟前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
四口鲸鱼爱吃盐27 分钟前
Pytorch | 从零构建GoogleNet对CIFAR10进行分类
人工智能·pytorch·分类
蓝天星空40 分钟前
Python调用open ai接口
人工智能·python
睡觉狂魔er41 分钟前
自动驾驶控制与规划——Project 3: LQR车辆横向控制
人工智能·机器学习·自动驾驶
scan7241 小时前
LILAC采样算法
人工智能·算法·机器学习
leaf_leaves_leaf1 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零11 小时前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志
菌菌的快乐生活1 小时前
理解支持向量机
算法·机器学习·支持向量机