跳转至

第 10 章 感知工程与部署

感知流水线在演示里能用,不等于在机器人上能用。把感知落到真实系统有四件事:边缘推理优化、端到端时延预算与时间戳同步、可回溯的评估指标、以及退化场景的失效判据与降级。评估指标一节给出可自算的纯 numpy 写法;量化时延等依赖 GPU 的数字标「待核实」。GPU 观测手段承接 linux-note 第 8 章,时间同步话题回引 ROS2-note 第 7 章 message_filters。

端到端预算与失效兜底挂在链路的哪一段:

flowchart LR
    cam["采集"] --> infer["推理"] --> post["后处理"] --> ctrl["控制"]
    budget["端到端时延预算 + 时间戳对齐"] -.-> infer
    fallback["退化场景判据 → 降级策略"] -.-> ctrl

1. 评估指标与口径陷阱

一个感知输出的好坏要分层量:定位看 IoU、检测看 AP、深度看 RMSE、里程计看 ATE/RPE。用纯 numpy 写法实现,是为了把"指标本身怎么算、在哪会被骗"讲实。

传统基线先跑一遍:scikit-learn 的 SVM / 随机森林 / 逻辑回归在小样本与表格特征上仍是深度模型的对照下限——同一样本量下先看基线,再判断深度模型多出的精度是否值得部署成本。

1.1 IoU 与 AP

交并比(intersection over union,IoU) = 交 / 并。完全重合为 1、相离为 0,这几个端点都直观;容易被忽略的是内含——小框完全落在大 GT 内时,IoU 等于两框面积比而远不到 1。IoU 因此惩罚"框得准但尺寸不对",定位评估用 IoU 阈值(常 0.5)判命中。

平均精度(average precision,AP) 是 precision-recall 曲线下面积,两代插值口径不同:Pascal VOC 用 11 点(recall=0,0.1,…,1 处取最大 precision),COCO 用 101 点更密、并对 precision 做单调包络。mAP@[.5:.95] 是 10 个 IoU 阈下 AP 的均值:各阈 AP 随阈值升高而单调下降(框定位误差在高阈下判失败),跨阈平均才暴露定位粗,只报 mAP@0.5 会掩盖这一点。把误检的置信度顶到最高,AP 会明显下跌且 precision@rank1 归零:AP 高度敏感于排序质量,高置信误检是最毒的失败模式。

1.2 深度与位姿误差

深度指标要先剔无效再算:同一份预测把空洞(0)当作有效测量,RMSE 会被抬高一个数量级以上。报深度指标前必须先定义有效掩码(depth>0),否则比的是空洞比例而不是深度精度。

轨迹误差分两种:绝对轨迹误差(absolute trajectory error,ATE) 先做刚体/相似对齐再量全局偏差,反映累积漂移;相对位姿误差(relative pose error,RPE) 量每段增量的一致性,反映局部抖动。对齐是关键一步:不对齐时整体平移会淹没真正的形状误差,把"没对齐"误当"估得差";Umeyama 对齐同时恢复旋转与尺度。

指标虚高最常见的来源不在公式而在划分:随机抽帧划分训练/验证集时,同一段视频的相邻帧几乎一样,验证样本在训练集里几乎都有近邻,量到的是记忆而非泛化。正确做法是按序列、按场地、按日期整段划分,留出全新场景做测试。类别极不均衡时还要报逐类 AP 与混淆矩阵,整体 mAP 会被大类主导,小类的系统性失败在平均值里看不见。

离线指标与在线表现之间还隔一层数据分布:录包回放用固定曝光与固定安装位姿,实机上自动曝光、机械臂自遮挡、镜头脏污都会改变输入统计。评估集因此要包含难例子集(强逆光、低纹理、部分遮挡)并单独报其指标;只看全集平均,难例退化会被大量简单样本掩盖。

指标口径本身就是坑:mAP 报 @0.5 还是 @.5:.95、深度 RMSE 有没有剔空洞、轨迹有没有对齐,都能让同一模型分数差数倍。报指标必须连口径一起报。

2. 边缘推理优化

把模型塞进边缘设备(Jetson 一类)跑实时,三条主流渠道:

  • 量化(quantization):权重/激活从 float32 降到 int8(PTQ 后训练 / QAT 训练时量化),换吞吐与显存,代价是精度。
  • TensorRT:NVIDIA GPU 上的算子融合 + 层优化编译。
  • ONNX Runtime / OpenVINO:跨平台推理引擎(CPU/核显侧)。

量化会掉精度:int8 量化在检测/分割上有可测的 mAP 掉点,量化后的时延与精度取决于目标边缘 GPU,选型时以目标硬件上的测量为准。部署侧与 control-note 同款语境。

量化的三个细节决定掉多少点:per-channel 比 per-tensor 的权重量化更稳(每通道独立缩放),激活侧多用 per-tensor;校准集必须覆盖真实输入分布,拿训练集前几百张做校准而实机是夜间或强光,激活范围就裁错;层敏感度不同,首尾层与检测头的回归分支最怕量化,常见做法是这几层保留 fp16。TensorRT 侧还需固定输入形状(或用 optimization profile 覆盖动态尺寸),形状一变就要重编引擎。与量化正交的另一条线是图优化:Conv+BN 折叠、常量折叠在精度上无代价,可与量化叠加而不必二选一。

3. 端到端时延预算与时间同步

实时感知要算时延预算:从光子进传感器到动作指令出控制器的总时延,须小于控制周期。链路各环节都要计入——采集、传输、预处理、推理、后处理、通信、决策,取最慢路径而非平均。

时间戳同步是多传感器融合的隐形地基:相机与激光/IMU 时间戳不对齐,融合就会把"同一时刻"的观测错配到不同时刻,产生运动畸变与错误关联。工程手段:ROS 侧 message_filters 的时间同步器(回引 ROS2-note 第 7 章)、硬件触发(PPS/PTP)、用 header.stamp 而非接收时间。GPU 侧观测手段回引 linux-note 第 8 章。

数据集与回放管线(rosbag2 / mcap)承接 ROS2-note——录全链路话题、可离线复算指标与调参,是评估可回溯的前提。

时延预算要按各环节的测量点算,而不是按经验比例:相机曝光结束、帧传输完成、预处理完成、推理返回、后处理完成、指令下发各取一个时间戳,差值才是真实分段耗时。取 p99 而不是均值——均值好看,长尾才是丢帧与超时保护触发的那一侧。总时延一旦超过一个控制周期,就得靠预测补(按当前速度外推一个周期),或降频并让控制侧知道"这一帧是旧数据"。帧率本身也要看抖动:调度抢占与显存分配会让同一条链路的单帧耗时相差数倍,只报平均帧率会把卡顿隐掉。

预算按最慢路径累加,时间戳在链路起点定:

flowchart LR
    t0["光子入传感器"] --> t1["采集 + 传输"] --> t2["预处理"] --> t3["推理"] --> t4["后处理"] --> t5["通信 → 动作指令"]
    t5 --> sum["总时延 = 最慢路径之和<br/>须小于控制周期"]
    ts["header.stamp 而非接收时间<br/>message_filters / PPS / PTP"] -.-> t2

4. 退化场景与安全兜底

真实环境的失效模式,正是前九章若干结论的适用边界:

常见误读 真实边界 判据 / 兜底
深度学习检测器不怕退化场景 强光、遮挡、纹理缺失下置信度虚高、漏检 多传感器交叉验证、低置信降级到几何法
标定一次终身有效 温漂、机械形变使内参漂移 周期性重标 + 在线自标定检测偏离(第 1 章)
点云配准 = ICP 初值依赖、非刚性场景失效 粗配准给初值 + 精配准(第 5 章)
SAM 零样本万能分割 提示工程敏感、域外退化 域内验证 + 失败回退传统分割(第 7 章)
量化不掉精度 精度与时延此消彼长 在目标硬件上量一组再定(本章第 2 节)

降级设计是兜底的核心:为每条学习式感知准备一个几何/规则回退路径,并定义触发判据(置信度阈、几何一致性残差、多源分歧度)。安全关键动作只在"感知输出 + 几何校验"双通过时才执行。

降级不是二值,分三层:降精度(换小模型、降输入分辨率)、降频率(隔帧推理、其余帧用跟踪补)、降功能(只保留几何检测或直接停车)。层间切换要有迟滞与最短驻留时间,否则置信度在阈值附近抖动时系统会在模式间反复跳,比不降级更不稳定。阈值本身不该手拍:用回放数据统计"该阈值下的漏检率与误降级率",两侧同时满足安全要求与可用性才定得下来。

5. 要点

  • IoU 惩罚尺寸不符(内含时等于面积比而非接近 1);AP 是 PR 曲线下面积,VOC-11 点与 COCO-101 点口径不同;高置信误检最伤 AP。
  • 深度 RMSE 必须先按有效掩码剔空洞,否则量到的是空洞比例;轨迹 ATE 要先 Umeyama 对齐,RPE 看增量一致性;数字必须连口径一起报。
  • 边缘优化三渠道(量化 / TensorRT / ONNX Runtime),量化有精度代价,运行时延标「待核实」。
  • 时延预算取最慢路径;时间戳同步用 message_filters/硬件触发,错配会毁融合。
  • 学习式感知的失效边界靠几何/规则回退兜底,双通过才执行——这是把演示变成系统的最后一道。

参考文献与延伸阅读

  • Jacob, B., Kligys, S., Chen, B., et al. Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference. CVPR, 2018. arXiv
  • NVIDIA. TensorRT 文档. 文档
  • Geiger, A., Lenz, P., & Urtasun, R. Are We Ready for Autonomous Driving? The KITTI Vision Benchmark Suite. CVPR, 2012. DOI
  • Sturm, J., Engelhard, N., Endres, F., Burgard, W., & Cremers, D. A Benchmark for the Evaluation of RGB-D SLAM Systems. IROS, 2012. DOI