本文记录了博主阅读论文《Depth-Aware CNN for RGB-D Segmentation》的笔记,原文提供代码,更新于2019.03.12。
《Depth-Aware CNN for RGB-D Segmentation》
摘要
卷积神经网络受到了固定网格状的卷积核结构的限制,因此无法处理几何学信息(geometric information)。现有方法要么是用一张额外的图像表示深度,要么是在3D体元(voxels)或点云(point cloud)中处理空间信息。但这样计算量大且内存消耗大。为了解决这个问题,本文中介绍了两种直观、灵活、有效的算子:depth-aware convolution和depth-aware average pooling。在信息传递(propagation)过程中运用像素间的深度相似度,空间信息可以无缝融合进CNN。如此,在不引入任何额外参数的情况下,两种算子都可以很轻松地整合进现有CNN中。
Introduction
将深度信息融入CNN是一项困难但重要的工作,目前已有一些在此方面的研究:(列在下面,如果有阅读笔记后面会有链接指向笔记的博客)
- 《Locality-Sensitive Deconvolution Networks with Gated Fusion for RGB-D Indoor Semantic Segmentation》(2017,阅读笔记)
- 《Indoor Semantic Segmentation using depth information》(2013,阅读笔记)
- 《Geometry Driven Semantic Labeling of Indoor Scenes》(2014,阅读笔记)
- 《Indoor Segmentation and Support Inference from RGBD Images》(2012,阅读笔记)
- 《3d graph neural networks for RGBD semantic segmentation》(2017,阅读笔记)
- 《rgb-d scene labeling: features and algorithms》(2012,阅读笔记)
- 《self-paced cross modality transfer learning for efficient road segmentation》(2017,阅读笔记)
本文中提出了一个用于RGB-D分割任务的端到端Depth-aware CNN(D-CNN)。 其中,Depth-aware convolution算子在普通的卷积上加了一个depth simialrity项,该项强制与核中心位置具有相同深度的像素比其他像素对输出的贡献更大。另一个算子(depth-aware average pooling)则在计算局部区域的均值时考虑了相邻像素之间的深度信息。这两种操作的设计都基于一个假设:具有相同语义标签和相似深度的两个物体之间的相互影响要更多一些(具有相同语义标签的两个像素具有相似的深度)。
如下图所示,像素A和C之间的关联度应该比A和B的关联度要大。
主要贡献:
- 可以将深度图中的集合信息无缝整合进CNN;
- 不增加传统CNN参数和计算量;
- 可以直接替代原来的卷积和池化部分。
Depth-Aware CNN
算子输入:
- 特征图 x ∈ R c i × h × w \mathbf{x}\in\mathbb R^{c_i\times h\times w} x∈Rci×h×w;
- 深度图 D ∈ R h × w \mathbf{D}\in\mathbb R^{h\times w} D∈Rh×w
其中 c i c_i ci是输入特征图的通道数, h h h是高, w w w是宽。
输出: y ∈ R c o × h × w , 其 中 \mathbf{y}\in\mathbb R^{c_o\times h\times w},其中 y∈Rco×h×w,其中c_o$是输出特征通道数。
尽管 x \bf x x和 y \bf y y都是3D张量,但是下面为了简洁在2D空间维度阐述这两个算子。
Depth-Aware Convolution
对于在 y \bf y y上的某个像素位置 p 0 \bf p_0 p0,标准2D卷积的输出是
y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n ) \mathbf{y(p_0)}=\sum_{\mathbf{p}_n\in\mathcal R}\mathbf{w}(\mathbf{p}_n)\cdot \mathbf{x}(\mathbf{p}_0+\mathbf p_n) y(p0)=pn∈R∑w(pn)⋅x(p0+pn)
其中 R \mathcal R R是 x \mathbf x x内在位置 p 0 \bm p_{\bf 0} p0处的局部网格(local grid), w \bf w w是卷积核。
为了描述深度信息,增加了两类权重:
- 可学习的卷积核 m \bf m m;
- 两个像素之间的深度相似度 F D \bm F_{\bf D} FD。
此时,上面的公式就变成了
y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ F D ( p 0 , p 0 + p n ) ⋅ x ( p 0 + p n ) \mathbf{y(p_0)}=\sum_{\mathbf{p}_n\in\mathcal R}\mathbf{w}(\mathbf{p}_n)\cdot \bm F_{\mathbf D}(\mathbf{p_0,p_0+}\mathbf p_n)\cdot \mathbf{x}(\mathbf{p}_0+\mathbf p_n) y(p0)=pn∈R∑w(pn)⋅FD(p0,p0+pn)⋅x(p0+pn)
其中 F D ( p i , p j ) \bm F_{\mathbf D}(\mathbf p_i, \mathbf p_j) FD(pi,pj)定义为
F D ( p i , p j ) = exp ( − α ∣ D ( p i ) − D ( p j ) ) \bm F_{\mathbf D}(\mathbf p_i,\mathbf p_j)=\text{exp}(-\alpha\vert\mathbf D(\mathbf p_i)-\mathbf D(\mathbf p_j)) FD(pi,pj)=exp(−α∣D(pi)−D(pj))
其中 α \alpha α是一个常数。需要注意的是, F D \bm F_{\mathbf D} FD不需要反向传播梯度,因此上式不引入额外的参数。
下图(a)显示了这个过程:
Depth-Aware Average Pooling
卷积中用到的平均池化(average pooling)计算的是 x \bf x x在网格 R \mathcal R R中的均值,定义如下式:
y ( p 0 ) = 1 ∣ R ∣ ∑ p n ∈ R x ( p 0 + p n ) \mathbf y(\mathbf p_0)=\frac{1}{\vert \mathcal R\vert}\sum_{\mathbf p_n\in \mathcal R}\mathbf x(\mathbf p_0+\mathbf p_n) y(p0)=∣R∣1pn∈R∑x(p0+pn)
这种方法将所有的像素等同看待,因此会导致目标边缘的模糊。几何信息就可以用来解决这个问题。
与depth-aware convolution相似,这里也利用深度信息 F D \bm F_{\mathbf D} FD迫使几何信息关系更紧密的点对输出的贡献更大。对于每个在位置 p 0 \bm p_{\bf 0} p0的像素点,depth-aware average pooling操作定义如下:
y ( p 0 ) = 1 ∑ p n ∈ R F D ( p 0 , p 0 + p n ) ∑ p n ∈ R F D ( p 0 , p 0 + p n ) ⋅ x ( p 0 + p n ) \mathbf y(\mathbf p_0)=\frac{1}{\sum_{\mathbf p_n\in\mathcal R}\bm F_\mathbf D(\mathbf p_0, \mathbf p_0+\mathbf p_n)}\sum_{\mathbf p_n \in \mathcal R}\bm F_{\mathbf D}(\mathbf p_0,\mathbf p_0+\mathbf p_n)\cdot \mathbf x(\mathbf p_0+\mathbf p_n) y(p0)=∑pn∈RFD(p0,p0+pn)1pn∈R∑FD(p0,p0+pn)⋅x(p0+pn)
在反向传播过程中,梯度应当乘以 F D ∑ p n ∈ R F D ( p 0 , p 0 + p n ) \frac{F_\mathbf D}{\sum_{\mathbf p_n\in \mathcal R}F_{\mathbf D}(\mathbf p_0,\mathbf p_0+\mathbf p_n)} ∑pn∈RFD(p0,p0+pn)FD。
如上图(b)所示,这种操作能够改善标准池化中固定空间结构的问题。
Understanding Depth-Aware CNN
基于point cloud的模型基于的是kNN,这种方式不仅计算量大,而且破坏了RGB图像与深度图像之间的像素间关系,这就使得这些网络没有办法利用CNN网格计算的有效性。
这一部分作者给出了几种网络的结论及分析,包括Dilated convolution、deformable CNN等。作者也观察到了语义标签与深度之间有很高的关联性。
后面会介绍不同深度相似度函数
F
D
F_{\bf D}
FD对结果的影响。
下图显示了给定neuron下的有效感受野,用以展示depth-aware CNN是如何从深度中捕获几何信息的。在传统CNN中,感受野和采样位置是固定的,但是在包含了depth-aware term后,这些是随着几何方差(geometric variance)变化的。例如,在下图中的最后一列,绿色的点被标注成chair,其对应的感受野也主要是chair points。
Depth-Aware CNN for RGB-D Semantic Segmentation
所提的这两个term都可以直接用于现存网络结构,下表是实验结果。
用VGG-16作为编码器,用DeepLab作为基准。将VGG-16中的层替换成depth-aware operations。假设层 c o n v 7 conv 7 conv7有 C C C个通道,参考[26]的做法,用gloabl pooling从 c o n v 7 conv 7 conv7中计算得到一个 C C C维的向量。这个向量随后被附加到所有空间位置上,最后得到一个 2 C 2C 2C通道的特征图。这个特征图后面跟了一个 1 × 1 1\times1 1×1的卷积层,最终生成分割概率图。
Experiments
评估基于流行RGB-D数据库;
- NYUv2:包括1499张RGB-D图片(像素级标签)。这里采用的是40个类别的设定,795张训练图片,654张测试图片。
- SUN-RGBD:有37个目标类别,包括10355张RGB-D图片,用5285张训练,5050张测试。
- Stanford Indoor Dataset (SID):包括70496张RGB-D图片,13个类别。用Area 1, 2, 3, 4, 6训练,用Area 5测试。
用了四个常用度量:
- Acc: pixel accuracy
- mACC: mean pixel accuracy of different categories
- mIoU: mean Intersection-over-Union of different categories
- fwIoU: frequency-weighted IoU
假设有 n i j n_{ij} nij个真值为类别 i i i的像素点被判断成了类别 j j j, n C n_C nC是所有类别的个数, s i s_i si是真值为类别 i i i的像素点数,所有像素点的总数为 s = ∑ i s i s=\sum_is_i s=∑isi。上述的四个度量分别定义为:
Acc
=
∑
i
n
i
i
s
\text{Acc}=\sum_i\frac{n_{ii}}{s}
Acc=i∑snii
mAcc
=
1
n
C
∑
i
n
i
i
s
i
\text{mAcc}=\frac{1}{n_C}\sum_i\frac{n_{ii}}{s_i}
mAcc=nC1i∑sinii
mIoU
=
1
n
C
∑
i
n
i
i
s
i
+
∑
j
n
j
i
−
n
i
i
\text{mIoU}=\frac{1}{n_C}\sum_i\frac{n_{ii}}{s_i+\sum_jn_{ji}-n_{ii}}
mIoU=nC1i∑si+∑jnji−niinii
fwIoU
=
1
s
∑
i
s
i
n
i
i
s
i
+
∑
j
n
j
i
−
n
i
i
\text{fwIoU} = \frac{1}{s}\sum_is_i\frac{n_{ii}}{s_i+\sum_jn_{ji}-n_{ii}}
fwIoU=s1i∑sisi+∑jnji−niinii
实施细节
用修改过的VGG-16当作编码器的DeepLab作为基础网络结构(文中称为D-CNN),同时也实验了结合HHA的并行网络结构(称为“HHA”),再将其融合depth-aware operations变成D-CNN+HHA。在消融实验中,还对VGG-16应用了ResNet-50。
用SGD optimizer,初始学习率0.001,动量0.9,batch size 1。每10次迭代,学习率乘以 ( 1 − i t e r m a x i t e r ) 0.9 (1-\frac{iter}{max_iter})^{0.9} (1−maxiteriter)0.9, α \alpha α设定为8.3( α \alpha α的影响后面会说到)。 数据集扩张用了随机尺度缩放、截取和色彩抖动(color jittering)。用PyTorch深度学习框架。两种算子都用了CUDA加速。
主要结果
在NYUv2和SUN-RGBD两个数据库上与基准和state-of-the-art比较,在SID上与基准比较。
下表是在NYUv2数据库下的比较,所有网络都是train from scratch。
下表中用的DeepLab的预训练得到的参数初始化。
[28] [8] [12] [26] [20]
DM-CNN-HHA:将Conv1、Conv2、Conv3中的max pooling layers替换成depth-aware max-pooling。
下表是在SUN-RGBD下的比较。
下表是在SID下的比较。
Ablation Study
Depth Similarity Function
修改 α \alpha α和 F D F_{\mathbf D} FD以验证不同depth similarity function对结果的影响,共实施了下面几种设置:
- α 8.3 \alpha_{8.3} α8.3:将 α \alpha α设置成8.3,网络结构与Table2相同。
- α 20 \alpha_{20} α20:将 α \alpha α设置成20,网络结构与Table2相同。
- α 2.5 \alpha_{2.5} α2.5:将 α \alpha α设置成2.5,网络结构与Table2相同。
- clip F D \text{clip}F_{\mathbf D} clipFD:网络结构与Table2相同, F D F_{\mathbf D} FD定义如下
F D ( p i , p j ) = { 0 , ∣ D ( p i ) − D ( p j ) ∣ 1 , otherwise F_{\mathbf D}(\mathbf p_i,\mathbf p_j)=\begin{cases} 0, & \vert\mathbf D(\mathbf p_i)-\mathbf D(\mathbf p_j)\vert \\ 1,& \text{otherwise} \end{cases} FD(pi,pj)={0,1,∣D(pi)−D(pj)∣otherwise
下表是结果
模型复杂度和运行时间分析
加入星球了解更多分割知识: