4. 协同框架总览:三种主流架构

聊到检测与位姿估计的协同,我见过不少团队一上来就调模型,结果折腾几个月精度还是上不去。其实,选对协同框架比调参重要得多。我个人习惯把主流方案分成三类:串联架构、端到端联合学习、多任务学习。这三条路各有各的脾气,咱们一条条捋清楚。

核心观点: 没有最好的架构,只有最合适的场景。选型前先问自己三个问题——实时性要求多高?标注数据够不够?算力资源紧不紧?

4.1 检测-位姿估计串联架构

这是最经典的做法,也是我最早接触的方案。说白了就是两步走:先用目标检测把物体框出来,再在框内做位姿估计。两个模型独立训练,推理时串行执行。

为什么很多人喜欢它? 模块解耦,调试方便。检测模型出了问题,换检测;位姿模型不准,调位姿。我在一个工业抓取项目里就用过这种方案,当时检测用 YOLOv5,位姿用 PVNet,两周就搭出了可跑的原型。

特性 说明 我的经验
训练方式 检测和位姿模型独立训练 可以分别调优,省心
推理流程 检测 → 裁剪 → 位姿估计 注意裁剪会丢失上下文
误差传递 检测框不准,位姿必歪 我曾经吃过这个亏
适用场景 物体大、背景干净、算力有限 工业分拣、桌面抓取
避坑指南: 我曾经在一个密集堆叠场景里用串联架构,检测框互相遮挡,裁剪出来的区域全是碎片,位姿估计直接崩了。后来加了 NMS 阈值调优才勉强能用。如果你遇到类似场景,建议先评估遮挡程度。

串联架构的代码实现也很直观。检测输出 bbox,然后根据 bbox 裁剪图像区域,再送入位姿网络。伪代码大概长这样:

# 串联架构推理流程
def detect_and_pose(image):
    # 步骤1:目标检测
    bboxes, scores = detector(image)
    
    # 步骤2:对每个检测框做位姿估计
    poses = []
    for bbox in bboxes:
        # 裁剪图像
        crop = image[bbox.y1:bbox.y2, bbox.x1:bbox.x2]
        # 位姿估计
        pose = pose_estimator(crop)
        poses.append(pose)
    
    return bboxes, poses

嗯,这里要注意:裁剪操作会丢失物体周围的上下文信息。如果物体本身纹理少,或者背景有干扰,位姿精度会明显下降。

4.2 端到端联合学习架构

串联架构有个硬伤——检测误差会一路传导到位姿。你想想看,检测框偏了 5 个像素,位姿可能就偏了 5 度。端到端联合学习就是为了解决这个问题。

核心思路: 用一个网络同时输出检测结果和位姿参数,共享特征提取层,梯度可以反向传播到整个网络。说白了,检测和位姿不再各干各的,而是互相拉一把。

我记得 2020 年有个工作叫 PoseCNN,就是典型的端到端方案。它把检测分支和位姿分支放在同一个 backbone 上,检测分支提供物体中心点,位姿分支回归旋转和平移。效果确实比串联好,但训练起来也麻烦不少。

我的建议: 如果你有充足的标注数据(检测框 + 位姿真值),而且算力够用,端到端方案值得一试。但要做好心理准备——训练收敛比串联慢,调参也更折腾。

端到端架构的损失函数通常长这样:

# 端到端联合损失
L_total = λ_det * L_det + λ_pose * L_pose + λ_reg * L_reg

# L_det: 检测损失(分类 + 回归)
# L_pose: 位姿损失(旋转 + 平移)
# L_reg: 正则化项

权重 λ 怎么设?我踩过坑。一开始我让 λ_det 和 λ_pose 都是 1,结果检测学得很好,位姿一塌糊涂。后来把 λ_pose 调到 5,位姿精度才上来。这个比例跟数据集有关,建议从 1:1 开始,观察两个分支的 loss 量级再调。

4.3 多任务学习架构

多任务学习跟端到端有点像,但理念不同。端到端强调的是「联合推理」,多任务强调的是「共享表征」。什么意思呢?就是让检测和位姿共享同一个特征空间,但各自保留独立的预测头。

关键区别: 多任务学习允许两个任务有不同的输入输出格式,甚至可以用不同的损失函数。比如检测用 Focal Loss,位姿用 L1 Loss,互不干扰。而端到端方案通常要求两个任务的输出在同一个坐标系下。

对比维度 串联架构 端到端联合学习 多任务学习
训练复杂度 低 高 中
推理速度 慢(两步) 快(一步) 快(一步)
精度上限 受检测误差限制 高(联合优化) 中高(共享特征)
标注需求 检测框 + 位姿 检测框 + 位姿 检测框 + 位姿
调试难度 低 高 中

我在一个仓储机器人项目里用过多任务学习。当时需要同时检测货架上的商品并估计抓取位姿。串联架构太慢,端到端又不好调,最后选了多任务方案。共享 backbone 用 ResNet-50,检测头用 YOLO 风格,位姿头用直接回归 6D 参数。效果还不错,推理能跑到 30 FPS。

选型口诀: 串联保下限,端到端冲上限,多任务取中间。实际项目中,我建议先用串联快速验证可行性,再根据精度瓶颈决定是否升级到端到端或多任务。

4.4 三种架构的协同关系图

下面这张图展示了三种架构的核心流程和差异。你可以看到,串联是串行流水线,端到端是单网络多输出,多任务是共享 backbone 多分支。

三种协同架构对比 串联架构 输入图像 检测网络 裁剪 位姿网络 输出位姿 端到端联合学习 输入图像 共享 Backbone 特征提取 检测头 位姿头 联合输出 多任务学习 输入图像 共享 Backbone 特征提取 检测分支 位姿分支 检测结果 位姿结果 串联:串行流水线 | 端到端:单网络多输出 | 多任务:共享特征多分支

4.5 如何选择?我的实战建议

说了这么多,到底怎么选?我根据项目经验总结了一个决策流程:

  1. 先看实时性要求:如果要求 30 FPS 以上,优先考虑端到端或多任务。串联架构两步走,很难跑快。
  2. 再看标注数据:如果检测框和位姿标注都很充分,端到端收益最大。如果只有检测框标注,位姿靠合成数据,串联更稳妥。
  3. 最后看调试资源:团队里如果有人专门调模型,可以上端到端。如果都是全栈工程师,串联更友好。
一个小技巧: 我习惯先用串联架构跑通全流程,然后逐步把检测和位姿的 backbone 共享,过渡到多任务学习。如果精度还不够,再考虑端到端。这样每一步都有 baseline,出了问题也知道是哪一步引入的。