PLY 文件格式与 PVN3D 中的使用说明1. 目的本文说明两件事.ply文件通常包含哪些信息在当前PVN3D项目中代码实际读取并使用了.ply里的哪些信息需要先明确一点PLY是一种通用 3D 数据格式理论上可以存很多内容但在当前仓库里.ply并没有被当作完整渲染资源来用而主要被当作“物体 3D 几何点集的来源”。2. PLY 文件的基本结构一个典型的.ply文件分为两部分文件头header数据区body典型示意ply format ascii 1.0 comment created by ... element vertex 1000 property float x property float y property float z property float nx property float ny property float nz property uchar red property uchar green property uchar blue element face 2000 property list uchar int vertex_indices end_header ... vertex data ... ... face data ...从这个结构可以看出PLY 至少有以下几个核心概念。2.1 文件头文件头用于描述后面数据区的结构例如文件是不是ply存储格式是ascii还是二进制有多少个顶点vertex每个顶点有哪些属性有多少个面片face每个面片如何组织例如format ascii 1.0表示文本格式element vertex 1000表示后面有 1000 个顶点property float x表示每个顶点有一个名为x的浮点字段2.2 顶点数据顶点通常至少包含xyz这 3 个值定义了一个 3D 点的位置。除此之外顶点还可能包含法线nx ny nz颜色red green blue透明度alpha纹理坐标u v置信度、标签等自定义属性例如某一行顶点数据可能是0.012 0.031 -0.055 255 0 0如果头部定义了x y z red green blue那么这一行就表示坐标(0.012, 0.031, -0.055)颜色(255, 0, 0)2.3 面片数据如果.ply表示的是网格模型而不只是点云还会有face。典型形式3 12 18 25含义通常是这是一个三角面由编号为12, 18, 25的 3 个顶点组成如果是四边形或更一般的多边形也可能是别的顶点数。2.4 存储格式PLY 常见有三种格式asciibinary_little_endianbinary_big_endian其中ascii便于查看和手工调试二进制格式体积更小、读取更快3. PLY 文件理论上可以包含哪些信息从通用定义上看.ply可以存储物体表面点的 3D 坐标点云颜色法线方向网格拓扑关系材质或纹理相关属性注释和元数据任务相关自定义字段因此PLY 并不只是“点坐标文件”而是一个可以同时表达点云带属性点云三角网格带颜色/法线/纹理的网格的通用容器。4. 在 PVN3D 中PLY 实际被使用了哪些信息在当前仓库中核心结论很明确PVN3D实际主要只使用了.ply中的顶点坐标x y z。下面这些字段在当前代码中没有看到被核心训练/评估逻辑依赖顶点颜色red green blue顶点法线nx ny nz面片face材质和纹理注释字段也就是说在本项目里.ply更接近“几何点集文件”而不是完整渲染模型资源。5. PVN3D 中读取.ply的具体方式当前仓库里主要有两种读取.ply的方式。5.1 方式一手写读取只取前 3 列代码位置pvn3d/lib/utils/basic_utils.py对应函数defply_vtx(self,pth):fopen(pth)assertf.readline().strip()plyf.readline()f.readline()Nint(f.readline().split()[-1])whilef.readline().strip()!end_header:continuepts[]for_inrange(N):pts.append(np.float32(f.readline().split()[:3]))returnnp.array(pts)这段代码做了这些事检查文件第一行是不是ply从头部读取顶点数N找到end_header逐行读取顶点数据每行只取前 3 列因此它只关心文件头中的顶点数量每个顶点的前 3 个字段即x y z如果.ply里还有nx ny nzrgbface这些内容这个函数都不会使用。5.2 方式二用plyfile.PlyData读取但仍然只取x y z代码位置pvn3d/lib/utils/basic_utils.pypvn3d/lib/utils/basic_utils.py对应逻辑plyPlyData.read(model_path)dataply.elements[0].data xdata[x]ydata[y]zdata[z]returnnp.stack([x,y,z],axis-1)以及plyPlyData.read(...)dataply.elements[0].data xdata[x]ydata[y]zdata[z]modelnp.stack([x,y,z],axis-1)虽然这里使用了PlyData做标准解析但真正取出的仍然只有xyz所以这条路径本质上和手写解析的目标一致把.ply转成N x 3的 3D 点集。6. PVN3D 中.ply具体用在什么地方6.1 作为 LINEMOD 物体模型点的来源代码位置pvn3d/lib/utils/basic_utils.py核心逻辑ptxyz_pthos.path.join(datasets/linemod/Linemod_preprocessed/models,obj_%02d.ply%cls)pointxyzself.ply_vtx(ptxyz_pth)/1000.0说明LINEMOD 数据集下物体几何模型来自models/obj_xx.ply代码读取.ply后只保留顶点坐标然后除以1000.0这意味着当前代码假设.ply中的单位是毫米项目内部使用米这一点很重要。若模型尺度错误会直接影响关键点坐标位姿变换尺度ADD / ADDS 评估结果6.2 作为模型点集并随机下采样还是在 pvn3d/lib/utils/basic_utils.py读取完模型点后还会做一次随机删点dellist[jforjinrange(0,len(pointxyz))]dellistrandom.sample(dellist,len(pointxyz)-2000)pointxyznp.delete(pointxyz,dellist,axis0)也就是说.ply提供的是原始模型顶点集合而后续实际参与某些计算的往往是一个下采样后的点集。因此在本项目里.ply的作用不是“保持完整网格拓扑”而是“提供物体几何参考点”。6.3 用于 ADD / ADDS 评估代码位置pvn3d/lib/utils/pvn3d_eval_utils.pypvn3d/lib/utils/pvn3d_eval_utils.py核心逻辑mesh_ptsbs_utils.get_pointxyz_cuda(...)addbs_utils.cal_add_cuda(pred_RT,gt_RT,mesh_pts)addsbs_utils.cal_adds_cuda(pred_RT,gt_RT,mesh_pts)这里.ply的作用是提供物体的 3D 模型点将这些模型点分别变换到预测位姿和真实位姿下计算两者之间的平均距离所以在 ADD / ADDS 评估中.ply提供的是物体几何形状的参考基准评估用到的不是纹理、颜色、面片而是模型点坐标。6.4 用于姿态可视化投影代码位置pvn3d/demo.py核心逻辑mesh_ptsbs_utils.get_pointxyz(obj_id,ds_typeargs.dataset).copy()mesh_ptsnp.dot(mesh_pts,pose[:,:3].T)pose[:,3]mesh_p2dsbs_utils.project_p3d(mesh_pts,1.0,K)np_rgbbs_utils.draw_p2ds(np_rgb,mesh_p2ds,colorcolor)这里.ply提供的模型点会被读成 3D 点集用预测位姿做刚体变换投影到图像平面画到图像上因此它承担的是预测结果的几何可视化注意这里画的是“投影后的模型点”不是利用.ply的面片做真实网格渲染。6.5 用于 Blender 模型或 YCB 模型的几何读取代码位置pvn3d/lib/utils/basic_utils.pypvn3d/lib/utils/basic_utils.pypvn3d/lib/utils/basic_utils.py这里通过load_ply_model()、get_blender_model()、get_ycb_ply_mdl()将.ply转成N x 3的点坐标数组。其用途仍然是读取几何模型为后续几何运算提供点集不是读取颜色、法线、材质等信息。7. 在当前项目中没有使用.ply的哪些信息从当前代码路径看下面这些信息即使存在于.ply文件中也不是当前核心流程依赖的内容顶点颜色rgb顶点法线nx ny nz三角面片face材质属性纹理坐标注释信息如果把一个.ply文件里的颜色删掉法线删掉面片删掉只保留能被当前代码读取的顶点坐标那么项目的大部分几何相关逻辑仍然是可以运行的。这也解释了为什么当前仓库中一些函数只关心“每行前 3 个数”。8..ply与farthest*.txt的关系虽然这不是本文重点但它和.ply的角色差异很大值得顺手说明。.ply存储完整物体模型的顶点集合点很多是物体整体几何来源farthest.txt、farthest4.txt、farthest12.txt等只存储少量关键点坐标通常是从模型上挑出的代表性点用于关键点监督和位姿恢复所以两者关系是.ply提供完整几何farthest*.txt提供从完整几何中选出的少量关键点9. 总结9.1 从 PLY 格式本身看PLY 是一个通用 3D 数据容器可以包含顶点坐标法线颜色面片拓扑纹理或其他自定义属性9.2 从当前 PVN3D 项目实现看项目实际核心使用的主要是头部里的顶点数量信息顶点坐标x y z这些数据被用于生成物体模型点集构建姿态评估所需的几何参考计算 ADD / ADDS将预测位姿下的模型点投影到图像中做可视化而以下信息并不是当前主要使用内容法线颜色面片材质与纹理因此在当前PVN3D仓库的语境里.ply更准确的理解应当是“物体几何顶点坐标的来源文件”而不是“被完整消费的网格渲染资源文件”。