我已经完成了我的论文(大脑语义分割和生存预测,并加入了一些基因组学(。在处理成像部分时,我遵循了文献,并了解到对大脑进行分割的少数几种不错的方法是使用Unets。我看到了这些数据集的2D和3D实现方式。由于这是我的论文,我不想直接抄袭别人的作品,所以我开始自己做一些事情。我被困在一个特定的部分,无法获得连接到网络的输入。据我所知,网络需要拍摄一张2D图像(H,W(,一个通道用于显示您试图一起传递的图像数量,另一个通道则用于显示您尝试分割的类数量。在这种情况下,我采用了18年、19年和20年的BraTS数据集。从初始数据集中,我解压缩nifti文件,并使用NLM滤波和N4BiasFieldCorrection执行两步预处理,然后我将图像保存在Z轴上的2D切片中(这转化为每个模态(flair,t1,t1c,t2(,获得包含155.png图像的自己的文件夹。对于掩码,我只将4个类编码为[0,1,2,3],并将它们保存为Z轴上的2D png。
我使用以下代码来创建我的自定义生成器。
import numpy as np
from skimage.io import imread
from keras.utils import to_categorical
def load_img(file_list):
images = []
for i in range(len(file_list)):
x = imread(file_list[i])
norm_img = (x - np.min(x)) / (np.max(x) - np.min(x))
images.append(norm_img)
images = np.array(images)
return (images)
def load_mask(file_list):
masks = []
for i in range(len(file_list)):
mask = imread(file_list[i])
enc_mask = to_categorical(mask, num_classes=4)
masks.append(enc_mask)
masks = np.array(masks)
return masks
def imageLoader(img_list, mask_list, batch_size):
L = len(img_list)
while True:
batch_start = 0
batch_end = batch_size
while batch_start < L:
limit = min(batch_end, L)
X = load_img(img_list[batch_start:limit])
Y = load_mask(mask_list[batch_start:limit])
yield (X, Y) # tuple
batch_start += batch_size
batch_end += batch_size
"to_categorical"步骤有一个问题,我认为这是因为每当它到达一个没有4个现有类的图像时,它就会崩溃。
我采用的Unet体系结构是https://github.com/jordan-colman/DR-Unet104/blob/main/Dr_Unet104_model.py我对此所做的修改是改变它的输出,给我一个我想要的多通道语义掩码。
outputs = Conv2D(num_classes, (1, 1), name='output_layer', activation='softmax')(X)
我对分割任务的想法是,使用这个Unet并训练其中四个。每个用于每个模态(flair,t1,t1c,t2(,然后冻结它们的权重并将它们连接成一个集合。
Input 0 of layer "conv2d_106" is incompatible with the layer: expected min_ndim=4, found ndim=3. Full shape received: (None, None, None)
Call arguments received by layer "model_5" (type Functional):
• inputs=tf.Tensor(shape=(None, None, None), dtype=uint8)
• training=True
• mask=None
我知道它要求我交换我的输入以适应它的输入,但我不确定如何进行。我一直试图用tensorflow.exexpand_dims((命令来扩展图像2D输入的维度,但没有成功。任何关于解决方案或阅读材料的建议都将不胜感激。
我做了一些非常需要的阅读&在这方面的工作,它起了作用:
- 通过手工编写小脚本解决了分类问题
- 修复了来自tensorflow的未知py崩溃,因为它找不到zlibstat(pycharmDIDNT显示错误,它只是返回了一个很长的退出代码,这毫无意义,总是尝试从终端运行脚本孩子们,从我的错误中吸取教训(
- 修复了tensorflow的另一个错误,因为我的GPU只有4GB的VRAM,不足以运行这样的模型,通过请求访问更好的GPU,因为显然CUDA不会使用共享内存
- 通过适当地扩展输入轴来解决输入的问题,最终输入样本是一个四重模态[flair,t1,t1ce,t2]2D堆叠numpy阵列,正如我所看到的"Dr。Sreenivas Bhattiproluhttps://www.youtube.com/watch?v=oB35sV1npVI。网络的最终输入是[H,W,X1,X2],从左到右,H:高度,W:宽度,X1:numpy堆栈中不同模态的数量(也称为图像通道(,X2:需要在掩码上注释的不同类的数量。在我的案例中,这是一个[240240,4,4]输入形状
我发现,要训练一个参数为74.6米的模型,需要大量的数据,所以我恳请您研究keras数据增强技术。我敢肯定,我的模型在我让它运行的100个时代都非常合身。
我会在发布后的某个时候回来,在git repo上发布一个链接,我会上传它,以防其他人发现自己陷入困境