自动摘要: 排牙(单颗牙物体坐标轴向精准) 状态定义:所有牙齿都原点的状态叫原始状态,未排齐的牙齿叫初始状态,排齐牙齿叫做目标状态 空间变换矩阵(44):平移、旋转、缩放左上前33是旋转矩阵,最后一列 ……..
排牙(单颗牙物体坐标轴向精准)
状态定义:所有牙齿都原点的状态叫原始状态,未排齐的牙齿叫初始状态,排齐牙齿叫做目标状态
空间变换矩阵(44):平移、旋转、缩放左上前33是旋转矩阵,最后一列中的前三个元素是平移矩阵,最后一行是固定的为[0,0,0,1];举例:空间变换矩阵为:
, 旋转矩阵为
,平移矩阵为
,其中1,…,9,a, b, c是未知量。
数据:
原始数据:数据形式:点云n*3test.json文件格式:共28个牙齿结构center: 几何中心点fdi: 牙齿编号;mat: 原始状态到目标状态的变换矩阵;width: 每颗牙齿的宽度;处理后的数据:数据目录: 每份牙颌共有三个文件夹,两个.txt文件文件夹Original: 原始状态;文件夹Shuffle(Init): 初始状态;文件夹Target: 目标状态;Init_features.txt: 初始状态的特征向量,网络的输入;28颗牙齿,共28行/组,每行8个数字分别为:宽度,(x,y,z),旋转姿态的四元数。Target_features.txt: 目标状态的特征向量,网络的输出;28颗牙齿,共28行/组,每行8个数字分别为:宽度,(x,y,z),旋转姿态的四元数。
代码目录介绍:
文件夹0:原始数据(同上)文件夹mesh: 网格数据,牙位号命名的.stl数据。Test.json: (同上);格式:共28个牙齿结构;center: 几何中心点;fdi: 牙齿编号;mat: 原始状态到目标状态的变换矩阵;width: 每颗牙齿的宽度;
文件夹dataset:处理后的数据(同上)(数据目录:每份牙颌共有三个文件夹,两个.txt文件)文件夹Original: 原始状态,标签命名的.ply文件。文件夹Shuffle(Init): 初始状态文件夹Target: 目标状态Init_features.txt: 初始状态的特征向量,网络的输入28颗牙齿,共28行,每行8个数字分别为:宽度,(x,y,z),旋转姿态的四元数Target_featus.txt: 目标状态的特征向量,网络的输出28颗牙齿,共28行,每行8个数字分别为:宽度,(x,y,z),旋转姿态的四元数
Test文件夹: 推理阶段的输出结果
Trained_models文件夹: 保存模型文件
Preprocess.py: 把产品部给的数据转成自己需要的的数据集Rearrange: 牙位号换成牙位索引(0,1,…,27)Mat_to_quarters: 44空间变换矩阵提取四元数Set_global_m: m是归一化系数,需要求出来的get_target_features: 获取目标状态的特征向量,维度288get_init_features: 获取初始状态特征,28*8get_shuffle_data: 生成初始状态数据(shuffle文件夹)。get_ Original data: 生成原始状态数据(Original文件夹)get_target data: 生成目标状态文件夹(Target文件夹)write_ feature_txt: 写入features_namePreprocess_data: 把上面函数整合Gen_dataset: 生成数据dataset.py: 数据加载器
model.py: 模型(网络)文件T_mlp_8: 数据编码器T_128_7: 解码器T_model_super: 整个模型
Train_position.py: 训练代码Trace_loss测地损失: 两个旋转矩阵的角度差Loss_function: 定义误差的损失函数,邻牙关系邻牙关系:每颗牙和邻牙的距离与目标状态下每颗牙和邻牙的距离Kl: 散度,两个分布之间相似性
Inference.py:推理