写在开头: 由于本人才疏学浅,加下刚刚开始学习医学图像分割,因此对这个领域有许许多多的未知,文章内容也会有很多错误,还希望各位不吝赐教
医学图像分割
在FCN网络模型提出之后,语义分割领域得到了长足的进展,而在医学图像医学图像上 流行的模型个人认为目前主要分为两大种
1.以Unet为基础的各种魔改
2.以transformer为代表的的注意力机制在CV中的应用
由于本人对注意力机制这块可以说是一窍不通,因此本文主要小结Unet系列的魔改
Unet系列主要应用仍然是在有监督学习领域上,对于无监督学习/半监督学习,笔者所知不多。
医学图像分割的三大问题
1.Class Imbalance : 类别不平衡,正负样本差距大
2.Multi-Task : 多任务
3.Dataset Size : 数据集大小
问题3可以说是目前在医学图像处理上热门的半监督/弱监督学习的直接原因了
对于挑战一 : 可以采用Weighted Loss / Resampling 来处理
对于挑战二 : 可以采用Multi-Label Loss ,但是目前其实多标签深度学习的模型还没有十分统一的框架,而且对于多标签的数据来说,精确标注或者标注不全仍是一个较大的问题
对于挑战三 : 可以采用Transfer Learing + Data Augmentation 来处理
以上问题加解决方法均来自吴恩达老师的医学图像教程
接下来回归Unet系列,上图
Unet论文及代码实现
Unet的结构主要有
1.encoder 左半边
2.decoder 右半边
3.skip connection 中间的连线
简单的来说
encoder端主要用来提取图片的特征,获取更高级别的语义信息
eocoder端的基本模块就是 conv + bn + relu
decoder端主要是重构图像 ,常用的方法有(双线性差值或者反卷积)
skip connetion主要用于融合尺度,让decoder端在重构图像的过程中能得到更多来自encoder端的不同尺度,不同粒度,不同语义的信息,以便更好的恢复图像的细节
这套继承自FCN的encoder-decoder+skip connection思想,在医学图像领域可谓是大杀四方了
当然一招鲜不可能吃遍天,鉴于Unet模型仍然存在许多改进之处,各方大佬提出了各种各样的改进
在我看来改变Unet主要基于
从encoder处改变
从skip connetion处改变
从decoder处改变
1.encoder入手
encoder 端主要干的活就是提取图像的特征,那既然说起提取图像的特征,那么就不得不看从LeNet开始,经过Alexnet VGG resnet Inception 这些网络,这些网络都是已经得到证明,且经过了充分检验,证明其提取特征能力十分强大的模型,
因此从encoder处入手 就是将Unet原有的简单模块 conv + bn +relu 改成
VGG resnet Inception等模块,
顺带一提,这些通常称为backbone/主干网络,如今在实现中往往直接调用在imgnet或者其他数据库上已经训练好的backbone模型,增强encoder端的特征提取能力
这里给出两种设计 resnet +Unet 以及Inception + Unet (当然这个其实不是真正的Inception + Unet 只是这种设计方式是借鉴了Inception)
resnet模块
MultiResUnet
Dual-Channel 这里借鉴的是Inception的思想
DC-Unet DC-Unet论文及其代码实现
skip connetion入手的改进
其实读者可以看到,在上文中的DC-Unet以及 mutiresUnet中
已经出现了一种对于skip connetion的改进
就是采用Res-path
传统Unet的跳接其实就是一个简单的copy + cat操作,而在Res-path里面,作者采用了conv + bn + relu的堆叠+resnet思想 ,目的是为了更好的融合两端的信息,但其实笔者见到的更多的,好像确实是copy+cat而不是respath这种
Attention Unet
attention Unet在Unet上面的改进主要就是在跳接中加上了一个注意力机制单元,虽说只是小小的改动,但是效果确实是很不错的,具体可以参照
attention Unet的论文及其代码实现
从跳接方式入手,不仅有上面的方式,还有改变跳接的形式这种方式
大佬们将Unet的跳接方式称为Plain skip connection,Unet++的连接方式称为Nested and dense skip connection 而将Unet3+的跳接方式称为Full-Scale skip connetion 方式
跳接将来自decoder的deep(深层),sematinc(语义),coarse-grained(粗粒度)的特征与来自encoder的shallow(浅层),low-level(低级),fifine-grained(细粒度)特征结合起来,
下面介绍Unet++ 和 Unet3+
有意思的是,Unet++的作者认为Unet的skip connetion 设计不能很好的融合encoder-decoder的特征,而Unet3+的作者认为Unet++提出的设计方式也不能很好的融合特征
Unet ++ 或者叫Nested-Unet
Unet++论文及其代码实现
Unet3+论文及其代码实现
其实我本来是想讲解一下Unet++和Unet3+的,但又怕自己的水平有限起了误导作用,因此在这里我就不予以讲解,
各位需要注意的是Unet++,Unet3+对于Unet的改进主要就是跳接方式,改进的主要目的就是为了让decoder端能够更好的融合多尺度信息,从而更好的恢复图像
另外二者共同的改变就是Deep Supervision
还有一些不同的变化,比如损失函数的设计等问题,大家可以参考论文以及各方讲解
这里推荐一下大佬的博客Unet++解读
小结
从Unet提出到在医学图像领域盛行,各方都在该模型上做出了很大努力,鉴于医学图像的复杂并存在大量噪音,有人提出了将善于提取特征的resnet/vgg/Inception 嵌入Unet的encoder模块,来增强模型的提取特征能**力,并将各类backbone在各数据集上预训练,使得Unet可以直接调用,大幅度提高了模型训练的速度和encoder端提取特征的能力。
又有人考虑到医学图像分割需要充分融合来自不同尺度的信息以及上下文信息,于是有人开始在跳接上做出改变,从直接连接到嵌套连接到全尺度连接,形成了Unet到Unet++到Unet3+的改变,而又有人从卷积方面考虑,提出了空洞卷积来扩大感受野,捕获多尺度上下文信息。
而对于在医学图像分割领域中常出现非器官图像呈现假阳性的现象,提出了将分类任务与分割任务相结合的策略(本文没讲,但是这个在Unet++还是Unet3+的论文中有提到)
对于目标器官在形状和大小上表现出较大的患者间差异时,有人提出使用先定位再去做分割的方法,有人提出了attention Unet这种加入注意力机制,自学习的方式,将定位和分割一起做。
新人刚刚入坑,难免有许多错处以及漏洞,希望各位批评指正,不吝赐教