0%

全冠生成算法设计文档V1

自动摘要: 修订历史: 2022年5月19日:添加网络结构,完善部分语言,添加处理图片。2022年5月21日:以20221月全冠源码,重新梳理整个流程,然后去除语言表达错误的语句,修改文档立意。2022年 ……..

修订历史:

2022年5月19日:添加网络结构,完善部分语言,添加处理图片。2022年5月21日:以2022-1月全冠源码,重新梳理整个流程,然后去除语言表达错误的语句,修改文档立意。2022年5月21日:添加左右邻牙保留原因。

背景概述:

Mescheder L, Oechsle M, Niemeyer M, et al. Occupancy networks: Learning 3d reconstruction in function space[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2019: 4460-4470.

全冠生成算法,主要是借助以网格/原始点云的边界特征作为学习为任务,如下图所示。从而将学习全冠生成简化成学习给定的点是否在边界内外。从多维度学习简化到二分类任务。因为学习的是决策边界,所以能很好的还原冠的细节特征。

算法流程

细节概述

数据处理部分:

来自南航全冠数据,待修复体由两颗邻牙一个基台构成,已修复模型由待修复位置对应的三颗牙构成
核心开源库:trimesh

  1. 源模型(待修复体)处理
    1. 利用连通体特性,删除待修复区域干扰(中间基台)
      1. 原因:因为无法获得基台边缘数据,对训练无任何帮助,所以我们认为基台是噪声
      2. 左右邻牙保留原因:根据南航硕士论文提及–邻牙的牙花对中间牙花在医学上有共性
    2. 然后取邻牙并体素归一化网格


  1. 目标模型(已修复体)处理
    1. 将网格进行均匀采样,然后添加方差为[0.1,0.01]正态分布噪声,然后归一化。(图中绿色部分)
      1. 原因:这样可以很好的泛化数据,并且能帮助网络更好的表达决策边界
    2. 将网格进行编码化(隐函数化/占位化/二进制化)(如图所示)
      1. 并包含在内则设置为1,否则设为0—>图中红绿用01二进制表示
        1. 可选优化:如果模型由空洞,可以通过每隔一定角度进行光射,通过光线是否穿透模型,来确定是否有孔洞。


网络部分

主要借鉴现阶段对点云多尺度,多维度特征提取方法,其实只要处理二分类网络都可以

  1. 核心思想:将输入的体素特征与边界采样特征进行特征匹配
  2. 方法:
    1. 边界采样原始点作为原始特征–>1号特征
    2. 将输入体素与边界采样点及其邻域点集混合后作为扩展特征–>扩展特征
    3. 第一层进行3D卷积提取特征+扩展特征—>2号特征
    4. 第二层将第一层结果进行最大池化再次使用3D卷积提取特征+扩展特征—>3号特征
    5. 第三层将第二层结果进行最大池化再次使用3D卷积提取特征+扩展特征—->4号特征
    6. 第四层将第三层结果进行最大池化再次使用3D卷积提取特征+扩展特征—->5号特征
    7. 然后将前面1,2,3,4,5,扩展特征联合作为一个特征组—>汇总特征
    8. 通过一维卷积代替全连接进行特征输出
  3. 注意事项
    1. 其中3D卷积是一个由卷积核333的3DConv+BN构成,当前采用3个3D卷积层提取特征。
    2. 使用一维卷积代替全连接,参数共享,同时降低维度,计算速度更快。
    3. 近似一阶邻域信息采集作为补充特征,主要还是为了泛化边界信息,如数据部分添加正态噪声一样的道理。
      1. 主要是确定当前边界采样对邻域的重要程度。
      2. 而整个网络架构考虑的是体素在边界采样中聚焦特定位置的能力。

训练部分:

因为是二分类问题,参考sigmoid+BCE 体系,具体可以百度BCEWithLogitsLoss

  1. 损失设计
    1. 主要对比生成的占用率与原始占用率对比, 使用BCEWithLogitsLoss加权重为0.9的算术平均
      1. 原因:0.9设置主要考虑的占用为1的点的损失权重—牙冠的权重
  2. 优化器选择
    1. 选择学习率0.1的Adam优化器,然后利用损失是否稳定下降作为依据,减少学习率,最高为1e-5

推理部分:

因为我们训练有一个来自待修复体的体素,一个来自目标模型的网格采样,所以推理同样需要这两个条件。

方式一:利用MC特性

  1. 待修复的体素可依照数据处理部分处理
  2. 目标模型因为未知,所以我们设立个立方体体素。
    1. 首先创建一个256256256, 正方体用于裁剪成牙齿
      1. 为什么不选101010等等,因为正方体应该大于训练牙齿的包围框,不然无法裁剪
  3. 通过网络判定哪些是属于牙冠外部的点,内部的点
  4. 然后通过MC网格重建固定阈值(0.)进行重建
    1. 因为MC要求是体素
  5. 注意输出网格是水密的。





方式二:利用OBB特性

  1. 待修复的体素可依照数据处理部分处理
  2. 目标模型因为未知,所以我们沿着待修复网格构建OBB包围框,并填充数量为100000(根据需求自行调节)点。
  3. 通过网络判定哪些是属于牙冠外部的点,内部的点
  4. 然后大于阈值(0.)选取属于牙冠内部的点
  5. 注意输出网格是非水密的。

未来改进计划:

  1. 减少生成,去除邻牙生成
  2. 将边界采样直接网络内置,不再要求用户输入
  3. 再次简化网络,去除邻域特征匹配,而采用网格自带属性,如曲率,角度,法线
  4. 使用ResNet代替现在网络

欢迎关注我的其它发布渠道