【医学尝试】基于Segment Anything Model的医学图像分割研究:眼底OCT与X线胸片微调实战

项目:基于 SAM(Segment Anything Model)的医学图像分割系统

关键词:SAM、医学图像分割、少样本学习、PyQt5、OCT、X线胸片、迁移学习


🏥 让SAM 进入医学领域:80 张图微调,Dice 直冲 98.5%

📋 项目逻辑全景梳理(先看这一节,5 分钟读懂全文)

我先来解答:这个项目到底做了啥?链路有多长?

下面是一个极简版图谱,帮你 30 秒建立认知:

【痛点】医学图像标注贵、传统吃数据、手工分割慢

【选型】Meta 开源 SAM 大模型 → 零样本能力强,但医学领域直接推理效果拉胯

【策略】轻量化微调:冻结 Prompt Encoder + Mask Decoder,只训练 Image Encoder

【数据】眼底 OCT(80 张训练)+ X 线胸片(504 张训练),验证少样本迁移能力

【训练】PyTorch + RTX 4090,60 epoch,DiceLoss + BCE,AMP 混合精度

【结果】OCT Dice 98.5% / 胸片 Dice 92.1%,碾压 PP-LiteSeg 基线

【落地】PyQt5 可视化 Demo,本地上传 → 自动框提示 → 一键分割 + IoU 显示

一句话总结:我用"大模型+轻量化微调+可视化工具"的完整闭环,证明了 SAM 在医学少样本场景下可以吊打传统小模型,并且做出了能直接给医生用的桌面端 Demo。

如果你只想看结论:OCT 上 80 张图训出 98.5% Dice,胸片上 92.1% Dice,单张推理 < 1 秒。

下面我把每一块拆开讲清楚。


一、前言:为什么拿 SAM 做医学分割?

医学图像分割(眼底 OCT 层结构、X 线胸片肺野)是临床诊断的硬刚需,但传统路子太折腾:

方案 痛点
纯手工 医生逐张描边,半小时一张,主观误差大
传统算法(区域生长、水平集) 对噪声敏感,模糊边界直接"摆烂"
常规深度学习(UNet 等) 极度依赖大量精标注数据,医学标注又贵又稀缺

我刚刚开始接触的时候是学习的自然语言,我就发现在自然语言模型中有一些是基础模型,可以通过零样本或者是少样本来迁移到其他的项目中,但是当时图像模型的发展还没有这么快(题外话:因为自然语言网上有大量的文本可以用来序列预测训练,序列训练是不需要标签的,但当涉及到计算机视觉的时候,虽然网上也有巨量的图片信息,但都没有分界框和分割掩码)。2023 年 Meta 开源了 Segment Anything Model(SAM) ,号称能分割一切,支持点、框、文本等多种 Prompt 驱动。但直接拿来做医学图像?零样本推理在 OCT 上 IoU 只有 0.675,胸片上更是只有 0.479,几乎不可用。

所以问题变成:如何用极少样本(Few-shot)微调,让 SAM 在特定医学任务上超越传统方法?


二、理论基础速览(白话版)

2.1 SAM 的三块积木

SAM 的推理流程分三步走:

模块 作用 我的处理方式
Image Encoder ViT backbone,输入 1024×1024,提取 image embedding 只训练它
Prompt Encoder 将点、框、Mask 等提示转为 prompt embedding ❌ 冻结
Mask Decoder 融合两种 Embedding,上采样输出掩码 + IoU 分数 ❌ 冻结

为什么只冻住两部分、只训 Image Encoder?

SAM 的 Prompt 和 Mask 解码器在自然图像上已经极其强大。医学图像分割不准,往往是因为编码器没见过医学影像的像素分布(纹理、边界、灰度特征完全不同)。只微调编码器:

  • 显存占用大幅下降(24G RTX 4090 轻松跑)
  • 避免在仅有几十张图的小数据集上过拟合

2.2 ViT 与 Attention(简单带过)

SAM 的编码器基于 ViT(Vision Transformer)。不再像 CNN 那样层层卷积,而是把图片切成 16×16 的小方块(Patch),拉直成序列,用 Transformer 算自注意力。好处是能捕捉全局上下文,不会像 CNN 那样"只见树木不见森林"。

Attention 机制就是"抓重点":计算 Query 和 Key 的相似度,给 Value 加权,让模型自动判断病变边缘等重要区域。

三、实验环境与数据集

3.1 软硬件环境

环境 配置
操作系统 Windows 10 / Ubuntu(AutoDL)
Python 3.8.1
框架 PyTorch 2.0 + CUDA 11.8
显卡 RTX 4090(24GB)
加速 PyTorch AMP 自动混合精度
优化器 Adam(lr=1e-4)
学习率调整 StepLR(step=10, gamma=0.9)

3.2 数据集划分(少样本挑战)

医学标注贵,所以我刻意控制了数据量,专门验证 SAM 的少样本迁移能力。

数据集 1:眼底 OCT 层分割(百度飞桨学习赛)

  • 训练集:80 张
  • 验证集:20 张
  • 测试集:20 张
  • 难点:噪声大、视网膜各层边界模糊、手动分割主观性强。

数据集 2:X 线胸片(NIH 国家医学图书馆 + 深圳三院)

  • 训练集:504 张
  • 验证集:62 张
  • 测试集:138 张
  • 难点:心脏/肋骨/横膈膜重叠遮挡、亮度不均、肺野边界极易受干扰。

四、SAM代码重要部分拆解(简化)

4.1 image_encoder

先是image_encoder,首先是 Patch Embedding:把图像切成块、展平,转化为序列数据,并添加位置信息。切割完后加入可学习的位置编码,因为 Transformer 本身没有空间概念。

接着进入 Transformer Block 做 Attention 前向传播,给每个 Patch 添加与整张图相关的权重。这里依次做 LayerNorm + 多头注意力、残差连接、LayerNorm + MLP、残差连接。

最后 image_encoder 进行 neck 操作,卷积降维,得到最终的 image embedding。

简化的放几个截图,论文里面的比较完善:

4.1.1位置信息相加
4.1.2.attention加mlp的操作:

添加进transformer block里面做attention前向传播的操作,这部分把前面的小块添加相关的图片相关度权重。这里做了一个注意力机制(attention)和多层感知(mlp) *

4.1.3.卷积操作:

image_encoder进行neck操作,卷积降维,得到image embedding。

4.2 prompt_encoder

Prompt Encoder 的核心是判断提示类型。如果是框提示,需要左上、右下两个点:

4.2.1判断是点还是框:

训练时统一使用边界框(Bounding Box)作为提示,因为框比点更容易提供先验位置信息。系统会先初始化一个空 embedding,把点的位置信息和 label 信息做 embedding 后叠加,返回一个全新的 embedding。

4.2.2 叠加:

4.3 mask_decoder

Mask Decoder 把 image_embedding 和 Prompt Encoder 的内容相融合,生成掩码图。本模型的解码器基于 Transformer 解码器块修改,原作者添加了动态掩码预测头。中间使用了提示 Self-Attention 和 Cross-Attention,在"提示到图嵌入"和"图嵌入到提示"两个方向都做了修改。

image embedding与prompt_encoder相叠加:
添加掩码:

然后对图像进行上采样,再用 MLP 将输出标记映射到动态线性分类器上,得出每个图像位置的蒙板前景概率,并生成 IoU 预测值。

五、医学图像背景与训练配置

5.1 为什么选这两个数据集?

眼底 OCT 层 :是一种无辐射、无侵入、高分辨率的眼底疾病影像诊断工具,能提供视网膜横断面信息。对视网膜和视神经相关疾病(如青光眼、黄斑变性、糖尿病性视网膜病变)的诊断具有重要辅助作用,帮助医生评估损伤程度和病变类型,制定更精准的治疗方案。

X 线胸片:是快捷经济的胸部检查方法,可覆盖肺部炎症、肿块、结核等疾病。它能根据人体组织密度差异观察病变位置的厚度和密度差别,且影像资料可长期保存,利于复查对比。

5.2 参数设置

超参数名称 取值 作用
input_size 3, 1024, 1024 图像标准信息:通道数、长、宽
net sam 网络模型选择
train_batch_size 2 每个批次的样本数量
checkpoint sam_vit_b_01ec64.pth 预训练模型参数
Momentum (0.9, 0.999) 动量参数

训练时我只训练了 image_encoder,固定 prompt_encoder 和 mask_decoder。两个数据集都训练了 60 轮,准确性、鲁棒性、边界清晰度和分割完整性的状态都很好。

六、训练过程与模型指标分析

6.1 训练过程

微调策略与显存优化

本实验严格遵循前述的微调策略:仅开放 Image Encoder 的梯度回传,而 Prompt Encoder 和 Mask Decoder 全程保持冻结状态 。在两个数据集(OCT 和 X 线胸片)上,均统一进行了 60 个 Epoch 的迭代训练。

即通过设置 image_encoderrequires_grad=True,同时锁定其余模块的权重更新。该冻结策略的主要优势在于:大幅降低了训练过程中的显存占用 。同时,在面对本实验规模有限(仅有几十张)的医学图像数据集时,这种针对性微调有效避免了因全局微调而产生的严重过拟合风险,保证了模型对特定医学特征的泛化能力。

训练核心流程与最佳模型保存

展示了训练主循环的核心逻辑。为了确保最终输出的模型具备最优的泛化性能,我们并未单纯依赖最后一个 Epoch 的权重,而是引入了基于验证集的早停与最佳权重重载机制

通过设置阈值比较,只有在验证集表现刷新历史最高分时,才替换旧的 Checkpoint 文件。这保证了我们最终部署的是泛化能力最强的模型,有效规避了模型在训练集上"死记硬背"而导致的过拟合问题。

6.2 模型评估指标

DICE(dice similarity coefficient)和IOU(intersection overunion)都是分割网络中最常用的评价指标,下面是DICE和IOU的公式。

IOU IOU=TP/TP+FN+FP
DICE DICE=2*TP/(TP+FN)+(TP+FP)
6.2.1 眼底 OCT 层分割结果
指标 SAM 原模型 训练结束 Best 模型
IoU 0.6750 0.9847
Dice 0.7999 0.9847

肉眼可见的差距:原始 SAM 预测的边界模糊,而微调后分割出的视网膜十层结构平滑细腻,完全贴合标注。仅用 80 张训练图,Dice 达到 98.5%。

原模型检测图:

训练模型检测图:

IOU和DICE曲线图:

6.2.2 X 线胸片分割结果
指标 SAM 原模型 训练结束 Best 模型
IoU 0.4787 0.8573
Dice 0.6366 0.9210

原模型检查图:

训练模型检查图:

IoU 和 Dice 曲线图:

6.2.3 Loss 曲线与收敛情况

我训练了两个医学数据集,SAM 模型表现随着训练越来越好。验证集上正确率最后基本保持平稳,正确率都达到 90% 以上,模型已经基本收敛。

眼部 OCT loss 曲线:

X 线胸片 loss 曲线:

6.2.4 与飞桨 PP-LiteSeg 方案对比(OCT 数据集)

我在 AIStudio 上复现了飞桨学习赛眼底 OCT 层分割 2022 年 12 月赛段第 2 名的 PP-LiteSeg 方案:

指标 PP-LiteSeg Best 模型
IoU 0.9323 0.9847
Dice 0.8762 0.9847

结论: SAM 大模型在少样本场景下展现出碾压性优势,验证了基础模型迁移至医学任务的巨大潜力。

七、PyQt5 交互式分割工具开发

光有模型不行,得让医生或者小白也能用。我用 PyQt5 写了一个极简桌面端,界面布局一目了然:左侧是图像显示区,右侧是功能按钮

界面说明(对照截图)

左侧显示区从上到下分为三块,分别对应:

  1. 最上方:原始 OCT 图像

    用户上传的眼底 OCT 断层扫描原图,或加载的测试样本。

  2. 中间:模型预测掩码

    后端调用训练好的 Best 模型推理后,自动生成的分割掩码(黑色背景 + 白色层边界),直观展示模型对视网膜各层的识别结果。

  3. 最下方:Ground Truth 标注

    数据集自带的标准标注掩码,用于与中间模型输出做直观对比,一眼就能看出分割准不准、边界偏没偏。

右侧三个按钮:

  • 执行全部样本检测:后端自动吊起最佳模型,批量跑完一轮测试集推理,结果依次在左侧展示。
  • 选择图片并执行:弹窗选择本地 OCT 或 X 光片,单张推理并实时显示三栏结果。
  • 退出:关闭程序。
  • 分别返回:原图、预测掩码、GT 掩码,对应界面三个显示区(return image, masks, ground_truth_mask)

界面展示:

后端吊起:

八、总结与未来展望

✅ 本文亮点

  • 验证了 SAM 在医学少样本场景下的强大迁移能力------训练集仅 80 张 OCT 图像,Dice 即可达 98.5%。
  • 微调策略轻量高效------固定 prompt_encoder 和 mask_decoder,只训练 image_encoder,省显存且防过拟合。
  • 完成了从训练到部署的完整闭环------提供了 PyQt5 交互界面,真正"可用"。
  • 横向对比有说服力------在相同 OCT 数据集上,SAM 微调版(Dice 0.985)显著优于 PP-LiteSeg(Dice 0.876)。

⚠️ 存在的不足

  • 数据规模仍然有限(尤其 OCT 仅 80 张),难以覆盖全部病变类型。
  • 当前仅依赖边界框提示,未尝试点提示或文本提示,交互方式不够灵活。
  • 仅处理 2D 切片,未扩展至 3D 体积数据。

🔮 后续研究方向

  • 扩充数据集规模,引入 BraTS、CHAOS 等公开医学分割基准。
  • 尝试 Adapter 微调 或 LoRA 等参数高效微调方法,进一步降低训练成本。
  • 改进网络结构、损失函数设计和优化算法,更准确地定位和分割病灶区域。
  • 集成 CLIP 等文本编码器,探索文本驱动的病灶分割(如"分割出所有渗出液区域")。

参考文献

1 Zhou S Kevin, Greenspan Hayit, Davatzikos Christos, Duncan James S, Van Ginneken Bram, Madabhushi Anant, Prince Jerry L, Rueckert Daniel, Summers Ronald M. A review of deep learning in medical imaging: Imaging traits, technology trends, case studies with progress highlights, and future promisesJ. Proceedings of the IEEE, 2021, 109(5): 820-838.

2 Ji Ge-Peng, Fan Deng-Ping, Xu Peng, Zhou Bowen, Cheng Ming-Ming, Gool Luc Van. SAM struggles in concealed scenes---empirical study on "Segment Anything"J. Science China(Information Sciences), 2023, 66(12): 278-280.

3 徐光宪, 冯春, 马飞. 基于 UNet 的医学图像分割综述J. Journal of Frontiers of Computer Science & Technology, 2023, 17(8).

4 Who Constitution Of. World health organizationJ. Air Quality Guidelines for Europe, 2020(91).

5 张文杰, 宋艳涛, 王克琪, 张越. 基于自分块轻量化Transformer的医学图像分割网络J. 计算机应用研究: 1-8.

6 Costa Rogério A, Skaf Mirian, Melo Jr Luiz As, Calucci Daniela, Cardillo Jose A, Castro Jarbas C, Huang David, Wojtkowski Maciej. Retinal assessment using optical coherence tomographyJ. Progress in retinal and eye research, 2006, 25(3): 325-353.

7 Tian Jing, Marziliano Pina, Baskaran Mani, Tun Tin Aung, Aung Tin. Automatic segmentation of the choroid in enhanced depth imaging optical coherence tomography imagesJ. Biomedical optics express, 2013, 4(3): 397-411.

8 朱付平, 田捷, 林瑶, 葛行飞. 基于 Level Set 方法的医学图像分割D. 2002.

9 舒添慧, 胥布工, 胡战虎. 基于区域生长法的医学图像分割J. 微计算机信息, 2008, 24(18): 284-285.

10 郭树旭, 马树志, 李晶, 张惠茅, 孙长建, 金兰依, 刘晓鸣, 刘奇楠, 李雪妍. 基于全卷积神经网络的肝脏 CT 影像分割研究J. 计算机工程与应用, 2017, 53(18): 126-131.

11 刘少鹏, 洪佳明, 梁杰鹏, 贾西平, 欧阳佳, 印鉴. 面向医学图像分割的半监督条件生成对抗网络J. 软件学报, 2020, 31(8): 2588-2602.

12 Zhang Yichi, Jiao Rushi. How segment anything model (SAM) boost medical image segmentation?J. arXiv preprint arXiv:2305.03678, 2023.

13 Ma Jun, He Yuting, Li Feifei, Han Lin, You Chenyu, Wang Bo. Segment anything in medical imagesJ. Nature Communications, 2024, 15(1): 654.

14 Cheng Junlong, Ye Jin, Deng Zhongying, Chen Jianpin, Li Tianbin, Wang Haoyu, Su Yanzhou, Huang Ziyan, Chen Jilong, Jiang Lei. Sam-med2dJ. arXiv preprint arXiv:2308.16184, 2023.

15 Wang Haoyu, Guo Sizheng, Ye Jin, Deng Zhongying, Cheng Junlong, Li Tianbin, Chen Jianpin, Su Yanzhou, Huang Ziyan, Shen Yiqing. Sam-med3dJ. arXiv preprint arXiv:2310.15161, 2023.

16 Hu Xinrong, Xu Xiaowei, Shi Yiyu. How to efficiently adapt large segmentation model (sam) to medical imagesJ. arXiv preprint arXiv:2306.13731, 2023.

17 Aumann Silke, Donner Sabine, Fischer Jörg, Müller Frank. Optical coherence tomography (OCT): principle and technical realizationJ. High resolution imaging in microscopy and ophthalmology: new frontiers in biomedical optics, 2019: 59-85.

18 赵云山, 段友祥. 基于 Attention 机制的卷积神经网络文本分类模型J. 应用科学学报, 2019, 37(4): 541-550.

19 Kirillov Alexander, Mintun Eric, Ravi Nikhila, Mao Hanzi, Rolland Chloe, Gustafson Laura, Xiao Tete, Whitehead Spencer, Berg Alexander C, Lo Wan-Yen. Segment anythingC. Proceedings of the IEEE/CVF International Conference on Computer Vision, 2023: 4015-4026.

20 Khan Md Shakib, Tafshir Nafisa, Alam Kazi Nabiul, Dhruba Abdur Rab, Khan Mohammad Monirujjaman, Albraikan Amani Abdulrahman, Almalki Faris A. Deep Learning for Ocular Disease Recognition: An Inner-Class BalanceJ. Computational Intelligence and Neuroscience, 2022, 2022.

21 于营, 王春平, 付强, 寇人可, 吴巍屹, 刘天勇. 语义分割评价指标和评价方法综述J. Journal of Computer Engineering & Applications, 2023, 59(6).

22 曹兰云.胸部DR摄片在健康人群体检中的应用价值分析J.益寿宝典, 2021(014):000.

23 毛君宇, 何廷年, 郭艺, 爱斌 基于全局注意力及金字塔卷积网络的表情识别. Journal of Computer Engineering & Applications. 2022 Dec 1;58(23).

相关推荐
YUS云生1 小时前
大模型学习·第40天:LangChain框架入门——从RAG原理到模型调用的统一接口
学习·langchain
小黄蚁1 小时前
FreeRTOS学习笔记(十二)
笔记·学习
就是一顿骚操作1 小时前
Dropout:神经网络正则化的经典解读
人工智能·深度学习·神经网络·论文解读
Nebula_g1 小时前
Java实现本地Socket通信(三)
java·开发语言·学习·socket·可视化
2401_843253702 小时前
数据隐私AI:从合规检查到隐私计算的Skill化
人工智能
茯苓gao2 小时前
嵌入式开发笔记:电机参数辨识与自学习完全指南——从电气参数到机械特性的深度解析
笔记·嵌入式硬件·学习
清川渡水2 小时前
NL2SQL 的正确打开方式:从「AI 猜 SQL」到「置信度闭环」的工程化落地
数据库·人工智能·sql
笨鸟先飞的橘猫2 小时前
游戏后端分布式学习——消息队列在游戏的用法
分布式·学习·游戏
Lyra_Infra2 小时前
OpenClaw 服务异常故障分析报告
linux·人工智能