pointnet网络模型如下图所示:
暂时不关注input_transform和feature_transform。同时也不关注分割任务。
从输入n×3到n×64的操作:
(图中数字仅为示意,不代表具体计算)
首先输入为n×3(n×1×3×1:点数×长×宽×通道数)有64个1×3的卷积核,每个卷积核对点云进行卷积操作,并生成一个通道,64个卷积核共计生成64个通道。(叙述过程省略了加偏置和激活的部分)得到的结果为n×64(n×1×1×64点数×长×宽×通道数)成功将数据升维。
在将64维升到128维的过程中,有一个【1×1】的卷积操作,这个过程易于造成理解上的偏差。
在源码中定义了一个kernel,kernel_h,kernel_w:代码中传入的为1×1,num_in_channels:输入通道(对应下图中的64个通道),num_out_channels:输出通道,就是核的个数。所以可以如下图理解这个shared_mlp的过程:
一个核的大小为【1×1×64(输入的通道数,根据输入进行变化)】,与输入对应位置相乘在相加,共128个核,则输出为【n×1×1×128】,成功将向量升维至128,初次阅读代码,看到这个【1×1】的卷积核,很是困惑,可以理解为一个【1×输入(64、128、1024)】的一个卷积核。从上到下这个卷积的过程,使用的是同一个卷积核,从而实现了权值共享的操作。
升维操作后进行最大池化,然后放入mlp分类器,这个过程很好理解。最大池化是一个对称函数,主要对点云的置换不变性。后面的操作看源码就很简单了。
附:
pointnet中shared_mlp过程详细解析
于 2021-08-13 13:36:57 首次发布