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

news2024/12/23 19:58:30

【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_file
            zip_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 os

def 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.coloradmin.cn/o/1227415.html

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

相关文章

个人博客添加访问人数以及访问时间-githubpage

layout: post # 使用的布局(不需要改) title: 个人博客添加访问人数以及访问时间 # 标题 subtitle: 个人博客优化 #副标题 date: 2023-11-18 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catalog: tr…

centos7 探测某个tcp端口是否在监听

脚本 nc -vz 192.168.3.128 60001 if [ $? -eq 0 ]; thenecho "tcp succeed" elseecho "tcp failed" fi nc -vz 192.168.3.128 60001 探测192.168.3.128服务器上60001 tcp端口, -vz说明是探测TCP的 端口开启的情况 执行脚本 端口禁用情况 执行脚本

054-第三代软件开发-信号槽

第三代软件开发-信号槽 文章目录 第三代软件开发-信号槽项目介绍信号槽实现原理与MFC消息映射机制区别Qt信号槽机制的优缺点 关键字: Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML&#x…

Vue中实现div的任意移动

前言 在系统应用中,像图片,流程预览及打印预览等情况,当前视窗无法全部显示要预览的全部内容,设置左右和上下滚动条后,如果用鼠标拖动滚动条,又不太便利,如何用鼠标随意的移动呢? …

Apache ECharts简介

二十九、Apache ECharts 29.1 介绍 Apache ECharts 是一款基于 JavaScript 的数据可视化图表库,提供直观、生动、可交互、可个性化定制的数据可视化图表。 官网地址:https://echarts.apache.org/zh/index.html 常见效果展示: 1). 柱形图 …

定点整数、小数

文章目录 一、定点整数二、定点小数三、定点小数的加/减运算 一、定点整数 二、定点小数 三、定点小数的加/减运算 对两个定点小数A、B进行加法/减法时,需要先转换为补码 计算机硬件如何做定点小数补码的加法:从最低位开始,按位相加&#x…

【评估分级方法】自然断点法(Python实现全代码)

自然断点法 自然断点法有两个称呼,一个就是直接英文名称,叫做“Natural Breaks”,这就不解释了,还有一个称呼就是ArcGIS里面用的,叫做“Jenks”,主要是来源于它的创造者:乔治弗雷德里克詹克斯&…

Vulhub靶场-KIOPTRIX: LEVEL 1.1

目录 环境配置 端口扫描 漏送发现 漏送利用 提权(内核漏洞提权) 环境配置 环境配置的过程同主页该专栏第一个靶场,不在赘述。 端口扫描 首先通过arp-scan并根据靶机的mac地址确定靶机的IP地址 然后对靶机进行一个扫描 首先扫描到OpenS…

自动驾驶学习笔记(九)——车辆控制

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 控制器设计 比例积分微分控制 线性…

NI Package Manager创建程序包

NI Package Manager创建程序包 要使用PackageManager创建程序包,即把相关的组件都放在一个目录下,使用命令行创建程序包。 程序包是一个压缩文件,包含要安装到目标位置的所有文件。Package Manager创建的程序包扩展名为.nipkg。可以使用Pack…

QFile文件读写操作QFileInFo文件信息读取

点击按钮选择路径,路径显示在lineEdit中 将路径下的文件的内容放在textEdit中 最后显示出来 !file.atend()//没有读到文件尾就一直读 file.readline表示按行进行读 追加的方式进行写 要是重新写的话用file.open(QIODevice::write) 用QFileInFo来读取…

微服务实战系列之Gateway

前言 人类世界自工业革命以来,无论从金融、货币、制度,还是科技、资源、社会各个方面,都发生了翻天覆地的变化。物质极大丰富,从而也推动了科技的极速发展。当计算机问世也仅仅不到80年,而如今我们的生活处处有它的影子…

阿里云ECS11月销量王 99元/年

这一波好像真没得说,老用户居然都有份,买来练习、测试冒似已经够了! 阿里云ECS11月销量王 99元/年 2核2G 3M固定带宽不限流量,新老同享,新购、续费同价,开发必备! 活动规则 云服务器ECS 云创季…

前端调试只会console.log()?

前言 相信大家在日常开发中调试代码是必不可少的步骤,毕竟谁也不能保证代码不出问题,总得debug一下,输出信息看看数据有没有问题。是不是习惯性console.log(‘XXX’)或者debugger呢。而JavaScript中的console对象提供了丰富的方法用于更灵活…

JAVA小游戏 “拼图”

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下: package heima; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import …

io多路复用:select、poll和epoll

1、为什么使用多路复用: 1.1单线程BIO监听socket 多路复用一般用于网络io当中,提到网络io我们肯定能想到socket。如果我们想要一个线程单纯的用向下文的方式监听很多个socket看他是否有事件发生,那这样是不可行。 但上一个socket1没有可读事…

关于2023年编程语言使用排行我的看法

一、2022、2023年编程语言使用排行榜 从这个表格中,我们可以看到Python在两次调查中都排第一。对这件事情,很多人有了不同的看法。一个小粉丝问我,凭什么、又是为什么。下面,我展开我的理解。 二、Python为什么排第一&#xff1f…

[C/C++] 数据结构 LeetCode:用队列实现栈

题目描述: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元…

【半监督学习】CNN与Transformer的结合

本文介绍了几篇结合使用CNN和Transformer进行半监督学习的论文,CNN&Trans(MIDL2022),Semi-ViT(ECCV2022),Semiformer(ECCV2022). Semi-Supervised Medical Image Seg…

ComText让机器人有了情节记忆

为了让人类与机器人更好地交流,MIT 计算机科学与人工智能实验室的研究员开发了一个名为 ComText 的程序。这款程序给机器人增加了情节记忆,让它们能够接受更加复杂的命令。目前,他们已经在机器人 Baxter 上测试了程序。 机器人没有情景化的记…