铺垫
在图像分割领域,全卷积网络 FCN 是非常经典的网络,而 U-Net 在医学图像分割方面表现的更加突出;
FCN vs U-Nnet
相同点:二者都采用了 encode 和 decode 的经典思路,也就是 AutoEncode 的思路;
这种思路起初被用于 图像压缩和去噪,后来被用到图像分割,是不是很厉害呢?所以别看他简单,重要的是思想;
不同点:
1. U-Net 是一种完全对称的结构,网络的 decode 部分仍然是卷积结构,而 FCN 的 decode 相对简单,只是 deconvolution 反卷积操作;
2. skip connection 的使用,U-Net 是叠操作,FCN 是加操作;
叠操作:1,2 ==> [1, 2]
加操作:1, 2 ==> 3
一个 decode 被玩出这么多花,是不是很厉害?所以,别觉得简单;
学习 U-Net 的重点是掌握 网络结构的思想,而非 U-Net 本身;
FCN 和 U-Net 都是非常经典的基础网络结构,事实上,他们已经被多次引用,扩展后的网络屡次发表顶会;
U-Net
下面我们认识一下主角
看起来稍微有些乱;
我们把它的 拓扑结构 抽取出来,这样更接近它的实质,排除细节的干扰;
这就是 大部分 分割网络 的拓扑结构;
分为三部分:
下采样:增加 对输入微小噪声 的鲁棒性,也就是关注主要矛盾,提取特征,增加感受野大小;
上采样:对特征进行还原;
skip connection:把浅层特征 叠加到 深层特征上,同时关注了浅层和深层特征;
扩展
思考一下,U-Nnet 把这个拓扑结构扩展成它的模样,如果让你去扩展,你会如何?
思考-网络深度
这是网络设计时必须要考虑的问题;
首先,我要明确的告诉你,模型的深浅 并不是 作者设计多少就是多少;
U-Net 的重点就是 同时利用了 深浅层特征,那为什么 它 4 层就最深了呢?
有人在 他自己的数据集上 训练了不同深度 的 U-Net 并测试,结果如下
实验证明,并不是越深越好,也不是 4 层最好;
实验折射出这样的结论:不同层次(深浅)的特征的重要性 在不同数据集上 表现不同;U-Net 作者设计 4 层,只能说 4 层适合他的数据集;
灵魂之问:到底要多深?
最笨的办法是 挨个试,训练不同深度的模型,看看测试效果,显然不是很高大上;
回到 U-Net 网络的思想,即 同时使用浅层和深层特征,在这个思想的前提下探讨网络深度,脑洞开一下;
把 4 种不同深度的网络强行叠加起来;
这么做的思想是,我不管哪个层次的特征最重要,都给你算上,让模型自己去学习;
可惜的是这个网络中的红色区域无法进行反向传播,因为网络是断开的;
怎么解决呢?这才是本文的核心,即如何设计一个网络;
网络设计
针对上面的问题,给出几套方案
1. 修改网络结构
把长连接全部改成短连接;
这样做虽然可反向传播,但是长连接的作用是更好的利用浅层特征,改成短连接后,浅层特征被反卷积后的特征代替,显然信息丢失很多;
虽然说这个设计不是很完美,但注意,这个设计也发表在 CVPR 上了哦,所以搞起来吧;
2. U-Net++
很简单,把长连接全部加上,这就 CVPR 了
3. deep supervision,深监督
深监督是一种思想,它把 不同深度的 模型 的 输出 用一定的方法 统计起来,这样可以观测到不同 深度 的输出,从而更好的设计网络的深度;
再次强调,它只是一种思想,没有具体形式;
下图就是 把 深监督 套到了 U-Net++ 上;
深监督最大的意义在于 剪枝
剪枝在移动端的作用十分明显;
在训练时 我们训练不同深度融合的网络,如果 浅层网络的结果已经满足需求,那么深层网络的权重将置零,也就等于没了,在测试时,速度会大大提升;
参考资料:
https://zhuanlan.zhihu.com/p/44958351 大神之作,坚决只看这一篇