
1. 先把6D这个词拆开它在估什么又容易被误读成什么1.1 六个自由度到底指哪六个刚接触这个方向的人十有八九会被6D这个写法绊一下。它不是指六个维度也不是指某个六维特征向量而是指刚体在三维空间中的六个自由度三个平移自由度加上三个旋转自由度。平移部分是一个三维向量 $t(t_x,t_y,t_z)$描述物体中心相对相机坐标系的位置旋转部分是一个属于 $SO(3)$ 的 $3\times3$ 正交矩阵 $R$描述物体自身的朝向。合起来就是经典的位姿矩阵$$T \begin{bmatrix} R t \ 0 1\end{bmatrix} \in SE(3)$$这里有个概念一定要掰清楚我们估的是物体相对相机坐标系也就是相机光心建立的坐标系的位姿不是相对世界坐标系的位姿。这个差异在单目场景里无所谓因为你只能定义到相机坐标系但一旦进入多相机或者手眼标定链路坐标系转换会变成最大的误差来源。我见过不少项目在算法侧做到 ADD 0.9 以上结果上了机械臂抓不住最后一查是相机到基座的标定矩阵抄错了符号。另一个容易被忽略的点是单位。平移向量 $t$ 的数值取决于相机内参和尺度定义。如果你直接用单目 RGB 训练网络输出的 $t$ 常常是相对物体自身尺寸归一化的必须乘回真实物理尺寸才能送进机器人控制器。有人把归一化后的 $t$ 直接喂给规划器机械臂就往桌子里捅这种事故在早期项目里很常见。1.2 它和人体姿态估计看着像其实是两套完全不同的任务搜索姿态估计弹出来的结果一大半是人体姿态COCO 关键点、OpenPose 的十六点到二十五点骨架、MPII 的十六关键点、Human3.6M 的三维关节点。这些属于人体姿态估计输出是一组关节点坐标二维或三维描述的是人的关节位置和动作形态。而 6D 姿态估计输出的是一个刚体的 $R$ 和 $t$描述的是这个杯子在哪、朝哪边。二者共享的只有姿态这个词。区别体现在三处输出空间不同。关键点是若干离散点预测错了只是骨架歪一点6D 姿态是一个连续流形上的元素旋转矩阵必须满足正交且行列式为 1网络一旦不约束这个结构输出就会漂到一个看起来差不多但没法用的地方。物体先验不同。人体姿态天然有骨骼长度、关节角度范围的强先验做平滑和重投影非常容易6D 位姿面对的可能是任意形状的物体除了 CAD 模型本身几乎没有可用的结构先验。评价方式不同。关键点用 PCK、OKS 这类基于距离阈值的指标就够了6D 位姿必须用 ADD、VSD 这一类对旋转和平移联合敏感、且要考虑对称性的指标。至于常见人体动作这类热词指向的是动作识别NTU RGBD、Kinetics 这类数据集和位姿估计又是另一条支线。把这三个概念混在一张技术路线图里讨论是很多综述类文章显得什么都讲了但什么都不透的根本原因。我写这篇东西的出发点就是只谈物体 6D 位姿这条线需要人体姿态的读者可以把它当作对照组来看。1.3 旋转表示的选择直接决定网络能不能训得动这是我认为整个方向上最反直觉也最有价值的一个知识点。理论上旋转有欧拉角、轴角、四元数、旋转矩阵等一堆等价表示但对于神经网络回归来说它们并不等价。Zhou 等人在 2019 年那篇讨论旋转表示连续性的工作里给出了一个很有说服力的结论欧拉角存在万向锁、四元数存在双覆盖导致的符号跳变$q$ 和 $-q$ 表示同一旋转但欧氏距离很远、$3\times3$ 旋转矩阵受正交约束限制这几种常见表示在用欧氏损失做回归这个场景下都存在不连续或歧义会逼着网络去拟合一个拓扑结构错误的映射。他们提出的做法是让网络回归旋转矩阵的前两列共 6 个数再用施密特正交化还原出完整旋转。这个6D 表示现在几乎是标配。下面这段代码就是最常见的实现可以直接抄import torch def gram_schmidt_to_rotmat(x6): x6: (B, 6) 网络输出返回 (B, 3, 3) 旋转矩阵 a1, a2 x6[:, :3], x6[:, 3:] b1 torch.nn.functional.normalize(a1, dim1) b2 a2 - (b1 * a2).sum(dim1, keepdimTrue) * b1 b2 torch.nn.functional.normalize(b2, dim1) b3 torch.cross(b1, b2, dim1) return torch.stack((b1, b2, b3), dim-1) # 按列拼成矩阵训练时用 6 维向量算损失推理时转成旋转矩阵再和 $t$ 拼成位姿矩阵去算指标——注意训练和评测必须用同一套转换逻辑否则会出现训练 loss 一路下降但评测指标死活上不去的诡异现象我第一次踩这个坑时排查了整整两天最后发现是评测脚本里用了另一套正交化实现。2. 四条技术路线的分野从对应点投票到神经渲染2.1 经典几何链路对应点加 PnP再到 ICP 收尾如果只有一台普通 RGB 相机、一个已知 CAD 模型最朴素的解法是这样的先在图像上找到若干个二维点和它们在模型上的三维对应点凑够四对以上用 PnP 解出位姿再用深度数据跑一轮 ICP 精修。这条路子几十年没变过到现在仍然是绝大多数深度学习方案的最后一环。为什么它这么顽固因为 PnP 是个几何闭合的解法给定正确的对应点它几乎不会出错而且求解过程可解释、可回溯。深度网络擅长的其实是找到对应而不是算出位姿。理解了这一点就看懂了这个领域过去十年的主线——大家一直在换着花样做同一件事把找对应点的活儿做得更稳。OpenCV 里几行就能跑起来import cv2, numpy as np # obj_pts: (N,3) 模型坐标系下的点img_pts: (N,2) 图像上的像素点 ok, rvec, tvec, inliers cv2.solvePnPRansac( obj_pts.astype(np.float64), img_pts.astype(np.float64), K, distCoeffsNone, flagscv2.SOLVEPNP_EPNP, reprojectionError3.0, iterationsCount200, confidence0.99) R, _ cv2.Rodrigues(rvec)几个实操参数值得说reprojectionError3.0在 640×480 尺度下比较通用图像分辨率翻倍就要跟着放大iterationsCount别贪大200 次在高内点率场景下足够真正需要调的是内点判定阈值它决定了错误对应点能造成多大破坏。另外SOLVEPNP_EPNP适合点数多十个以上的情况SOLVEPNP_AP3P在只有四五个点时更稳但代价是对噪声极度敏感。2.2 显式对应路线PVNet、DPOD、PVN3D 的共同逻辑这条路线可以统称为稠密对应 PnP。代表工作有几个DPOD2019直接为物体每个可见像素回归它在纹理图上的 UV 坐标得到稠密对应后做 PnP再加上一个针对对称物体的后处理。它的优点是输出天然稠密缺点是必须先有一个带纹理的模型。PVNet2019的思路更巧妙不给像素直接回归坐标而是让每个前景像素投票出关键点的方向向量再把所有投票聚合成关键点位置最后用 RANSAC 做 PnP。投票这个设计对遮挡特别友好——即使关键点本身被挡住了周围的像素仍然能指出它的位置。作者还顺带把投票的方差当作不确定性加权进 PnP这一步在遮挡场景里带来的提升非常明显。PVN3D2020把投票从二维搬到三维点云上做的是中心点投票 关键点投票 最小二乘拟合位姿的流程。在 YCB-Video 上它把 ADD-S 拉到了 0.95 以上的量级至今仍是很多项目的 baseline。这三者的共同点是位姿不是网络直接吐出来的而是从一组中间表示里解出来的。这个设计带来的最大工程收益是——出错的时候你能知道错在哪一环。是分割漏了物体是投票方向乱了还是 PnP 的内点筛选有问题每一环都能单独可视化、单独替换。相比之下直接回归的模型一旦效果不好你基本只能重新训。2.3 直接回归与迭代精修从 PoseCNN 到 DeepIM 的演进PoseCNN2017是这个方向上的分水岭。它用三个分支分别做语义分割、中心点回归通过 Hough 投票和旋转回归四元数。顺便说一句ADD 这个指标就是这篇论文提出来的它把 6D 姿态估计从几何配准问题正式变成了可评测的学习任务。但直接回归有个绕不过去的毛病精度受限于回归的分辨率。四元数回归出来的位姿往往只能做粗定位平移误差动辄几厘米。于是有了迭代精修这条路——DeepIM2018的做法是先用一个初始位姿把模型渲染出来然后把渲染图 观测图一起送进网络让网络预测一个相对位姿修正量反复迭代几次。这本质上是把位姿估计变成了位姿比较而比较两个图像的差异正是卷积网络最擅长的事。这条思路后来衍生出很多变体包括多视图联合优化的CosyPose2020它在多相机或视频序列下用 RANSAC 做跨视图一致性筛选能显著改善遮挡和单视图歧义。我个人的经验是如果你的场景是固定工位、相机和物体相对关系稳定迭代精修路线的性价比远高于直接回归——初始位姿哪怕粗一点迭代三轮之后平移误差通常能收敛到毫米级。2.4 隐式表示与新物体泛化NOCS、MegaPose、FoundationPose前面三条路线的共同前提是待估物体的 CAD 模型事先已知。一旦要处理没见过的东西就得换思路。NOCS2019提出了归一化物体坐标空间把任意物体归一化到一个共享的立方体坐标系里网络预测每个像素的 NOCS 坐标再通过配准求出位姿。它把问题从实例级推进到了类别级——同一个类别比如所有马克杯共用一个空间先验。再往后是从单张参考图直接建物体表征的路线MegaPose2022用一个大规模合成数据训练的比较网络仅凭一张 RGB 参考图就能估计新物体位姿。而FoundationPose2024把这条线做得更完整既支持基于 CAD 模型也支持基于少量参考图既支持单帧估计也支持视频跟踪核心是一个统一的神经物体表征加一个位姿假设-验证的循环。同期还有把分割基础模型引进来的做法如SAM-6D先分割再匹配把泛化性推到了零样本的边界。给一个我自己总结的取舍表方便直接从场景倒推方法方法路线需要 CAD 模型需要深度遮挡鲁棒性推理速度典型场景对应点投票PVNet/PVN3D是可选强中等固定工位、已知料箱物件直接回归PoseCNN 系是否弱快快速粗定位、初值提供迭代精修DeepIM/CosyPose是可选较强慢多轮高精度装配、多相机类别级/零样本NOCS/MegaPose/FoundationPose否建议有中等慢新物体上线快、品类多3. 数据集和评测协议论文里的数字该怎么读3.1 从 LineMOD 到 T-LESS难度不是线性递增的LineMOD是这个领域的入门数据集十五个日常小物体大约一千多帧标注图像背景干净、遮挡少。它的问题也正在于此——在上面刷到 95% 以上的 ADD 已经不稀奇很多时候模型学到的是数据集特有的纹理和背景而不是真正的位姿能力。Occlusion LineMODLM-O是同一个数据集的重标注版本只挑了一千两百多帧遮挡严重的帧。它的分数通常比 LineMOD 低十几个点更能反映真实能力。我一般会建议把 LM-O 当作主指标LineMOD 只用来确认训练流程没写错。YCB-Video是另一个主力二十一类共几十个真实物体九十多段视频、十几万帧。它的特点是物体材质多样有金属、有透明塑料而且提供了多视角序列适合做时序方法。难点在于对称物体多加上部分物体表面反光严重单目 RGB 上一不小心就全军覆没。T-LESS是最不讲道理的一个三十个工业零件绝大多数是无纹理、几何自相似的物体而且很多是旋转对称的。它的主测试集有两万多张实拍图分为多个测试场景。在任何方法上T-LESS 的分数都会比 LineMOD 低一大截因为它几乎抹掉了所有依赖纹理的捷径。做工业抓取的团队我的建议是先啃 T-LESS能拿到可用分数再换自己的数据否则很容易在自己数据上遇到看起来简单但就是不动的窘境。3.2 ADD、ADD-S、VSD、AR每个指标背后都藏着一个假设指标这件事必须单独讲因为误用指标比用错模型更危险。ADD的定义很直观把模型上的采样点用预测位姿变换一遍再用真实位姿变换一遍算两组点的平均欧氏距离小于物体直径的 10% 就算这一帧估计正确。它的问题是对称物体完全失效——一个杯子转 180 度几何上完全一样但 ADD 会给出一个巨大的数。ADD-S改成算预测点到真值点集的最近邻距离平均值绕开了对称性问题。但这是个双刃剑ADD-S 对非对称物体同样会偏松而且它把旋转错 180 度和旋转错 5 度的差距压缩了。我遇到过模型 ADD 只有 0.6 而 ADD-S 有 0.93 的情况实际上模型根本没学好旋转只是中心点估得准而已——拿去抓取照样翻车。VSDVisible Surface Discrepancy是 BOP 挑战赛主推的指标思路是只比较可见表面的距离和遮挡关系而且对对称物体用距离函数代替点对应。它更接近视觉上是否一致这个真实需求。BOP 里常用的参数是 $\tau0.05$深度容差、$\theta0.2$正确性阈值这两个数改动一下排名就会变所以看论文时一定要确认它用的是哪套配置。ARAverage Recall是 BOP 的做法把 ADD或 ADD-S、VSD、MSSD、MSPD 等若干指标在阈值 0.05 到 0.5 之间积分求 AUC再取平均。这个综合分数的好处是不容易被单一指标刷爆。指标对称物体适用性对旋转敏感度常见陷阱ADD不适用高对称物体被误判为失败ADD-S适用低掩盖旋转误差分数虚高VSD适用中依赖深度图质量与渲染精度AR (BOP)适用中需要按官方代码跑自己实现容易有偏差提示如果要报告结果请务必说明用的是哪一版 BOP 的对称性定义和阈值配置。我见过两个团队各自报 0.9 的 VSD实际性能差一个数量级原因就是对称变换集合不一样。3.3 合成数据与域随机化BlenderProc 那条流水线真实标注 6D 位姿的成本极高——每一帧都要精确对齐稍微偏一点就变成了噪声标签。所以现在几乎所有方法都依赖合成数据流程大致是准备资产CAD 模型 若干张带纹理的贴图。没有纹理的模型可以程序化生成随机纹理工业件通常需要这一手。搭场景用 BlenderProc 或 PyBullet 把物体随机撒在桌面/料箱里随机化相机位姿、光照方向、光源色温、背景贴图、物体材质粗糙度与金属度。渲染与出标签同时输出 RGB、深度、实例掩码、法线、以及精确的位姿真值。这一步的精确是相对渲染引擎坐标系而言的只要相机内外参一致标签就是无噪声的。课程式采样训练初期用大范围随机位姿后期逐步收敛到真实场景的位姿分布。这一点很关键纯随机往往导致模型在真实分布上欠拟合。域随机化的效果好不好取决于随机化的维度和真实域的差异维度是否对得上。如果真实场景光照很稳定你把光照随机得天花乱坠反而有害反过来真实场景如果金属反光严重合成时不模拟各向异性反射模型就一定在真实数据上掉点。我的做法是先拍 20 张真实图把它们的背景复杂度、光源数量、高光强度量化一下再照这个范围去定随机化参数。3.4 人体姿态数据集替代不了物体位姿数据集这一节专门写给从人体姿态方向转过来的朋友。COCO Keypoints、MPII、Human3.6M、3DPW 这些数据集再大也不能用来训练或评测 6D 物体位姿原因有三个标注对象不同。它们标注的是人体关节点坐标没有刚体位姿的概念也没有物体的 CAD 模型。自由度含义不同。人体姿态的三维关节点不是刚性变换的结果用刚体约束去拟合只会得到无意义的结果。评测目标不同。PCK、OKS 这些指标衡量的是关键点定位精度与物体在哪、朝哪边没有对应关系。如果你的任务确实同时涉及人和物比如人-物交互、协作装配正确做法是分两条支线各自训练再在结果层做几何融合而不是试图用一个模型统一输出。4. 从零跑通一条推理链路环境、代码与调试手段4.1 工具栈选型与版本踩坑我目前比较稳定的组合是PyTorch 2.x OpenCV 4.8 以上 trimesh处理网格和采样点 pyrender 或 BlenderProc做渲染验证 BOP Toolkit跑官方评测。如果要用点云分支加上 Open3D要做可微渲染用 PyTorch3D 或 nvdiffrast。几个具体的版本坑OpenCV 的solvePnP在不同版本对useExtrinsicGuess的默认行为有差异如果你的代码在 4.5 上跑通、4.9 上出问题第一件事是显式把参数写全。PyTorch3D 和 PyTorch 主版本绑定较紧升级 PyTorch 之前先确认有没有对应轮子否则会陷入编译地狱。BOP Toolkit 对目录结构有硬性要求模型文件、标注文件、相机参数文件的命名和层级都必须按它的规范放否则会在评测时报找不到对称变换这类莫名其妙的错误。关于 trimesh 采样点我建议用面积加权的泊松盘采样而不是简单的均匀随机。因为 ADD 类指标对点集的分布敏感采样方式不同同一模型的指标可能差一到两个点。为了和论文可比最好直接用 BOP 官方提供的模型点集文件。4.2 一条可复现的像素投票加 PnP 加精修链路把这条链路拆开一共四个可独立验证的阶段第一阶段实例分割。目标是从图中拿到每个物体的前景掩码。工业场景用 Mask R-CNN 变体就够追求泛化可以换分割基础模型再微调。这一步的输出质量直接决定上限掩码边缘吃掉两三个像素后面的投票就会整体偏移。第二阶段对应点回归或投票。网络输出每个前景像素到各个关键点的单位方向向量以及一个可见性/不确定性权重。这里有个实用技巧训练时把不可见关键点的标签设为不参与损失而不是方向为零否则网络会被迫去学一个无意义的零向量。第三阶段聚合与 PnP。把所有像素的方向向量做投票得到二维关键点位置再配合模型上的三维关键点做 RANSAC PnP。投票的带宽参数需要调——带宽太小则峰值尖锐但对噪声敏感太大则关键点位置糊掉。实践中我会取图像短边的 1%~2% 作为带宽。第四阶段精修。有深度就把点云对齐上去跑 ICP没有深度就用渲染比较法迭代修正。ICP 的关键参数是对应点距离阈值和最大迭代次数前者建议取模型直径的 2%~5%后者 20 到 30 次足够收敛。4.3 用可视化手段定位误差来源我强烈建议在项目一开始就把这几个可视化做出来后面能省掉大量猜测时间重投影叠加图把模型的边线按预测位姿投影到图像上肉眼一看就知道是旋转错了还是平移错了。旋转错的话边线方向不对平移错的话整体偏移但方向正确。投票方向场把每个像素的投票方向画成箭头能立刻看出是分割污染还是网络本身没学好。误差随距离/角度的分布曲线把测试集按物体到相机的距离分桶画每桶的 ADD 曲线。如果远距离急剧恶化说明平移回归存在系统性偏差而不是随机噪声。失败帧聚类把所有失败帧按背景亮度、遮挡比例分组通常能发现某一类场景集中失败。注意位姿误差一定拆成旋转误差用测地距离单位度和平移误差用米或毫米分别统计。合成一个综合误差会让你在排查时完全失去方向感。4.4 相机标定误差是怎么一步步放大成位姿误差的这是我认为最值得专门写一节的内容因为它是最隐蔽的误差源。假设内参焦距有 1% 的误差。在透视投影下图像坐标 $u f_x \cdot X/Z c_x$。焦距误差会让网络学到的像素级对应点在反投影时产生系统性偏移而这个偏移会随物体深度线性放大。粗略地说焦距误差 1%在 1 米距离上会带来约 1 厘米量级的平移误差这个量级已经超过很多装配任务的全部容差了。主点 $(c_x, c_y)$ 的误差通常影响更直接它不随深度缩放而是平移式的常常表现为所有估计都往一个方向偏一点。如果多个物体连续多帧都朝同方向偏几乎可以断定是主点没标好或者预处理时裁剪没同步调整内参。还有一个极其常见的坑图像在送入网络前做了缩放或裁剪但评估脚本里还用的是原始内参。比如原图 1280×720网络输入 640×480那么 $f_x, f_y, c_x, c_y$ 都要乘 0.5。这件事听起来低级但我在三个不同项目里都遇到过而且症状是训练正常、评测莫名其妙整体偏移。# 图像缩放后内参同步缩放别漏了这一步 scale_x, scale_y net_w / raw_w, net_h / raw_h K_net np.array([[fx*scale_x, 0, cx*scale_x], [0, fy*scale_y, cy*scale_y], [0, 0, 1]])5. 那些论文不写、实测才暴露的坑5.1 对称物体的 ADD-S 幻觉前面提过一次这里展开讲。ADD-S 的最近邻匹配让旋转错 180 度的惩罚变得非常小但对于一个只有部分对称性的物体比如一个把手偏在一边的杯子旋转错半圈其实会影响抓取姿态。真正正确的做法是使用物体完整的对称变换集合来做对称感知的距离计算——BOP 官方为每个物体都定义了对称变换连续对称用旋转轴描述离散对称列出具体矩阵。如果你自己实现指标请在模型文件里把对称性写全别图省事用 ADD-S。我踩过的具体坑某个圆柱类零件模型上有个小凸台。算法在测试集上 ADD-S 0.97看起来很漂亮。实际抓取时机械臂有大约三分之一的概率抓到凸台那一侧夹爪合不拢。查了半天才发现模型对这个凸台的朝向根本没学到——因为 ADD-S 的最近邻匹配把小凸台抹平了。换成 VSD 之后分数掉到 0.62才和现场表现对得上。5.2 内参和预处理不一致导致的玄学掉点除了上面的缩放问题还有几处容易出问题畸变校正的顺序。如果你在推理时对图像做了去畸变但用的是去畸变后的内参同时训练数据是未去畸变的模型学到的投影关系就对不上。要么全程不去畸变要么训练推理统一。颜色通道顺序。BGR 和 RGB 搞反在分类任务里常常只是掉几个点但在位姿任务里可能让整个模型失效因为它干扰了纹理对应的学习。深度图的对齐方式。RGB-D 相机输出的深度图常常和彩色图有物理偏移必须用厂商提供的对齐参数做重投影。直接把深度图当彩色图的像素坐标用在近距离下误差可以到厘米级。排查这类问题有个笨办法但很有效造一批已知位姿的合成图让整个推理链路跑一遍。因为合成图的位姿是真值任何环节的不一致都会在这里现形。如果合成图上误差接近零而真实图上误差很大问题在数据如果合成图上就已经有很大误差问题在代码。5.3 合成到真实的域间隙比想象中更顽固关于域间隙我想纠正一个常见认知它不是靠随机化更狠就能消掉的。原因是真实域的成像链路里有几件事渲染器很难完整模拟相机的噪声特性。真实传感器的读出噪声、坏点、卷帘快门导致的运动畸变渲染图里都是干净的。材质的复杂反射。金属和塑料的高光在真实场景里是空间变化的简单的环境贴图只能近似。遮挡的软边缘。真实场景中物体边缘有半透明过渡和亚像素混合合成图往往过于锐利。我的应对策略是分三步先用合成数据把模型训到能跑通全链路然后采集 200 到 500 帧真实数据做少量标注用半自动方法先用当前模型预测再用渲染叠加人工微调做一轮微调最后用真实数据做最终的指标评估。这个少量真实微调带来的提升通常远大于把合成数据的渲染质量再提升一个档次。5.4 指标高和抓得住是两件不完全相干的事这是我最想强调的一条经验。位姿指标衡量的是位姿数值是否接近真值而抓取成功衡量的是夹爪是否落在允许的抓取区域且姿态在容差内。两者之间隔着三层指标是全物体平均的抓取只关心你实际要抓的那个部位指标假设真值位姿是唯一正确的但实际抓取可能有一整个可行位姿集合比如圆柱体绕轴任意旋转都能抓指标不考虑运动学可达性和碰撞而真实抓取要在机械臂工作空间里做规划。所以我现在的做法是离线指标只用来筛模型上线前一定要做一次真实抓取成功率测试而且至少 50 次。如果指标 0.9 但成功率只有 60%别急着换模型先去看失败样本——大概率是容差设置或者抓取点定义的问题而不是位姿精度不够。6. 选型建议不同场景下我会怎么挑方案6.1 按三个轴切分场景我的决策逻辑基本围绕三个问题展开第一物体是否已知且固定已知且有 CAD 模型走对应点投票加 PnP 这条路简单可靠、可解释、好调。物体类别固定但实例多样比如各种包装盒考虑类别级方法。物体频繁更换、每次上线新品类都要等几天标注那就得上零样本路线接受它精度略低但上线快的现实。第二有没有可靠的深度有深度的话三维投票如 PVN3D 思路通常比纯二维对应更稳尤其在无纹理物体上。没有深度就要在纹理和轮廓上做更多工作同时接受对称物体上的天然歧义。第三算力预算多少边缘设备上跑单帧预算 30 毫秒以内就老老实实选轻量分割加轻量投票网络加 PnP别想迭代精修。有服务器端的算力迭代精修和渲染比较路线可以放开用精度收益很实在。6.2 部署侧的量化与加速取舍部署阶段我踩过的坑集中在精度损失上FP16 量化通常安全对位姿精度的影响一般在千分之几的平移误差量级可以放心用。INT8 量化要谨慎尤其是做对应点回归的分支量化后的方向向量误差会被 PnP 放大。我的经验是 INT8 只用在主干特征提取上输出头保留 FP16。输入分辨率降低是最容易被忽视的隐性量化。把 640×480 降到 320×240 提速四倍但投票的带宽参数必须跟着减半否则关键点位置会糊成一片精度损失比 FP16 大得多。还有一个部署层面的经验把 PnP 和 ICP 放在 CPU 上用 OpenCV 的多线程实现往往比放到 GPU 上自己写更快。因为这部分代码在 CPU 上已经高度优化而且省掉了数据在主机和设备之间的来回拷贝。我测过的场景里把 PnP 挪到 CPU 能省下将近 5 毫秒的单帧时间。6.3 我个人觉得值得继续深挖的几个方向最后分享一些我观察到的、短期内比较值得投入的方向。一是时序信息的利用还不够充分。大部分方法还是在逐帧独立估计但视频里物体的运动是连续且受物理约束的。把位姿序列当作状态去做滤波或联合优化在遮挡场景下能带来很实在的提升而且实现成本不高——卡尔曼滤波加一个简单的运动模型就能解决不少单帧失败。二是对称性和部分可观测性的建模。现在很多方法在遇到对称物体时要么输出一个任意的对称等价解要么给出一个多峰的模糊结果。能不能显式地输出位姿的概率分布而不是一个点估计是这个方向能不能进入高精度装配场景的关键。三是评测与真实任务的对齐。这一条我在第 5 节讲过了但我真的希望看到更多工作直接报告端到端的任务成功率而不只是一个 ADD 数字。指标和任务之间的那道缝最终是要有人去补的。四是数据标注成本的下降。半自动标注加少量人工修正目前是我用过性价比最高的方案。如果能在合成数据和真实数据之间建立一个自动的迭代闭环——模型预测、渲染验证、自动筛选需人工修正的帧——那么一个新物体从拿到 CAD 到上线可能只需要半天这件事的意义比再刷两个点的 ADD 大得多。我个人的体会是这个方向的研究进展很快但工程落地的瓶颈其实很少在模型结构上。绝大多数真实项目卡住的地方是标定、数据、预处理一致性和任务定义这些不性感的环节。把这几处做扎实用一个三年前的方法也能跑出很好的效果反过来用最新的模型配上不一致的内参结果只会是一堆看不懂的误差曲线。