雷锋网AI研习社按:经典的 Encoder-Decoder 结构在目标分割问题中展现出了举足轻重的作用,然而这样一个相对固定的框架使得模型在感受野大小和边界分割精度两方面很难达到兼顾。本次公开课,讲者以 U-Net 为案例分析,总结现有的分割网络创新,以及探讨还有哪些有针对性的改进方向。
分享嘉宾:
周纵苇,亚利桑那州立大学生物信息学在读博士,师从 Jianming Liang 教授,主要研究方向为医学图像分析,深度学习等。其研究工作曾在 CVPR , DLMIA ,EJNMMI Research 发表。
公开课回放地址:
分享主题:研习 U-Net ——现有的分割网络创新
分享提纲:
肢解经典的 U-Net 结构,反思其组成元素的必要性和优缺点
解读现有的对于 U-Net 结构性创新的改进思路
分享我们对其提出的一个改进方案—— UNet++
雷锋网AI研习社将其分享内容整理如下:
在计算机视觉领域,全卷积网络 FCN 毫无疑问是最有人气的图像分割网络,可一旦聚焦到医学图像处理领域,U-Net 网络会是更热门的选择。这么说吧,几乎所有的分割问题我们都会拿 U-Net 先看一下基本的结果,再进行「魔改」。
和 FCN 相比,U-Net 的第一个特点是完全对称,也就是左边和右边是很类似的,而 FCN 的 decoder 相对简单,只用了一个 deconvolution 的操作,之后并没有跟上卷积结构;第二个区别就是 skip connection,FCN 用的是加操作(summation),U-Net 用的是叠操作(concatenation)。都是使用的「编码-解码」结构——需要强调的是,「编码-解码」结构一开始并非用于分割图像,而是用在压缩图像和去除噪音上。
简单的过一下这个网红结构,我们先提取出它的拓扑结构,这样会比较容易分析它的实质,排除很多细节的干扰。
输入是一幅图,输出是目标的分割结果。继续简化就是,一幅图,编码,或者说降采样,然后解码,也就是升采样,然后输出一个分割结果。根据结果和真实分割的差异,反向传播来训练这个分割网络。
我们可以说,U-Net 里面最精彩的部分就是这三部分:
下采样
上采样
skip connection
这就是在我眼中的大部分分割网络的拓扑结构。对于这个拓扑结构,一个非常广义的问题就是:
这个三年不动的拓扑结构真的一点儿毛病都没有吗?
在这三年中,U-Net 得到的超过 2500 次的引用,FCN 接近 6000 次的引用,大家都在做什么样的改进呢?如果让你在这个经典的结构基础上改进,你会去关注哪些点呢?
首先一个问题是:要多深合适?
这里我想强调的一点是,很多论文给出了他们建议的网络结构,其中包括非常多的细节,比如用什么卷积,用几层,怎么降采样,学习率多少,优化器用什么,这些都是比较直观的参数,其实这些在论文中给出参数并不见得是最好的,所以关注这些的意义不大,一个网络结构,我们真正值得关注的是它的设计传达了什么信息。
好,我们回来继续讨论到底需要多深的问题。其实这个是非常灵活的,涉及到的一个点就是特征提取器,U-Net 和 FCN 为什么成功,因为它相当于给了一个网络的框架,具体用什么特征提取器,随便。
关于到底要多深这个问题,还有一个引申的问题就是,降采样对于分割网络到底是不是必须的?问这个问题的原因就是,既然输入和输出都是相同大小的图,为什么要折腾去降采样一下再升采样呢?
比较直接的回答当然是降采样的理论意义,我简单朗读一下,它可以增加对输入图像的一些小扰动的鲁棒性,比如图像平移,旋转等,减少过拟合的风险,降低运算量,和增加感受野的大小。升采样的最大的作用其实就是把抽象的特征再还原解码到原图的尺寸,最终得到分割结果。
这些理论的解释都是有道理的,在我的理解中,对于特征提取阶段,浅层结构可以抓取图像的一些简单的特征,比如边界,颜色,而深层结构因为感受野大了,而且经过的卷积操作多了,能抓取到图像的一些说不清道不明的抽象特征。总之,浅有浅的侧重,深有深的优势。
那么接下来是关键,我们心中的目标很明确了,就是使用浅层和深层的特征!但是总不能训练这些个 U-Net 吧,未免也太多了。好,要你来,你怎么来利用这些不同深度的,各自能抓取不同层次的特征的 U-Net?
我把图打出来就很简单了。
我们来看一看,这样是不是把 1~4 层的 U-Net 全给连一起了。我们来看它们的子集,包含 1 层 U-Net,2 层 U-Net,以此类推。这个结构的好处就是我不管你哪个深度的特征有效,我干脆都给你用上,让网络自己去学习不同深度的特征的重要性。第二个好处是它共享了一个特征提取器,也就是你不需要训练一堆 U-Net,而是只训练一个 encoder,它的不同层次的特征由不同的 decoder 路径来还原。这个 encoder 依旧可以灵活的用各种不同的 backbone 来代替。
可惜的是,这个网络结构是不能被训练的,原因在于,不会由任何梯度会经过这个红色区域,因为它和算 loss function 的地方是在反向传播时是断开的。
关于解决方案,我主要想到了两个:
第一个是用 deep supervision,强行加梯度是吧,关于这个,我待会儿展开来说。
第二个解决方案是把结构改成这样子:
这个结构由 UC Berkeley 的团队提出,发表在今年的 CVPR 上,是一个 oral 的论文,题目是"Deep Layer Aggregation"。现在我们和上面那个结构对比一下,不难发现这个结构强行去掉了 U-Net 本身自带的长连接。取而代之的是一系列的短连接。
我们认为,U-Net 中的长连接是有必要的,它联系了输入图像的很多信息,有助于还原降采样所带来的信息损失。
因此,我的建议是最好给出一个综合长连接和短连接的方案,也就是我们提出的 UNet++。
对于这个主体结构,我们在论文中给出了一些点评,说白了就是把原来空心的 U-Net 填满了,优势是可以抓取不同层次的特征,将它们通过特征叠加的方式整合,不同层次的特征,或者说不同大小的感受野,对于大小不一的目标对象的敏感度是不同的,比如,感受野大的特征,可以很容易的识别出大物体的,但是在实际分割中,大物体边缘信息和小物体本身是很容易被深层网络一次次的降采样和一次次升采样给弄丢的,这个时候就可能需要感受野小的特征来帮助。
另一个解读就是如果你横着看其中一层的特征叠加过程,就像一个去年很火的 DenseNet 的结构,非常的巧合,原先的 U-Net,横着看就很像是 Residual 的结构,这个就很有意思了,UNet++对于 U-Net 分割效果提升可能和 DenseNet 对于 ResNet 分类效果的提升,原因如出一辙,因此,在解读中我们也参考了 Dense Connection 的一些优势,比方说特征的再利用等等。
这些解读都是很直观的认识,其实在深度学习里面,某某结构效果优于某某结构的理由,或者你加这个操作比不加操作要好,很多时候是有玄学的味道在里头,也有大量的工作也在探索深度网络的可解释性。关于 UNet++的主体结构,我不想花时间赘述了。
接下来我要说的这部分,非常的有意思。刚刚在讲这里的时候留了一个伏笔,说这个结构在反向传播的时候中间部分会收不到过来的梯度,如果只用最右边的一个 loss 来做的话。
刚才说了,一个非常直接的解决方案就是深监督,也就是 deep supervision。当 UNet++配合上这样一个填满的 U-Net 结构时,会带来其中一个非常棒的优势——剪枝。
这是因为,在测试的阶段,由于输入的图像只会前向传播,扔掉这部分对前面的输出完全没有影响的,而在训练阶段,因为既有前向,又有反向传播,被剪掉的部分是会帮助其他部分做权重更新的。在深监督的过程中,每个子网络的输出都其实已经是图像的分割结果了,所以如果小的子网络的输出结果已经足够好了,我们可以随意的剪掉那些多余的部分了。
这里我想问两个问题:
为什么要在测试的时候剪枝,而不是直接拿剪完的 L1,L2,L3 训练?
怎么去决定剪多少?
【答案请回看视频 00:34:10处, http://www.mooc.ai/open/course/549?=Leiphone】
让我们看一组结果。
先看看 L1~L4 的网络参数量,差了好多,L1 只有 0.1M,而 L4 有 9M,也就是理论上如果 L1 的结果我是满意的,那么模型可以被剪掉的参数达到 98.8%。不过根据我们的四个数据集,L1 的效果并不会那么好,因为太浅了嘛。但是其中有三个数据集显示 L2 的结果和 L4 已经非常接近了,也就是说对于这三个数据集,在测试阶段,我们不需要用 9M 的网络,用半 M 的网络足够了。
回想一下一开始我提出的问题,网络需要多深合适,这幅图是不是就一目了然。网络的深度和数据集的难度是有关系的,这四个数据集当中,第二个,也就是息肉分割是最难的,大家可以看到纵坐标,它代表分割的评价指标,越大越好,其他都能达到挺高的,但是唯独息肉分割只有在 30 左右,对于比较难的数据集,可以看到网络越深,它的分割结果是在不断上升的。对于大多数比较简单的分割问题,其实并不需要非常深,非常大的网络就可以达到很不错的精度了。
横坐标代表的是在测试阶段,单显卡 12G 的 TITAN X (Pascal) 下,分割一万张图需要的时间。我们可以看到不同的模型大小,测试的时间差好多。如果比较 L2 和 L4 的话,就差了三倍之多。
对于测试的速度,用这一幅图会更清晰。我们统计了用不同的模型,1 秒钟可以分割多少的图。如果用 L2 来代替 L4 的话,速度确实能提升三倍。
剪枝应用最多的就是在移动手机端了,根据模型的参数量,如果 L2 得到的效果和 L4 相近,模型的内存可以省 18 倍。还是非常可观的数目。
关于剪枝的这部分我认为是对原先的 U-Net 的一个很大的改观,原来的结构过于刻板,并且没有很好的利用不用层级的特征。
简单的总结一下,UNet++的第一个优势就是精度的提升,这个应该它整合了不同层次的特征所带来的,第二个是灵活的网络结构配合深监督,让参数量巨大的深度网络在可接受的精度范围内大幅度的缩减参数量。
最后给大家分享一下我们工作成果的网络链接:
论文:https://arxiv.org/abs/1807.10165
代码:https://github.com/MrGiovanni/Nested-UNet
微博:@MrGiovanni
我今天的分享就到此为止,谢谢大家!
以上就是本期嘉宾的全部分享内容。更多公开课视频请到雷锋网AI研习社社区(https://club.leiphone.com/)观看。关注微信公众号:AI 研习社(okweiwu),可获取最新公开课直播时间预告。