首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多个文件夹加载医学成像数据

从多个文件夹加载医学成像数据
EN

Data Science用户
提问于 2021-09-24 16:29:40
回答 1查看 356关注 0票数 2

我对ML算法和CNN有相当基本的数学和实现上的理解,我正在尝试为这个任务考虑一种方法:https://www.kaggle.com/c/rsna-miccai-brain-tumor-radiogenomic-classification/data?select=test

“数据”部分解释了该任务,并提供了数据集的预览。

关于一般实现方法的Doubt:

据我所知,我们有4个输入参数: FLAIR、T1W、T1Gd和T2W。基于这四个参数,我们必须计算"MGMT状态“(MGMT的存在),它是二进制的,i,e取值(0/1)。

我们可以使用CNN架构,它使用乙状结肠激活函数--这是最后一层(在(0,1)中获取输出)。

现在,我知道图像是作为输入到神经网络中的。然而,在对象检测程序中,在这些示例中输入单个图像,然后由网络提取特征。

我应该如何处理我的特殊情况,其中我有多个图像作为输入参数?

此外,火车数据集中的顶级文件夹00000,00002..etc到底与什么相对应?我最初认为他们的行为是“病人编号”(即培训示例),但是每个顶级文件夹中的4个子文件夹不应该每个只有一个图像吗?一张华丽的图片,一张T1W image..etc。然而,有多个FLAIR (~200),T1W,..etc图像对应于每个顶级文件夹。

编辑

在Serali的回答之后,我对我们应该如何处理预处理有了一些见解。顶层文件夹00000,00002,。etc确实起着“病人编号”的作用,这就是文件train_labels.csv所指的"BraTS21ID“。

例如,现在我们选择文件夹00000。其中有4个子文件夹,每个子文件夹包含各种图像:例如,FLAIR子文件夹包含200幅图像。这200张图像代表了FLAIR MRI的切片,我认为它们将被堆叠在一起,形成完整的"FLAIR MRI“。

类似地,如果我们对其余子文件夹中的所有图像执行此操作,则每个顶级文件夹最终将得到4个图像,对应于FLAIR、T1W、T1gd、T2W。我找到了一个脚本,似乎是这样做的:

代码语言:javascript
复制
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
import json
import glob
import random
import collections
import cv2
import pydicom
from pydicom.pixel_data_handlers.util import apply_voi_lut

from matplotlib import animation, rc
rc('animation', html='jshtml')

train_df = pd.read_csv("../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv")
def load_dicom(path):
    dicom = pydicom.read_file(path)
    data = dicom.pixel_array
    data = data - np.min(data)
    if np.max(data) != 0:
        data = data / np.max(data)
    data = (data * 255).astype(np.uint8)
    return data



def visualize_sample(
    brats21id, 
    slice_i,
    types=("FLAIR", "T1w", "T1wCE", "T2w")
):
    plt.figure(figsize=(10, 3))
    patient_path = os.path.join(
        "../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/", 
        str(brats21id).zfill(5),
    )
    for i, t in enumerate(types, 1):
        t_paths = sorted(
            glob.glob(os.path.join(patient_path, t, "*")), 
            key=lambda x: int(x[:-4].split("-")[-1]),
        )
        data = load_dicom(t_paths[int(len(t_paths) * slice_i)])
        plt.subplot(1, 4, i)
        plt.imshow(data, cmap="gray")
        plt.title(f"{t}", fontsize=10)
        plt.axis("off")
    plt.show()
    
_brats21id = train_df.iloc[0]["BraTS21ID"] #patient ID 0 
visualize_sample(brats21id=_brats21id,slice_i=0.55)

此脚本显示病人ID 00000的4个最终图像。输出:

现在,我有点困惑,对于这4张图片我还应该做些什么。再用“三维叠加”把它们组合成一个?对于每个顶级文件夹,我有一段代码似乎最终只获得了1幅图像:

https://www.kaggle.com/ammarnassanalhajali/brain-tumor-3d-training (“加载图像的函数”部分)

<#>Main问题

I对这两个脚本正在做什么有一些模糊的想法,但我想具体地理解它们,因为我希望为此目的编写自己的代码。

<#>Script 1

  1. load_dicom()函数首先使用pydicom.read()读取.dcm图像,但是对data变量的操作是怎么回事?像data=data-np.min(data)data= (data*255).astype(np.uint8)
  2. 函数visualise_sample()是怎么回事?

Script 2

  1. load_dicom_image()到底在做什么?我得到了调整大小的部分,但是我不理解rotatevoi_lut参数。
  2. 主要功能似乎是load_dicom_images_3d。我不知道这是做什么。我认为glob.glob()被用来迭代火车部分中的所有文件,但我不明白随后如何使用lambda,我也不知道如何定义p1p2 middle等。
  3. 可以修改第一个脚本以实现第二个脚本所做的工作吗?
EN

回答 1

Data Science用户

发布于 2021-09-24 19:26:48

有关数据集的详细信息可在“数据描述”文本中获得。如果你愿意的话,每个号码都是一个单独的病例或病人。把给出的数字看作是病人的身份证号码。因此,编号为0、2、3、5等的患者在训练数据集中,编号为1、13、15、27等的患者在公共测试或验证数据集中。在用于分级的私有测试数据集中,剩下的任何数字都是。

每例患者都有四种不同类型的MRI图像,即Flair,T1W,T1Gd,T2。每个磁共振成像都是由几个称为“切片”的图像组成的,这些图像是每个文件夹中的几幅图像(FLAIR、T1W、T1Gd、T2)。我的意思是,FLAIR文件夹的图像集合就是FLAIR磁共振成像。

"BraTS21ID“看上去是对该出版物命名的研究本身的参考:”Radiogenomic 2021脑肿瘤分割和放射学分类基准“。竞争很可能是基于这篇论文。

作为实现,我不确定在这个特定的Kaggle竞争中允许什么或者需要什么,但是一种简单的方法可能是使用3D卷积。我没有检查每个文件夹的细节,但通常由几个“切片”组成,在一天结束时,这些切片被放在一起(我的意思是像一样,字面意思是并排放置)以获得一张图像。你可以尝试对所有的图像这样做,在一天结束的时候,把每个最终的图像放在另一个上面,以获得一个三维张量。

让我更具体地说明这个过程:我的主要目标是获得表单的最终图像。如果所有文件夹都包含200幅图像,那么降低这个数字可能是个好主意。最后,我们希望将所有图像并排放置,以获得一个NxM维图像,其中N,M表示每一行、每列中的小图像(片)数。例如,我们可以得到一幅5X5图像--一幅表示MRI类型之一的图像,例如FLAIR --其中包含25幅小图像。为了以这种方式减少图像的数量,我们可以简单地取每8幅图像中每个像素值的平均值,这样编号为1-8的图像将形成一幅图像,9-16个图像,等等。

我们可以继续将同样的程序应用于所有4种类型的磁共振成像。因此,我们最终得到了每种MRI类型的4幅最终图像,每一张都有5行5列较小的图像--我们平均采集的切片。我们现在可以把它们叠加在一起,得到一个三维张量,它可以作为三维卷积的输入。

票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/102449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档