4. 感知模型基础

在 Jetson 边缘平台上部署感知模型之前,必须先厘清“任务类型”与“评价指标”这两件事。任务类型决定了模型输出张量的形状、后处理逻辑以及算力消耗;评价指标决定了我们如何判断一个模型是否真的“够用”。很多部署失败并非因为模型精度差,而是因为把分类模型当成检测模型用、把语义分割指标套在实例分割上,导致验收标准错位。本章围绕四类主流感知任务展开,并给出 Jetson 场景下的指标选择建议。

一、四类感知任务的核心差异

感知任务可以按“输出粒度”和“是否区分个体”两个维度划分。目标检测输出一组边界框,每个框带类别与置信度,回答“有什么、在哪里”;语义分割为每个像素分配类别标签,回答“每个像素属于什么”,但不区分同类个体;实例分割在语义分割基础上为每个目标实例生成独立掩码,回答“每个像素属于哪个具体个体”;姿态估计则定位人体或物体的关键点,回答“关节在哪里、如何连接”。

从计算复杂度看,检测通常最轻,语义分割次之,实例分割因需要逐实例掩码而最重,姿态估计介于检测与分割之间,但后处理(关键点分组)可能成为瓶颈。在 Jetson Orin Nano 这类 8GB 显存设备上,同时跑检测与分割需要仔细规划显存与带宽。

四类感知任务:输出粒度与个体区分 输入图像 RGB 1920×1080 或 640×640 Tensor NHWC 目标检测 输出:边界框 + 类别 + 置信度 代表:YOLO / SSD 指标:mAP@0.5 语义分割 输出:逐像素类别 不区分个体 代表:FCN / DeepLab 指标:mIoU 实例分割 输出:逐实例掩码 + 类别 + 框 代表:Mask R-CNN 指标:mask mAP 姿态估计 输出:关键点坐标 + 连接关系 代表:OpenPose 指标:OKS / PCK 输出粒度: 框级 像素级(不区分个体) 像素级(区分个体) 点级 Jetson Orin Nano 8GB 典型推理耗时(FP16, 640×640) 检测 ~8ms 语义分割 ~22ms 实例分割 ~45ms 姿态估计 ~18ms 部署选型提示: 检测适合实时避障与计数;语义分割适合可行驶区域划分;实例分割适合精细抓取;姿态估计适合人机交互。 若需同时运行多任务,优先考虑共享 Backbone 的多头网络,减少重复特征提取。

二、评价指标:别只看 mAP

目标检测最常用的指标是 mAP(mean Average Precision),它综合了不同类别在不同召回率下的精度。mAP@0.5 表示 IoU 阈值为 0.5 时的平均精度,mAP@0.5:0.95 则在 0.5 到 0.95 之间以 0.05 为步长取平均,更严格。在 Jetson 部署中,如果业务只关心“有没有检测到”,mAP@0.5 足够;如果关心框的贴合度,必须看 mAP@0.5:0.95。

语义分割使用 mIoU(mean Intersection over Union),即每个类别的预测区域与真实区域的交并比再取平均。实例分割除了 mIoU,还使用 mask mAP,在掩码层面计算 AP。姿态估计常用 OKS(Object Keypoint Similarity),它根据关键点距离和可见性加权,比简单的 PCK 更鲁棒。

任务 核心指标 Jetson 部署关注点 常见阈值
目标检测 mAP@0.5 / mAP@0.5:0.95 后处理 NMS 耗时、框数量 IoU ≥ 0.5
语义分割 mIoU、像素准确率 输出分辨率、上采样开销 mIoU ≥ 0.65
实例分割 mask mAP、mask mIoU 掩码解码显存、ROI Align mask mAP ≥ 0.35
姿态估计 OKS、PCK@0.2 关键点分组、多人场景 OKS ≥ 0.70

三、Jetson 部署中的指标换算与取舍

在 PC 上训练得到的指标不能直接等同于 Jetson 上的表现。TensorRT 的 FP16/INT8 量化会带来精度损失,尤其是语义分割的边界区域和实例分割的小目标掩码。建议在部署后重新跑一遍验证集,记录量化前后的指标差异。以下是一个典型的 TensorRT 引擎构建与精度校验命令:

# 构建 FP16 TensorRT 引擎
trtexec --onnx=yolov8s.onnx \
        --saveEngine=yolov8s_fp16.engine \
        --fp16 \
        --workspace=2048 \
        --verbose

# 使用 polygraphy 对比 ONNX 与 TensorRT 输出差异
polygraphy run yolov8s.onnx \
           --trt --fp16 \
           --validate \
           --atol 1e-2 --rtol 1e-2

如果发现 mAP 下降超过 2 个百分点,优先检查预处理是否一致(归一化系数、letterbox 填充值)、后处理 NMS 的 IoU 阈值是否与训练时一致。很多“精度掉了”的问题其实出在前后处理,而非模型本身。

实用建议:在 Jetson 上做多任务时,不要为每个任务单独跑一个完整模型。可以先用一个共享 Backbone 提取特征,再挂多个轻量 Head。这样显存占用和延迟都更可控,指标损失通常在 1~3 个百分点以内。

四、常见误区与复盘

  • 误区一:用分类准确率衡量检测模型。分类准确率不涉及定位,检测必须看 mAP 和 IoU。若业务只关心“有没有”,可以看召回率,但仍需框的 IoU 达标。
  • 误区二:语义分割与实例分割指标混用。语义分割的 mIoU 不区分同类个体,若业务需要区分“人A”和“人B”,必须用实例分割的 mask mAP。
  • 误区三:忽略后处理耗时。YOLO 的 NMS、Mask R-CNN 的掩码解码在 Jetson CPU 上可能比推理还慢。部署前务必用 trtexec 或 Nsight Systems 测端到端延迟。
  • 误区四:量化后不校验。INT8 对分割边界和关键点坐标影响较大,必须用验证集重新评估 OKS 和 mIoU,不能只看推理速度。
复盘要点:指标是验收的尺子,但尺子要选对。检测看 mAP,分割看 mIoU,实例分割看 mask mAP,姿态看 OKS。在 Jetson 上还要叠加延迟、显存、功耗三个约束。只有指标达标且实时性满足,才算真正部署成功。