一、Primal-Dual Mesh Convolutional Neural Networks

PD-MeshNet

1、将三维网格转变成图像

将输入网格记作M,A是M上的一个面,N{A}为面A的所有相邻面,{A,B}表示A,B面的公共边

①构建Primal Graph:M中的每个面会在Primal Graph中产生一个对应的点,如果M中的两个面相邻,那么在Primal Graph中对应的顶点间产生一条边.一、Primal-Dual Mesh Convolutional Neural Networks_第1张图片
②构建Dual Graph(文中提出的第一种方法):取M中的一条网格边,假设该边是A,B面的公共边,记作{A,B}.有集合N{A}{B}与N{B}{A},其中A与N{A}{B}各面有公共边,在Dual Graph中有对应点集K1,将{A,B}边的对应点与K1中各点相连,同理B与N{B}{A}各面有公共边,在Dual Graph中有对应点集K2,将{A,B}边的对应点与K2中各点相连.
一、Primal-Dual Mesh Convolutional Neural Networks_第2张图片

2、确定Dual Graph和Primal Graph各点的特征

一、Primal-Dual Mesh Convolutional Neural Networks_第3张图片一、Primal-Dual Mesh Convolutional Neural Networks_第4张图片
在这里插入图片描述

3、Convolution

1.Dual convolution layer

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
一、Primal-Dual Mesh Convolutional Neural Networks_第5张图片

2.Primal convolution layer

一、Primal-Dual Mesh Convolutional Neural Networks_第6张图片
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述一、Primal-Dual Mesh Convolutional Neural Networks_第7张图片

4、Pooling

在这里插入图片描述
当K条边互不相邻时,只需将各边两个端点合并成一个,新产生的点特征为两个合并点的特征和.下图展示了A,C点合并后Primal Graph的变化…
一、Primal-Dual Mesh Convolutional Neural Networks_第8张图片
将Primal Graph中A,C点合并后,网格中对应的两个面也合并成了一个,此时的Dual Graph图也会对应改变.
一、Primal-Dual Mesh Convolutional Neural Networks_第9张图片
当K条边中存在边相邻,则将这些边的顶点合并成一个,新产生的点特征为所有合并点的特征和.假设边BE和DE属于这K条边,下图展示了B,D,E点合并后Primal Graph的变化.
一、Primal-Dual Mesh Convolutional Neural Networks_第10张图片
当Primal Graph中的点合并后,相邻网格面间可能会存在多条公共边,将这些公共边在Dual Graph上的点合并成一个点,新产生的点特征为所有合并点的特征和.例如上图Primal Graph中的B,D,E合并后,Dual Graph发生如下改变.图中虚线按颜色进行划分,由于边4,边8都是面AC与面BDE的公共边,根据Dual Graph的构建方式,就会产生下图这种情况.
一、Primal-Dual Mesh Convolutional Neural Networks_第11张图片
此时将点4与点8进行合并,新产生的点4特征为点4和点8的特征和.
一、Primal-Dual Mesh Convolutional Neural Networks_第12张图片

5、Unpooling

Primal Unpooling

在进行Pooling操作时,保存了如下信息. 其中old表示Pooling前的primal node,new表示Pooling后新生成的primal node.

①old_primal_node_to_new_primal_node:标记了Pooling前的primal node对应Pooling后的哪个primal node
②old_primal_graph_batch:Pooling前intput primal graphs对应的Batch结构
③old_primal_edge_index:Pooling前的边信息

根据上述信息重建池化前的Primal Graph.根据②创建一个Batch,根据③确定池化前的边信息,根据①确定池化前各点的特征.
new_primal_graph_batch 表示池化前的primal_graph_batch,即我们要重建的内容.

# Reconstruct the primal graph.
  old_primal_node_to_new_one = pooling_log.old_primal_node_to_new_one
# - Reconstruct the connectivity.
  new_primal_graph_batch = Batch(batch=pooling_log.old_primal_graph_batch)
  new_primal_graph_batch.edge_index = pooling_log.old_primal_edge_index
# - Assign to the new primal nodes the features of the primal nodes in
#   which these were merged when performing the pooling operation.
  new_primal_graph_batch.x = primal_graph_batch.x[old_primal_node_to_new_one]

Dual Unpooling

在进行Pooling操作时,保存了如下信息. 其中old表示Pooling前的点,new表示Pooling后新生成的点.

①old_dual_node_to_new_dual_node:标记了池化前的点对应池化后的哪个点
②old_dual_graph_batch:池化前intput primal graphs对应的Batch结构
③old_dual_edge_index:池化前的边信息

# Reconstruct the dual graph.
old_dual_node_to_new_one = pooling_log.old_dual_node_to_new_one
# - Reconstruct the connectivity.
new_dual_graph_batch = Batch(batch=pooling_log.old_dual_graph_batch)
new_dual_graph_batch.edge_index = pooling_log.old_dual_edge_index
# - Assign the same learnable feature to all the dual nodes that do not
#   have a corresponding dual node after performing the pooling
#   operation.
num_old_dual_nodes = len(old_dual_node_to_new_one)
new_dual_graph_batch_x = self.new_dual_feature.repeat(num_old_dual_nodes, 1)
# - Assign to the new dual nodes that have a corresponding dual node
#   after the pooling operation the features of these corresponding nodes.
new_dual_graph_batch_x[old_dual_node_to_new_one != -1] = dual_graph_batch.x[old_dual_node_to_new_one[old_dual_node_to_new_one != -1]]
new_dual_graph_batch.x = new_dual_graph_batch_x
# Remap the primal-graph edges to the dual-graph nodes.
new_primal_edge_to_dual_node_idx_batch = (pooling_log.old_primal_edge_to_dual_node_index)

最后返回new_primal_graph_bath,new_dual_graph_bath,new_primal_edge_to_dual_node_idx_batch

你可能感兴趣的:(python)