21、Camera与AI融合:NPU Pipeline、Camera+AI低延迟设计、模型输入预处理

各位好,今天我们来聊聊Camera和AI的融合。说实话,这个主题在车载圈子里已经热了好几年了。我最早接触这个方向,是在一个ADAS项目中,客户要求在摄像头采集的画面里实时检测行人。那时候我们用的还是纯CPU方案,帧率惨不忍睹。后来换了NPU,效果立竿见影。嗯,今天就把我这些年踩过的坑和积累的经验,跟大家好好掰扯掰扯。

NPU Pipeline:Camera数据怎么喂给AI

先说说NPU Pipeline。说白了,就是摄像头采集的数据,怎么一路送到NPU里去推理。这个流程看起来简单,但里面门道不少。

典型的NPU Pipeline长这样:

Camera Sensor → ISP → Memory(YUV/RGB) → Preprocessing → NPU → Postprocessing → Application

这里有个关键点:数据格式。Camera出来的通常是YUV格式,但NPU模型一般吃RGB或者BGR。所以中间必须有个格式转换。我见过不少团队在这里翻车——直接拿YUV数据往NPU里塞,结果模型推理结果一塌糊涂。

核心原则:NPU的输入格式必须和训练时完全一致。差一个像素都不行。

我个人习惯的做法是,在ISP输出端就做好格式转换。这样后面的模块拿到的都是统一格式,省心。当然,有些NPU支持YUV直接输入,那另当别论。但你要确认你的模型训练时用的也是YUV。

Camera+AI低延迟设计:从帧到帧的博弈

低延迟,这是车载AI的命门。你想想看,一辆车以60km/h的速度行驶,每延迟100ms,刹车距离就多出1.7米。这可不是闹着玩的。

那么,怎么降低延迟?我总结了几条实战经验:

  • Pipeline并行化:不要让Camera采集、预处理、NPU推理串行执行。用双缓冲甚至三缓冲,让它们并行跑起来。
  • 减少数据拷贝:每次数据拷贝都是延迟的元凶。尽量用ION/DMA-BUF共享内存,避免CPU介入。
  • NPU调度优先级:在Android HAL层,把NPU推理任务的优先级调高。我曾在某个项目里,因为NPU任务被其他后台进程抢占,导致推理延迟从30ms飙到120ms。
  • 模型量化:FP32模型转INT8,推理速度能快3-4倍。代价是精度略有下降,但车载场景下,速度优先。

小技巧:我曾经在调试延迟问题时,用ftrace抓了完整的Pipeline时间线。结果发现,最大的瓶颈不在NPU,而在预处理环节——一个简单的resize操作,因为用了CPU版本,耗时比NPU推理还长。后来换成GPU或NPU自带的硬件resize,延迟直接砍半。

这里我画了一张图,帮你直观理解Camera+AI的Pipeline结构:

Camera + AI Pipeline 低延迟架构 Camera Sensor 30fps / 60fps ISP YUV420输出 预处理 Resize + 格式转换 NPU推理 INT8量化模型 Pipeline并行:三缓冲机制,ISP/预处理/NPU同时工作 延迟优化关键点 ① 共享内存避免拷贝 ② 硬件resize替代CPU ③ NPU优先级调高 ④ 模型量化 端到端延迟目标:< 50ms(从Sensor到AI输出) 实际项目经验:优化前120ms → 优化后35ms

模型输入预处理:别让数据在最后一公里掉链子

预处理这个环节,看起来不起眼,但往往是整个Pipeline的瓶颈。我见过太多团队,模型选得挺好,NPU也算力够用,结果预处理没做好,整体延迟还是下不来。

常见的预处理操作包括:

  • Resize:把Camera图像缩放到模型输入尺寸。比如1920x1080缩到640x480。
  • 格式转换:YUV转RGB/BGR,或者RGB转BGR。
  • 归一化:像素值从[0,255]映射到[0,1]或[-1,1]。
  • 数据排布:NHWC转NCHW,或者反过来。

这里我重点说说Resize。很多同学直接用CPU做双线性插值,但你要知道,对于1080p的图像,一次CPU resize就要花掉10-20ms。如果帧率是30fps,那光resize就占了三分之一的时间。

警告:千万不要在NPU推理线程里做CPU resize。这会导致NPU空等,浪费算力。正确的做法是,用单独的线程或硬件模块做预处理,和NPU推理并行执行。

我建议的做法是:

  1. 优先使用硬件resize:很多SoC的ISP或VPU自带硬件缩放器,延迟只有1-2ms。
  2. 如果必须用CPU:用NEON指令集优化,或者用OpenCV的UMat(GPU加速)。
  3. 归一化可以融合到模型里:有些NPU支持在模型第一层做归一化,这样就不用单独做预处理了。

举个例子,我在一个项目中,把resize从CPU换到ISP硬件后,预处理延迟从15ms降到了2ms。整个Pipeline的端到端延迟从55ms降到了42ms。效果立竿见影。

实战:一个完整的Camera+AI低延迟配置

最后,我分享一个我在项目中实际用过的配置。这个配置跑在Qualcomm SA8295平台上,Camera是200万像素,模型是YOLOv5s量化版。

环节 实现方式 延迟(ms) 备注
Camera采集 MIPI CSI + ISP 16.7 60fps采集,双缓冲
格式转换 ISP硬件输出RGB 0 ISP直接输出RGB,省去转换
Resize ISP硬件缩放 2.0 1920x1080 → 640x640
归一化 融合到模型第一层 0 NPU内部处理
NPU推理 INT8量化,4核并行 18.0 YOLOv5s
后处理 CPU NMS 3.0 非极大值抑制
端到端 39.7 满足50ms目标

个人经验:这个配置我调了整整两周。最开始端到端延迟是85ms,主要瓶颈在格式转换和resize。后来发现ISP可以直接输出RGB,并且硬件resize的延迟比CPU低一个数量级。嗯,有时候问题不在NPU,而在数据流的前半段。

好了,关于Camera与AI融合,NPU Pipeline的设计、低延迟的优化思路、以及模型输入预处理的细节,今天就聊到这里。这些内容都是我在实际项目中一点一点摸索出来的。你如果也在做类似的工作,希望这些经验能帮你少走一些弯路。


公众号:蓝海资料掘金营,微信deep3321