在深度学习这一块儿,我最开始使用Unet进行了冠状动脉血管的分割
再后来,我尝试改进Unet,改进损失函数,让网络能有不错的效果
再后来,看到了注意力机制,读了attention unet,
于是,我在自己的网络里加入了注意力机制,取得了更好的效果
之后我就一直专注于网络的两个过程来改进:
下采样过程,上采样过程,
我认为我将在注意力机制研究这块越陷越深
目前还在学习过程,秋季就要找工作了,
这篇博客也算对自己深度学习的相关工作做一个总结
文章目录
0. FCN:从分类到分割
论文地址:https://arxiv.org/pdf/1411.4038.pdf
encoder-decoder模式的网络
下采样降低图像尺寸,提取图像特征
上采样恢复图像尺寸,利用底层的图像特征信息,逐点相加到一起,细化特征
根据得到的feature map预测分割
1. SegNet:追求内存时间平衡的改进FCN
论文地址:https://arxiv.org/pdf/1511.00561.pdf
SegNet使用VGG16的13个卷积层作为编码器,去掉了全连接层,参数从134M降到14.7M
将FCN的逐点相加变成了max pooling,进一步在保证效果的基础上减少了参数
近似版的UNET,但是某些方面不如UNET
2. Unet:适合于医学影像的分割网络
论文地址:https://arxiv.org/pdf/1505.04597.pdf
encoder-decoder模式的网络
下采样降低图像尺寸,提取图像特征
与FCN不同的是,在上采样的部分
利用底层的图像特征信息,不是单纯的相加在一起,而是concat一起,
充分利用中间过程的特征,细化图像
根据得到的feature map预测分割
3. Attention Unet:在Unet基础上加上注意力机制
论文地址:https://arxiv.org/pdf/1804.03999.pdf
在Unet的基础上,每一个上采样模块都增加了一个attention gate的模块
也称为注意力机制,个人理解是利用底层信息和当前通道的特征,做了一个通道层面的注意力控制,使得不同通道之间的特征能够联系起来,同类特征的识别准确率得到提高
4. PSPNet:聚合不同区域的上下文信息(PPM)
论文地址:https://arxiv.org/pdf/1612.01105.pdf
论文提出了一个具有层次全局优先级,包含不同子区域之间的不同尺度的信息,称之为pyramid pooling module。该模块融合了4种不同尺度的特征,分别由卷积核大小为1,2,3,6的卷积核得到,最终concat在一起
- 使用了poly的学习策略,learning rate 0.01,power 0.9
- 随机翻转、尺寸在0.5到2之间缩放、角度在-10到10之间旋转、随机的高斯滤波
5. Unet++:下采样中,同层特征利用的极致
论文地址:https://arxiv.org/pdf/1807.10165v1.pdf
这个网络是类Unet型的,但是不是严格的Unet型,首先输出是用了DSN深度监督机制进行输出的,在特征提取过程,做了很多工作,不断利用当前层数的信息以及上一层的信息,在每次深度加深的时候,不仅仅利用当前和上一层的,每一个在下采样过程中具有相同尺寸的中间channel都被利用了起来,这个网络在课题的具体实验中表现不佳,看来并不是网络结构越复杂,效果就能越好的。
6. HRNET(2019CVPR):并行特征重复利用
论文地址:https://arxiv.org/pdf/1902.09212.pdf
这个网络也是类Unet型的网络,但是并不是严格的Unet型的网络,网络并行利用提取到的特征,在不同的层之间,新提取到的特征又被利用到了最初的一层,每次提取的新特征,不同的层之间都进行了共享,是另外一个空间层面上的特征利用。网络结构复杂,backbone可选resnet101,作者的代码能力绝对是1级的,我看这个代码debug下足足看了两天,makelayer那种神操作,我自己宁愿一层一层写(手动捂脸),在实际的运用过程中,也是发现,并不是网络结构越复杂,对于某个特定的任务,比如我的冠脉分割的任务就越合适,分割结果只能达到和Unet差不多的水平
7. DANET(2019 CVPR):双重注意力机制
论文地址:https://arxiv.org/pdf/1809.02983.pdf
论文地址:https://arxiv.org/pdf/1809.02983.pdf
在传统的基于孔洞卷积的FCN上添加了两种注意力模块,
这个是我接下来工作的重点,毕业可能也全仰仗这个双重注意力机制了
在空间和通道上实现了双重感知,分别是:
- 位置注意力模块:
通过所有位置处的特征的加权和来选择性地聚合每个位置的特征。无论距离如何,类似的特征都将彼此相关。 - 同通道注意力模块:通过整合所有通道映射之间的相关特征来选择性地强调存在相互依赖的通道映射。
将两个注意模块的输出相加以进一步改进特征表示,这有助于更精确的分割结果
8. DFN:改进的残差模块和注意力机制
论文地址:https://arxiv.org/pdf/1804.09337.pdf
网络涉及了两个结构
- Smooth Network(SN):SN用于学习更鲁棒性的特征表示,用于捕获多尺度信息,并带有全局平均池化用于捕获全局信息
- Border Network(BN):用于去区分具有相似外表但不同语义标签的相邻区域
DFN用于同时解决 intra-class inconsistency和inter-class indistinction问题
网络结构图中的基本模块的意思如下:
RRB: refinement residual module,细化特征图,根据resnet的残差模块修改的,笔者设想加入SE的trick话没准会更好
CAB: channel attention module,在广泛使用的注意力机制上加入了全局平均池化取得了更好的效果,细化不同类的边界分割
9. BiSeNet:ARM+FFM,翻版DFN
论文地址:https://arxiv.org/pdf/1808.00897.pdf
face ++出品,6就完事儿了
介绍了现有加速的方法:1.crop或者resize图片 2. 减少特征通道数,尤其在网络的早期3.丢弃网络的最后阶段(ENet),使模型变得紧凑。三种方式的缺点如下 1.损失了空间细节,特别是边缘 2.弱化了空间信息 3. 少了最后阶段的下采样,感受野变小,影响大物体的分割(对自己来说特别重要)这些方法为了速度牺牲了acc,在实际中处于劣势。为了弥补空间信息,u-shape结构被提出来,粗暴的对特征进行融合。但是这种方法计算太慢而且不能还原通过剪裁和resize的空间信息。so,还是我家提出的BiSeNet好。
主要看4个名词:
- Spatial path(SP):保存原始图片的空间尺度并编码丰富的空间信息
- Context path(CP):使用轻量级的xception网络,加上全局平均池化,得到大的感受野,编码高层的语义特征。最后融合全局平均池化后上采样的特征和xception的特征。
- ARM模块:加入全局平均池化的注意力模块
- FFM模块:SP中是低层抽象信息,CP中是高层抽象信息,不能单纯的逐点相加,所以设计了FFM进行两个不同特征的融合
10. DeepLabV1、V2、V3和V3+
这一部分详解参考:https://blog.csdn.net/u011974639/article/details/79148719
DeepLabv1
论文地址:https://arxiv.org/pdf/1412.7062v3.pdf
- 将VGG16的全连接层转为卷积,
- 最后的两个池化层去掉了下采样,
- 后续卷积层的卷积核改为了空洞卷积(rate=2),
- 最后还采用了条件随机场(CRF)进行进一步精修
DeepLabv2
论文地址:https://arxiv.org/pdf/1606.00915.pdf
- 用多尺度获得更好的分割效果(使用ASPP) ,在给定的特征层上使用不同采样率的卷积有效的重采样
- 基础层由VGG16转为ResNet
- 使用不同的学习策略(poly)
DeepLabv3
论文地址:https://arxiv.org/pdf/1706.05587.pdf
- 提出了更通用的框架,适用于任何网络
- 复制了ResNet最后的block,通过对比串联和并联的效果选择并联
- 在ASPP中使用BN层
- 去掉了CRF
DeepLabV3+
- backbone是微软的可变形卷积思想改造的Xception
- 增加decoder部分,融合更底层的特征
- 使用深度可分离卷积改造ASPP和decoder部分,减少计算量
由deeplab引出的相关的知识点
- 深度可分离卷积
(顺带一提,分组卷积的参数量是标准卷积的1/N倍,N是分组的组数)
详细的带图解释参考这个链接
https://zhuanlan.zhihu.com/p/65377955
简单来说:深度可分离卷积分为深度卷积和逐点卷积
- 深度卷积的参数量是标准卷积的1/N,其中N是输出图像的通道数,
- 逐点卷积的参数量 是标准卷积的 1 / d k 2 1/{d}_{k}^{2} 1/dk2,其中 d k {d}_{k} dk是卷积核的大小
- 总的参数量/标准卷积参数量=1/N + 1 / d k 2 1/{d}_{k}^{2} 1/dk2
- 感受野的计算
推荐一个网址,可以自定义卷积/池化层,然后计算感受野:fomoro传送门
计算感受野的方法有两种:
这两种方法实际都是递推的方法,第一种方法比较好理解,第二种方法是逆推,稍难理解
- 第一种方法:
参考链接:
https://blog.csdn.net/u012862372/article/details/81045593
https://zhuanlan.zhihu.com/p/28492837
补充一点自己的理解,初始化的时候,R0初始化为1,S0初始化为1(也就是当计算第一层的时候,实际的感受野就是卷积核的大小) - 第二种方法:
参考链接:https://zhuanlan.zhihu.com/p/28492837
这是一种逆推的方法,top->down,从最后一层逆推到输入层的计算方法,链接里面说的很明白
但是运用方法一可以顺推每个中间层的感受野,比第二种直观一些
这一部分的详细解释,另开一篇博文总结https://blog.csdn.net/u014687517/article/details/100592255
- 扩大感受野:深度网络中为了增加感受野且降低计算量,总要进行降采样(pooling或s2/conv),这样虽然可以增加感受野,但空间分辨率降低了。为了能不丢失分辨率,且仍然扩大感受野,可以使用空洞卷积。这在检测,分割任务中十分有用。一方面感受野大了可以检测分割大目标,另一方面分辨率高了可以精确定位目标。
- 捕获多尺度上下文信息:空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中填充dilation rate-1个0,因此,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息。
- 空洞卷积的输出尺寸的计算,在于卷积核的大小不是原始卷积核的大小,而应该使用公式:K=k+(k-1)(r-1),k为原始卷积核大小,r为空洞卷积参数空洞率;新图像的尺寸的计算公式,与普通卷积的计算公式一致:
n = f − k − 2 p s + 1 n = \frac{f-k-2p}{s}+1 n=sf−k−2p+1
这一部分的详细解释,另开一篇博文总结https://blog.csdn.net/u014687517/article/details/100592255
11. R3Net
12. PoolNet(2019CVPR)
总结
Unet型的网络适用于医学影像的分割,而Unet型的结构往往有比较好的效果,
具体原因可以参考之前写的博客:传送门。
针对Unet的改进层出不穷,这里没有罗列完所有看过的文章,比如还有nnUnet这样的网络,以及很多设计的很巧妙的用到不同领域的Unet型网络,这里总结的都是和我的课题冠状动脉分割相关的网络结构。总的说来,针对Unet的改进网络分为:
- 改进下采样部分
Unet++,BVNET,I2I3D,HRNET,deeplab系列, - 改进上采样部分
Attention UNET,DANET,R2Unet,R2attention Unet
我认为无论是deeplab提出的孔洞卷积还是最新的DANET提出的双重注意力机制都表明了特征粒度的细化很关键,底层特征的多样性,驱使设计的网络不仅要有很大的感受野,也要在区分同类和不同类特征这件事上做的更好。事实上,现在的state-of-art的网络也都这么干,同时汲取了孔洞卷积的大感受野和其余一些特征提取结构的优势。
深度学习还有很长的路要走,也许这条路很长,也许也没那么长
教会机器做人们想要的事情指日可待(手动微笑)