对于编码器与解码器的理解

知乎上的一篇文章

SegNet是一个由剑桥大学团队开发的图像分割的开源项目,该项目可以对图像中的物体所在区域进行分割,例如车,马路,行人等,并且精确到像素级别。图像分割的实现由一个卷积神经网络构成,该网络主要有两部分组成:encoder与decoder。encoder是一个沿用VGG16的网络模型,主要对物体信息进行解析。decoder将解析后的信息对应成最终的图像形式,即每个像素都用对应其物体信息的颜色(或者是label)来表示。后面章节会对SegNet的模型进行详解。但是由于SegNet是一个主要由卷基层组成像素处理级的网络,对于像FPGA这类移动设备来说,计算量还是有些大。在选取处理速度和计算量的平衡当中,我们在选择使用另一个轻量级的SegNet实现,使用此实现加上我们的AI芯片DV700,可以在FPGA上运行。

对于编码器与解码器的理解_第1张图片
如上图所示,SegNet是一个由encoder(左)和decoder(右)组成的对称网络。输入一张RGB图像后,网络根据图像中物体的语义信息,把图像中的物体进行分类(例如,“马路”,“汽车”, “楼房”等),最后生成一张分割图像。

Encoder

虽然有着一个高大上的名字,但是encoder本身其实就是一连串的卷积网络。该网络主要由卷基层,池化层和BatchNormalization层组成。卷基层负责获取图像局域特征,池化层对图像进行下采样并且将尺度不变特征传送到下一层,而BN主要对训练图像的分布归一化,加速学习。

概括地说,encoder对图像的低级局域像素值进行归类与分析,从而获得高阶语义信息(“汽车”, “马路”,“行人”),Decoder收集这些语义信息,并将同一物体对应到相应的像素点上,每个物体都用不同的颜色表示。

Decoder

既然Encoder已经获取了所有的物体信息与大致的位置信息,那么下一步就需要将这些物体对应到具体的像素点上了。这一系列工作是由Decoder完成。Decoder对缩小后的特征图像进行上采样,然后对上采样后的图像进行卷积处理,目的是完善物体的几何形状,弥补Encoder当中池化层将物体缩小造成的细节损失。

换一个角度理解Encoder+Decoder

让我们换一个角度尝试理解这个过程。假设你有一本菜谱,这本菜谱有很多章节,每个章节都是文字描写如何烹饪不同的菜。现在我们讲所有文字输入到SegNet当中,注意此时SegNet接收到的只是文字信息,它并不知道这本菜谱的构成。Encoder所做的就是它能理解这本菜谱的结构,对其中的内容进行抽象,形成一些高阶的信息(比如描述做了什么菜),并将这些信息对应到一个简化的空间里。Decoder对这些简化的高阶信息进行理解与编译,并且对相同语义相近的文字进行分类并对应到具体的菜式上面(比如:凉菜,面食,鱼,肉等)。这样以来,仅从文字上,我们就可以大概知道这是描述哪个菜式了,可能是凉菜,也可能是面食。换句话说,你不仅能获得菜式信息,并且可以知道这些菜式对应的是哪一个章节,哪些字句,是不是很棒?

再回到图像的例子当中,Encoder对图像进行分析,弄清某一区域是什么物体,然后Decoder来寻找这个物体对应的是原图像当中的哪些像素点。这样,一个图像就被分割完成了!

Convolution Layer in Encoder and Decoder

我们可以看到在Encoder和Decoder中都存在卷积层。他们在算法上一模一样,但是在作用上有一点不同。Encoder阶段,卷基层的主要作用就是获取图像的局部信息,并传送给池化层,然后由2x2最大池化处理,把最大值特征再次传递到下一层。所以在这部分当中,Convolution+Pooling的主要作用从图像中获取信息。

与此相反,Decoder阶段的处理是将特征层进行上采样,然后交给卷基层进行处理。上采样后的2x2区域只有一个前一层传来的1x1特征点,其余区域都是空值,因此这些空值需要被填补成适当的特征值,来让这个区域变得完整并且平滑。这个工作就是由卷基层担任的。所以位于Decoder当中的卷积层的作用是对图像进行“填补”。

一句话总结,两个阶段的卷积层在计算上是完全一样的,但是表现出的结果是有差异的。有些人根据此差异,将Encoder阶段的卷积命名为“卷积”,Decoder阶段的卷积命名为“反卷积“(或”转置卷积“),但实际上进行的处理是一样的。

你可能感兴趣的:(计算机视觉,深度学习)