CV | Medical-SAM-Adapter论文详解及项目实现

news2024/10/6 22:25:22

*******************************  👩‍⚕️ 医学影像相关直达👨‍⚕️*******************************

CV | SAM在医学影像上的模型调研【20240207更新版】-CSDN博客

CV | Segment Anything论文详解及代码实现

本文主要讲解Medical-SAM-Adapter论文及项目实现~

2023.12.29第七版_Medical SAM Adapter:Adapting Segment Anything Model for Medical Image Segmentation

论文地址:2304.12620.pdf (arxiv.org)

论文代码:KidsWithTokens/Medical-SAM-Adapter: Adapting Segment Anything Model for Medical Image Segmentation (github.com)

1.论文详解

摘要

Segment Anything Model (SAM) 在图像分割领域广受欢迎,因为它在各种分割任务中具有令人印象深刻的功能和基于提示的界面。然而,最近的研究和个别实验表明,由于缺乏医学特定知识,SAM在医学图像分割方面表现不佳。这就提出了一个问题,即如何增强SAM对医学图像的分割能力。在本文中,没有对SAM模型进行微调,而是提出了医疗SAM适配器(Med-SA),它使用一种轻巧而有效的适应技术将特定领域的医学知识整合到分割模型中。在Med-SA中,提出了空间深度转置(SD-Trans)来实现2D SAM与3D医学图像的适应,以及超提示适配器(HyP-Adpt)来实现快速条件适应。对不同图像模态的 17 个医学图像分割任务进行了综合评估实验。Med-SA 的性能优于几种最先进的 (SOTA) 医学图像分割方法,而仅更新了 2% 的参数。

方法

主要讲解方法部分

论文基于SAM,依旧使用图像编码器、提示编码器和mask解码器。

图像编码器:基于标准ViT被MAE训练,这里使用ViT_h/16变种,有14×14窗口的注意力和4个等间距的全局注意力。图像编码器的输出是对输入图像的16倍下采样嵌入。

提示编码器:可以是稀疏的点、框、文本或密集的mask;本文中只关注稀疏提示编码器,它将点和框表示为位置编码,并对每个提示类型进行学习嵌入。

mask解码器:是一个Transformer解码器,包括动态掩模预测头。

SAM 使用双向交叉注意,一个用于提示到图像的嵌入,另一个用于图像到提示的嵌入,在每个块中学习提示和图像嵌入之间的相互作用。在运行了两个块之后,SAM 上采样嵌入图像,MLP 将输出标记映射到一个动态线性分类器,从而预测给定图像的目标掩码。

Med-SA架构(Med-SA architecture)

为了对 SAM 架构进行微调以适应医学图像分割,本文没有完全调整所有参数,而是冻结了预先训练好的 SAM 参数,并在架构的特定位置插入了 Adapter 模块。

Adapter 是一个 bottleneck 结构,它依次包括:下投影、ReLU 激活和上投影。下投影使用简单的 MLP 层将给定的嵌入压缩到较小的维度;上投影使用另一个 MLP 层将压缩的嵌入扩展回其原始维度.

(在第一版里叫MSA,第七版里叫Med-SA)

2D Medical Image Adaption
在 SAM 编码器中,本文为每个 ViT 块部署了两个 Adapter。

修改标准 ViT block (a),得到 2D Medical Image Adaption (b)

  • 将第一个 Adapter 放在多头注意力之后、残差连接之前
  • 将第二个 Adapter 放在多头注意力之后 MLP 层的残差路径上

紧接着第二个 Adapter 之后,按照一定的比例系数对嵌入进行了缩放
引入缩放因子 s 是为了平衡与任务无关的特征和与任务有关的特征
Decoder Adaption
在 SAM 解码器中,本文为每个 ViT 块部署了Adapter,把这个叫做Hyper-Prompting Adapter

第一个 Adapter 部署在 prompt-to-image 嵌入的多头交叉注意之后,并添加了提示嵌入的残差
本文使用了另一种向下投影来压缩提示嵌入,并在 ReLU 激活之前将其添加到 Adapter 的嵌入上
有助于 Adapter 根据提示信息调整参数,使其更加灵活和通用于不同的模式和下游任务
第二个 Adapter 的部署方式与编码器完全相同,用于调整 MLP 增强嵌入
第三个 Adapter 部署在图像嵌入的残差连接之后,以提示交叉注意
另一个残差连接和层归一化在自适应后连接,以输出最终结果
SD-Trans
尽管 SAM 可以应用于病灶的每个切片以获得最终的分割,但是它没有考虑深度维中的相关性

本文提出了一种新的适配方法,其灵感来源于 image-to-video adaptation,具体架构如 (c)

在每个 block 中,本文将注意力操作分成两个分支:空间分支和深度分支
ing~

2.项目实现

2.0.环境设置

Python3.8+docker容器(Ubuntu)

git clone https://github.com/KidsWithTokens/Medical-SAM-Adapter

cd Medical-SAM-Adapter

wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth

# 自定义req.txt,如本文A1
pip install -r req.txt

因为我没有使用conda新建虚拟环境,自己新建了一个requestion.txt,如【A1】,按照作者要求是torch版本是1.12,我是1.14,并删掉了安装torch的命令。

2.1.数据集设置

官网:ISIC Challenge (isic-archive.com)

 新建文件夹data/isic

#下载数据集
wget https://isic-challenge-data.s3.amazonaws.com/2016/ISBI2016_ISIC_Part1_Training_Data.zip

#wget https://isic-challenge-data.s3.amazonaws.com/2016/ISBI2016_ISIC_Part1_Training_GroundTruth.zip

wget https://isic-challenge-data.s3.amazonaws.com/2016/ISBI2016_ISIC_Part1_Test_Data.zip

#wget https://isic-challenge-data.s3.amazonaws.com/2016/ISBI2016_ISIC_Part1_Test_GroundTruth.zip


#下载csv文件
https://github.com/KidsWithTokens/MedSegDiff/blob/master/data/isic_csv/ISBI2016_ISIC_Part3B_Test_GroundTruth.csv

https://github.com/KidsWithTokens/MedSegDiff/blob/master/data/isic_csv/ISBI2016_ISIC_Part3B_Training_GroundTruth.csv



进入文件夹解压缩: unzip '*.zip'

格式如图

2.2.训练

训练数据集1:ISIC2016

python train.py -net sam -mod sam_adpt -exp_name msa_isic -sam_ckpt ./checkpoint/sam/sam_vit_b_01ec64.pth -image_size 1024 -b 32 -dataset isic -data_path ./data/isic

 一张单卡24GGPU的情况,batch size为2,17929MiB,如果现存较小,改小batch size或者image size.

100个epoch时,IOU:0.85,DICE:0.91 

采样结果

 训练数据集2

python train.py -net sam -mod sam_adpt -exp_name msa_kv
asir -sam_ckpt ./sam_vit_b_01ec64.pth -image_size 1024 -b 32 -dataset Kvasir-SEG -data_path /workspace/SAM
/datasets/Kvasir-SEG

PS

【PS1】ValueError: num_samples should be a positive integer value, but got num_samples=0

csv文件问题

重新下载csv文件就可以啦,不能使用wget方式下载

【PS2】 TypeError: unsupported operand type(s) for %: 'int' and 'NoneType'

或者出现 ZeroDivisionError: integer division or modulo by zero错误时:

训练命令需要填写或修改vis自定义参数,默认是None,不能填写0,修改为1

 扩展

【A1】pip 安装第三方库

aiosignal==1.2.0
alembic==1.10.4
appdirs==1.4.4
astor==0.8.1
asttokens==2.2.1
backcall==0.2.0
beautifulsoup4==4.12.2
blinker==1.6.2
cachetools==4.2.2
certifi==2022.12.7
charset-normalizer==2.0.4
click==8.1.3
cmaes==0.9.1
colorama==0.4.6
colorlog==6.7.0
contextlib2==21.6.0
coverage==6.5.0
coveralls==3.3.1
cucim==23.4.1
cycler==0.11.0
databricks-cli==0.17.7
docker==6.1.1
docopt==0.6.2
einops==0.6.1
entrypoints==0.4
exceptiongroup==1.1.1
executing==1.2.0
filelock==3.12.0
fire==0.5.0
flask==2.3.2
fonttools==4.25.0
future==0.18.3
gdown==4.7.1
gitdb==4.0.10
gitpython==3.1.31
google-auth==2.6.0
google-auth-oauthlib==0.4.4
greenlet==2.0.2
gunicorn==20.1.0
h5py==3.8.0
huggingface-hub==0.14.1
iniconfig==2.0.0
ipython
itk==5.3.0
itk-core==5.3.0
itk-filtering==5.3.0
itk-io==5.3.0
itk-numerics==5.3.0
itk-registration==5.3.0
itk-segmentation==5.3.0
itsdangerous==2.1.2
jedi==0.18.2
jinja2==3.1.2
json-tricks==3.16.1
jsonschema==4.17.3
kornia==0.4.1
lmdb==1.4.1
lucent==0.1.0
mako==1.2.4
mlflow==2.3.1
nibabel==5.1.0
ninja==1.11.1
nni==2.10
nptyping==2.5.0
opencv-python==4.7.0.72
openslide-python==1.1.2
optuna==3.1.1
partd==1.2.0
pluggy==1.0.0
pooch==1.4.0
prettytable==3.7.0
prompt-toolkit==3.0.38
psutil==5.9.5
pyarrow==11.0.0
pyasn1==0.4.8
pyasn1-modules==0.2.8
pydicom==2.3.1
pygments==2.15.1
pynrrd==1.0.0
pyqt5-sip==12.11.0
pyrsistent==0.19.3
pytest==7.3.1
pytest-mock==3.10.0
pythonwebhdfs==0.2.3
pytorch-ignite==0.4.10
querystring-parser==1.2.4
regex==2023.5.5
requests-oauthlib==1.3.0
responses==0.23.1
rsa==4.7.2
safetensors==0.4.1
schema==0.7.5
simplejson==3.19.1
smmap==5.0.0
soupsieve==2.4.1
scikit-image
sqlalchemy==2.0.12
sqlparse==0.4.4
tabulate==0.9.0
tensorboardx==2.2
termcolor==2.3.0
threadpoolctl==2.2.0
tifffile==2021.7.2
timm==0.9.12
tokenizers==0.12.1
tomli==2.0.1

torch-lucent==0.1.8

traitlets==5.9.0
transformers==4.21.3
typeguard==3.0.2
types-pyyaml==6.0.12.9
wcwidth==0.2.6
websocket-client==1.5.1
websockets==11.0.3
werkzeug==2.3.4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1438153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

兼容ARM 32位架构的edgeConnector产品为用户提供新的部署选项

Softing工业将ARM 32位兼容性集成到了edgeConnector产品中,以满足用户对ARM处理器的边缘设备日益增长的使用需求。 (兼容ARM 32位架构的edgeConnector产品扩展了其应用部署范围) 用户对采用ARM处理器的紧凑型边缘设备的需求正在大幅增长&…

LC 2641. 二叉树的堂兄弟节点 II

2641. 二叉树的堂兄弟节点 II 难度 : 中等 题目: 给你一棵二叉树的根 root ,请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和 。 如果两个节点在树中有相同的深度且它们的父节点不同,那么它们互为 堂兄弟 。 请你返回修改值之后,…

【动态规划】【子序列除重】【C++算法】1987不同的好子序列数目

作者推荐 【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II 本文涉及知识点 动态规划汇总 LeetCode1987:不同的好子序列数目 给你一个二进制字符串 binary 。 binary 的一个 子序列 如果是 非空 的且没有 前导 0 (除非数字是 “0” 本身&…

Hgame week1 web

1.Bypass it 不准注册,禁用一下js成功注册登录拿到flag 2.ezHTTP 跟着提示走就行 jwt解析一下 3.点击选课发包时候显示已满 一直发包就会选上 每个都一直发包最后就可以全选课成功 后来得知是后天每隔一段时间会放出一些课,一直发包就能在放课的时候选到…

【网站项目】035家居商城系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

使用 git 上传文件时,运行 命令 git pull origin 时未成功,出现报错信息

项目场景: 背景: 使用 git 上传文件时,运行 命令 git pull origin 时未成功,出现报错信息 问题描述 问题: $ git pull origin print --allow-unrelated-histories error: Pulling is not possible because you hav…

从零开始手写mmo游戏从框架到爆炸(六)— 消息处理工厂

就好像门牌号一样,我们需要把消息路由到对应的楼栋和楼层,总不能像菜鸟一样让大家都来自己找数据吧。 首先这里我们参考了rabbitmq中的topic与tag模型,topic对应类,tag对应方法。 新增一个模块,专门记录路由eternity-…

IS-IS P2P网路类型 地址不在同一子网建立邻居关系

拓扑图 由于IS-IS是直接运行在数据链路层上的协议,并且最早设计是给CLNP使用的,IS-IS邻居关系的形成与IP地址无关。但在实际的实现中,由于只在IP上运行IS-IS,所以是要检查对方的IP地址的。如果接口配置了从IP,那么只要…

使用navicat导出mysql离线数据后,再导入doris的方案

一、背景 doris本身是支持直接从mysql中同步数据的,但有时候,客户不允许我们使用doris直连mysql,此时就需要客户配合将mysql中的数据手工导出成离线文件,我们再导入到doris中 二、环境 doris 1.2 三、方案 doris支持多种导入…

万万没想到,又被问ThreadLocal了

我待ThreadLocal如初恋,ThreadLocal虐我千百遍。但这一次,要彻底搞懂ThreadLocal 回顾一下面试名场面: 面试官:Handler如何做到与线程绑定的? 我:每个Handler只有一个相关联的Looper,线程绑定…

【MySQL进阶之路】SpringBoot 底层如何去和 MySQL 交互了呢?

SpringBoot 底层如何去和 MySQL 交互了呢? 我们在写做 Java 项目时,一般都是引入 MyBatis 框架来和 MySQL 数据库交互,如果需要在 MySQL 上执行什么语句,只需要在 Mapper.xml 文件中定义对应的 SQL 语句即可 那么他底层到底是如…

学习Android的第六天

目录 Android TextView 文本框 TextView 基础属性 范例 带阴影的TextView 范例 带边框的TextView 范例 带图片(drawableXxx)的TextView 范例1 范例2 使用autoLink属性识别链接类型 范例 TextView 显示简单的 HTML 范例1 范例2 SpannableString & Spannable…

Git合并多个commit

git rebase -i commitId 假设想要合并最后3个commit, git log显示 commit id 1 commit id 2 commit id 3 commit id 4 则执行git rebase -i commitId4. 注意是4,不是3. 然后,pick最老的commit (commit id 3). https://blog.csdn.net/qiao…

盲盒APP软件开发:开启全新购物体验

随着科技的飞速发展,盲盒APP软件成为了市场的新宠。盲盒APP软件开发不仅为消费者提供了全新的购物体验,同时也为商家带来了无限的商业机会。本文将深入探讨盲盒APP软件开发的各个方面,包括其概念、优势、开发流程以及未来发展趋势。 一、盲盒…

java Servlet 云平台教学系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc

一、源码特点 JSP 云平台教学系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助 系统采用serlvet dao bean,系统具有完整的源代码和数据库 ,系统主要采用B/S模式开发。开发 环境为TOMCAT7.0,Myeclipse8.5开发,数据…

ref用法

目录 React中提供两种方法创建ref对象: 类组件获取 Ref 三种方式 ① Ref属性是一个字符串。 ② Ref 属性是一个函数。 ③ Ref属性是一个ref对象。 高级用法1:forwardRef 转发 Ref 高级用法2:ref实现组件通信 【ref作用】:最…

Vue3.4+element-plus2.5 + Vite 搭建教程整理

一、 Vue3Vite 项目搭建 说明: Vue3 最新版本已经基于Vite构建,关于Vite简介:Vite 下一代的前端工具链,前端开发与构建工具-CSDN博客 1.安装 并 创建Vue3 应用 npm create vuelatest 创建过程可以一路 NO 目前推荐使用 Vue R…

20240203在WIN10下使用GTX1080配置stable-diffusion-webui.git不支持float16精度出错的处理

20240203在WIN10下使用GTX1080配置stable-diffusion-webui.git不支持float16精度出错的处理 2024/2/3 21:23 缘起:最近学习stable-diffusion-webui.git,在Ubuntu20.04.6下配置SD成功。 不搞精简版本:Miniconda了。直接上Anacoda! …

如何在 emacs 上开始使用 Tree-Sitter(windows)

文章目录 如何在emacs上开始使用Tree-Sitter(windows) 如何在emacs上开始使用Tree-Sitter(windows) 参考:“How to Get Started with Tree-Sitter”。 首先要有一个可运行的emacs,并且它支持Tree-Sitter&…

最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画局部编辑重绘,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT…