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结构:
模型输入预处理:别让数据在最后一公里掉链子
预处理这个环节,看起来不起眼,但往往是整个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推理并行执行。
我建议的做法是:
- 优先使用硬件resize:很多SoC的ISP或VPU自带硬件缩放器,延迟只有1-2ms。
- 如果必须用CPU:用NEON指令集优化,或者用OpenCV的UMat(GPU加速)。
- 归一化可以融合到模型里:有些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