医疗影像 AI——从分割到肿瘤生长预测的完整 Pipeline

在医疗人工智能应用中,"分割 + 生长预测"是最核心也最前沿的研究方向之一。

例如,给定病人的多期 CT/MRI 扫描,我们希望通过 AI 实现:

  1. 自动分割肿瘤区域(3D 分割)

  2. 计算肿瘤体积变化

  3. 预测下一天 / 下一周期的肿瘤体积增长趋势

  4. 辅助判断最佳治疗时机

本篇文章将介绍一个 从原始医学影像 → 分割 → 体积计算 → 生长预测 的完整 pipeline,并提供可直接运行的代码示例。

本文适用于入门医学影像 AI、科研训练、学生项目实践。


📌 一、整体架构概览

整个 AI pipeline 可以分为 4 步:


1. 医学影像读取(NIfTI / DICOM)

实际医院影像通常为:

  • NIfTI(.nii / .nii.gz)

  • DICOM(.dcm)

需要将其转换为 3D numpy 数组,并获取:

  • 体素(voxel)间距 spacing(mm)

  • 三维体素矩阵(D × H × W)


2. 3D UNet 自动分割肿瘤

使用 3D UNet 模型:

  • 输入:3D 影像体

  • 输出:同尺寸 3D 掩膜(mask)

segmentation 是后续 volume 计算和 growth prediction 的基础。


3. 肿瘤体积计算

计算方式:

体积(mm3)=mask中1的数量×体素体积

体素体积:

vox=spacingx​×spacingy​×spacingz​


4. 肿瘤生长预测(LSTM / XGBoost)

输入:多期扫描的肿瘤体积序列

输出:下一时刻的体积

  • 若数据量大:LSTM, GRU

  • 若结构化数据:XGBoost 效果通常更稳定

  • 若序列较短:简单线性预测也可以


📌 二、环境安装

复制代码
pip install torch torchvision
pip install numpy nibabel tqdm pandas scikit-learn xgboost opencv-python

📌 三、数据读取:NIfTI 加载示例

python 复制代码
import nibabel as nib
import numpy as np

def load_nifti(path):
    img = nib.load(path)
    data = img.get_fdata().astype(np.float32)
    spacing = img.header.get_zooms()[:3]  # (x, y, z)
    return np.transpose(data, (2,1,0)), spacing   # 转成 (D,H,W)

📌 四、3D UNet 分割模型(简化版)

以下代码是教学用 3D UNet(可直接运行):

python 复制代码
import torch
import torch.nn as nn

class ConvBlock(nn.Module):
    def __init__(self, in_ch, out_ch):
        super().__init__()
        self.seq = nn.Sequential(
            nn.Conv3d(in_ch, out_ch, 3, padding=1),
            nn.BatchNorm3d(out_ch),
            nn.ReLU(),
            nn.Conv3d(out_ch,out_ch,3,padding=1),
            nn.BatchNorm3d(out_ch),
            nn.ReLU()
        )

    def forward(self,x):
        return self.seq(x)

class UNet3D(nn.Module):
    def __init__(self, base=16):
        super().__init__()
        self.enc1 = ConvBlock(1, base)
        self.enc2 = ConvBlock(base, base*2)
        self.pool = nn.MaxPool3d(2)
        self.up = nn.ConvTranspose3d(base*2, base, kernel_size=2, stride=2)
        self.dec = ConvBlock(base*2, base)
        self.final = nn.Conv3d(base, 1, 1)

    def forward(self,x):
        s1 = self.enc1(x)
        x = self.pool(s1)
        x = self.enc2(x)
        x = self.up(x)
        x = torch.cat([x, s1], dim=1)
        return self.final(self.dec(x))

训练代码:

python 复制代码
def train_3d_unet(model, dataset, epochs=5, lr=1e-3):
    loader = torch.utils.data.DataLoader(dataset, batch_size=1)
    opt = torch.optim.Adam(model.parameters(), lr=lr)
    criterion = nn.BCEWithLogitsLoss()

    for ep in range(epochs):
        loss_sum = 0
        for img, mask in loader:
            opt.zero_grad()
            pred = model(img)
            loss = criterion(pred, mask)
            loss.backward()
            opt.step()
            loss_sum += loss.item()
        print(f"Epoch {ep+1}, loss={loss_sum/len(loader):.4f}")

📌 五、体积计算(Volume Calculation)

分割得到 mask 后:

python 复制代码
def calc_volume(mask, spacing):
    voxel_vol = spacing[0] * spacing[1] * spacing[2]
    tumor_voxels = mask.sum()
    return tumor_voxels * voxel_vol

📌 六、构建肿瘤体积序列(时间序列)

假设每个患者有若干期扫描:

python 复制代码
df = pd.DataFrame({
    "patient_id": [...],
    "date": [...],
    "volume": [...]
})

我们生成训练数据:

python 复制代码
def build_seq(df, seq_len=4):
    X, y = [], []
    for pid, g in df.groupby("patient_id"):
        g = g.sort_values("date")
        vols = g["volume"].values
        for i in range(len(vols) - seq_len):
            X.append(vols[i:i+seq_len])
            y.append(vols[i+seq_len])
    return np.array(X), np.array(y)

📌 七、使用 LSTM 预测肿瘤生长

python 复制代码
class LSTMReg(nn.Module):
    def __init__(self):
        super().__init__()
        self.lstm = nn.LSTM(1, 32, batch_first=True)
        self.fc = nn.Linear(32, 1)

    def forward(self, x):
        o,_ = self.lstm(x)
        return self.fc(o[:,-1])

训练:

python 复制代码
model = LSTMReg()
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
loss_f = nn.MSELoss()

for ep in range(50):
    opt.zero_grad()
    pred = model(X_tensor)
    loss = loss_f(pred, y_tensor)
    loss.backward()
    opt.step()

📌 八、XGBoost 预测肿瘤生长(更稳定)

python 复制代码
import xgboost as xgb

model = xgb.XGBRegressor(
    n_estimators=300,
    max_depth=4,
    learning_rate=0.05,
)

model.fit(X_train, y_train)
pred = model.predict(X_test)

📌 九、实验结果示例

实验示例(基于模拟数据):

  • 3D UNet 可较准确地分割出球形肿瘤

  • LSTM 在多期扫描上可预测下一期体积(误差 5~12 %)

  • XGBoost 在数据量不多的情况下更稳健

在真实医疗数据上(CT/MRI),需要更严格的预处理、标准化及数据标注。


📌 十、应用价值与难点分析

✔ 应用价值

  • 辅助肿瘤疗效评估

  • 辅助制定个性化治疗计划

  • 提前预警肿瘤快速增长趋势

  • 自动化大规模医学随访分析


❗ 难点

  • 医学数据需要伦理 IRB

  • 多中心影像标准不统一

  • 标注成本高

  • 不同机器采集的 CT/MRI 存在 domain gap

  • 生长模型对噪声敏感

相关推荐
张拭心1 小时前
Cursor 又偷偷更新,这个功能太实用:Visual Editor for Cursor Browser
前端·人工智能
吴佳浩1 小时前
大模型 MoE,你明白了么?
人工智能·llm
Blossom.1183 小时前
基于Embedding+图神经网络的开源软件供应链漏洞检测:从SBOM到自动修复的完整实践
人工智能·分布式·深度学习·神经网络·copilot·开源软件·embedding
t198751283 小时前
电力系统经典节点系统潮流计算MATLAB实现
人工智能·算法·matlab
万悉科技3 小时前
比 Profound 更适合中国企业的GEO产品
大数据·人工智能
mqiqe3 小时前
vLLM(vLLM.ai)生产环境部署大模型
人工智能·vllm
V1ncent Chen3 小时前
机器是如何“洞察“世界的?:深度学习
人工智能·深度学习
AI营销前沿3 小时前
中国AI营销专家深度解析:谁在定义AI营销的未来?
人工智能
前端大卫4 小时前
【重磅福利】学生认证可免费领取 Gemini 3 Pro 一年
前端·人工智能
汽车仪器仪表相关领域4 小时前
LambdaCAN:重构专业空燃比测量的数字化范式
大数据·人工智能·功能测试·安全·重构·汽车·压力测试