【图像分割模型】用BRNN做分割—ReSeg
这是专栏《图像分割模型》的第9篇文章。在这里,我们将共同探索解决分割问题的主流网络结构和设计思想。
尽管许多人都知道RNN在处理上下文上多优于CNN,但如何将RNN用于分割任务还是值得讨论一下。本文我们就来聊聊用BRNN做分割的ReSeg。
作者 | 孙叔桥
编辑 | 言有三
本期论文
《ReSeg: A Recurrent Neural Network-based Model for Semantic Segmentation》
1 简单说说BRNN
(1) 什么是循环神经网络
不同于卷积神经网络(CNN,Convolutional Neural Network)通常以图块(patches)为输入,循环神经网络(RNN,Recurrent Neural Network)的输入是序列形式的。即使在处理图像时,通常也需要对图像矩阵进行展开(flatten)操作,再应用RNN。输入序列数据后,RNN在序列的演进方向递归所有节点,并将其定向链式连接。
下图是一个简单的RNN单元示意图:
(2) 为什么要用RNN
尽管CNN在处理多维数据(如图像)时的表现相当不错,但是其需要依赖人工指定的核函数来完成计算,因此在处理上下文信息的时候受到了限制。相反,RNN本身拓扑结构的设计,使得其能够利用内部记忆处理任意时序的输入序列,从而在长短时间间隔序列的处理上比CNN更具优势。
(3) 什么是BRNN
BRNN是双向循环神经网络(Bi-directional RNN)的缩写,属于循环神经网络的一种。基础RNN只能依据之前时刻的时序信息来预测下一时刻的输出,但是有些问题中需要联系上之前和未来状态,共同进行预测。BRNN由两个方向不同的RNN堆叠而成,同时处理过去和未来信息。下图是BRNN的示意图:
2 ReSeg:用BRNN做分割
ReSeg是基于图像分割模型ReNet提出的。因此,我们首先来看一下ReNet。下图是ReNet的运算示意图:
如图所示,ReNet由两层顺序排列的RNN构成。在给定输入图像(或前层)特征后,ReNet对展开结果分别按列、按行扫描。每个扫描过程由两个相反方向的RNN运算单元实现。具体公式如下:
其中f代表RNN,I为图像子块行数(图像被分割成IxJ块),o是结果,z为之前的状态,p为子图块内的像素点。
给定输入图像后,ReSeg首先用预训练好的VGG-16提取图像的特征,随后开始应用基于SeNet的网络结构进行分割任务。具体网络结构如下图所示:
从网络结构可以看出,ReSeg应用了3次串联的完整ReNet模块,空间分辨率在这个过程中逐渐减小。这么做的目的是,将VGG-16提取的特征进行进一步的处理,从而得到对输入图像更复杂的特征描述。
特征提取结束后,特征图对输入图像的空间分辨率下降为1/8,因此需要恢复空间分辨率以得到稠密的分割结果。因此,在所有ReNet模块结束后,ReSeg应用了若干层由反卷积组成的上采样层,将特征图的空间分辨率恢复成原始输入图像的空间分辨率。
最后,简单应用softmax实现分割。
3 实验结果
ReSeg的实验用到了三个数据库,分别是Weizmann Horses、Oxford Flowers和CamVid。其中,前两个数据库比CamVid要容易一些,因此这里只讨论CamVid下ReSeg的表现,感兴趣的读者可以移步原文看ReSeg在其他数据库下的实验结果。
下表是ReSeg在CamVid数据库下对不同类别的分割结果以及与其他算法的效果比较。
下图是ReSeg在CamVid下的分割结果图:
从左到右:输入、真值、ReSeg结果、带类别平衡的ReSeg结果
本专栏作者维护的深度学习图像分割星球上线了,欢迎大家参与学习与讨论
总结
尽管ReNet和ReSeg的提出时间较早,分割效果相比较state-of-the-art算法也略有不足。但是,其提供的模型设计与卷积操作上的思路是非常新颖的,同时也巧妙地用GRU解决了RNN梯度消失问题,因此对于分割任务的网络设计具有一定的启发性作用。
下期我们继续RNN的讨论,看看如何在ReNet的基础上处理长程上下文信息下的分割问题。下回见!
今晚直播
今日看图猜技术
有三AI生态