【Promise12数据集】Promise12数据集介绍和预处理

【Segment Anything Model】做分割的专栏链接,欢迎来学习。
【博主微信】cvxiayixiao
本专栏为公开数据集的介绍和预处理,持续更新中。

要是只想把Promise12数据集的raw形式分割为png形式,快速导航,直接看2,4标题即可
这里只处理了test 换个路径在走一边train就行 是一样的

文章目录

  • 1️⃣Promise12数据集介绍
    • 🌵介绍
    • 🌿临床意义
    • 🌱Promise12数据集特点
    • 🍃源文件样图
  • 2️⃣下载Promise12数据集
  • 3️⃣python读取一张Promise12数据集并展示
    • 🍀使用 Python 的 zipfile 模块来访问 ZIP 文件
    • 🍃注意 ⚠️ ⚠️⚠️
    • 🌳提取第一个raw
    • 🌲python读取raw
    • 🌱python读取分割切片结果
  • 4️⃣python处理整个Promise12数据集
    • 1. 数据集下载到本地之后先将zip解压
    • 2. 处理解压之后的数据集,将raw转为png
    • 3. 将所有png图像分为image文件夹和label文件夹
  • 5️⃣Promise12数据集官方给的评价指标

1️⃣Promise12数据集介绍

🌵介绍

数据集来源一个比赛Prostate MR Image Segmentation 2012。是一个广泛用于前列腺磁共振成像(MRI)分割的数据集。
这个数据集最初是在2012年的MICCAI 'Prostate MR Image Segmentation’挑战赛中使用的,🚩目标是比较用于前列腺MRI的交互式和(半)自动分割算法。可以下载。官网 下载地址在 Download里面

🌿临床意义

前列腺在MR图像上的分割在临床上尤为重要,👀因为它可以帮助确定前列腺的体积,这对于评估前列腺疾病,预测前列腺癌的病理阶段,了解预后,并帮助预测治疗反应都极为重要。

前列腺的大小,形状,以及相对于相邻器官的位置的信息是进行前列腺切除手术,🗿放射治疗以及新兴的微创疗法(如冷冻治疗和高强度聚焦超声)的手术规划的重要组成部分。Promise12数据集可以为这些应用提供关键的、精确的前列腺分割信息🚩。

🌱Promise12数据集特点

这个数据集的特点包括:

多中心,多数据供应商: 数据集中的图像来自多个不同的医疗中心和机构,使其可以覆盖和代表各种不同的病例和设备来源。

训练和测试数据:数据集提供训练和测试数据,均有相应的真实分割(ground truth)作为参考。

算法比较和评估:提交的结果会被自动评估并与参考标准进行比较,从而可以直观地比较和评价不同的分割算法的性能。

🍎🍎🍎这些特性使Promise12成为了前列腺MRI分割任务的重要基准数据集。研究者通过使用这个数据集来训练并评估他们的前列腺分割算法。

🍃源文件样图

在这里插入图片描述

2️⃣下载Promise12数据集

官网有三个包可以下载
在这里插入图片描述
livechallenge_test_data中的结构如下。这是比赛之后官网验证的数据集,比赛中不可见,是测试部分。
每个样本由4个文件组成分别是原始img的mhd,分割img的mhd。原始img的raw 分割img的raw

MHD和RAW是常用于医学图像处理和存储的文件格式。
MHD用于存储医学图像数据和相关的元数据信息。MHD文件通常是一个文本文件,其中包含图像数据的描述信息,例如图像的维度、像素类型、像素间距、数据存储顺序等。MHD文件本身并不包含图像数据,而是引用一个相应的RAW文件来存储实际的图像数据RAW文件则是包含原始图像数据的二进制文件。它通常与MHD文件配套使用,用于存储实际的图像像素值。RAW文件中的数据可以是未经处理的原始像素值,例如灰度值或颜色值,具体取决于图像的类型和采集设备。

在这里插入图片描述
test_data是提供给参赛人员的测试样本,结构一样。
在这里插入图片描述
training_data训练数据,也一样
在这里插入图片描述

3️⃣python读取一张Promise12数据集并展示

🍀使用 Python 的 zipfile 模块来访问 ZIP 文件

import zipfile
import os
import SimpleITK as sitk
import matplotlib.pyplot as plt
# 设置文件的路径
zip_file_path = 'F:\BaiduNetdiskDownload\promise12\\test_data.zip'
#
# 检查文件是否存在
if os.path.exists(zip_file_path):with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:# 获取 ZIP 文件中的文件列表file_list = zip_ref.namelist()# 选取第一个文件(或任意一个文件)作为样本来展示sample_file = file_list[0] if file_list else None# 如果找到样本文件,则读取并展示其内容if sample_file:# 提取样本文件到当前目录或其他指定目录zip_ref.extract(sample_file, './extract/')print(f"样本文件 '{sample_file}' 已提取。")else:print("ZIP 文件中没有找到任何文件。")
else:print(f"文件路径 '{zip_file_path}' 不存在。")

运行结果为在这里插入图片描述
打开mhd文件,就是此图像的成像描述
在这里插入图片描述

🍃注意 ⚠️ ⚠️⚠️

文件关联问题:.mhd 文件应包含指向 .raw 文件的引用。也就是上图中的最后一行
一定确保 .mhd 文件中的路径指向 .raw 文件是正确的,并且 .raw 文件位于指定的位置。一定确保同时有 .mhd 和 .raw 文件。

🌳提取第一个raw

刚才的代码提取了第一个mhd文件,为了保证文件关联性,mhd 文件要指向 .raw 文件的引用。所以现在提取第一个raw文件,才能展示出图像。
上面代码这个改成1就好了
在这里插入图片描述
此代码的运行效果就是 提取到了mhd和raw到同一文件夹里面
在这里插入图片描述

🌲python读取raw

虽说图像信息保存在了raw里面,但其实读取的是mhd文件,mhd文件里面有raw文件的引用
读取代码如下

import zipfile
import os
import SimpleITK as sitk
import matplotlib.pyplot as plt
# 设置文件的路径
zip_file_path = 'F:\BaiduNetdiskDownload\promise12\\test_data.zip'
#
# 检查文件是否存在
if os.path.exists(zip_file_path):with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:# 获取 ZIP 文件中的文件列表file_list = zip_ref.namelist()# 选取第一个文件(或任意一个文件)作为样本来展示sample_file = file_list[1] if file_list else None# 如果找到样本文件,则读取并展示其内容if sample_file:# 提取样本文件到当前目录或其他指定目录image_file = './extract/' + sample_filezip_ref.extract(sample_file, './extract/')image = sitk.ReadImage('./extract/Case00.mhd')# 将 SimpleITK 图像转换为 NumPy 数组image_array = sitk.GetArrayFromImage(image)# 选择一个切片来展示slice_index = 0  # 你可以选择不同的切片索引selected_slice = image_array[slice_index]# 使用 matplotlib 展示图像切片plt.imshow(selected_slice, cmap='gray')plt.axis('off')  # 不显示坐标轴plt.show()print(f"样本文件 '{sample_file}' 已提取。")else:print("ZIP 文件中没有找到任何文件。")
else:print(f"文件路径 '{zip_file_path}' 不存在。")

效果如下
在这里插入图片描述

🌱python读取分割切片结果

先用 Python 的 zipfile 模块来访问 ZIP 文件的代码把3,4切片的mhd和raw读取到extract文件夹里面
这个过程和第一个代码一样,就是改一下数字

import zipfile
import os
import SimpleITK as sitk
import matplotlib.pyplot as plt
# 设置文件的路径
zip_file_path = 'F:\BaiduNetdiskDownload\promise12\\test_data.zip'
#
# 检查文件是否存在
if os.path.exists(zip_file_path):with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:# 获取 ZIP 文件中的文件列表file_list = zip_ref.namelist()# 选取第一个文件(或任意一个文件)作为样本来展示sample_file = file_list[3] if file_list else None# 如果找到样本文件,则读取并展示其内容if sample_file:# 提取样本文件到当前目录或其他指定目录zip_ref.extract(sample_file, './extract/')# image = sitk.ReadImage('./extract/Case00_segmentation.mhd')# # 将 SimpleITK 图像转换为 NumPy 数组# image_array = sitk.GetArrayFromImage(image)# # 选择一个切片来展示# slice_index = 9  # 你可以选择不同的切片索引# selected_slice = image_array[slice_index]# # 使用 matplotlib 展示图像切片# plt.imshow(selected_slice, cmap='gray')# plt.axis('off')  # 不显示坐标轴# plt.show()print(f"样本文件 '{sample_file}' 已提取。")else:print("ZIP 文件中没有找到任何文件。")
else:print(f"文件路径 '{zip_file_path}' 不存在。")

sample_file = file_list[3] if file_list else None这一行先改成2在改成3.
这样就能把3,4切片的mhd和raw读取到extract文件夹里面
之后运行下面的代码就能读取到分割结果的切片

import zipfile
import os
import SimpleITK as sitk
import matplotlib.pyplot as plt
# 设置文件的路径
zip_file_path = 'F:\BaiduNetdiskDownload\promise12\\test_data.zip'
#
# 检查文件是否存在
if os.path.exists(zip_file_path):with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:# 获取 ZIP 文件中的文件列表file_list = zip_ref.namelist()# 选取第一个文件(或任意一个文件)作为样本来展示sample_file = file_list[3] if file_list else None# 如果找到样本文件,则读取并展示其内容if sample_file:# 提取样本文件到当前目录或其他指定目录zip_ref.extract(sample_file, './extract/')image = sitk.ReadImage('./extract/Case00_segmentation.mhd')# 将 SimpleITK 图像转换为 NumPy 数组image_array = sitk.GetArrayFromImage(image)# 选择一个切片来展示slice_index = 9  # 你可以选择不同的切片索引selected_slice = image_array[slice_index]# 使用 matplotlib 展示图像切片plt.imshow(selected_slice, cmap='gray')plt.axis('off')  # 不显示坐标轴plt.show()print(f"样本文件 '{sample_file}' 已提取。")else:print("ZIP 文件中没有找到任何文件。")
else:print(f"文件路径 '{zip_file_path}' 不存在。")

在这里插入图片描述

4️⃣python处理整个Promise12数据集

👍👍👍 以上我们完成的是使用python读取到了一张原图和一张分割结果的示例图👉👉👉以下我们要做的是使用python处理数据集把她分为网络接受的图片。这里处理成png

1. 数据集下载到本地之后先将zip解压

import zipfile
import os
import SimpleITK as sitk
import matplotlib.pyplot as plt
# 设置文件的路径
zip_file_path = 'F:\BaiduNetdiskDownload\promise12\\test_data.zip'
#
# 检查文件是否存在
if os.path.exists(zip_file_path):with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:# 获取 ZIP 文件中的文件列表file_list = zip_ref.namelist()# 选取第一个文件(或任意一个文件)作为样本来展示for i in file_list:zip_ref.extract(i, './extract/')

在这里插入图片描述

2. 处理解压之后的数据集,将raw转为png

import SimpleITK as sitk
import numpy as np
import imageio
import osdef convert_raw_to_png(raw_folder, output_folder):for file in os.listdir(raw_folder):if file.endswith(".mhd"):image_path = os.path.join(raw_folder, file)image = sitk.ReadImage(image_path)array = sitk.GetArrayFromImage(image)for i, slice in enumerate(array):slice_min = slice.min()slice_max = slice.max()slice_normalized = ((slice - slice_min) / (slice_max - slice_min) * 255).astype(np.uint8)file=os.path.splitext(file)[0]output_path = os.path.join(output_folder, f"{file}_{i}.png")imageio.imwrite(output_path, slice_normalized)raw_folder = "./extract"
output_folder = "./png_images"
os.makedirs(output_folder, exist_ok=True)
convert_raw_to_png(raw_folder, output_folder)

在这里插入图片描述

3. 将所有png图像分为image文件夹和label文件夹

此时的图像都是混在一起的,一个名字对应一个原图和分割结果,我们把它分开在两个文件夹,更有利于构建dataset和dataloader

先把png_images文件夹里面的segmentation全部复制到label文件夹里面
在将png_images文件里里面的segmentation删除

import shutil
import os
path="./png_images"
new_folder='./label'
os.makedirs(new_folder, exist_ok=True)
for i in os.listdir(path):if "segmentation" in i:ori_seg_path=os.path.join(path,i)seg_path=os.path.join(new_folder,i)# 复制文件shutil.copy2(ori_seg_path, seg_path)# 删除混在一起的os.remove(ori_seg_path)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5️⃣Promise12数据集官方给的评价指标

Dice相似系数 (Dice Similarity Coefficient, DSC): 常用评价指标,用于量化分割结果与真实标签之间的重叠度。Dice系数的值范围从0到1,值越高表示分割结果与真实情况的一致性越好。

  • 敏感度 (Sensitivity)真正率 (True Positive Rate, TPR): 衡量了分割算法正确识别出正类(即前列腺组织)的能力。

  • 特异性 (Specificity)真负率 (True Negative Rate, TNR): 评估了分割算法正确识别出负类(即非前列腺组织)的能力。

  • Hausdorff距离 (Hausdorff Distance): 这是一个几何度量,用于衡量预测边界与真实边界之间的最大不一致性。

  • 平均表面距离 (Average Surface Distance, ASD): 用于计算预测边界与真实边界之间的平均距离,也是一个评估分割精度的重要指标。

  • 体积重叠误差 (Volume Overlap Error, VOE): 评估分割体积与真实体积之间的重叠程度。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/148204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【精选】项目管理工具——Maven详解

Maven简介 Maven是一个项目管理工具。它可以帮助程序员构建工程,管理jar包,编译代码,完成测试,项目打包等等。 Maven工具是基于POM(Project Object Model,项目对象模型)实现的。在Maven的管理下…

Spring Framework 6.1 正式 GA

Spring Framework 6.1在运行时方面针对 JDK 21 和 Jakarta EE 10 上提供了一级支持,同时保留了 JDK 17 和 Jakarta EE 9 基线。Spring 还通过精细的元数据推理跟踪 GraalVM for JDK 21 的演变,同时暂时保持与 GraalVM 22.3 的兼容性。 主要变化 支持 JD…

Unity在Windows选项下没有Auto Streaming

Unity在Windows选项下没有Auto Streaming Unity Auto Streaming插件按网上说的不太好使最终解决方案 Unity Auto Streaming插件 我用的版本是个人版免费版,版本号是:2021.2.5f1c1,我的里边Windows下看不到Auto Streaming选项,就像下边这张图…

Python-pptx教程之二操作已有PPT模板文件

文章目录 简单的案例找到要修改的元素修改幻灯片中的文本代码使用示例 修改幻灯片的图片代码使用示例 删除幻灯片代码使用示例 获取PPT中所有的文本内容获取PPT中所有的图片总结 在上一篇中我们已经学会了如何从零开始生成PPT文件,从零开始生成较为复杂的PPT是非常消…

Jmeter——循环控制器中实现Counter计数器的次数重置

近期在使用Jmeter编写个辅助测试的脚本,用到了多个Loop Controller和Counter。 当时想的思路就是三个可变的数量值,使用循环实现;但第三个可变值的数量次数,是基于第二次循环中得到的结果才能确认最终次数,每次的结果…

爱奇艺大数据离在线混部

混部作为一种提高资源利用率、降低成本的的方案,被业界普遍认可。爱奇艺在云原生化与降本增效的过程中,成功将大数据离线计算、音视频内容处理等工作负载与在线业务进行了混部,并且取得了阶段性收益。本文重点以大数据为例,介绍从…

HDFS、MapReduce原理--学习笔记

1.Hadoop框架 1.1框架与Hadoop架构简介 (1)广义解释 从广义上来说,随着大数据开发技术的快速发展与逐步成熟,在行业里,Hadoop可以泛指为:Hadoop生态圈。 也就是说,Hadoop指的是大数据生态圈整…

多线程(初阶)

文章目录 一、认识线程(Thread)1.1 概念1.1.1 什么是线程1.1.2 为什么要有线程1.1.3 进程和线程的区别(重要)1.1.4 Java的线程和操作系统线程的关系 1.2 第一个多线程 程序1.3 创建线程(重要)1.3.1 继承 Tr…

iframe渲染后端接口文件和实现下载功能

一:什么是iframe? 1、介绍 iframe 是HTML 中的一种标签,全称为 Inline Frame,即内联框架。它可以在网页中嵌入其他页面或文档,将其他页面的内容以框架的形式展示在当前页面中。iframe的使用方式是通过在HTML文档中插入…

Linux_安装docker

安装包管理工具yum-utils,并设置docker储存库(如果已有,不用安装) # 安装包管理工具 sudo yum install -y yum-utils # 安装docker储存库 sudo yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/cen…

react之基于@reduxjs/toolkit使用react-redux

react之基于reduxjs/toolkit使用react-redux 一、配置基础环境二、使用React Toolkit 创建 counterStore三、为React注入store四、React组件使用store中的数据五、实现效果六、提交action传递参数七、异步状态操作 一、配置基础环境 1.使用cra快速创建一个react项目 npx crea…

python图

有向图&#xff1a;图中的每条边都有方向的图叫有向图。此时&#xff0c;边的两个顶点有次序关系&#xff0c;有向边 < u,v>成为从顶点u到顶点v的一条弧&#xff0c;u成为弧尾&#xff08;始点&#xff09;&#xff0c;v成为弧头&#xff08;终点&#xff09;&#xff0c…

我叫:选择排序【JAVA】

1.我是个啥子&#xff1f;&#xff1f; 选择式排序&#xff1a;属于内部排序法,从欲排序的数据中,按指定的规则选出某一元素&#xff0c;再依规定交换位置后达到排序的目的。 2.我的思想 基本思想:第一次从arr[0]~arr[n-1]中选取最小值&#xff0c;与arr[0]交换&#xff0c;第…

【C++】类和对象(7)--友元, static成员

目录 一 友元 1 友元概念 2 友元函数 3 友元类 二 static成员 1 概念 2 用法 3 static成员特性 4 例题 一 友元 1 友元概念 友元提供了一种突破封装的方式&#xff0c;有时提供了便利。但是友元会增加耦合度&#xff0c;破坏了封装&#xff0c;所以 友元不宜多用。 …

2023年高压电工证考试题库及高压电工试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年高压电工证考试题库及高压电工试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机出的高压…

【碰碰球】弹珠游戏-微信小程序项目开发流程详解

还记得小时候玩过的弹珠撞击游戏不&#xff0c;这里把它的实现原理通俗易懂地讲一下&#xff0c;看看怎样实现一个碰碰球(弹珠)小游戏&#xff0c;除了个人玩法&#xff0c;也可以双人玩哦&#xff0c;与打乒乓球一样的&#xff0c;可练习临场反应。 创建项目 打开微信开发者…

前端面试:如何实现并发请求数量控制?

题目&#xff1a;实现一个并发请求函数concurrencyRequest(urls, maxNum) 要求如下&#xff1a; 要求最大并发数 maxNum;每当有一个请求返回&#xff0c;就留下一个空位&#xff0c;可以增加新的请求;所有请求完成后&#xff0c;结果按照 urls 里面的顺序依次打出&#xff1b;…

DE算法简介

文章目录 前言一、DE是什么&#xff1f;二、DE流程2.1 初始化种群2.2 变异&#xff08;差分操作&#xff09;2.3 交叉2.4 选择2.5 重复迭代 三、DE运行结果 前言 这两天看了DE算法&#xff0c;简单说下自己的认识 一、DE是什么&#xff1f; 百科定义&#xff1a;差分进化算…

Vue+ElementUI技巧分享:自定义表单项label的文字提示

文章目录 概要在表单项label后添加文字提示1. 使用 Slot 自定义 Label2. 添加问号图标与提示信息 slot的作用详解1. 基本用法2. 具名插槽 显示多行文字提示的方法1. 问题背景2. 实现多行内容显示3. 样式优化 结语 概要 在Vue和ElementUI的丰富组件库中&#xff0c;定制化表单是…

Linux进程间通信之匿名管道

文章目录 为什么要有进程间通信pipe函数共享管道原理管道特点管道的四种情况 管道的应用场景&#xff08;进程池&#xff09;ProcessPool.ccTask.hpp 为什么要有进程间通信 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享…