手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

deeplab相关理解

时间:2021/5/19 22:38:22|来源:|点击: 次

前面这一段是我写的关于卷积和转置卷积的一些总结https://mp.csdn.net/editor/html/116109041。接下来我们讨论以下膨胀卷积。这个链接是老师关于膨胀卷积的一些讨论:https://zhuanlan.zhihu.com/p/372753977。

膨胀卷积和普通卷积不一样,膨胀卷积是对kernel元素之间进行空间插入。膨胀率往往是一个超参数d,然后有d-1个空格被插入kernel元素中。d=1的时候就对应我们的常规卷积操作。膨胀卷积用来在不增大kernelsize的情况下简单的扩大感受野,这在多个扩展卷积一个接一个堆叠时特别有效。

使用了膨胀卷积之后的输入尺寸和输入尺寸的关系还是比较好理解的。我们可以先把他想象成普通的kernel并计算出对应普通kernel的大小然后把kernelsize带进去就能够算出他们之间的关系了。(我们知道膨胀实际上是kernel之间插入d-1个空格。那么对应的传统kernel大小可以写成k+(k-1)*(d-1))

最后带入传统的卷积计算公式得到如下关系。

那么膨胀卷积在图像分割如何使用呢。我们知道像fcn和unet那种模型。都是要先通过pooling降低分辨率(pooling的实际作用是降低了分辨率减小了计算量同时扩大了感受野),然后在用transconv上采样回来原来的大小。这种做法实际上会损失一部分信息降低定位精度(pooling相当于认为设定在4个点中取一个点肯定会损失一些信息)。而deeplab模型是直接用膨胀卷积来代替pooling+transconv的操作,进行padding能够保证分辨率大小不变同时达到了pooling扩大感受野和pooling的减少计算量提速的效果。

那么deeplab中如何使用膨胀卷积呢。我们以vgg基础上使用为例(为什么不直接用ac->ac->ac多个膨胀卷积串联呢理论上可以但是实际效果不是很好,我们传统网络如vgg有预训练的参数所以直接拿过来用训练效果比较好)。

如图这个是一个传统的vgg模型。传统的vgg模型经过过了8次 pooling然后接全链接层,进行分类的。deeplab在次基础上做了一些调整。如图28*28尺度的时候也就是缩小了8倍的时候,deeplab的做法是不在进行缩小了,因为如果继续缩小会丢失更多的细节信息。而是使用膨胀卷积来代替。把原来14*14那里的换成dialation=2的膨胀卷积,把原来7*7那里的换成dialation=4的膨胀卷积,这里注意一下maxpooling并没有被移除掉,而是把原来的maxpooling的stride=2改成了stride=1。

我认为这里第3个第4个还是原来的conv?(没有确认,后面确认后在改下这里),然后接一个d=4的conv。最后把相应的全链接改成全卷积。最终得到28*28的特征图,直接进行双线性插值上采样8倍(这里和fcn相比28*28的特征图是更加精细的所以可以直接上采样8倍)。最后将上采样8倍后的结果利用条件随机场CRF进行处理得到最终结果。

那么CRF该如何理解呢。(虽然CRF在deeplab++后就被取消掉了。我的理解是CRF是传统的机器学习的过程,而前面的DCNN+双线性插值是我们提取特征的过程,先提取出特征再用CRF左处理得到最终比较精细的分割结果)

E(x)是一个能量场。表示的是指取groudtruth的时候各个像素取对应类别的时候的联合概率的一个能量,能量越小越接近真实。我们发现E(x)由两部分组成。前一项是theta的一个累加值,一个thetai是指在i位置取对应类别的概率(这个概率是前面dcnn求得的特征图得到的,特征图是一个w*h*类别的tensor),根据log的加法实际上是将里面的值进行连乘,所以就是所有像素取对应类别同时发生的一种概率情况。(这里有个问题待讨论:这里的dcnn是训练好了的?我们直接拿求得的特征值来用的?还是在求这个能量的时候要同时进行优化的?)。这个公式还有第二项,第二项里面是求不同像素点直接建立的一种关系(i=j的时候是取0的),这里的w1,w2也是可训练的,然后我们看到公式里面有pi-pj这个是考虑进两个像素点之间的位置距离,Ii-Ij是考虑进两个像素点之间的灰度值差距。(所以我们这里公式要求的是不是只是w1,w2呢?关于crf的理解也可以参考老师的这个链接https://zhuanlan.zhihu.com/p/372759285)

作者在deeplabv1的时候已经做了一系列的实验,实验结果如下图

我们发现使用MSC(多尺度融合)以及dcnn的时候使用7*7(这里是指没有用4*4或3*3加速)的卷积以及使用largefov(大感受野,其实就是用更大的膨胀卷积)能够取得更好的性能。其中更大的膨胀卷积能够取得和7*7一样的效果(这里直接inputstride=12了)。所以作者在做v2的时候结合了这样的实验结论做了优化。总结来说做了以下几点

  1. aspp,采用了多个尺寸的膨胀卷积进行融合操作(参考了spp),集合了上面结论(largeFov和Msc的效果)
  2. 将vgg改成用resnet来代替
  3. 训练策略改变。使用的学习率下降公式做了调整

如图在用膨胀卷积的时候用了不同的rate,输入是一个m*m*c的特征图,最后输出也是一个m*m*c的特征图

训练策略上对学习率的公式做了调整。学习率的更新每次乘以这个系数

我们发现在deeplabv2的时候作者依然没有舍弃掉crf这一步操作。到deeplabv3的时候则彻底舍弃了这一步

先截一个栅格化的图,这个是膨胀的时候直接2,2,2串联导致的。我们前面提到膨胀卷积d=2的时候前面必定要有一个d=1的,这样在d=2的那一层才不会出现空洞。所以这里引入了multigrid概念。v3和v2的变化主要是充分利用了resnet,然后用了multigrid概念,不在用crf

如图使用的是resnet101

 

Copyright © 2002-2019 某某自媒体运营 版权所有