theirMeshCNN/

本文链接:https://blog.csdn.net/suian0424/article/details/93624375
                   
               
                   
               
                                                   
            
            
           
                                       
                   
                   
                                            SIGGRAPH 2019 的一篇paper,很有意思的工作。
论文主页:https://ranahanocka.github.io/MeshCNN/
一、简介
之前看的PointNet++是以顶点为中心定义卷积,这篇是以边为中心定义卷积。这篇paper介绍的以边为单位的卷积操作,非常直观自然,非常优雅(也可能因为最近看spectral的GCN很头疼,所以觉得这种简洁明快的网络设计简直太友好了orz
二、网络设计
卷积
以边为单位定义卷积,那么边的邻域是确定的,不像PointNet++需要通过knn寻找最近的k个邻域点。
任何一条边邻域就是所在两个三角形中的另外两条边,同时作者为了保证卷积操作的不变性,对邻域四条边进行了上图公式中的变换,之后再应用卷积。如果不做上图公式中的变化,对于同一组weight,按abcd的顺序进行卷积和按cdab的顺序进行卷积结果是不一样的。
池化
基于边的池化操作也非常好理解,使用了边折叠(edge-collapse)来定义池化。
如何选择哪些边进行pooling?
网络设计时给定pooling层的输入边数和输出边数(即,指定了pooling层需要折叠的边个数),对输入的边按特征大小(L2范数)从大到小排序,对特征值较小的边进行折叠。
如果选择哪些边进行unpooling?
在逐层pooling的时候记录pooling前后的mesh结构变化,用于unpooling。即,unpooling的边的选择并不是通过学习得到的,而是对pooling的一个逆过程。同时unpooling层采用类似Unet的设计,unpooling后的特征将和之前pooling操作前的特征叠加在一起,再次送入卷积层学习,进行特征分辨率的恢复。
Unpooling does not have learnable parameters, and it is typically combined with convolutions to recover the original resolution lost in the pooling operation. The combination with the convolution effectively makes the unpooling a learnable operation.
特征
MeshCNN的第一层输入是每条边一个5维的特征向量:二面角、两个三角形的内角、两个三角形的高与底边的比值。初始特征输入不包含边的位置信息,甚至整个网络计算过程中边的位置信息都只用于pooling操作中的边折叠,不直接参与特征构造和计算。
输入
分类(classification)的输入是统一固定到600条边,分割(Segmentation)的输入是统一固定到2250条边。将模型下采样到要求的边数以下,不足的部分直接补0。看了下论文中用到的人体分割的那个数据集,简化后的2250条边的模型,只有大约750个顶点,对比PointNet在ShapeNet数据集上的2048个顶点的输入和PointNet++在ScanNet数据集上的8192个顶点的输入规模都有差距。
不知道MeshCNN是不是只能处理小规模的mesh,所以论文中只展示了对简化后的数据集的训练测试结果。不知道MeshCNN对高精度的mesh的处理效果怎么样。
三、网络可视化
因为网络是通过折叠特征值较小的边来进行pooling的,所以对于不同的任务,mesh的简化(pooling中使用的边折叠可以类似看为简化了mesh的拓扑结构)会有不同的趋势。如上图中的例子,上一排的任务是分类花瓶(vase)是否有柄(handle),下一排的任务是分类花瓶是否有颈(neck)。
四、一些思考
MeshCNN与PointNet++的一些差别:
MeshCNN的下采样与task的相关性更高:PointNet++在下卷积时通过FPS(farthest point sampling)的方式选择下一层的中心点,因此点的选择基本只依赖于mesh本身的结构,与task的关系不大,也就是说无论mesh被用于什么task,下卷积的采样中心是基本一致的。但MeshCNN的下采样是与具体task密切相关的,它能够在下采样的时候,更多地保留与task密切相关的边,这一点与图像中的max pooling具有更相似的内在含义。
MeshCNN的上采样与下采样的结构一致性更强:MeshCNN和PointNet都采用了类似UNet的结构。但相比MeshCNN直接用下采样的mesh结构来进行上采样,PointNet++中的上采样和下采样的感知域是不一样的,以scannet数据集为例,下采样是邻域32个点,上采样是邻域3个点。
MeshCNN的感知域在模型表面空间:PointNet++使用knn挑选空间距离上的领域点,这种方式有可能采样到测地距离远但空间距离近的点。而MeshCNN根据边进行上下采样,更接近于挑选测地距离上的领域,感知域在模型表面空间。(emmm 这个好像算用mesh和用点云的差别?
————————————————
版权声明:本文为CSDN博主「LuminousLumin」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/suian0424/article/details/93624375
原文地址:https://www.cnblogs.com/skydaddy/p/11935050.html