4. 感知模型基础
在 Jetson 边缘平台上部署感知模型之前,必须先厘清“任务类型”与“评价指标”这两件事。任务类型决定了模型输出张量的形状、后处理逻辑以及算力消耗;评价指标决定了我们如何判断一个模型是否真的“够用”。很多部署失败并非因为模型精度差,而是因为把分类模型当成检测模型用、把语义分割指标套在实例分割上,导致验收标准错位。本章围绕四类主流感知任务展开,并给出 Jetson 场景下的指标选择建议。
一、四类感知任务的核心差异
感知任务可以按“输出粒度”和“是否区分个体”两个维度划分。目标检测输出一组边界框,每个框带类别与置信度,回答“有什么、在哪里”;语义分割为每个像素分配类别标签,回答“每个像素属于什么”,但不区分同类个体;实例分割在语义分割基础上为每个目标实例生成独立掩码,回答“每个像素属于哪个具体个体”;姿态估计则定位人体或物体的关键点,回答“关节在哪里、如何连接”。
从计算复杂度看,检测通常最轻,语义分割次之,实例分割因需要逐实例掩码而最重,姿态估计介于检测与分割之间,但后处理(关键点分组)可能成为瓶颈。在 Jetson Orin Nano 这类 8GB 显存设备上,同时跑检测与分割需要仔细规划显存与带宽。
二、评价指标:别只看 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 阈值是否与训练时一致。很多“精度掉了”的问题其实出在前后处理,而非模型本身。
四、常见误区与复盘
- 误区一:用分类准确率衡量检测模型。分类准确率不涉及定位,检测必须看 mAP 和 IoU。若业务只关心“有没有”,可以看召回率,但仍需框的 IoU 达标。
- 误区二:语义分割与实例分割指标混用。语义分割的 mIoU 不区分同类个体,若业务需要区分“人A”和“人B”,必须用实例分割的 mask mAP。
- 误区三:忽略后处理耗时。YOLO 的 NMS、Mask R-CNN 的掩码解码在 Jetson CPU 上可能比推理还慢。部署前务必用
trtexec或 Nsight Systems 测端到端延迟。 - 误区四:量化后不校验。INT8 对分割边界和关键点坐标影响较大,必须用验证集重新评估 OKS 和 mIoU,不能只看推理速度。