You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:40:55