
去年帮一家三甲医院做肺部CT结节辅助筛查,差点被医学影像的复杂性劝退。和普通RGB图像不同,医学图像是单通道、高动态范围、格式特殊(DICOM),而且对精度要求极高——漏检一个结节可能就是大事。折腾了三个月,终于跑通了从数据标注到模型部署的完整流程。今天这篇,就用最接地气的方式,带大家入门YOLO在医学影像中的应用。
一、前期准备:搞定环境与数据
1. 环境搭建
医学影像处理有特殊依赖,除了常规的YOLOv8,还需要:
- pydicom:用于读取DICOM格式的医学图像。
- SimpleITK:强大的医学图像处理库。
- labelme:支持多边形标注的工具,适合不规则病灶。
pip install ultralytics pydicom SimpleITK labelme numpy opencv-python
2. 数据预处理:从DICOM到PNG
医院给的数据是.dcm文件,我们需要将其转换为模型能识别的PNG格式,并进行窗宽窗位(Windowing)调整,这是关键!窗宽窗位决定了我们关注的组织类型(比如肺窗、骨窗)。
import pydicom
import numpy as np
import cv2
def dcm_to_png(dcm_path, png_path, window_center= –600, window_width=1500):
# 读取DICOM
ds = pydicom.dcmread(dcm_path)
img = ds.pixel_array.astype(np.float32)
# 应用窗宽窗位 (Lung Window)
img_min = window_center – window_width // 2
img_max = window_center + window_width // 2
img = np.clip(img, img_min, img_max)
img = (img – img_min) / (img_max – img_min) * 255.0
cv2.imwrite(png_path, img.astype(np.uint8))
这一步决定了你的模型“看”得清不清楚,务必根据具体病灶类型调整参数。
二、分步实操:标注、训练、推理
1. 第一步:专业级病灶标注
我们使用labelme进行多边形(Polygon)标注,因为病灶边缘往往不规则。标注时要注意:
- 每个病灶一个独立标签。
- 对于微小结节,宁可标大一点,也不要漏掉。
标注完成后,labelme会生成JSON文件。我们需要将其转换为YOLOv8-Segmentation所需的格式(一个TXT文件对应一个图像,每行是类别ID+归一化的多边形坐标)。
2. 第二步:模型训练(YOLOv8-Seg)
YOLOv8原生支持实例分割(Instance Segmentation),即不仅能框出目标,还能精确描绘其轮廓。我们选用yolov8n-seg.pt作为预训练模型,因为它轻量,适合医学数据集通常较小的特点。
训练配置data.yaml如下:
train: ./dataset/images/train
val: ./dataset/images/val
nc: 1 # 只检测一种病灶,如肺结节
names: ['nodule']
启动训练:
yolo segment train data=data.yaml model=yolov8n-seg.pt epochs=100 imgsz=640
3. 第三步:推理与结果可视化
训练完后,加载最佳模型进行推理,并将分割掩码(mask)叠加到原始图像上,方便医生查看。
from ultralytics import YOLO
import cv2
model = YOLO('runs/segment/train/weights/best.pt')
results = model('test_image.png')
# 可视化结果
for result in results:
im_array = result.plot() # 绘制预测框和掩码
cv2.imshow("Prediction", im_array)
cv2.waitKey(0)
result.plot() 方法会自动将彩色的分割掩码覆盖在原图上,效果非常直观。
三、问题排查:医学场景特有问题
- 模型学不会? 医学数据集普遍偏小。解决方案:谨慎使用数据增强。避免使用旋转、裁剪等可能改变病灶形态的增强,重点用HSV调整模拟不同设备的成像差异。
- 分割边界不精细? 尝试使用更大的模型,如yolov8s-seg或yolov8m-seg。另外,在labelme中标注时,点要打得足够密。
- 假阳性太多? 这是医学AI的大忌。可以在后处理阶段加入简单的规则过滤,比如移除面积小于10个像素的预测结果。
四、总结
将YOLO应用于医学影像,核心在于尊重医学数据的特殊性。通过这次项目,我深刻体会到:
这套流程已经成功应用于我们的肺结节筛查原型系统,虽然离临床落地还有距离,但作为一个入门教程,希望能为你打开一扇门。医学AI任重道远,我们一起加油!



