既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
(建议先看他的知乎和视频,下面是我个人的学习笔记,总结作者的心路历程)
1、网红拓扑结构
编码和解码(encoder-decoder),早在2006年就被Hinton大神提出来发表在了nature上.当时这个结构提出的主要作用并不是分割,而是压缩图像和去噪声.后来把这个思路被用在了图像分割的问题上,也就是现在我们看到的FCN或者U-Net结构,在它被提出的三年中,有很多很多的论文去讲如何改进U-Net或者FCN,不过这个分割网络的本质的拓扑结构是没有改动的, 即下采样、上采样和skip connection.
这个结构真的一点毛病都没有吗?显然没有, 大家都在这个经典的结构上不断地去完善它. 在这三年中,U-Net得到的超过2500次的引用,FCN接近6000次的引用,大家都在做什么样的改进呢?如果让你在这个经典的结构基础上改进,你会去关注哪些点呢?
2、降采样和升采样
第一个问题: 降采样对于分割网络到底是不是必须的?
问这个问题的原因就是,既然输入和输出都是相同大小的图,为什么要折腾去降采样一下再升采样呢?
理论回答是这样的: 降(下)采样的理论意义,它可以增加对输入图像的一些小扰动的鲁棒性,比如图像平移,旋转等,减少过拟合的风险,降低运算量,和增加感受野的大小。升(上)采样的最大的作用其实就是把抽象的特征再还原解码到原图的尺寸,最终得到分割结果。如下图所示:
作者认为,对于特征提取阶段,浅层结构可以抓取图像的一些简单的特征,比如边界,颜色,而深层结构因为感受野大了,而且经过的卷积操作多了,能抓取到图像的一些说不清道不明的抽象特征,讲的越来越玄学了,总之,浅有浅的侧重,深有深的优势.然后他再次提出疑问:多深才好?U-Net为什么只在4层以后才返回去?问题实际是这样的,下图所示,既然
X1,0 、X2,0、 X3,0 、X4,0**所抓取的特征都很重要,为什么我非要降到
** X4,0 层了才开始上采样回去呢?
3、网络要多深
提出疑问后, 作者开始做实验,为了验证多深才好,干脆每加一个深度(层次)就一个网络,然后测它们各自的分割表现,如下图所示,先不要看后两个UNet++,就看这个不同深度的U-Net的表现(黄色条形图),我们可以看出,不是越深越好吧,它背后的传达的信息就是,不同层次特征的重要性对于不同的数据集是不一样的,并不是说我设计一个4层的U-Net,就像原论文给出的那个结构,就一定对所有数据集的分割问题都最优。(备注:作者分别用了两个数据集:Electron Microscopy 和 Cell)
4、UNet++的萌芽
从上面的分析可见,不同数据集的最优的深度是不一样的,但是总不能把所有不同深度的U-Net都训练一遍吧,这太耗时间了吧。如果给你一个数据集,训练你的网络,你并不知道网络要多深才算最优,也就是你并不知道不同深度的特征的重要性,那有没有办法设计一个网络使得它能够学习不同深度的特征的重要性呢?
我把图打出来就很简单了。
我们来看一看, 在这个网络里面你都可以找到1~4层的U-Net,它们全部都连在了一起. 这个结构的好处就是我不管你哪个深度的特征有效,我干脆都给你用上,让网络自己去学习不同深度的特征的重要性。第二个好处是它共享了一个特征提取器(我认为这说的是encoder),也就是你不需要训练一堆U-Net,而是只训练一个encoder,它的不同层次的特征由不同的decoder路径来还原。这个encoder依旧可以灵活的用各种不同的backbone来代替。
5、无法训练
可惜的是,上面这个网络结构是不能被训练的,原因在于,梯度不会经过这个红色的区域,由于这个区域和算loss function的地方()在反向传播时的路途是断开的。如下图所示
如何解决无法训练这个问题?
- 第一个是用deep supervision,后面再说.
- 第二个解决方案是把结构改成这样子:
如果没有我上面说的那一堆话来盘逻辑,这个结构可能不那么容易想到,但是如果顺着思路一步一步的走,这个结构虽然不能说是显而易见,也算是顺理成章的.但是我提一句,这个结构由UC Berkeley的团队提出,发表在今年的CVPR上,是一个oral的论文,题目是"Deep Layer Aggregation"。他们在论文中给出的关于分割网络结构的改进,他们还做了其他的工作,包括分类,和边缘检测。但是主要的思路就是刚刚盘的那些,目标就是取整合各个不同层次的特征。
这只是一个题外话哦,我们继续来看这个结构,请问,**你觉得这个结构又有什么问题?**
为了回答这个问题,现在我们和UNet那个结构对比一下,不难发现这个结构强行去掉了U-Net本身自带的长连接。取而代之的是一系列的短连接。那么我们来看看U-Net引以为傲的长连接到底有什么优点。如下图:
作者认为,U-Net中的长连接是有必要的,它联系了输入图像的很多信息,有助于还原降采样所带来的信息损失.所以作者给出一个综合长连接和短连接的方案.
6、UNet++模型诞生
这个综合长连接和短连接的方案就是作者他们在MICCAI中发表的UNet++,也就是说这里的短连接是为了使模型能够得到训练,然后长连接是获得更多信息.
(UNet++和刚刚说的那个CVPR的论文结构也太像了吧,这个工作和UC Berkeley的研究是完全两个独立的工作,也算是一个美丽的巧合。UNet++在年初时思路就已经成型了,CVPR那篇是我们七月份开会的时候看到的,当时UNet++已经被录用了,所以相当于同时提出。另外,和CVPR的那篇论文相比,作者还有一个更精彩的点埋在后面说,刚刚也留了一个伏笔)
7、参数多了是导致UNet++比UNet好吗
UNet++的效果是比UNet好,从网络结构上看,说白了就是把原来空心的U-Net填满了
所以有人会认为是参数多了才导致效果好,而不是网络结构的增加.怎么反驳这个呢?
为了回答这个问题,同样作者又去做实验验证
作者的做法是强行增加U-Net里面的参数量,让它变宽,也就是增加它每个层的卷积核个数。由此,作者他们设计了一个叫wide U-Net的参考结构,先来看看UNet++的参数数量是9.04M,而U-Net是7.76M,多了差不多16%的参数,所以wide U-Net我们在设计时就让它的参数比UNet++差不多,并且还稍微多一点点,来证明效果好并不是无脑增加参数量带来的
显然,这个实验用到了控制变量法,为了证明不是参数量影响了模型的表现.所以增加U-Net参数使它变宽,即“wide” U-Net.这样这个“wide” U-Net就和UNet++的参数差不多,甚至还多了点.实验结果如下:
实验证明,UNet++性能的提升和参数量无直接关系,和网络结构有关.(不过这样“无脑”增加参数的实验,作者认为有点敷衍,应该还有更好的办法来完善这个实验,使它更有说服力,总之,作者这种研究思路和爱发现问题以及动手实验值得我学习)
另外,实验也证明了单纯地把网络变宽、把参数提上,对效果的提升并不大
8、简单解读UNet++
从上面分析下来,我们可以解读一下为什么UNet++好
解读1:显然它的优势是可以抓取不同层次的特征,将它们通过特征叠加的方式整合. 不同层次的特征,或者说不同大小的感受野,对于大小不一的目标对象的敏感度是不同的,比如,感受野大的特征,可以很容易的识别出大物体的,但是在实际分割中,大物体边缘信息和小物体本身是很容易被深层网络一次次的降采样和一次次升采样给弄丢的,这个时候就可能需要感受野小的特征来帮助.而UNet++就是拥有不同大小的感受野,所以效果好.
解读2:如果你横着看其中一层的特征叠加过程,就像一个去年很火的DenseNet的结构,非常的巧合,原先的U-Net,横着看就很像是Residual的结构,这个就很有意思了,UNet++对于U-Net分割效果提升可能和DenseNet对于ResNet分类效果的提升,原因如出一辙,因此,在解读中作者他们也参考了Dense Connection的一些优势,比方说特征的再利用等等.
以上说法不一各有各的,这些解读都是很直观的认识,其实在深度学习里面,某某结构效果优于某某结构的理由,或者你加这个操作比不加操作要好,很多时候是有玄学的味道在里头,也有大量的工作也在探索深度网络的可解释性。
9、深监督(Deep Supervision)
刚刚在讲本篇的第5节的时候留了一个伏笔,说这个结构在反向传播的时候, 如果只用最右边的一个loss来做的话, 中间部分会收不到过来的梯度,导致无法训练, 解决的办法除了用短连接的那个结构外,还有一个办法就是用深监督(deep supervision).如下图所示,具体的实现操作就是在图中 X0,1 、X0,2、 X0,3 、X0,4后面加一个1x1的卷积核,相当于去监督每个level,或者说监督每个分支的U-Net的输出。这样可以解决那个结构无法训练的问题.
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!