文献笔记:
1.把点云的区域分割表示为一个逐点识别的问题。
(We formulate part segmentation as a per-point classification problem.)
把点的mIoU(?)作为评价指标,计算mIoU值的具体方法如下(分清category的mIoU、shape的mIoU、part type的mIoU):
首先,对于分类C中的每一个形状S,计算该形状S的mIoU值:对于C中的每一个部分(part type),计算理论值和预测值之间的IoU值 ,如果某个部分的预测值和理论值组成的union中点为空,我们把这个部分IoU设为1。之后我们计算该category中的所有部分(part type)的IoU值,将这些IoU的平均值作为该形状的mIoU值。
之后,当我们要计算category的mIoU值时,我们把属于当前category中的所有形状的mIoU值做平均值,该平均值即为category的mIoU值。
以上是论文中对于各个方法的结果比较。
2.关于PointNet Segmentation Network,它是识别网络的一个扩展。局部点特征(第二次变换网络feature transform的输出)和全局点特征(最大池化层的输出)被关联在一起。分割网络不使用dropout。训练参数跟识别网络的完全一样。
对于基础的分割网络,为了达到最好的分割效果,作者还是做出了如下的一些修改:
a.增加了一个one-hot向量来表示输入的类型,并别把它和最大池化层的输出联系在一起
b.在某些层增加了神经元,并且增加了skip links跳转链接来收集不同层的局部点特征,把他们连接在一起,共同组成分割网络的作为输入的点特征。
此外,文章最后还提到法向量估计(法向量预测结果在某些区域甚至比真实值更平滑,连续性更好)。还通过实验验证了分割网络的健壮性。对于识别网络的部分,网络对数据损坏和数据缺失并不是特别敏感,因为点的全局特征是从关键点的集合中提取的。对于分割网络来说,它同样具有稳定性。结合逐点特征和学习到的全局形状特征,对每点部分的标签进行了预测。下图说明的分割结果的一致性。
代码部分:
模型:
1.model部分的代码储存在pointnet_part_seg中,get_model函数定义了如上图9的网络,包括classification network以及segmentation network;
2.get_transform函数和get_transform_K函数定义了figure 9中的变换网络T1和T2,可以看到T1和T2这两个变换网络本身也是由卷积层、池化层和全连接层等构成的;
3.get_loss函数包含了对损失设计,总的损失包括三部分,分别是:seg_loss(分割的交叉熵损失,通过tf.nn.sparse_softmax_cross_entropy_with_logits()来获得)、label_loss(标记的交叉熵损失,但是最后计算loss时weight取1,实际结果中没有这项的贡献)、mat_diff_loss(变换矩阵Transform本身是正交矩阵,计算出的正交矩阵的正则化偏差Regularization loss)
train.py:
1.batch默认值32,epoc默认值200,在train函数前面定义了学习率和衰减率等参数,定义了需要读写的文件的位置,包括训练文件和测试文件的位置,模型的储存和日志的储存。以及label到one_hot的转换函数。
2.train函数:
首先确定learning rate以及学习率衰减的参数,这里是指数衰减
bn
(batch normalization 主要解决的是中间训练层数据分布发生改变的情况,再输入之前进行归一化处理,网络无需适应不同的数据分布,从而加速训练。BN层本质上就是对上一层的输出进行处理,得到下一层的输入。实现BN层的难点在于如何使得归一化不破坏上一层所学习到的特征。引入可学习参数进行变换,让BN层网络通过学习,恢复原始网络的特征分布。从数学上看就是,在不改变特征分布的前提下,通过变换来改变均值和方差的大小,得到归一化的效果)
momentum
(增加一个动量项,一般来说,主要用在权重更新的时候,如果前一次的momentum与这次的梯度负方向相同,那么动量项会使下降的幅度更大,目的是为了加速收敛)
之后是一些初始化、以及tensorflow的config
最后是train_one_epoch函数,以及eval_one_epoch函数。
刚接触深度学习,有些概念不是很明白,希望今后能多接触,努力学
在b站上发现了作者的一个视频,可能有些帮助:
https://www.bilibili.com/video/av28340597?from=search&seid=7171823237791363931