医学影像与人工智能的结合正在重塑现代医疗诊断的格局。想象一下,你正坐在咖啡馆里,手边只有一台普通笔记本电脑,却想探索这个前沿领域——这听起来像天方夜谭?但借助Google Colab的免费GPU资源和PyTorch的灵活性,这个梦想触手可及。本文将带你用COVID-19肺部X光数据集,从零构建一个能区分正常与异常肺部的智能分类器,过程中遇到的每个坑我都踩过,现在把最实用的解决方案打包给你。
打开Google Colab后,在菜单栏依次选择:
python复制运行时 → 更改运行时类型 → 硬件加速器选择GPU
验证GPU是否可用:
python复制import torch
print(f"可用GPU:{torch.cuda.is_available()}")
print(f"设备名称:{torch.cuda.get_device_name(0)}")
注意:Colab的GPU配额会重置,长时间训练建议保存中间结果到Google Drive
方案A - 直接下载到运行时环境:
python复制!wget https://example.com/COVID-19_Radiography_Dataset.zip
!unzip COVID-19_Radiography_Dataset.zip
方案B - 挂载Google Drive:
python复制from google.colab import drive
drive.mount('/content/drive')
推荐方案B:训练过程中断后可恢复,但需注意路径指向正确位置
COVID-19数据集通常包含两种格式:
python复制from PIL import Image
import pydicom
def load_image(path):
if path.endswith('.dcm'):
ds = pydicom.dcmread(path)
img = ds.pixel_array
else:
img = Image.open(path)
return img
医学影像的像素值分布差异大,建议采用动态统计:
python复制import numpy as np
def compute_mean_std(dataset):
pixel_values = []
for img_path in dataset:
img = load_image(img_path)
pixel_values.extend(img.flatten())
return np.mean(pixel_values), np.std(pixel_values)
python复制import torch.nn as nn
class PneumoniaNet(nn.Module):
def __init__(self):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(1, 32, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2)
)
self.classifier = nn.Sequential(
nn.Linear(64*64*64, 128), # 根据实际输入尺寸调整
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(128, 2)
)
def forward(self, x):
x = self.features(x)
x = x.view(x.size(0), -1)
return self.classifier(x)
关键设计原则:
python复制import pytorch_lightning as pl
class LitModel(pl.LightningModule):
def __init__(self):
super().__init__()
self.model = PneumoniaNet()
self.criterion = nn.CrossEntropyLoss()
def training_step(self, batch, batch_idx):
x, y = batch
outputs = self.model(x)
loss = self.criterion(outputs, y)
self.log('train_loss', loss)
return loss
def configure_optimizers(self):
return torch.optim.Adam(self.parameters(), lr=1e-4)
num_workers设为0(Colab多进程问题)python复制torch.cuda.empty_cache()
batch_size=16起步,根据GPU内存调整在notebook单元格运行:
python复制%load_ext tensorboard
%tensorboard --logdir lightning_logs/
同时监控:
!nvidia-smi)!free -h)将模型转换为TorchScript:
python复制scripted_model = torch.jit.script(model)
scripted_model.save("pneumonia_detector.pt")
使用Gradio创建Web应用:
python复制!pip install gradio
import gradio as gr
def predict(inp):
inp = preprocess(inp) # 添加你的预处理逻辑
with torch.no_grad():
prediction = model(inp)
return {"Normal": float(prediction[0][0]),
"Pneumonia": float(prediction[0][1])}
gr.Interface(fn=predict,
inputs=gr.Image(type="filepath"),
outputs="label").launch()
在Colab上训练医学AI模型最深的体会是:数据质量比模型复杂度重要十倍。曾经花三天调参提升的2%准确率,换用更干净的标注数据后直接提升了15%。当你的第一个模型开始区分健康与病变的肺部时,那种成就感会告诉你——医疗AI的大门,已经为你打开。