当前位置:   article > 正文

无监督语义分割综述

无监督语义分割综述

引言

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

基于聚类的方法

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

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。

代码:

  1. import networkx as nx
  2. # 创建有向图
  3. G = nx.DiGraph()
  4. # 添加节点和边
  5. G.add_edge('s', 'a', capacity=2)
  6. G.add_edge('s', 'b', capacity=6)
  7. G.add_edge('a', 'b', capacity=1)
  8. G.add_edge('a', 't', capacity=3)
  9. G.add_edge('b', 't', capacity=3)
  10. # 计算最大流和最小割
  11. flow_value, flow_dict = nx.maximum_flow(G, 's', 't')
  12. cut_value, partition = nx.minimum_cut(G, 's', 't')
  13. reachable, non_reachable = partition
  14. print(f"最大流量: {flow_value}")
  15. print(f"最小割: {cut_value}")
  16. print(f"属于目标物体的节点: {reachable}")
  17. print(f"属于背景的节点: {non_reachable}")

结果:

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

 具体来说,由于 声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】

推荐阅读
相关标签