我对 ML 算法和 CNN 有相当基本的数学和实现理解,并且我正在尝试为这项任务考虑一种方法:https ://www.kaggle.com/c/rsna-miccai-brain-tumor-radiogenomic-分类/数据?选择=测试。
“数据”部分解释了任务并提供了数据集的预览。
对一般实施方法的怀疑:
据我了解,我们有 4 个输入参数:FLAIR、T1W、T1Gd 和 T2W。基于这 4 个参数,我们必须计算“MGMT 状态”(MGMT 的存在),它是二进制的,即取值()。
我们可以使用使用 sigmoid 激活函数的 CNN 架构,它是最后一层(在中获得输出)。
现在,我知道图像作为输入被馈送到神经网络,例如。然而,在对象检测程序中,在这些示例中,将单个图像作为输入输入,随后网络会提取特征。
我应该如何处理我的特殊情况,我有多个图像作为输入参数?
另外,火车数据集中的顶级文件夹00000,00002..etc 到底对应于什么?我最初认为它们表现得像“患者编号”(即训练示例),但是每个顶级文件夹中的 4 个子文件夹不应该只有一个图像吗?一张 FLAIR 图像,一张 T1W 图像……等等。然而,每个顶级文件夹对应多个 FLAIR (~200) 、 T1W 、..etc 图像。
编辑
在 Serali 的回答之后,我对我们应该如何处理预处理有了一些见解。顶级文件夹00000,00002,.. 等确实起到“患者编号”的作用,这就是文件train_labels.csv所指的“ BraTS21ID”。
现在例如我们选择文件夹00000。其中有 4 个子文件夹,每个子文件夹包含各种图像:例如,FLAIR 子文件夹包含 200 个图像。这 200 张图像代表FLAIR MRI 的切片,我想它们将被堆叠在一起以提供完整的“FLAIR MRI”。
同样,如果我们对其余子文件夹中的所有图像都这样做,我们最终将在每个顶级文件夹中获得 4 张图像,对应于 FLAIR,T1W,T1gd,T2W。我找到了一个似乎可以做到这一点的脚本:
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 张图片。通过“3-D堆叠”将它们再次组合成一个?对于每个顶级文件夹,我有一段似乎最终只获得 1 张图像的代码:
https://www.kaggle.com/ammarnassanalhajali/brain-tumor-3d-training (“加载图像的功能”部分)
主要问题
我对这两个脚本在做什么有一些模糊的想法,但我想具体理解它们,因为我希望为此编写自己的代码。
脚本 1
- 该
load_dicom()函数首先使用 .dcm 读取 .dcm 图像,但是变量pydicom.read()的操作发生了什么?data喜欢data=data-np.min(data),data= (data*255).astype(np.uint8) - 函数中发生了
visualise_sample()什么?
脚本 2
该功能到底在
load_dicom_image()做什么?我得到了调整大小的部分,但我不明白rotateandvoi_lut参数。主要功能似乎是
load_dicom_images_3d。我不知道这是在做什么。我认为glob.glob()正在用于迭代火车部分中的所有文件,但我不了解 lambda 随后的使用,我不知道定义 , 等的方法是p1什么p2middle。可以修改第一个脚本以实现第二个脚本的功能吗?
