如使用point cloud表示, S ( p 1 , p 2 , ⋅ ⋅ ⋅ , p N ) S(p_1,p_2,···,p_N) S(p1,p2,⋅⋅⋅,pN)其中, N N N表示点的数量, p i = ( p i 1 , p i 2 , p i 3 ) p_i=(p_{i1},p_{i2},p_{i3}) pi=(pi1,pi2,pi3)表示各点坐标,那么 S S S的数据量为 3 N 3N 3N.
如使用dense grid表示,假设空间大小为 M ∗ M ∗ M M*M*M M∗M∗M,则数据量大小为 M 3 M^3 M3
一般情况下, M 3 > 3 N M^3>3N M3>3N,所以Point Cloud效率更高?
f i i = f i i i f_{ii}=f{iii} fii=fiii,但二者形状不同,故CNNs会丢失形状信息; f i i i ≠ f i v f_{iii} \neq f{iv} fiii̸=fiv,但其实二者代表的是统一形状,只是顺序不同,说明CNNs无法适应不同点集顺序。
论文学习笔记(一) PointCNNAbstract1 Introduction2 Related Work3 PointCNN
论文学习笔记(一) PointCNNAbstract1 Introduction2 Related Work3 PointCNN
X-transformation.
\qquad 从K个输入点中学习一个K×K的矩阵:
X = M L P ( p 1 , p 2 , . . . , p K ) X={\rm {MLP}}(p_1,p_2,...,p_K) X=MLP(p1,p2,...,pK)
论文学习笔记(一) PointCNNAbstract1 Introduction2 Related Work3 PointCNN
关于这一段的理解:
X i i X_{ii} Xii和 X i i i X_{iii} Xiii从不同形状的点集中学习得到,故可以使得 f i i f_{ii} fii与 f i i i f_{iii} fiii不同;
通过学习得到的 X i i i X_{iii} Xiii可能等于 X i v × π X_{iv}\times\pi Xiv×π,且 π × [ f a , f b , f c , f d ] T = [ f c , f a , f b , f d ] T \pi\times[f_a,f_b,f_c,f_d]^T=[f_c,f_a,f_b,f_d]^T π×[fa,fb,fc,fd]T=[fc,fa,fb,fd]T,所以使得 f i i i = f i v f_{iii}=f_{iv} fiii=fiv.
X-Conv参考CNNs分层结构的思想,将输入点集映射或聚合到下一层,“less and less points, richer and richer features”.
需要注意的是, F 2 F_2 F2基于的点集( p 2 p_2 p2)并不一定要求是 F 1 F_1 F1基于的点集的子集( p 1 p_1 p1).但在本文实现中,使用的都是采样的方法(所以都是子集):分类任务,使用随机下采样方法获得 p 2 p_2 p2;而分割任务中,使用FPS(最远点采样法)。
作者提到,他们认为一些代表点生成算法可能更加有效,如Deep Points。
3.2 X-Conv Operator
X-Conv使用 p 2 p_2 p2在 p 1 p_1 p1中的邻近点集作为输入
N \Bbb N N是 p 2 p_2 p2在 p 1 p_1 p1中的邻近点集。从 N \Bbb N N中采样 K K K个点,得到X-Conv的输入 S \Bbb S S。 S \Bbb S S是一个无序点集,可以表示为 [ P K × D ∣ F K × C 1 ] [P_{K\times D}|F_{K\times {C_1}}] [PK×D∣FK×C1] 进而,可以得到,X-Conv中的trainable kernel是一个tensor K \bf K K,其大小为 K × ( C 1 + C δ ) × C 2 K\times (C_1+C_\delta)\times C_2 K×(C1+Cδ)×C2.
X-Conv算法描述
输入: K K K - trainable kernel
p p p - 映射/聚合标点
P P P - 输入点集
F F F - 输入点的特征集
输出: F p F_p Fp - 映射/聚合到 p p p的特征
步骤:
将输入点集 P P P中各点坐标迁移到以点 p p p为原点的相对坐标系,得到点集合 P ′ P^′ P′;
通过MLP将 P ‘ P` P‘中每个点映射到高维空间 δ \delta δ中,得到特征矩阵 F δ F_\delta Fδ;
将输入点的特征集 F F F和上一步得到的特征矩阵 F δ F_\delta Fδ直接拼接,得到新的特征矩阵 F ∗ F_* F∗;
使用MLP从点集合 P ′ P^′ P′中学习到一个K×K大小的变换矩阵 X X X;
使用变换矩阵 X X X对特征矩阵 F ∗ F_* F∗进行矩阵变换(加权&排序),得到特征矩阵 F X F_X FX;
上文中提到,X-Conv的kernel size为 K × ( C 1 + C δ ) × C 2 K\times (C_1+C_\delta)\times C_2 K×(C1+Cδ)×C2,其参数量主要受 K K K影响,与CNNs中的平方和3D-CNNs中的立方相比,具有稀疏性。可以节省内存和算力。Sparse kernel的一个好处是可以在不显著增加参数数量的情况下耦合较远距离信息。
\quad 定义每个代表性点的感知野为 K / N K/N K/N,其中 K K K代表近邻点数, N N N代表上一层的总点数。 K / N = 1 K/N=1 K/N=1意味着本层的代表点get到了上一层的全局信息。
论文学习笔记(一) PointCNNAbstract1 Introduction2 Related Work3 PointCNN
分类网络结构
\qquad 论文中,作者给出了两款用于完成分类任务的网络结构,Figure 4(a) 和 Figure 4(b).(a)中给出的网络结构采样数下降过快,导致X-Conv层不能被充分训练。作者为了改进此问题,提出了(b)结构,旨在控制网络深度的同时兼顾感知野的增长速度,使模型具有"see larger and larger"的能力。
\qquad 借鉴CNNs中膨胀卷积的思想,作者也引入了膨胀因子 D D D。具体做法是从 K × D K×D K×D个近邻点中均匀采样得到最后的K个近邻点。这样使得在不增加近邻点数量,也就是没有增大kernel size的情况下,将感知野从 K / D K/D K/D增大到 ( K × D ) / N (K\times D)/N (K×D)/N。如图(b)所示,在fc层之前的4个代表点都可以看到整个形状,所以它们都具有进行预测的能力。
f ( x ) = { x , if x > 0 α ( e x − 1 ) , if x ≤ 0 f(x) = \begin{cases} x, & \text{if $x>0$} \\ \alpha(e^x-1), & \text{if $x\leq0$} \end{cases} f(x)={x,α(ex−1),if x>0if x≤0
f ′ ( x ) = { 1 , if x > 0 α + f ( x ) , if x ≤ 0 f^′(x) = \begin{cases} 1, & \text{if $x>0$} \\ \alpha+f(x), & \text{if $x\leq0$} \end{cases} f′(x)={1,α+f(x),if x>0if x≤0
论文学习笔记(一) PointCNNAbstract1 Introduction2 Related Work3 PointCNN
\quad 2. BN层的使用。在 P ′ P^′ P′、 F p F_p Fp和全连接层(最后一层除外)上采用了批归一化。但没有用在MLP δ _\delta δ和MLP上,因为 F ∗ F_* F∗和 X X X,尤其是 X X X,旨在实现对特殊代表点的特定表示。