识别:从图像到几何观测
从取图、目标识别、角点定位到观测时效,理解识别模块中的问题为什么会自然出现。
识别模块处在自瞄数据链路的最前端。它读取相机图像,回答三个问题:目标在哪里、目标是什么、它的几何特征在哪里。后续的 PnP、滤波和火控都建立在这次观测上,因此识别的输出不只是一个好看的检测框,而是一组能够稳定进入几何解算的数据。
1. 为什么识别模块会包含这些内容
识别模块中的相机、YOLO、角点、PnP 精度和推理加速并不是互相独立的知识点。它们来自同一个问题:怎样把真实世界中的目标,及时、准确地变成下游可以使用的几何观测?
沿着数据向下游流动的方向,这些问题会依次出现:
真实目标
→ 相机与镜头形成图像
→ YOLO 从图像中识别目标并定位角点
→ 角点与已知三维结构建立对应
→ PnP 解算目标位姿
→ 滤波、预测与火控使用这次观测反过来从下游要求向上看,又能得到一条约束链:
PnP 需要准确的二维角点
← 角点精度依赖模型、图像分辨率、清晰度和标注
← 图像质量依赖相机、镜头、快门、曝光和运动状态
← 观测时效依赖相机帧率、推理速度、传输和时间戳这就是本模块内容的组织依据。我们不是先列出一组视觉名词再逐个解释,而是顺着工程问题追问:下一步需要什么,当前结果为什么还不够。
取图为什么必然引出相机选型
识别的输入是一张图像,所以第一步必然是取图。但并不是任何能拍照的摄像机都适合自瞄。目标可能很远、移动很快,场地又同时存在暗区、发光装甲板和强反光。相机与镜头需要保证:目标进入图像后仍有足够像素,曝光期间没有严重模糊或几何形变,亮暗区域保留可识别的边缘,并且图像能够带着正确时间信息及时到达上位机。
因此,只要开始讨论识别,就会自然遇到分辨率、视场、焦距、全局快门、曝光、增益、动态范围和时间同步。这些参数最后都会影响模型看到的图像,以及角点能够达到的精度。
为什么取图之后要讨论 YOLO
相机只提供像素矩阵,并不会直接告诉我们哪一块是装甲板、它属于哪一类、四个角点在哪里。早期方案通过颜色、亮度、轮廓和灯条几何关系手工寻找目标;当光照、反光、背景和目标姿态变得复杂时,规则数量不断增加,泛化能力仍然有限。
当前方案使用 YOLO 一类神经网络,从数据中学习目标的外观与几何特征。模型把图像转换成目标类别、置信度和关键点,使系统能在不同光照与背景下维持较稳定的识别。传统视觉仍然有价值:NMS、角点排序、几何检查和 PnP 都依赖明确的规则与物理约束。
为什么不能只输出检测框
检测框只能说明“目标大概在这里”,不能直接建立装甲板三维结构与图像之间的精确对应。PnP 需要若干含义固定的二维点,例如左上、右上、右下、左下角点,并将它们与已知的三维物理点一一对应。
于是问题从“能不能识别目标”继续变成“角点能不能准确、稳定地落在同一物理位置”。模型角点的随机抖动、系统偏移、顺序交换,图像分辨率、失焦、运动模糊和过曝,都会进入 PnP。识别率很高但角点不准的模型,仍然可能让位姿解算产生明显误差。
为什么必须讨论帧率、GPU 和 TensorRT
自瞄面对的是持续运动的目标。一帧图像即使识别完全正确,只要结果到达下游时已经过旧,也不能代表目标当前的位置。假设目标相对相机的角速度为 ω,相邻观测间隔为 Δt,两帧之间的角度变化近似为:
Δθ ≈ ω · Δt提高相机帧率可以缩短观测间隔,让目标在相邻帧之间的变化更小,也给跟踪器提供更密集的测量。但相机送得更快之后,推理和后处理也必须跟上。如果相机输出 120 FPS,而完整识别链路只能稳定处理 40 FPS,帧就会被丢弃或在队列中积压;队列中的图像越旧,模型算出的角点越不代表当前时刻。
使用 GPU 和 TensorRT 的目的正是在这里:利用 GPU 并行计算,并通过算子融合、低精度计算和执行计划优化,降低神经网络推理时间,提高持续吞吐。我们最终关心的不是“模型跑出了多少 FPS”这个单独数字,而是:
- 推理延迟是否足够小且稳定;
- 完整流水线能否持续跟上相机帧率;
- 是否因为排队、内存复制和异步处理产生额外延迟;
- 输出角点是否保留原始图像的曝光时间戳;
- 加速或量化后,角点精度是否发生变化。
相机帧率、推理 FPS 和端到端延迟描述的是三个不同问题。只有把采集、传输、预处理、推理、后处理和时间戳放在一起测量,才能判断一次视觉观测是否既准确又及时。
2. 先把问题抽象清楚
我们已知什么
- 相机连续输出带时间戳的二维图像;
- 装甲板、能量机关具有相对固定的颜色、轮廓和物理结构;
- 装甲板的真实宽高、关键点定义和编号集合是已知的;
- 相机内参、畸变参数以及相机到云台的安装关系可以通过标定获得;
- 上位机的算力、允许延迟、相机分辨率和比赛环境范围是有限的。
我们要得到什么
对每一帧图像,识别模块需要输出零个或多个候选目标:
| 输出 | 作用 |
|---|---|
| 目标类别 | 区分装甲板、能量机关或其他任务目标 |
| 颜色与编号 | 支持敌我过滤、机器人识别和目标关联 |
| 置信度 | 表示当前观测的可靠程度,供阈值和下游逻辑使用 |
| 二维关键点 | 与已知三维结构建立对应,作为 PnP 的主要输入 |
| 时间戳 | 将图像观测与同一时刻的云台姿态对齐 |
把它写成一个函数,就是:
视觉观测 = f(图像矩阵, 相机参数, 任务先验)其中 f 可以是人工设计的图像处理规则,也可以是从数据中学习得到的神经网络,还可以是两者组合形成的工程管线。
3. 很自然能够想到的三类方案
方案 A:根据颜色和几何规则寻找目标
装甲板会发光、左右灯条形状相似,并且具有规定的相对位置。我们可以先按颜色和亮度分割图像,再寻找轮廓、拟合灯条、两两配对,最后用几何条件筛选装甲板。这就是早期自瞄常见的传统视觉方案。
方案 B:让模型从数据中学习目标特征
我们也可以准备带标注的图像,让神经网络学习从像素到目标框、类别和关键点的映射。YOLO 及其变体属于这一类。它们省去了大量手写外观规则,在光照变化、运动模糊和复杂背景下通常具有更强的适应能力。
方案 C:神经网络与几何方法组合
现代自瞄更常见的是组合方案:神经网络负责发现目标、分类并预测关键点;传统几何方法负责关键点排序、尺寸检查、NMS、PnP 和时序一致性判断。两类方法并不是互相取代,而是分别解决“从复杂画面中找到目标”和“让输出满足物理约束”两个问题。
4. 怎样判断识别做得好不好
一个适合自瞄的视觉模型需要同时满足以下要求:
- 找得全:远距离、小目标、旋转、遮挡和运动模糊时仍有足够召回率;
- 认得准:减少场地灯光、反光、屏幕和友方目标造成的误识别;
- 角点准:关键点误差小、顺序稳定,不随亮度和姿态产生系统偏移;
- 时间稳定:相邻帧不会频繁闪烁、换类或跳点;
- 运行及时:在车载计算平台上保持足够吞吐,并且延迟和抖动可测量;
- 容易部署:训练、ONNX 导出、TensorRT/OpenVINO 推理和后处理的输入输出保持一致。
因此,mAP 只是评价的一部分。最终还要测量每个角点的像素误差、PnP 位姿误差、不同距离下的召回率、单位时间误检数以及端到端延迟。