0%

嵌体修复部署迭代V1

自动摘要: |时间|对应版本号|修订人|主要修订内容| ||||| ||V1.0.0|[@SindreYang( ……..

时间 对应版本号 修订人 主要修订内容
V1.0.0 @Sindre Yang(sindre) 基于Libtorch部署
V1.0.1 @邹童玺 基于openvino集成

V1.0.0

背景

  1. libtorch(pytorch的C++版本):https://pytorch.org/
    • 建议使用1.9版本及以上,因为服务器用的1.9.1
  2. cmake:建议使用3.12版以上cmake封装

文件说明

model.pth—>模型文件(生成模型,可应用于单牙,三连牙)infer.py—>接口文件

  • 前处理-preprocess

  • 模型推理-inference

  • 后处理-postprocess


参数信息

preprocess

1
2
3
4
5
6
7
8
9
10
"""
图片数据转换为tensor
要求对数据做标准化mean=(0.5,), std=(0.5,)
"""
input= Image.open("input.png").convert('L')
#input.show()
transform_Tensor= transforms.Compose([transforms.ToTensor(), transforms.Normalize(mean=(0.5,), std=(0.5,))])
input_tensor= transform_Tensor(input).unsqueeze(0).cuda()#unsqueeze增加一个维度


inference

1
2
3
4
5
6
7
8
 """
加入模型,c++对应代码为:
torch::jit::script::Module module;
module = torch::jit::load("fill_jit_zxx.pth");
"""
model=torch.jit.load("./fill_jit_zxx.pth")
out=model.forward(input_tensor)

postprocess

1
2
3
4
5
6
7
"""
对生成的图片进行反标准化,不然结果会有问题
"""
To_Image= transforms.ToPILImage()
inv_normalize=transforms.Normalize(mean=-1,std=1/0.5)
img_PIL = To_Image(inv_normalize(out[0].cpu()))

V1.0.1

应用场景

  1. 适用于前磨牙、磨牙;
  2. 椅旁CAD中自动形式的嵌体生成;
    1. 有边缘线情况;
    2. 无边缘线情况;
  3. 基本版CAD中自动形式的嵌体生成
    1. 有边缘线情况;
    2. 无边缘线情况;

算法输入

  1. 模型输入
    1. 模型为三颗牙(中间为待修复的嵌体)的片段模型或一颗牙(嵌体)的片段Mesh结构,该片段Mesh需要一个算法获得(任务1),其中输入条件为三颗牙时效果优于一颗牙,输入多颗牙的目的是为限制嵌体与邻牙的间隙,所以针对不同情况输入信息不同:
      1. 近中(磨牙)、坏磨牙、远中(磨牙):输入三颗牙;
      2. 近中(磨牙)、坏磨牙:输入两颗牙;
      3. 近中(尖牙)、坏磨牙、远中(磨牙):输入三颗牙;
      4. 不考虑坏牙为尖牙的情况。
  2. Mesh模型深度图获取
    1. 通过ToothMarker工具从具体的CAD扫描件,提取输入模型的深度图(任务2)。

算法输出

  1. 深度图转换成嵌体Mesh
    1. 深度图需还原成点云模型(任务3),之后点云模型需三角化成网格(任务4);得到的网格是多颗牙的片段模型,需要对其进行裁剪,将嵌体对应的区域裁剪下来进行,该部分为嵌体外层,用外层与嵌体内层进行拼接,得到最终的嵌体模型Mesh(任务5)

任务列表

任务1:CAD中AI嵌体算法输入模型的裁剪

输入:牙弓Mesh模型、坏牙位置;输出:片段Mesh模型、变换矩阵;

裁剪当前坏牙牙位的近中侧和远中侧邻牙,输出多颗牙的片段模型Mesh,需将片段Mesh移至世界坐标系原点,返回变换矩阵,用于AI嵌体算法的输入;情况:近中(磨牙)、坏磨牙、远中(磨牙):输入三颗牙;近中(磨牙)、坏磨牙:输入两颗牙;近中(尖牙)、坏磨牙、远中(磨牙):输入三颗牙;不考虑坏牙为尖牙的情况;

自动生成可能需要邻牙提取算法;手动生成参考ToothMarker中交互功能;

任务2:AI嵌体算法片段模型生成深度图

输入:裁剪后的片段模型Mesh;输出:牙尖侧、舌侧、颊侧方向的深度图组;参考DepthImageLib;

任务3:AI嵌体算法输出深度图点云化

输入:深度图组,相机参数;输出:Mesh点集;参考DepthImageLib;

任务4:点云模型三角化重建

输入:片段模型点云Mesh;输出:片段模型网格Mesh;参考方法:泊松重建方法、贪婪投影三角化方法;

任务5:模型裁剪拼接生成嵌体

输入:片段模型网格Mesh;输出:嵌体Mesh模型;1、根据任务1中的变换矩阵,模型变换回原坐标系位置,在同一坐标系下进行裁剪;2、根据有无嵌体边缘线情况采用不同的裁剪方法:有边缘:需要变换回原坐标系,使用边缘线参与裁剪;无边缘:需要变换回原坐标系,基于重叠的处理,裁掉重叠的面片、点,保留嵌体区域,该方法会有误差,根据效果进行完善;3、对裁剪后的网格进行滤波(Refine);4、内外层拼接,用上面的外层与嵌体的内层,拼接形成一个闭合的成品修复体;

任务计划

10.22 整理之前沟通输出的任务 ==>文档; 理解并运行C++封装的分牙算法 ==> toothmarker展示分牙效果准备、为嵌体封装做准备;
10.23 AI嵌体算法的理解运行 ==>输出训练后深度图效果; 理解并运行toothmarker ==>理解深度图生成方法,输出深度图效果,嵌体封装需要; ==>熟悉toothmarker的结构、以便后续优化填加功能;
10.25-10.26 封装AI嵌体算法并运行 ==>生成的深度图记录变换矩阵; ==>验证,深度图生成点云,后续进行点云三角化和后处理; ==>嵌体部分裁剪、拼接; ==>通知吴晓燕,准备10组数据,后续测试;
10.27 自测并与张新霞反馈 ==>跑10组数据,改BUG,观察效果; ==>反馈,优缺点,改进方向讨论; toothmarker集成分牙功能 ==>toothmarker添加调用接口,显示分牙效果;
10.28 *点云三角化及后处理 ==>确定实现者 ==>自己实现则10.28处理,计划顺延n天或暂停(需讨论),他人实现则并行处理; *toothmarker集成AI嵌体 ==>输出点云还是网格?网格需等待“点云三角化及后处理” ==>toothmarker添加调用接口,显示嵌体效果; 封装全冠生成算法 ==>理解全冠算法,运行结果; ==>确定封装的输入数据,如何处理; ==>封装,测试结果;
10.29 toothmarker集成全冠生成 ==>toothmarker添加调用接口,显示全冠效果; 完善toothmarker ==>界面、模型、调用;

调用方式:

1、设置待修复体片段模型;
2、设置神经网络模型路径,在VinoInlayLib/model中;

3、执行嵌体修复;
4、得到修复后的模型;

依赖库

所依赖的openvino/opencv动态库在VinoInlayLib/bin中;

效果



缺陷

1.

2.

  1. 还未进行缺失区域的裁剪拼接,待后续处理;


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