3、多路视频处理流程:视频采集、解码、预处理、推理、后处理、编码输出的完整pipeline
多路视频NPU部署的核心挑战,不在于单路视频的极致性能,而在于多路并发时的资源调度与吞吐稳定性。一个完整的视频处理pipeline通常包含六个关键阶段:视频采集、解码、预处理、推理、后处理、编码输出。每个阶段都可能成为瓶颈,且阶段之间的数据传递方式(内存拷贝、零拷贝、异步队列)直接影响整体帧率与延迟。本章将逐一拆解每个阶段的工程要点,并给出多路场景下的资源分配与调优方法。
3.1 视频采集与解码:多路输入的工程基础
视频采集阶段决定了整个pipeline的数据源质量与格式。在边缘设备上,常见的采集方式包括RTSP网络流、USB摄像头、本地视频文件以及HDMI输入。多路场景下,采集环节的核心问题不是“能不能读到数据”,而是“如何保证多路数据到达的同步性与稳定性”。RTSP流可能因为网络抖动导致丢包或延迟,USB摄像头可能因为带宽共享导致帧率下降,本地文件则相对可控。
解码阶段是将压缩码流(H.264/H.265等)转换为YUV原始帧的过程。边缘设备通常使用硬件解码器(VPU或GPU中的专用模块)来降低CPU负载。以瑞芯微RK3588为例,其内置VPU支持同时解码多路1080p@60fps或4K@30fps。但硬件解码器数量有限,例如RK3588的VPU最多支持8路1080p解码,超过该路数就需要考虑分时复用或降低分辨率。
- 硬件解码优先:使用VPU/GPU硬解,避免CPU软解占用大量算力。
- 解码器池化:创建固定数量的解码器实例,通过队列分配任务,避免频繁创建销毁。
- 分辨率适配:根据NPU输入要求,解码时直接输出对应分辨率(如640×640),减少后续缩放开销。
- 帧率控制:对于非实时分析场景,可跳帧解码(如每2帧解1帧),降低带宽与算力消耗。
3.2 预处理与推理:NPU数据格式转换与调度
预处理阶段将YUV帧转换为NPU所需的张量格式。典型操作包括:色彩空间转换(YUV→RGB)、尺寸缩放(如1920×1080→640×640)、归一化(除以255或使用均值方差)、通道重排(NHWC→NCHW)。这些操作看似简单,但在多路场景下会消耗大量CPU或GPU资源。如果预处理耗时超过单帧间隔(如33ms@30fps),就会成为瓶颈。
推理阶段是NPU的核心工作负载。多路推理有两种主流调度方式:批处理(batching)和多流并发(multi-stream)。批处理将多路帧拼接成一个batch输入NPU,提高算子利用率;多流并发则让NPU同时处理多个独立推理任务。实际部署中,通常采用“动态批处理”策略:当队列中积累的帧数达到阈值(如4帧)时触发一次推理,否则等待超时(如5ms)后以当前帧数推理。
| 调度方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 静态批处理 | 实现简单,算子利用率高 | 延迟高,需凑满batch | 离线分析、非实时 |
| 动态批处理 | 延迟与吞吐平衡 | 需调优阈值与超时 | 实时多路监控 |
| 多流并发 | 延迟低,独立性强 | 算子利用率可能下降 | 路数少但实时性要求高 |
3.3 后处理与编码输出:结构化数据与回显
后处理阶段将NPU输出的原始张量转换为业务可用的结构化结果。以目标检测为例,后处理包括:阈值过滤(confidence > 0.5)、非极大值抑制(NMS)、类别映射、目标跟踪(如DeepSORT)。后处理通常使用CPU执行,多路场景下需要采用多线程并行处理。每路视频分配一个后处理线程,或者使用线程池统一调度。
编码输出阶段将推理结果叠加到原始视频帧上(画框、标注),再编码为H.264/H.265流,推送到RTMP服务器或写入本地文件。编码同样建议使用硬件编码器。需要注意的是,编码输出并非所有场景都需要——如果只做结构化数据上报(如JSON),则无需编码回显,可节省大量算力。
3.4 案例拆解:8路1080p实时检测系统的Pipeline调优
某智慧园区项目需要在RK3588平台上部署8路1080p@25fps的实时行人检测系统。初始方案直接使用OpenCV读取RTSP流,CPU软解,模型输入640×640,后处理单线程,编码输出8路RTMP。实测结果:CPU占用率95%,NPU利用率仅40%,整体帧率不足10fps,系统严重卡顿。
分析过程:通过perf工具定位,发现CPU主要消耗在软解(约40%)和预处理(约30%),后处理占15%,编码占10%。NPU利用率低是因为推理任务串行提交,且每路帧到达时间不齐,导致batch size始终为1。
优化步骤:
- 启用硬件解码:使用RK3588的VPU硬解,将解码CPU占用从40%降至5%。
- 预处理优化:使用RGA(Rockchip Graphics Accelerator)硬件加速缩放与格式转换,CPU占用从30%降至8%。
- 动态批处理:设置batch阈值4帧,超时5ms。将8路帧统一送入推理队列,NPU利用率提升至75%。
- 后处理线程池:创建4个后处理线程,每个线程处理2路结果,CPU占用控制在15%。
- 编码降级:仅对4路关键画面编码输出,其余4路只上报结构化数据。
结果对比:优化后CPU占用降至35%,NPU利用率75%,整体帧率稳定在25fps,端到端延迟从500ms降至120ms。代价是编码输出路数减半,但业务方确认4路回显已满足需求。
3.5 多路Pipeline的通用设计原则与常见误区
综合以上分析,多路视频pipeline的设计应遵循以下原则:
- 硬件加速优先:解码、缩放、编码尽量使用专用硬件模块,释放CPU给后处理与业务逻辑。
- 异步流水线:每个阶段之间使用有界队列解耦,避免同步等待导致整体帧率下降。
- 资源池化:解码器、线程、内存缓冲区均采用池化设计,避免动态创建销毁的开销。
- 动态负载均衡:根据各路视频的复杂度(如画面变化率)动态调整处理优先级,避免某一路拖垮整体。
- 内存零拷贝:尽量使用DMA-BUF等机制在硬件模块间直接传递数据,减少CPU拷贝。
- 误区一:认为路数越多越好,忽略解码器数量上限。超过硬件解码能力时,应降低分辨率或帧率。
- 误区二:预处理使用CPU逐帧操作,未利用硬件加速。在8路以上场景,CPU预处理必然成为瓶颈。
- 误区三:推理batch size固定不变,导致低峰期浪费算力、高峰期排队。应使用动态批处理。
- 误区四:后处理单线程串行,多路结果排队处理。应使用线程池并行。
- 误区五:所有路数都编码输出,浪费编码器资源。应根据业务需求选择性输出。