1、SAM-Med2D 模型介绍
SAM-Med2D论文地址:[2308.16184] SAM-Med2D (arxiv.org)
代码地址:https://github.com/OpenGVLab/SAM-Med2D
SAM-Med2D模型:
- 收集并整理了迄今为止最大的医学图像分割数据集(4.6M 图像和 19.7M mask)用于训练模型
- 基于 Segment Anything Model (SAM) 的最全面的微调。
- SAM-Med2D在大规模数据集上的综合评估。
SAM-Med2D 在包含 4.6M 图像和 19.7M 掩码的数据集上进行训练和测试。该数据集涵盖 10 种医学数据模态、4 种解剖结构 + 病变、31 种人体主要器官。就数量和类别覆盖范围而言,这是目前最大、最多样化的医学图像分割数据集。
SAM-Med2D 在github上介绍很多,这里不多赘述
消融试验:在测试集上的比较
对 9 个MICCAI2023数据集进行泛化验证
可视化效果:
2、官方的demo数据集介绍
下载后的目录如下:
这里还需要下载预训练权重:sam-med2d_b.pth - Google 云端硬盘
放在这里
2.1 关于数据集介绍
虽然上述操作完,可以直接train了,不过为了后面更换数据集,这里对demo数据集进行简单介绍
目录如下:
以往的mask是在一张图片里面的,用不同的灰度值代表不同的分割类别
这里就是独立出来了,把每个灰度值变成新的二值图像(255 0),有几类就有几张对应的mask图像
就比如[0 0 0 1 1 2 2 ],假设这是一张图片
这里需要变成 [0 0 0 255 255 0 0]和 [0 0 0 0 0 255 255]两张mask模板
- 官方使用的image和mask都是png格式的,更换数据集的时候最好遵守
- 官方的mask命名是 _类 实现
怎么定义训练集和测试集?json文件就体现了作用
2.2 训练集文件
其中 image2label_train.json 如下:
其实就是image:【mask1,mask2,mask3】 所以前面说命名无所谓,这里定义好就行
{
"data_demo/images/amos_0006_90.png": [
"data_demo/masks/amos_0006_90_liver_000.png",
"data_demo/masks/amos_0006_90_spleen_000.png",
"data_demo/masks/amos_0006_90_inferior_vena_cava_000.png",
"data_demo/masks/amos_0006_90_aorta_000.png"
],
"data_demo/images/s0114_111.png": [
"data_demo/masks/s0114_111_lung_middle_lobe_right_000.png",
"data_demo/masks/s0114_111_heart_ventricle_right_000.png",
"data_demo/masks/s0114_111_lung_lower_lobe_left_000.png",
"data_demo/masks/s0114_111_rib_left_9_000.png",
"data_demo/masks/s0114_111_vertebrae_T9_000.png",
"data_demo/masks/s0114_111_heart_ventricle_left_000.png",
"data_demo/masks/s0114_111_lung_lower_lobe_right_000.png",
"data_demo/masks/s0114_111_lung_upper_lobe_left_000.png",
"data_demo/masks/s0114_111_aorta_000.png",
"data_demo/masks/s0114_111_autochthon_right_000.png",
"data_demo/masks/s0114_111_autochthon_left_000.png",
"data_demo/masks/s0114_111_heart_myocardium_000.png",
"data_demo/masks/s0114_111_heart_atrium_right_000.png",
"data_demo/masks/s0114_111_heart_atrium_left_000.png",
"data_demo/masks/s0114_111_rib_right_9_000.png"
]
}
2.3 测试集文件
其中 label2image_test.json 如下:
其实 mask:image
{
"data_demo/masks/amos_0004_75_inferior_vena_cava_000.png": "data_demo/images/amos_0004_75.png",
"data_demo/masks/amos_0004_75_liver_000.png": "data_demo/images/amos_0004_75.png",
"data_demo/masks/amos_0004_75_aorta_000.png": "data_demo/images/amos_0004_75.png",
"data_demo/masks/s0619_32_femur_right_000.png": "data_demo/images/s0619_32.png",
"data_demo/masks/s0619_32_gluteus_maximus_left_000.png": "data_demo/images/s0619_32.png",
"data_demo/masks/s0619_32_hip_left_000.png": "data_demo/images/s0619_32.png",
"data_demo/masks/s0619_32_colon_000.png": "data_demo/images/s0619_32.png",
"data_demo/masks/s0619_32_hip_right_000.png": "data_demo/images/s0619_32.png",
"data_demo/masks/s0619_32_hip_right_001.png": "data_demo/images/s0619_32.png",
"data_demo/masks/s0619_32_hip_left_001.png": "data_demo/images/s0619_32.png",
"data_demo/masks/s0619_32_gluteus_maximus_right_000.png": "data_demo/images/s0619_32.png"
}
3、训练train脚本
train脚本参数很多,其他的都很好理解,就是这个mask_num不知道啥意思,等到更换数据集的时候再调试调试看看吧
说了那么多,其实再github上下载好源码,然后预处理权重这两个文件后,直接运行train即可,不需要改任何参数!!
训练完可以再workdir查看训练结果:有这些值就可以绘图了
4、测试test脚本
test好像也不用改,具体的参数含义可以自己查看,运行如下
python test.py --save_pred True --sam_checkpoint workdir/models/sam-med2d/epoch15_sam.pth
如下:
参数是为了保留结果: