MeshCNN
- 引言
 - 一、方法简述
 - 1.1 输入
 - 1.2 卷积
 - 1.3 池化
 
- 二、实验分析
 - 三、改进以及应用
 

引言
MeshCNN是第一个将网格简化引入到池化操作中的网络:合并顶点降低网格分辨率,类似图像中的平均池化。
主页1:https://ranahanocka.github.io/MeshCNN/
比较详细的讲解2:基于MeshCNN和PyTorch的三维对象分类和分割
一、方法简述
主要有三个内容:输入、卷积和池化
 网络结构类似ResNet、UNet,使用交叉熵损失函数,网络初始化、训练策略等具体细节可参考源码
1.1 输入

边的特征(五维):二面角、两个内角(排序)、两个边长比(排序)。使用排序解决顺序模糊性并保证不变性。
 较重要的代码就是构造网格边的GEMM,其计算边特征也是基于此矩阵
def build_gemm(mesh, faces, face_areas):
    """
    gemm_edges: array (#E x 4) of the 4 one-ring neighbors for each edge
    sides: array (#E x 4) indices (values of: 0,1,2,3) indicating where an edge is in the gemm_edge entry of the 4 neighboring edges
    for example edge i -> gemm_edges[gemm_edges[i], sides[i]] == [i, i, i, i]
    """
    ## 具体省略
 
1.2 卷积
 翻转-> 
其一个边与周围四个边的卷积为
    
     
      
       
        e
       
       
        ⋅
       
       
        
         k
        
        
         0
        
       
       
        +
       
       
        
         ∑
        
        
         
          j
         
         
          =
         
         
          1
         
        
        
         4
        
       
       
        
         k
        
        
         j
        
       
       
        ⋅
       
       
        
         e
        
        
         j
        
       
      
      
       e\cdot k_0+\sum_{j=1}^4k_j\cdot e^j
      
     
    e⋅k0+∑j=14kj⋅ej。其中
    
     
      
       
        
         e
        
        
         j
        
       
      
      
       e^j
      
     
    ej的计算方式如下:
 
# apply the symmetric functions for an equivariant conv
x_1 = f[:, :, :, 1] + f[:, :, :, 3]
x_2 = f[:, :, :, 2] + f[:, :, :, 4]
x_3 = torch.abs(f[:, :, :, 1] - f[:, :, :, 3])
x_4 = torch.abs(f[:, :, :, 2] - f[:, :, :, 4])
f = torch.stack([f[:, :, :, 0], x_1, x_2, x_3, x_4], dim=3)
 
其对边上不明确的对应关系用一组简单的对称函数。但是个人感觉就对称意义上来说并不如max、avg或者sum。
- max、avg或sum都可以保证输出与边的顺序无关。但是MeshCNN的方法还是有歧义性:
     
      
       
        
         
          e
         
         
          1
         
        
        
         =
        
        
         ∣
        
        
         a
        
        
         −
        
        
         c
        
        
         ∣
        
       
       
        e^1=|a-c|
       
      
     e1=∣a−c∣,将网格面翻转 
     
      
       
        
         
          e
         
         
          1
         
        
        
         =
        
        
         ∣
        
        
         b
        
        
         −
        
        
         d
        
        
         ∣
        
        
         ?
        
       
       
        e^1=|b-d|?
       
      
     e1=∣b−d∣? 
起始边的选取会影响其结果或者说在三维空间中,顺时针和逆时针都是相对而言的 - SubdivNet3:Subdivision-Based Mesh Convolution Networks 中的面卷积考虑到了以上情况,使用sum解决了以上问题
 - 还有一种排序式的面卷积网络4:Face-Based CNN on Triangular Mesh with Arbitrary Connectivity,并没有使用对称函数也能取得不错的结果,与SubdivNet3的深度优先遍历不同,其使用广度优先遍历网格面
 
1.3 池化

 上图已表述清楚,实质上就是边之间的平均池化。但是实现代码略复杂,不仅仅是塌边的顺序和特征平均,还有网格结构的更新,并且要考虑合并是否会出现非流形面。
MeshCNN的设置是不允许非流形面的出现:这与可学习的塌边会产生一定的冲突。- Face-Based CNN4中的面池化允许非流形面的出现,消融实验表明其确实可以略微提点,但是会限制池化操作。如果产生了太多非流形面,势必会影响后续网格上的卷积和池化。
 - SubdivNet3则更贴近2D图像的池化,并且可以并行。个人感觉比以上方法更优雅,就是需要对网格进行预处理,使其具备细分连接性。
 
二、实验分析
使用其官方代码,对其结果进行简单复现:
| 方法 | SHREC11 Split10 | Chairs | 
|---|---|---|
| MeshCNN-复现 | 93 | 95 | 
| 无池化 | 91 | 93 | 
| 论文数据 | 91 | 99 | 
- 试了几次,在SHREC11 分类上比论文中的精度高,在Chairs 上精度较低,也许是训练参数问题(
官方没有提供此数据训练参数和预训练模型) - 关于
池化,由于其池化操作是串行的,计算速度很慢,MeshCNN都是在较低分辨率的网格上进行实验,池化也确实有效。但是继续降低分辨率效果是否会更好?是否就不需要池化操作了?很有意思… 
三、改进以及应用
修改输入和池化5:Feature-preserved convolutional neural network for 3D mesh recognition
修改损失函数6:Discriminative feature abstraction by deep L2 hypersphere embedding for 3D mesh CNNs
医疗模型分割应用7:MedMeshCNN - Enabling MeshCNN for Medical Surface Models
https://ranahanocka.github.io/MeshCNN/ ↩︎
基于MeshCNN和PyTorch的三维对象分类和分割 ↩︎
Subdivision-Based Mesh Convolution Networks ↩︎ ↩︎ ↩︎
Face-Based CNN on Triangular Mesh with Arbitrary Connectivity ↩︎ ↩︎
Feature-preserved convolutional neural network for 3D mesh recognition ↩︎
Discriminative feature abstraction by deep L2 hypersphere embedding for 3D mesh CNNs ↩︎
MedMeshCNN - Enabling MeshCNN for Medical Surface Models ↩︎



















