首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MONAI变换卡住了三维多通道网络的4D NIfTI卷转换

MONAI变换卡住了三维多通道网络的4D NIfTI卷转换
EN

Stack Overflow用户
提问于 2022-07-23 22:00:39
回答 1查看 244关注 0票数 1

我正在以MONAI的三维分割教程为基础来处理4D NIfTI数据,其中第四维表示为提议的3D网络输入的通道。我已经修改了本教程,以便更好地使用MONAI's DynUNet(nnUNet),但是正确地将数据转换成所需的格式以在多通道上训练我的3D网络将面临困难。

我目前的方法似乎会导致先前工作的DynUNet在加载数据时卡住(估计加载12+小时并被服务器杀死的时间是1分钟前)。我无法找到我是否正在正确地转换/准备数据进行三维多通道培训。

当前的输入维看起来类似于[num_px_x, num_px,y, num_slices, num_channels],我希望将它转换成一个能够用于多通道网络的3D卷。如果有用的话,第4维的长度为7,其中索引0表示强度值,指数1-6表示一个热编码序列。

获取转换的函数片段:

代码语言:javascript
复制
def get_xforms(mode="train", keys=("image", "label")):
    """returns a composed transform for train/val/infer."""

    xforms = [
        LoadImaged(keys),
        EnsureChannelFirstd(keys='image'),

        AsChannelFirstd(keys),

        Orientationd(keys, axcodes="LPS"),
    ]
    return monai.transforms.Compose(xforms)

训练数据加载器

代码语言:javascript
复制
# format: [ {'image': 'ct file path', 'label': 'seg file path'} ]
train_files = [{keys[0]: img, keys[1]: seg} for img, seg in zip(images[:n_train], labels[:n_train])]
val_files = [{keys[0]: img, keys[1]: seg} for img, seg in zip(images[-n_val:], labels[-n_val:])]

keys = ("image", "label")
batch_size = 2

train_transforms = get_xforms("train", keys)
train_ds = monai.data.CacheDataset(data=train_files, transform=train_transforms)
train_loader = monai.data.DataLoader(
    train_ds,
    batch_size=batch_size,
    shuffle=True,
    num_workers=2,
    pin_memory=torch.cuda.is_available(),
)

网络功能

代码语言:javascript
复制
def get_net():
    kernels=[[3, 3, 3], [3, 3, 3], [3, 3, 3], [3, 3, 3]]
    strides=[[1, 1, 1], [2, 2, 2], [2, 2, 2], [2, 2, 2]]

    num_classes = 2
    net = monai.networks.nets.DynUNet(
        spatial_dims=3,
        in_channels=7,
        out_channels=num_classes,
        kernel_size=kernels,
        strides=strides,
        upsample_kernel_size=strides[1:],
    )

    return net

其他代码段大多与MONAI的教程一致

EN

回答 1

Stack Overflow用户

发布于 2022-07-27 08:19:34

我用3D U-Net进行多通道训练。

代码语言:javascript
复制
data_dicts = [
    {"image": image_name, "label": label_name, "seg": seg_name}
    for image_name, label_name, seg_name in zip(X_train, y_train, X_segs)
]

我有imageseg频道,我用ConcatItemsd添加了它们

代码语言:javascript
复制
train_transforms = Compose(
[
    LoadImaged(keys=["image", "label", "seg"]),
    EnsureChannelFirstd(keys=["image", "label", "seg"]),
    ConcatItemsd(keys=["image", "seg"], name="img"),        
    CropForegroundd(keys=["img", "label"], source_key="img"),
    RandCropByPosNegLabeld(
        keys=["img", "label"],
        label_key="label",
        spatial_size=(192,192,64),
        pos=1,
        neg=1,
        num_samples=4,
        image_key="img",
        image_threshold=0,
    ),
    EnsureTyped(keys=["img", "label"]),
]

这类数据的一个例子是维数[batch_size, num_of_channels, size_x, size_y, size_z]。所以我认为你的尺寸是错的。通道的数量应该在当前窗口的空间大小之前。

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

https://stackoverflow.com/questions/73094489

复制
相关文章

相似问题

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