1、介绍
transformer的基于全局信息的把握,使得对图像的处理成为了可能
swin-transformer在图像分类应用的成功,证明了transformer比传统的cnn卷积网络可以更好的提取图像特征。因为图像分割也是基于特征信息的融合,将不同尺度下的信息拼接,那么transformer肯定也可以在分割领域实现好的效果
前言废话多,很多内容之前介绍过了,这里不想重复,可以参考往期的博文:
unet网络介绍:UNet - unet网络-CSDN博客
unet多类别网络的实战:Unet 实战分割项目、多尺度训练、多类别分割_unet进行多类分割-CSDN博客
unet更换骨干网络为resnet、deeplab等等:Unet+ResNet 实战分割项目、多尺度训练、多类别分割_resnet分类和unet 图像分割-CSDN博客
Unet 高阶分割网络实战、多类别分割、迁移学习(deeplab、resnet101等等)_unet多分类-CSDN博客
swin-transformer在图像分类的介绍:
Swin-Transformer 在图像识别中的应用_swim transformer 应用-CSDN博客
没有数据集的话,想要自己制作,并且利用 swin-transformer 分类,实现端到端的分类项目的话,参考:图像识别完整项目之Swin-Transformer,从获取关键词数据集到训练的完整过程_transformer图像识别-CSDN博客
2、项目介绍
因为小白在做分类人物的时候,不知道怎么定义分类的类别,这不是分割吗?怎么还有number classes这个参数?或者这个参数需不需要加背景(+1)?等等
本项目对数据集进行处理,将mask的灰度值进行编码重构,这样可以根据数据集自动获取number classes的个数,不需要手动定义,这也就是为什么叫自适应分割的原因
代码根据官方的代码进行更改,因为官方的代码训练过程可能稍微繁琐了一些,需要生成指定的数据格式啊、或者参数定义太多了等等
事实上,如果跑了很多项目,有了自己熟悉的代码风格的话,完全可以只用源代码的model部分,其余的train、predict等等自己实现
项目目录如下:
这里的data就是数据,按照目录摆好即可,里面都是图片
这里建议图片的名称完全一样,要不然dataset提取到images,想要找到mask的话,还要更改对应的代码
这里本人写过一篇python自动化办公的脚本,可以参考这个更改:PYTHON 自动化办公:更改图片后缀-CSDN博客
3、训练
定义好数据后,就可以训练了,超参数就是下面这几个,如果想要更改优化器啊、动量啊等等,在代码里更改就好了。如果不是炼丹大师的话,建议默认,更改下面的值就行了
这里会自动载入官方的预训练权重,达到迁移学习的目的
当然了,运行前需要配置好环境!!
代码运行完,会在run_results目录下,生成下面的数据,这个目录就是自己生成的
只需要注意一点,每次运行train脚本,都会删除之前的run_results目录,然后生成新的!!
这里对腹部多脏器的进行分割,miou达到了0.81!!
在日志文件中,可以看到更为具体每个类别的iou
因为腹部多脏器是4类别分割,加上背景就是5类,而每个列表下就是对应的类别(索引0代表背景)
4、推理
推理的时候,直接运行predict脚本即可,代码会将inference目录下的所有图像进行推理,并且保存
5、其他
这里捋一遍代码的运行的逻辑
1、按照指定格式摆放好数据
2、更改完超参数后,直接运行train脚本即可
train代码会将数据的mask灰度重新索引,不管你的数据是按照0 255这样灰度,还是0 1 2这样格式,都会重新编码,保存在data下
然后dataset就会根据这个文本,自动灰度映射,因为二值分割需要保证灰度是0 1而非0 255的格式。
最后,trian脚本根据这个文本自动提取分割网络输出的number classes,达到自适应分割
3、运行predict推理即可
项目的下载:基于Swin-Transformer和Unet项目、自适应多尺度训练、多类别分割:腹部多脏器5类别分割数据集资源-CSDN文库
这里多尺度,是因为train的预处理,会自动将图片随机缩放到指定尺寸的0.5-1.5倍之间,然后随机裁剪成224*224的size,这样可以达到数据增广的目的
因为transformer的训练时间很长才能收敛,所以本项目自动载入官方的预训练权重,使用迁移学习
其他:
这里没有给出网络输入的维度,而是固定了224*224的输入。因为本人在测试官方代码的时候,发现更改为480*480会报错,所以干脆直接固定了