1、前言
Unet 图像分割之前介绍了不少,具体可以参考 图像分割专栏
为了实现多类别的自适应分割,前段时间利用numpy的unique函数实现了一个项目。通过numpy函数将mask的灰度值提取出来,保存在txt文本里,这样txt里面就会有类似0 1 2 ...等等的灰度值。而有几个灰度值,就代表分割要分出几个类别。
具体可以参考:Unet 实战分割项目、多尺度训练、多类别分割
将vgg换成resnet的unet参考:Unet+ResNet 实战分割项目、多尺度训练、多类别分割
对于图像分割而言,仍有很多的分割网络(例如deeplab、retinaNet等等)在分割任务有不错的表现。这里将介绍几种torch自定义的高阶分割API
高阶分割API的输入被限制为32的倍数,不能像之前那样输入任意大小
2、Resnet101
代码类似,参考之前的文章即可,这里仅仅将网络进行替换
需要安装的库文件:
pip install segmentation-models-pytorch
导入:
导入网络:
结果:
效果还是可以的
3、Deeplabv3
可以利用torchvision自带的分割网络
导入:
加载网络:
这里没有加载预训练模型,因为不同的输出会导入预训练权重失败,当然可以删除最后的输出层进行导入,可以自己尝试下
结果:
4、项目地址
下载地址:项目的使用,参考readme文件
深度学习 Unet+Resnet101 实战分割项目、多尺度训练、迁移学习、多类别分割:腹部多脏器5类别分割数据集
深度学习 Deeplabv3+Resnet101 实战分割项目、多尺度训练、多类别分割:腹部多脏器5类别分割数据集
5、一点废话
对于官方实现的高阶分割网络而言,输入需要限制在32的倍数,这是根据unet下采样的倍数决定的。
这样在推理的时候,也需要将图像resize成固定大小,之前讨论过这个问题,总感觉有点差强人意,所以本人不太使用这种高阶API,参考:关于图像分割的预处理 transform
对于二值图像来说,之前做过几个项目,有的是单通道输出,有的是多通道输出
因为对于二值图像分割,结果就两个0 1,可以利用交叉熵进行输出两个,也可以利用sigmoid阈值处理变成两个,结果是没区别的。后者的精度虽然高,但仅仅是精度,不是iou,将同样的项目换到交叉熵的多通道输出,结果也一样,所以不需要纠结。如下: