如何将ADC与DWI图像拼接后加载至深度学习模型(前列腺癌分类)
基于MRI双模态图像的前列腺癌分类实现方案
针对你的需求,核心是实现ADC与DWI图像的配对加载与通道拼接,以下是具体的代码实现和关键细节说明(以PyTorch为例,TensorFlow思路类似):
1. 自定义数据集类(核心)
首先编写自定义Dataset类,遍历患者文件夹,配对ADC和DWI图像,同时提取标签:
import os import numpy as np from PIL import Image from torch.utils.data import Dataset class ProstateMRIDataset(Dataset): def __init__(self, root_dir, transform=None): self.root_dir = root_dir self.transform = transform self.patient_folders = [f.path for f in os.scandir(root_dir) if f.is_dir()] self.image_pairs = [] # 遍历所有患者,收集配对图像路径与标签 for patient_path in self.patient_folders: adc_dir = os.path.join(patient_path, "ADC") dwi_dir = os.path.join(patient_path, "DWI") # 按文件名排序,确保ADC与DWI图像一一配对 adc_imgs = sorted([os.path.join(adc_dir, img) for img in os.listdir(adc_dir) if img.endswith(".png")]) dwi_imgs = sorted([os.path.join(dwi_dir, img) for img in os.listdir(dwi_dir) if img.endswith(".png")]) # 跳过图像数量不匹配的患者 if len(adc_imgs) != len(dwi_imgs): print(f"警告:{os.path.basename(patient_path)}的ADC/DWI图像数量不匹配,已跳过") continue # 提取标签(需根据你的文件名规则修改) for adc_path, dwi_path in zip(adc_imgs, dwi_imgs): label = self._get_label_from_filename(adc_path) self.image_pairs.append((adc_path, dwi_path, label)) def _get_label_from_filename(self, file_path): # 示例:假设文件名格式为 adc_image_0_label_1.png,提取最后一个数字作为标签 # 请根据你的实际标注规则修改此方法 filename = os.path.basename(file_path) return int(filename.split("_")[-1].split(".")[0]) def __len__(self): return len(self.image_pairs) def __getitem__(self, idx): adc_path, dwi_path, label = self.image_pairs[idx] # 读取单通道灰度MRI图像 adc_img = np.array(Image.open(adc_path).convert("L")) dwi_img = np.array(Image.open(dwi_path).convert("L")) # 在通道维度拼接,生成(2, H, W)的张量(适配PyTorch通道在前的格式) combined_img = np.stack([adc_img, dwi_img], axis=0) # 应用预处理变换 if self.transform: combined_img = self.transform(combined_img) return combined_img, label
2. 加载数据集与DataLoader
定义预处理变换,将数据集封装为DataLoader供模型训练:
from torch.utils.data import DataLoader from torchvision import transforms # 预处理流水线:调整尺寸、归一化等 transform = transforms.Compose([ transforms.ToTensor(), transforms.Resize((256, 256)), # 根据你的模型输入尺寸调整 transforms.Normalize(mean=[0.5, 0.5], std=[0.5, 0.5]) # 双通道分别归一化 ]) # 加载训练/验证/测试集 train_dataset = ProstateMRIDataset(root_dir="Train", transform=transform) val_dataset = ProstateMRIDataset(root_dir="Validation", transform=transform) test_dataset = ProstateMRIDataset(root_dir="Test", transform=transform) # 创建DataLoader train_loader = DataLoader(train_dataset, batch_size=8, shuffle=True) val_loader = DataLoader(val_dataset, batch_size=8, shuffle=False) test_loader = DataLoader(test_dataset, batch_size=8, shuffle=False)
3. 适配双模态输入的模型
模型的输入通道数需要设置为2(对应ADC和DWI两个模态),以ResNet50为例:
import torch.nn as nn from torchvision.models import resnet50 class ProstateCancerClassifier(nn.Module): def __init__(self, num_classes=2): super().__init__() self.backbone = resnet50(pretrained=False) # 修改第一层卷积的输入通道为2(原ResNet默认是3通道RGB) self.backbone.conv1 = nn.Conv2d(2, 64, kernel_size=7, stride=2, padding=3, bias=False) # 替换最后全连接层,适配分类类别数 self.backbone.fc = nn.Linear(self.backbone.fc.in_features, num_classes) def forward(self, x): return self.backbone(x)
关键注意事项
- 图像配对准确性:必须通过文件名排序保证ADC与DWI图像一一对应,否则会破坏模态间的关联关系。
- 标签提取逻辑:
_get_label_from_filename方法需要完全匹配你的文件名标注规则,如果标签存放在独立文件(如txt),需修改为读取对应文件。 - 通道维度适配:如果使用TensorFlow,需将拼接轴改为
axis=-1(通道在后),预处理变换也需对应调整。 - 同步数据增强:若使用数据增强(如随机翻转、旋转),需确保ADC和DWI图像应用完全相同的变换参数,避免模态错位。
内容的提问来源于stack exchange,提问作者Shazman
相关产品推荐
相关产品推荐

