上一次发博客已是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间作一个总结。算法
首先固然仍是好好说点这段时间的主要工做:语义分割。semantic segmentation 应该是DL这几年快速发展的最重要的领域之一了,但惋惜的事,在这方面你们走的并非很远,仍是有不少值得改进的地方,这固然是个很好的事情,特别是我这种想发paper弱渣.....网络
语义分割作的是什么事呢? 就是给你一张图,你要对其中的每一个pixel作分类,例如把全部的人都涂成红色,车都涂成蓝色。这是在机器人领域和自动驾驶中都很是重要的一步,由于咱们开始让电脑真正的开始认识这个世界了。以下图所示:ide
semantic segmentation的转折点是从long的那那篇FCN开始的,以前的方法大可能是用PGM建模的方法来作,原理都很清楚,但效果就是很差,由于难以解决的问题太多了。等DL大火以后,果真仍是DL大法好,FCN这篇文章我以前是写过笔记的,那时候还比较年轻,如今再好好说一下。post
这篇文章提出来的全卷积的概念并不新鲜, 也无怪乎lecun再FCN得到CVPR的best paper后吐槽了一发,但我的以为如今DL领域,关键的不是谁提出了什么,而是谁作出了什么,谁作的更好,毕竟效果好才是王道。回到FCN,他的思路很简单,VGG最后的全联接层使得咱们的输入只能是固定的,这个很很差,因此就用全卷积层来代替它,这样就能够任意输入了,全卷积层这里有个不少人都有的概念的疑惑,那就是为何会有人说1*1的卷积就等价于全链接层呢?(并且仍是lecun说的...)这事我也纠结过,咱们很简单的理解,和全链接层等价的确定是kernel和feature map同样大的卷积层,但lecun这么说是有语境的...由于在作全链接层以前,咱们要把图像拉成一列,如1*1*4096这种,这样对他作1*1的卷积就等价于全链接层了...也算是我一个无聊的发现...性能
说说FCN的创新点和问题,最大的创新点就是skip connection了,这个trick到如今都是很不错的想法,不一样level的feature map所提供的信息是不一样的,因此在最后分类的时候均可以用到他们,semantic segmentation一直有一个trade-off,就是物体的边缘和物体总体的分类的正确性,high-level的feature能提供更细节的表现,low-level的feature侧重于于很大一块区域的准确性,传统解决这个问题的方法通常是两种:1.multi-scale的input。2.skip connection。 这方面最近有个叫refinenet的paper作的挺不错的,它用restnet的思想将网络分为两条路,一个负责location,一个负责refine,有兴趣能够去看看。 回到FCN的问题,也是我最想吐槽的一点....VGG的model时downsample 32倍的,因此FCN使用了原来classification同样的模型,因此在通过最后7*7点卷积以后,feature map就只有1*1点大小了....也就是说咱们要从1*1点feature map上恢复到原图,虽说它到channel不少,但毫无疑问,它提供的信息时严重不足的,这也无怪乎他得用skip connection了..这里要谈一谈downsample的问题,downsample太多的话会丢失原图的不少信息,毕竟咱们是作pixel级别的分类,因此根据个人经验,通常是8倍或者16倍左右...学习
如今作semantatic segmentation 主要仍是用的deeplab那一套,接下来我准备好好讲一下deeplab这一套方法... 优化
deeplab那篇paper很推荐你们去看一下,他应该基本表明了如今semantic segmentation的state of art的流程了,我分几点说一下吧:rest
1、encoder层:code
encoder层个人理解是把原图downsample的步骤,通常来讲这一步使用的网络是和分类使用的一致的,分类的网络性能越强,最后大效果也就越好,因此如今广泛使用的是resnet(152),这里须要注意的问题就是,传统的classification下采样的倍数太大了,不利于分割,可是咱们又不能不用pretrain-model,由于用了imagenet或者COCO的pretrain model,结果必定会涨。。并且收敛会快不少。这里通用的解决方法是用hole算法,其实说白了,就是使用dilated convlution,在卷积的时候,不是对一块连续的区域卷积,而是跳跃式的,以下图所示:orm
这样作的话有两个好处:
1.pretrain model能够用了,在须要downsample的地方,把全部的卷积变为一个dilation 2的卷积。
2.能够任意的提升感觉野了,只要增长dilation便可,固然,有机会能够说一下,理论上的感觉野不表明实际的感觉野,由于会有不少的重合,因此理论感觉野的中间会对最后的结果影响很大,而边缘地方影响很小,最近有篇paper也提到了这点,有时间放上连接吧。。。PS:所以在将来recepitive filed的研究上,我以为好好解决这个问题是一个不错的思路。
2、decoder层:
和encoder层对应的天然就是decoder层,这个也很好理解,咱们要对pixel作分类,天然就要把图像upsample到原图的大小(或者一半,而后再作biliner upsample),upsample的方法有几类,根据个人经验....都差不了多少,卷积+biliear或者卷积+反卷积或者卷积+unpooling,最后一个在deconvlution那篇paper出现的方法一度让我觉得是通用的方法,直到发现你们开始抛弃pooling的downsample方法之后...不用pooling下采样很好理解,毕竟咱们是作pixel级别的分类,因此仍是用可学习的下采样,上采样的比较好。
另外,decoder层须要注意的事,实际上它并不须要和encoder层同样大,deconvlution那篇paper提出的对称结构确实优雅并且看起来就有理有据,但实际上并非须要这么作的,enet的那篇paper对此作过说明,简单的理解就是:decoder实际上就是对feature map作一个upsample的refine,这个时候网络已经学习到了须要的东西了,毕竟咱们并非要去作一个autoencoder。。。
3、post-processing 后处理
后处理这个东西,其实有点小尴尬,做为刷榜的不二神器,他有两个问题:1.不符合如今不少人对end-to-end的迷之追求。2.太慢了,正常使用的dense crf会比神经网络慢不少,最后的实用场景基本不可能使用。
dense crf的调参也是我不能承受之痛...直到用了同事grid search的暴力调参大法,才结束我那段黑暗的日子....
不扯了,简单的说一下常见的后处理方法-CRF吧,crf做为经典的一个图模型,原本是semantic segmentation的主要方法,直到DL出现...最终沦为了后处理...DL+CRF有着自然的方便,为何这么说了,CRF的优化是要有一个初始化的state的,也就是每一个pixel的unary energy,若是只有label的方法等话,通常也就是用几率和置信度来暴力指定了,但其实神经网络的最后一层通常是softmax,因此咱们彻底能够用softmax的输出做为CRF中unary enargy的初始化,至于pair energy,仍是常规的RGB像素值和XY location值了。
实际上,对于CRF你们是又爱又恨的,因此后面也出现了很多的改进方法,如CRF as RNN,CNN+LSTM这些,实际效果我没试过,但估计是呵呵了,比较期待的是北大的segmodel,看他们在cityscapes上的表现,感受CVPR2017会有一个惊喜..
总结:
平常总结,segmentation是一个很不错的领域,但我的感受你们主要仍是在拼trick和调参技巧,这真是最没意思的行为了。但也很好,给了咱们很多想象的空间,我最近的工做就是receptive filed 、side information上作点文章...但愿能够出点东西吧。加油~