论文笔记:Learning Region Features for Object Detection

中心思想

继Relation Network实现可学习的nms之后,MSRA的大佬们觉得目标检测器依然不够fully learnable,这篇文章类似之前的Deformable ROI Pooling,主要在ROI特征的组织上做文章,文章总结了现有的各种ROI Pooling变体,提出了一个统一的数学表达式,藉由这个表达式,提出完全可学习,无人工设计的Region特征,据Han Hu大佬的讲座所说,这篇文章现在只是提出了一种行得通的方案,还没有研究清楚,性能比Deformable Conv那篇文章稍差一点点。

Region特征提取的总结和统一表达

一般地,region feature \(\mathbf{y}(b)\)的提取可以统一表达为如下的公式:
\[\mathbf{y}(b) = \text{RegionFeat}(\mathbf{x}, b)\]
这里x指的是输入特征,b是bbox。\(\mathbf{y}(b)\)的维度是\(K\times C_f\),通道数与输入特征一般相同,为\(C_f\)。注意,要特别关注自变量包含哪些东西,这里x是指整张特征图,而不只是box内的特征,譬如在Deformable ROI Pooling中就用到了box之外的特征。这个式子可以具体地表达为:
\[\mathbf{y}_k(b) = \sum_{p \in \Omega_b}w_k(b,p,\mathbf{x})\odot \mathbf{x}(p)\]
其中,\(\Omega_b\)表示支撑区域“supporting region”,也就是Pooling所用到的区域,p为区域中的每个位置,\(\odot\)表示element-wise相乘,k表示pooling后的第k个位置。也就是说,pooling后的每个位置,都是\(\Omega_b\)中每个位置的加权平均。
最原始的RoI Pooling,作者称之为Regular RoI Pooling,
\[w_k(b, p) = \begin{cases} 1/|R_{bk}| & \text{ if $p \in R_{bk}$} \\ 0 & \text{else} \end{cases}\]
其中,\(R_{bk}\)是第k个bin的所有位置的几何。这种pooling的缺点是:由于空间上的下采样,难以区分非常靠近的RoIs。譬如,输入特征一般比原图缩小了16倍,如果两个RoI的距离小于16个像素,那么它们的\(R_{bk}\)完全相同,特征也就完全相同。
SPPNet中提出的Spatial Pyramid Pooling,跟原始RoI Pooling差不多,只是用了好几种bin的划分。
Aligned ROI Pooling,
\[w_k(b, p) = g(u_p, u_{bk}) \cdot g(v_p, v_{bk})\]
其中,\(g(a,b) = \max(0, 1-|a-b|)\))表示一维的双线性插值核,\((u_{bk}, v_{bk})\)表示每个bin的中心点,\(p=(u_p,v_p)\)表示整数坐标。比较好理解,就是对于某个浮点坐标,考虑其与四个相邻整数坐标的距离,再进行加权。注意,以上几种Pooling方式,权重都只是依赖几何信息,并不依赖输入特征本身。

Deformable RoI pooling为每个bin的中心学习一个偏移量\((\delta u_{bk}, \delta v_{bk})\)
\[w_k(b,p,\mathbf{x}) = g(u_p, u_{bk} + \delta u_{bk}) \cdot g(v_p, v_{bk} + \delta v_{bk})\]
PSRoI Pooling,与原始RoI Pooling不同的是,每个bin仅与输入特征通道的某个子集相关,可以表达为
\[\mathbf{y}_k(b) = \sum_{p \in \Omega_b}w_k(b,p,\mathbf{x}_k)\odot \mathbf{x}_k(p)\]
其中,\(\mathbf{x}_k\)仅包含x在通道轴上的某个子集,具体依据k来决定。

学习Region Features

重点来了,说了这么多,上面的各种变体说到底都是完全hand-crafted的。即使Deformable RoI pooling引入了一个可学习的组件,但其形式也很大程度上受限于一个规则的网络。本文的目标就是最大限度地减少手工的设计。

直觉上,影响\(w_k\)的因素有二:一是位置p与RoI box b的几何关系,例如,b内部的位置理应具有较高的权重;二是图像特征x应自适应地使用,这一点Deformable中已经做到了。因此,使用下列式子对\(w_k\)进行建模:
\[w_k(b,p,\mathbf{x}) \propto \exp(G_k(b,p)+A_k(\mathbf{x},p))\]
其中,第一项用来捕捉几何关系:
\[G_k(b,p) = \langle W^{\text{box}}_{k}\cdot \mathcal{E}^{\text{box}}(b), W^{\text{im}}\cdot \mathcal{E}^{\text{im}}(p) \rangle\]
这个式子分三步进行。首先,将box和图像坐标嵌入到一个高维空间中(Relation Network中也有类似操作)。
\[\mathcal{E}_{2i}(z) = \sin \Large ( \frac{z}{1000^{2i/C_{\mathcal{E}}}} \Large ), \quad \mathcal{E}_{2i+1}(z) = \cos \Large (\frac{z}{1000^{2i/C_{\mathcal{E}}}} \Large )\]
这个操作确实说不出太多道理,作者也说了这问题还没研究清楚。z是一个标量,ε(z)是一个\(C_ε\)维的向量,下标i的取值范围为0至\(C_ε/2-1\)。经过这一操作,一个图像坐标p的高维空间嵌入\(ε^im (p)\)的维度是\(2C_ε\),一个box b的高维空间嵌入\(ε^box (b)\)的维度是\(4C_ε\)

而后,使用\(W^{\text{box}}_{k}\)\(W^{\text{im}}_{k}\)分别对上面的两个向量作线性变换,变换到同一维度\(C_g\)。注意,这里k的数值是比较大的,一般是7×7,实例分割任务中甚至会取14×14,这样搞下来可学习的参数会比较多,所以作者寻思着共享一部分参数,\(W^{\text{box}}_k = \hat{W}^{\text{box}}_k V^{\text{box}}\)\(V^{\text{box}}\)没有下标k,所以是共享的,这样做也是比较符合直觉的,在保证输出维度不变的前提下能减少很多参数。

第二项使用图像特征,跟Deformable那篇是一样的,
\[A_k(\mathbf{x},p) = W^{\text{app}}_k \cdot \mathbf{x}(p)\]
\(W^{\text{app}}_k\)代表1×1卷积核的权重。

高效实现

上面这一系列骚操作,乍一看是非常费劲的。但仔细分析之下可以看到,\(A_k(\mathbf{x},p)\)\(W^{\text{im}}\cdot \mathcal{E}^{\text{im}}(p)\)的计算对所有的RoI是可复用的。所以计算量主要来自计算权重时要跟特征图上的所有点两两进行计算,所以数量级是HW,可以去看原论文中的表,这里就不贴出来了,如果用这种naive的实现方式,计算量惊人。怎么办呢?很显然应该从HW上下手,手法是很符合直觉的,就是在RoI内部密集采样,而在RoI外部稀疏采样。如下图所示,数量级可以下降100倍左右!但个人认为不是所有的RoI都需要计算,因为一般只选取k个RoI进入到第二阶段,不选的就不必计算了,论文里好像没写这个,不过代码里想必是实现了的。