记一下PointNet和PointNet++的实现细节
PointNet
T1=InputTransformNet(I0)I1=I0⋅T1I2=conv2d(I1,channels=64)I2=conv2d(I2,channels=64)I2[N×64]T2=FeatureTransformNet(I2)I3=I2⋅T2I4=conv2d(I3,channels=64)I4=conv2d(I4,channels=128)I4=conv2d(I4,channels=1024)I4[N×1024]I5=MaxPool2d(I4,output=N×1) \begin{aligned} T1&=InputTransformNet(I_0) \\ I_1&=I_0\cdot T_1 \\ I_2&=conv2d(I_1,channels=64) \\ I_2&=conv2d(I_2,channels=64) & I_2[N\times 64]\\ T_2&=FeatureTransformNet(I_2) \\ I_3&=I_2\cdot T_2 \\ I_4&=conv2d(I_3,channels=64) \\ I_4&=conv2d(I_4,channels=128) \\ I_4&=conv2d(I_4,channels=1024) & I_4[N\times 1024]\\ I_5&=MaxPool2d(I_4,output=N\times 1) \end{aligned} T1I1I2I2T2I3I4I4I4I5=InputTransformNet(I0)=I0⋅T1=conv2d(I1,channels=64)=conv2d(I2,channels=64)=FeatureTransformNet(I2)=I2⋅T2=conv2d(I3,channels=64)=conv2d(I4,channels=128)=conv2d(I4,channels=1024)=MaxPool2d(I4,output=N×1)I2[N×64]I4[N×1024]
T_Net
I1=conv2d(I0,channels=64)I1=conv2d(I1,channels=128)I1=conv2d(I1,channels=1024)I2=MaxPool2d(I2,output=N×1)I3=FCLayer(1024→512→256)T=Diagonal(I3⋅W)W[256,K×K] \begin{aligned} I_1&=conv2d(I_0,channels=64) \\ I_1&=conv2d(I_1,channels=128) \\ I_1&=conv2d(I_1,channels=1024) \\ I_2&=MaxPool2d(I_2,output=N\times 1) \\ I_3&=FCLayer(1024\rightarrow512\rightarrow256) \\ T&=Diagonal(I_3\cdot W) & W[256,K\times K] \end{aligned} I1I1I1I2I3T=conv2d(I0,channels=64)=conv2d(I1,channels=128)=conv2d(I1,channels=1024)=MaxPool2d(I2,output=N×1)=FCLayer(1024→512→256)=Diagonal(I3⋅W)W[256,K×K]
PointNet++
KeyPoints=getsKeyPoints(I0)KeyPoints[K,D]G=getGroupByKey(KeyPoints)Gi[Ni,D],∣G∣=KFeatures=PointNet(G) \begin{aligned} KeyPoints&=getsKeyPoints(I_0) & KeyPoints[K, D]\\ G&=getGroupByKey(KeyPoints) &G_i[N_i,D],|G|=K\\ Features&=PointNet(G) \end{aligned} KeyPointsGFeatures=getsKeyPoints(I0)=getGroupByKey(KeyPoints)=PointNet(G)KeyPoints[K,D]Gi[Ni,D],∣G∣=K
MSG
P,R=FarthestPointSampling(I2,n) \begin{aligned} P,R=FarthestPointSampling(I_2,n) \end{aligned} P,R=FarthestPointSampling(I2,n)