神经网络、YOLO 与关键点检测
从特征提取到 NMS,并介绍当前工程使用的深圳大学装甲板模型。
神经网络把图像矩阵作为输入,通过一系列可学习的运算提取特征,最后输出目标位置和语义。训练阶段使用带标注的数据调整参数;部署阶段固定参数,只进行一次前向计算。
1. 视觉模型在学习什么
浅层特征通常对边缘、颜色和局部纹理敏感;更深的特征逐渐组合出灯条、数字区域、装甲板轮廓和机器人结构。检测网络需要同时完成两类任务:
- 定位:目标框、中心点或关键点在哪里;
- 分类:它是不是目标、属于什么颜色和编号。
训练时,损失函数衡量预测与标注之间的差异。定位误差、分类误差和关键点误差共同反向传播,模型参数在大量样本上逐渐形成一套比人工阈值更复杂的判别规则。
2. 常见视觉网络路线
| 路线 | 代表方法 | 特点 | 在自瞄中的位置 |
|---|---|---|---|
| 两阶段检测 | Faster R-CNN | 先生成候选区域再分类,精度高但结构较重 | 适合离线基线或算力充足场景 |
| 单阶段检测 | SSD、RetinaNet、YOLO | 一次前向直接产生密集候选,速度和精度平衡较好 | 实时装甲板检测最常见的路线 |
| 中心/关键点检测 | CenterNet、YOLO Pose | 用中心或关键点描述目标 | 很适合直接输出 PnP 所需角点 |
| 端到端 Transformer 检测 | DETR、RT-DETR | 使用集合预测,部分方案不依赖传统 NMS | 可作为实时检测的新基线 |
实际选型不需要追逐最新的版本号。对自瞄而言,轻量化、关键点输出、部署后端支持、延迟稳定和数据匹配程度,通常比通用数据集上的单一排名更重要。
在 RoboMaster 装甲板和能量机关识别中,更常见的工程形态是轻量单阶段检测器 + 关键点输出。公开方案中可以看到修改后的 YOLOv5、自定义关键点 Head、YOLO Pose 等不同实现。它们的共同目标是一次推理同时得到目标置信度、语义类别和几何关键点,减少检测框裁剪后再运行第二个角点模型所带来的延迟与误差传递。
3. YOLO 的基本结构
YOLO 是一类单阶段实时检测器。不同版本细节不同,但通常可以抽象成三部分:
- Backbone:从输入图像提取多层特征;
- Neck:融合不同尺度的特征,让网络同时看到近处大目标和远处小目标;
- Head:在多个位置输出目标置信度、类别、边界框,以及可选的关键点。
一张原始图像进入模型前,通常会经过缩放、补边(letterbox)、颜色顺序调整、归一化和张量排布。模型输出仍是大量候选,需要通过置信度阈值和后处理变成最终观测。
Anchor-based 与 anchor-free
早期 YOLO 会在不同尺度的特征图上预设若干 Anchor,网络预测目标相对 Anchor 的偏移;Anchor 的尺寸需要与数据集中的目标形状匹配。Anchor-free 检测器不再依赖这组预设框,而是直接预测中心、边界距离或关键点。两条路线都可以用于自瞄,区别主要体现在标签分配、检测头和后处理方式,而不是输入输出目标发生了改变。
多尺度特征
近处装甲板占据大量像素,远处装甲板可能只有几十个像素宽。Neck 会把深层语义特征和浅层高分辨率特征融合,再在不同尺度上进行预测。训练集中缺少远距离样本时,仅靠多尺度结构也不能自动获得稳定的小目标能力。
检测头与关键点头
检测头输出目标存在概率、类别和边界框;关键点头额外输出固定数量的二维点。训练时它们对应不同损失项。增大关键点损失权重可能改善定位,却也可能影响分类和收敛,因此需要同时观察框指标、关键点指标和最终 PnP 误差。
4. 置信度、IoU 与 NMS
模型可能在同一块装甲板附近给出多个高度重叠的候选框。非极大值抑制(Non-Maximum Suppression,NMS)用于去掉重复结果:
- 删除低于置信度阈值的候选;
- 选择当前分数最高的候选;
- 计算它与其他候选框的 IoU;
- 删除 IoU 高于阈值的重复候选;
- 对剩余候选重复以上过程。
IoU 表示两个框的交集面积与并集面积之比:
IoU = area(A ∩ B) / area(A ∪ B)NMS 阈值太低,靠得很近的不同目标可能互相抑制;阈值太高,同一目标可能留下多个结果。OpenCV 的 cv::dnn::NMSBoxes 接收候选框、置信度阈值和 NMS 阈值,返回保留的候选索引。
RT-DETR、YOLOv10 等端到端检测器尝试减少或移除部署阶段的 NMS。不过在现有大量 YOLO 工程中,“网络输出 + 阈值过滤 + NMS”仍是最容易理解和部署的管线。
5. 为什么自瞄更需要关键点,而不只是检测框
边界框只能描述一个大致区域,框的四个角通常不对应装甲板的真实物理角点。PnP 需要的是图像中的二维点与物体坐标系中的三维点一一对应,因此更适合让网络直接预测灯条端点或装甲板四角点。
关键点检测头会为每个目标输出固定数量的点。工程中还需要统一点的语义顺序,例如:
左下 → 左上 → 右上 → 右下只要某一帧把左上和左下交换,PnP 得到的姿态就可能发生突变。关键点顺序与坐标恢复和关键点精度同样重要。
6. 当前 3SE 工程使用的装甲板模型
当前装甲板模型来自深圳大学 RobotPilots 视觉组开源的 broalantaps/RobotDetectionModel。原项目将其描述为修改后的 YOLOv5,并使用 MobileNetV3 作为 Backbone;仓库提供约 15K 图像训练得到的 0526.onnx。原项目的输出定义为:四个关键点、目标置信度、红/蓝/灰/紫四种颜色和九种数字类别。
3SE 当前工程在这个模型的输出协议上完成了 TensorRT 与实时流水线适配:
| 项目 | 当前值 |
|---|---|
| 模型输入 | images: 1 × 3 × 640 × 640 |
| 模型输出 | output: 1 × 25200 × 22 |
| 关键点 | 4 个点,共 8 个数值 |
| 置信度 | 第 8 维,经 sigmoid 后参与筛选 |
| 颜色 | 4 类:蓝、红、灰、紫 |
| 数字 | 9 类:哨兵、1–5、前哨站、基地小/大装甲 |
| 推理后端 | FP16 TensorRT,多流流水线 |
| 当前阈值 | 置信度 0.50,NMS IoU 0.45 |
推理代码先把原图按比例缩放到 640 × 640,执行网络推理,再把关键点还原到原始图像坐标;随后完成候选过滤、NMS、关键点排序、颜色与数字解码,最终生成供 PnP 使用的四个顶点。
这里需要区分“模型本身”和“工程实现”:模型权重与输出定义来自深圳大学开源项目;3SE 的工作集中在 TensorRT 转换、GPU 预处理、多帧流水线、颜色过滤、后处理以及与 Daedalus/自瞄数据链路的集成。引用或继续使用该模型时,应保留深圳大学 RobotPilots 与原仓库来源。截至本章撰写时,原仓库页面未显示标准许可证文件。
7. 一个好的自瞄视觉模型应该输出什么
好的模型不仅在一张截图上框得准,还应该做到:
- 对光照、曝光、噪声、距离、姿态和运动模糊保持稳定;
- 远距离小目标具有足够召回率,复杂背景下误检率可控;
- 颜色和编号不会在相邻帧频繁跳变;
- 四角点误差小,并且没有固定方向的系统偏差;
- 输出协议清楚,关键点顺序、缩放和 letterbox 逆变换一致;
- 在目标计算平台上延迟稳定,模型推理与后处理都能被测量;
- 导出到 ONNX、TensorRT 或 OpenVINO 后,结果与训练框架基本一致。
下一节将使用关键点检测任务训练一个入门模型。训练流程同时适用于装甲板和能量机关,区别主要在类别定义、关键点数量和数据分布。