当前位置:首页 > 文章列表 > 文章 > python教程 > 在 Python 中使用标准化剪切 (NCut) 进行无监督图像分割的指南

在 Python 中使用标准化剪切 (NCut) 进行无监督图像分割的指南

来源:dev.to 2024-10-11 14:55:09 0浏览 收藏

学习文章要努力,但是不要急!今天的这篇文章《在 Python 中使用标准化剪切 (NCut) 进行无监督图像分割的指南》将会介绍到等等知识点,如果你想深入学习文章,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

在 Python 中使用标准化剪切 (NCut) 进行无监督图像分割的指南

介绍

图像分割在理解和分析视觉数据方面起着至关重要的作用,而归一化剪切(ncut)是一种广泛使用的基于图的分割方法。在本文中,我们将探索如何使用 microsoft research 的数据集在 python 中应用 ncut 进行无监督图像分割,重点是使用超像素提高分割质量。
数据集概述
用于此任务的数据集可以从以下链接下载:msrc 对象类别图像数据库。该数据集包含原始图像及其语义分割为九个对象类(由以“_gt”结尾的图像文件表示)。这些图像被分组为主题子集,其中文件名中的第一个数字指的是类别子集。该数据集非常适合试验分割任务。

问题陈述

我们使用 ncut 算法对数据集中的图像进行图像分割。像素级分割的计算成本很高,而且通常有噪声。为了克服这个问题,我们使用 slic(简单线性迭代聚类)来生成超像素,它将相似的像素分组并减少问题大小。为了评估分割的准确性,可以使用不同的指标(例如,并集交集、ssim、兰德指数)。

执行

1。安装所需的库
我们使用 skimage 进行图像处理,使用 numpy 进行数值计算,使用 matplotlib 进行可视化。

pip install numpy matplotlib
pip install scikit-image==0.24.0
**2. load and preprocess the dataset**

下载并提取数据集后,加载图像和地面实况分割:

wget http://download.microsoft.com/download/a/1/1/a116cd80-5b79-407e-b5ce-3d5c6ed8b0d5/msrc_objcategimagedatabase_v1.zip -o msrc_objcategimagedatabase_v1.zip
unzip msrc_objcategimagedatabase_v1.zip
rm msrc_objcategimagedatabase_v1.zip

现在我们准备开始编码了。

from skimage import io, segmentation, color, measure
from skimage import graph
import numpy as np
import matplotlib.pyplot as plt

# load the image and its ground truth
image = io.imread('/content/msrc_objcategimagedatabase_v1/1_16_s.bmp')
ground_truth = io.imread('/content/msrc_objcategimagedatabase_v1/1_16_s_gt.bmp')

# show images side by side
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(image)
ax[0].set_title('image')
ax[1].imshow(ground_truth)
ax[1].set_title('ground truth')
plt.show()

3。使用 slic 生成超像素并创建区域邻接图

在应用 ncut 之前,我们使用 slic 算法来计算超像素。使用生成的超像素,我们基于平均颜色相似度构建区域邻接图(rag):

from skimage.util import img_as_ubyte, img_as_float, img_as_uint, img_as_float64

compactness=30 
n_segments=100 
labels = segmentation.slic(image, compactness=compactness, n_segments=n_segments, enforce_connectivity=true)
image_with_boundaries = segmentation.mark_boundaries(image, labels, color=(0, 0, 0))
image_with_boundaries = img_as_ubyte(image_with_boundaries)
pixel_labels = color.label2rgb(labels, image_with_boundaries, kind='avg', bg_label=0

紧凑性控制形成超像素时像素的颜色相似度和空间接近度之间的平衡。它决定了对保持超像素紧凑(在空间方面更接近)与确保它们按颜色更均匀分组的重视程度。
较高的值:较高的紧凑度值会导致算法优先创建空间紧凑且大小均匀的超像素,而较少关注颜色相似性。这可能会导致超像素对边缘或颜色渐变不太敏感。
较低的值:较低的紧凑度值允许超像素在空间尺寸上变化更大,以便更准确地考虑颜色差异。这通常会导致超像素更紧密地遵循图像中对象的边界。

n_segments 控制 slic 算法尝试在图像中生成的超像素(或段)的数量。本质上,它设置了分割的分辨率。
较高的值:较高的 n_segments 值会创建更多的超像素,这意味着每个超像素会更小,分割会更细粒度。当图像具有复杂纹理或小物体时,这会很有用。
较低的值:较低的 n_segments 值会产生更少、更大的超像素。当您想要对图像进行粗分割,将较大的区域分组为单个超像素时,这非常有用。

4。应用标准化剪切 (ncut) 并可视化结果

# using the labels found with the superpixeled image
# compute the region adjacency graph using mean colors
g = graph.rag_mean_color(image, labels, mode='similarity')

# perform normalized graph cut on the region adjacency graph
labels2 = graph.cut_normalized(labels, g)
segmented_image = color.label2rgb(labels2, image, kind='avg')
f, axarr = plt.subplots(nrows=1, ncols=4, figsize=(25, 20))

axarr[0].imshow(image)
axarr[0].set_title("original")

#plot boundaries
axarr[1].imshow(image_with_boundaries)
axarr[1].set_title("superpixels boundaries")

#plot labels
axarr[2].imshow(pixel_labels)
axarr[2].set_title('superpixel labels')

#compute segmentation
axarr[3].imshow(segmented_image)
axarr[3].set_title('segmented image (normalized cut)')

5。评估指标
无监督分割的关键挑战是 ncut 不知道图像中类别的确切数量。 ncut 找到的分段数量可能超过实际的地面实况区域数量。因此,我们需要强大的指标来评估细分质量。

并集交集 (iou) 是一种广泛使用的评估分割任务的指标,特别是在计算机视觉领域。它测量预测分割区域和地面真实区域之间的重叠。具体来说,iou 计算预测分割和真实数据之间的重叠面积与其并集面积的比率。

结构相似性指数 (ssim) 是一种用于通过比较两个图像的亮度、对比度和结构来评估图像感知质量的指标。

要应用这些指标,我们需要预测和地面实况图像具有相同的标签。为了计算标签,我们在地面上计算一个掩模,并在预测时为图像上找到的每种颜色分配一个 id
然而,使用 ncut 进行分割可能会发现比真实情况更多的区域,这会降低准确性。

def compute_mask(image):
  color_dict = {}

  # get the shape of the image
  height,width,_ = image.shape

  # create an empty array for labels
  labels = np.zeros((height,width),dtype=int)
  id=0
  # loop over each pixel
  for i in range(height):
      for j in range(width):
          # get the color of the pixel
          color = tuple(image[i,j])
          # check if it is in the dictionary
          if color in color_dict:
              # assign the label from the dictionary
              labels[i,j] = color_dict[color]
          else:
              color_dict[color]=id
              labels[i,j] = id
              id+=1

  return(labels)
def show_img(prediction, groundtruth):
  f, axarr = plt.subplots(nrows=1, ncols=2, figsize=(15, 10))

  axarr[0].imshow(groundtruth)
  axarr[0].set_title("groundtruth")
  axarr[1].imshow(prediction)
  axarr[1].set_title(f"prediction")
prediction_mask = compute_mask(segmented_image)
groundtruth_mask = compute_mask(ground_truth)

#usign the original image as baseline to convert from labels to color
prediction_img = color.label2rgb(prediction_mask, image, kind='avg', bg_label=0)
groundtruth_img = color.label2rgb(groundtruth_mask, image, kind='avg', bg_label=0)

show_img(prediction_img, groundtruth_img)

现在我们计算准确度分数

from sklearn.metrics import jaccard_score
from skimage.metrics import structural_similarity as ssim

ssim_score = ssim(prediction_img, groundtruth_img, channel_axis=2)
print(f"SSIM SCORE: {ssim_score}")

jac = jaccard_score(y_true=np.asarray(groundtruth_mask).flatten(),
                        y_pred=np.asarray(prediction_mask).flatten(),
                        average = None)

# compute mean IoU score across all classes
mean_iou = np.mean(jac)
print(f"Mean IoU: {mean_iou}")

结论

归一化切割是一种强大的无监督图像分割方法,但它也面临着过度分割和调整参数等挑战。通过合并超像素并使用适当的指标评估性能,ncut 可以有效地分割复杂图像。 iou 和 rand 指数指标为分割质量提供了有意义的见解,但需要进一步细化才能有效处理多类场景。
最后,我的笔记本中提供了一个完整的示例。

今天关于《在 Python 中使用标准化剪切 (NCut) 进行无监督图像分割的指南》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

版本声明
本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
如何在Windows 11任务栏上显示列表而不是缩略图如何在Windows 11任务栏上显示列表而不是缩略图
上一篇
如何在Windows 11任务栏上显示列表而不是缩略图
多重继承的问题
下一篇
多重继承的问题
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    4300次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    3991次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    3977次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    4159次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    4127次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码