永远使用 RGB 做训练;绝对不要直接拿 YUYV / NV12 / YUV 原始数据训练神经网络

边缘端用 NV12 直推只是【部署时的硬件优化手段】,训练和部署要严格分开,二者不能混淆。

下面分层把原理、误区、工程方案讲透,适配你 RDK X5 项目。

一、先理清两件完全独立的事情

  1. 训练阶段(PC GPU) 输入素材:RGB 目的:让网络学习物体色彩、纹理特征。
  2. 部署阶段(RDK X5 BPU) 内存传输格式:NV12(YUV420) 只是硬件传输存储格式; BPU 内部预处理单元自动完成 YUV→RGB 换算,送入卷积运算; 卷积计算本质仍然等价 RGB 输入。

类比: 训练:用标准图纸(RGB)训练工人识别零件; 部署:运输零件采用压缩包装(NV12),进入车间先解压成标准形态再检测; 不能直接拿压缩包装去训练工人。

二、为什么不能用 YUV/YUYV 原始数据训练?

1. YUV420/YUYV 存在色度下采样(4:2:0 / 4:2:2)

  • RGB:每个像素独立 R/G/B,信息完整;
  • YUV 4:2:0:4 个像素共享一组 U、V 色度;色度信息天然压缩、插值生成

如果你直接把未还原成RGB的 YUV 张量喂给 CNN 训练: 网络学到的是「插值失真后的色彩分布」,并不是真实像素色彩。 部署时即便同样 YUV 输入,采集设备 ISP 插值算法、色域不同,训练与推理分布不一致,精度明显下跌

2. YUV 不是统一标准,存在大量可变参数

1)色域区分

  • Full Range YUV:Y∈[0,255](相机 ISP 输出)
  • Limited Range YUV:Y∈[16,235](视频、HDMI 标准) 2)转换矩阵不唯一 BT.601 / BT.709 / BT.2020,YUV↔RGB 转换系数不一样。

RGB 没有这类歧义,是深度学习行业统一基准。

一旦训练使用某一套 YUV 参数,部署只要参数不一致,色彩偏移,置信度大范围下降。

3. 深度学习框架生态原生基于 RGB

PyTorch、TensorFlow、ONNX 算子、数据增强库全部以 RGB 图像作为标准输入。

  • 随机翻转、色彩抖动、高斯模糊、色域增强都是针对 RGB 设计;
  • 直接在 YUV 空间做数据增强会破坏 U/V 插值关系,产生伪影; 强行改造工作量极大,没有任何收益。

4. YUYV 4:2:2 同样存在色度采样压缩

YUYV 每两个像素共用一组 UV。 直接作为网络输入依然是失真数据,同样不适合训练。

三、关键疑问:既然端侧输入 NV12,为什么训练不用 NV12?

正确链路(标准工业方案)

plaintext

训练:JPG/PNG → RGB图像 → CNN训练 → ONNX(RGB输入 [1,3,H,W])
部署转换:hb_model_convert配置【硬件预处理】
           BPU自动:NV12 → YUV2RGB → 归一化/均值处理 → 卷积

训练与推理的数学输入空间保持完全一致。

BPU 内置硬件预处理 = 把 YUV2RGB、归一化 硬件加速,避免 CPU 执行; 并没有让网络直接学习 YUV 特征。

四、工程最大坑:训练 / 部署色彩域不匹配(高频翻车点)

错误做法 1: RGB 训练;部署 NV12 输入,但模型转换时没有正确配置 YUV 色域、转换矩阵。 现象:画面偏亮 / 偏暗、颜色偏色,目标置信度降低、漏检。

✅解决方案: 在 hb_model_convert 的配置文件明确配置:

  • yuv_range: full_range(MIPI 相机 ISP 输出标准)
  • color_space: bt709 /bt601 和 Sensor ISP 保持一致

五、拓展:有没有场景在 YUV 空间训练?

极少数学术场景:视频编码相关模型(H.264/H.265),原生基于 YUV 码流。 目标检测、语义分割、双目视觉、机器人感知任务一律 RGB 训练。

六、可选进阶优化方案(追求极致鲁棒性,可选,非必需)

想要缩小「PC RGB 图片」和「端侧相机 YUV 图像」域差,可以做域适应增强: 在训练阶段的数据增强流水线里,随机模拟 YUV 压缩噪声: RGB → 模拟转 YUV420(色度下采样插值)→ 转回 RGB 送入网络。 作用:提升模型对相机 ISP 色度压缩的鲁棒性。

重点:依然是 RGB 为主链路,只是加入噪声模拟,不是直接用 YUV 训练。

七、极简操作规范(直接落地使用)

  1. 训练侧 所有数据集统一解码为 RGB (HWC/CHW),不要加载原始 YUV 码流训练; OpenCV 读取 BGR 务必转换 RGB。

  2. 模型导出 ONNX 输入定义 (1,3,H,W) 三通道 RGB 浮点张量。

  3. RDK X5 模型转换 cfg 配置输入类型为 nv12,开启硬件 YUV2RGB 转换,对齐色域与转换矩阵;

  4. 板端业务代码 hobot_vio 取出 NV12 帧直接送入推理,禁止 CPU 调用 cvtColor 做 YUV→RGB(增加延迟、占用 CPU);可视化通道单独转换 RGB 用于显示,推理主线保留 NV12 直推。

一句话最终总结

训练必须 RGB;YUV/NV12 只是边缘端硬件传输格式,依靠 BPU 内置预处理还原成 RGB 空间再计算,不能作为训练输入。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐