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 ↩︎