图像分割实战-系列教程 总目录
语义分割与实例分割概述
Unet系列算法
1、Unet网络
1.1 概述
- 整体结构:
- 概述就是编码解码过程
- 简单但是很实用,应用广
- 起初是做医学方向,现在也是
虽然用的不是很多,在16年特别火,在医学领域、小目标领域做分割,其实到现在为止也还在用,因为在深度学习中网络越简单越好,这篇内容也会介绍Unet++版和Unet最新版
相比于yolo、maskrcnn、fastrcnn这些,Unet远比这些网络简单。网络越大的时候,感受野也越大,实际上就会更加适合一些大目标。
1.2 结构
如图的网络架构中,左边从上到下,仍然是一层一层卷积的过程,三层卷积一个block,这个过程也就是图像长宽减小、通道变多的过程。一直到最底下的一层,tensor维度从(572,572,1)变成了(28,28,1024),当然这个过程从代码中打印出来会比较清晰。
- 第一个Block的输出会给到最后一个Block的输入和第二个Block的输入
- 而第二个Block的输出会给到第三个Block的输入和倒数第二个Block的输入
- 而同时最后一个Block会接受倒数第二个Block的输入和第一个Block的输入
- 这种从上到下,从左到右的结构与以前的网络有所不同
- 其中第一个Block和最后一个Block是一个对应的输入输出,对应的数据维度也是一样的,在当前这个网络中没有保持一样在后续新版本会保持一致
这整个过程相当于编码和解码的过程,整个网络呈现一个U字形,Unet在医学领域一直有不错的发挥
2、Unet各版本比较
2.1 Unet
- 主要网络结构:
- 还引入了特征拼接操作
- 以前我们都是加法,现在全都要
- 这么简单的结构就能把分割任务做好
2.2 U-net++概述
- 整体网络结构:
- 特征融合,拼接更全面
- 其实跟densenet思想一致
- 把能拼能凑的特征全用上就是升级版了
相比于Unet,++版本多做了一些融合的事情
2.3 U-net++损失计算方式
- Deep Supervision :
- 也是很常见的事,多输出
- 损失由多个位置计算,再更新
- 现在来看,很多视觉任务都可以套用这招
如图所示,第一层中 x 0 , 1 x^{0,1} x0,1、 x 0 , 2 x^{0,2} x0,2、 x 0 , 3 x^{0,3} x0,3、 x 0 , 4 x^{0,4} x0,4等4个位置都参与了损失计算,由于很多位置都参与了损失计算可以再各个阶段都获取一个比较好的效果,使得最终的结果更好。
2.4 Unet++优点
- 可以更容易剪枝:
- 因为前面也单独有监督训练
- 可以根据速度要求来快速完成剪枝
- 训练的时候同样会用到L4,效果还不错
如图所示,原本是一个4层的网络,由于多个部分参与了损失计算,可以很方便的直接去掉最后一层看最后的结果,如果对速度要求发生变化,就可以尝试去掉第四层。
2.5 Unet+++
- U-net+++(了解下就行)
- 不同的max pool整合低阶特征
- (X1和X2,轮廓之类的)
- 上采样整合高阶特征
- (感受野大的,全局的)
- 各层统一用卷积得到64个特征图
- 5*64=320,最终组合得到全部特征
这里看清楚了,是有3个+,其实这方面的论文有不少,4+和5+都有,实际上大同小异。
低阶特征(长宽大、特征图数少,如图 X E n 1 X^1_{En} XEn1、 X E n 2 X^2_{En} XEn2)通过maxpooling降维,
高阶特征(长宽大、特征图数少,如图 X E n 4 X^4_{En} XEn4、 X E n 5 X^5_{En} XEn5)通过线性插值增维,
统一变成nn64的维度,然后全部拼接在一起,这里就是nn645 = nn*320