[具身智能-620]:主机端的CNN网络模型,输入图片格式基本是RGB的。端侧也一样吗?

[具身智能-620]:主机端的CNN网络模型,输入图片格式基本是RGB的。端侧也一样吗?

主机 PC(PyTorch/TensorRT)习惯输入 RGB;

边缘端(RDK X5、NPU/BPU)绝大多数情况【不用原生 RGB 作为模型输入】,主流是 NV12/YUV420 Planar。

根源:硬件链路差异: PC:摄像头→软件解码→RGB 内存数组→ CNN 推理

RDK X5 嵌入式平台:MIPI Sensor → ISP硬件解码输出 NV12直接送入 BPU 推理尽量避免转 RGB

下面分层完整拆解,结合RDK 双目视觉项目。

一、主机(PC/GPU)标准链路

训练 & PC 推理输入规范

  1. 图像存储:JPG/PNG 解码得到RGB(HWC)
  2. 深度学习框架标准排布:
    • PyTorch:CHW,顺序R、G、B
    • OpenCV 陷阱:默认读出BGR,训练 / 推理必须手动转 RGB
  3. 模型 ONNX 输入张量定义:[1,3,H,W] float32 RGB

特点:软件生态统一,大家默认 RGB,GPU 做颜色转换开销很低,不用考虑硬件 ISP 输出格式。

二、边缘端 RDK X5(BPU)真实链路

MIPI 相机原始通路:Sensor RAW → ISP硬件处理 → 硬件输出NV12(YUV420_8bit)

两种方案对比

方案 A:NV12 直接送入 BPU(工程量产首选)

✅优势

  1. 零拷贝、无颜色空间转换:ISP 输出帧 Buffer 直接给推理,CPU 不参与图像转换
  2. 带宽占用最低:NV12 1.5 字节 / 像素,RGB 3 字节 / 像素;4K 图像带宽直接减半;
  3. ISP 硬件天然输出格式,不需要额外内存开辟 RGB 缓存。

⚠️关键问题:训练用 RGB,端侧输入 NV12,颜色空间不一致怎么办?

解决办法二选一:

1)模型预处理放到硬件预处理单元(BPU 内置 PreProc)在离线模型转换工具(hb_model_convert)配置: 开启YUV→RGB 色彩空间转换、均值 / 归一化缩放。

👉 转换逻辑固化进模型任务,不在 CPU 执行

数据流:NV12(内存)→ BPU 内部硬件自动完成 YUV 转 RGB 归一化 → CNN 卷积。

2)训练时模拟 YUV 噪声(高精度项目可选),绝大多数检测任务不需要。

方案 B:先转 RGB 再送入推理(强烈不推荐量产)

流程:NV12 → CPU 调用 OpenCV 转换成 RGB → 送入推理 缺点:

  • 4K 图像转换消耗大量 CPU;
  • 额外占用双倍内存;
  • 增加帧延迟,容易造成帧率上不去、丢帧; 只适合调试阶段可视化查看图像。

三、格式概念区分(极易混淆)

  1. 逻辑输入(模型逻辑)CNN 数学计算层面,依然等价于 RGB 三通道; 只是物理内存里不存放 RGB 数组,以 NV12 存储,由硬件实时转换。

  2. 物理输入(内存 Buffer 真实数据)PC:内存 = RGB 数组 RDK 边缘端:内存 = NV12 YUV 数据

通俗比喻: 主机:把饭菜提前做好(RGB)端上桌; 端侧:原材料 (NV12) 直接送进灶台 (BPU),灶台内置厨具现场转换成需要的 RGB 格式。

四、补充:其他边缘芯片通用规律

  • 地平线 BPU(RDK X3/X5):主推 NV12 输入
  • 昇腾 NPU:支持 YUV/RGB,同样优先 YUV 硬件通路
  • 寒武纪 MLU:优先 YUV420
  • 手机 NPU:全部摄像头通路 YUV 直入 NPU

所有带硬件 ISP 的嵌入式视觉平台,设计思想统一:避免 CPU 做色彩转换。

五、训练 ↔ 端侧对齐重要坑点(工程高频翻车)

  1. 通道顺序 PC 训练:RGB;OpenCV 读取图片是 BGR。很多人训练写错通道,端侧直接识别失效。
  2. 归一化 & 均值

plaintext

host: img = (rgb / 255.0 - mean) / std

这段预处理不要放到 CPU 代码循环里跑,模型转换时配置进 BPU 预处理单元。 3. 色域范围(关键!)

  • 图像传感器输出 YUV:Full Range [0~255]
  • 电视标准 YUV:Limited Range [16~235] 两端范围不一致,图像亮度偏移,检测准确率暴跌。 👉 在 hb_model_convert 工具里必须正确配置 range 类型。

六、最简工程实施建议(RDK X5 YOLO / 检测网络)

  1. PC 训练:标准 RGB 图像训练,导出 ONNX,输入[1,3,H,W] RGB
  2. 模型转换阶段(hb_model_convert):
    • 输入源设置:nv12
    • 配置 YUV2RGB 转换、图像均值、归一化、色域范围
  3. 板端业务代码: 从 hobot_vio 获取 NV12 帧,直接传给 dnn 推理接口,不调用 cv::cvtColor
  4. 可视化调试分支:单独拷贝一份 NV12 转 RGB 用于显示,推理主线保持 NV12 直推。

七、一句话总结

逻辑上 CNN 仍然需要 RGB 三通道信息; PC/GPU 物理内存存放 RGB;RDK 这类带 ISP+BPU 的边缘硬件,物理内存传输使用 NV12,由 BPU 内置硬件单元实时完成 YUV→RGB 转换,规避 CPU 图像转换开销。