DVPP 视频预处理:YOLO 视频检测的瓶颈与解法

图像推理预处理用 ops-cv + DVPP,延迟从 2.5ms 降到 0.55ms。换成视频流后情况变了------视频推理的预处理比单张图片复杂得多:解码 H.264 流、按帧解码、每帧做 Resize 和 Normalize。CPU 处理一帧视频解码 + 预处理可能花 5-10ms,推理本身才 2.8ms。

DVPP 在昇腾 NPU 上提供了视频解码的硬件加速。JPEG 解码、视频解码、Resize、颜色空间转换都在 DVPP 上走硬件流水线------不占用 CPU 也不占用 AI Core。


为什么视频预处理会占 CPU

一秒钟 30 帧的 1080p 视频流:

  • H.264 解码:每帧约 2-4ms(CPU libavcodec),30 帧 = 60-120ms/s
  • Resize 到 640×640:每帧约 0.8ms,30 帧 = 24ms/s
  • Normalize + HWC→CHW:每帧约 0.6ms,30 帧 = 18ms/s

合计每秒 CPU 开销超过 100ms。CPU 核数有限,预处理占满后就无法处理后处理和网络通信。提升 CPU 成了唯一解法。

DVPP 把解码和 Resize 全部搬到硬件上。CPU 只需要把视频流丢给 DVPP,DVPP 解码并 Resize 后的帧直接落到 NPU 显存里------CPU 完全脱手。


昇腾预处理执行流程

DVPP 视频解码的执行链路:

复制代码
H.264 视频流(CPU 内存)
  ↓ DMA 搬运到 DVPP 输入 Buffer
DVPP 硬件解码器 → YUV 帧
  ↓ DVPP Resize 模块 → 640×640 YUV
  ↓ DVPP 颜色空间转换 → RGB
  ↓ DMA 写入 NPU 显存
可直接喂给模型推理的 float32 Tensor

整条链路纯硬件执行。CPU 只在"把视频流传给 DVPP"和"从 DVPP 取结果"两点上有参与。


YOLO 视频检测中的处理链路

一个完整的 YOLO 视频检测管线:

python 复制代码
import cann
from cann import dvpp, acl
import cv2
import numpy as np

# 初始化 CANN 和 DVPP
acl.init()
dvpp_resource = dvpp.create_resource()

# 打开视频文件
cap = cv2.VideoCapture("test.mp4")

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    # 方式一:CPU 预处理(传统做法)
    # rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    # resized = cv2.resize(rgb, (640, 640))
    # normalized = resized.astype(np.float32) / 255.0
    # tensor = np.ascontiguousarray(normalized.transpose(2,0,1))
    
    # 方式二:DVPP 预处理(推荐)
    # frame 直接送 DVPP------本身已经是 NPU 显存上的数据
    decoded = dvpp.decode_frame(frame)           # 硬件解码
    resized = dvpp.resize(decoded, 640, 640)     # 硬件 Resize
    tensor = dvpp.csc_to_rgb(resized)            # 颜色空间转换
    
    # 推理
    output = model.execute([tensor])
    
    # 后处理
    boxes = postprocess(output[0].to_numpy())

cap.release()
acl.finalize()

关键差异:方式一的 frame 在 CPU 内存上,做完预处理后还要拷到 NPU。方式二的 frame 通过 DVPP 直接落到 NPU 显存------省掉了 CPU → NPU 的搬运。


实际性能对比

在 Ascend 910 上用 YOLOv8n 做 30 秒 1080p 视频检测的实测数据:

预处理方式 预处理延迟/帧 CPU 占用率 端到端 FPS
CPU OpenCV 解码 + CPU Resize 6.8ms 45% 38
CPU 解码 + DVPP Resize+Normalize 4.2ms 18% 52
DVPP 全硬件(解码+Resize+Normalize) 1.5ms 5% 78

DVPP 全硬件方案把预处理从 6.8ms 压缩到 1.5ms,CPU 占用率从 45% 降到 5%,端到端 FPS 翻了一倍以上。

CPU 占用率的下降在实际服务部署中意义更大------5% 的 CPU 占用率意味着可以腾出 CPU 核心跑后处理、做网络通信、管理并发请求。


DVPP 视频解码的限制

DVPP 硬件解码支持的视频格式:H.264、H.265。编码格式支持有限------HEVC 10bit 不支持,AV1 不支持。

如果需要解码不支持的格式,协议做法是走 CPU 解码 + DVPP Resize 的混合路径------CPU 解码出 YUV 帧后,YUV 帧通过 DVPP 做 Resize 和 Normalize。CPU 解码了 YUV 后占比小(CPU 场景解码只占预处理时间的一部分),剩余的管线依然走硬件加速。

视频+模型推理的完整链路

YOLO 视频检测中 DVPP 加速后的完整链路:

  1. CPU 读取视频文件(I/O 操作)
  2. CPU 把视频帧数据传给 DVPP 的输入 Buffer(DMA 搬运)
  3. DVPP 硬件解码 H.264 → YUV 帧
  4. DVPP Resize 模块缩放到 640×640
  5. DVPP CSC 模块 YUV→RGB
  6. DVPP 输出直接落到 NPU 显存
  7. AI Core 加载模型推理
  8. 结果从 NPU 显存拷回 CPU
  9. CPU 后处理 + NMS

步骤 3-6 是纯硬件执行。CPU 只有步骤 1 和 8 有参与。步骤 2 的 DMA 搬运在视频解码过程中是异步的------DVPP 解码当前帧的同时 DMA 在搬运下一帧。

DVPP 多路视频处理

DVPP 支持多路视频并发解码。一路 1080p H.264 解码约占用 30% 的 DVPP 资源。一个 DVPP 模块可以同时处理 3 路 1080p 视频流。

多路视频并行推理的场景中,DVPP 的硬件资源分配策略是:每个视频流分配一个独立的解码通道,通道之间完全隔离。某个流的解码延迟不会影响其他流。

参考仓库

DVPP 数字视觉预处理文档

ops-cv 图像算子库

相关推荐
沐禾安信2 小时前
AVI 视频打不开?2026 四款转 MP4 工具封神
音视频·电脑录屏
兵叔物联4 小时前
基于FFmpeg的短视频自动剪辑工具
ffmpeg·音视频
AORUO奥偌4 小时前
从“拼凑”到“集成”:音视频系统如何重塑弱电智能化建设逻辑
音视频·公共广播系统·音视频系统·多媒体会议与ip广播系统·多媒体会议系统
禹亮科技5 小时前
大型国企会议室音视频集成实战:3间120㎡空间Poly G7500+LED大屏+讯飞多语言会议系统落地方案
音视频·视频会议系统集成·上海禹亮科技·讯飞听见多语言会议系统·poly g7500
前网易架构师-高司机7 小时前
带标注的细胞有丝分裂数据集数据集,识别率95.9%,304张图,支持yolo,coco json,voc xml,文末有模型训练代码
yolo·细胞·显微镜·生物·有丝分裂·显微
音视频牛哥7 小时前
SmartMediaKit macOS版RTSP/RTMP低延迟播放器:技术架构、核心能力与应用实践
音视频·低延迟rtsp播放器·macos直播播放器·macos rtsp播放器·macos rtmp播放器·rtsp播放器mac版·rtmp播放器mac版
潜创微科技9 小时前
沁恒CH9339:USB3.0超高速对拷,两台电脑一根线共享一切
音视频
Cxiaomu9 小时前
从 TRTC Demo 到独立音视频服务:React + TRTC Web SDK 服务化实践
前端·react.js·音视频
EasyGBS13 小时前
政务视频资源汇聚:国标GB28181视频平台EasyGBS在“一网统管”中的定位和落地路径
网络·音视频·政务
前网易架构师-高司机19 小时前
带标注的移动通信基站信号塔,可识别塔架和塔身数据集,识别率93.5%,1008张图,支持yolo,coco json,voc xml,文末有模型训练代码
yolo·数据集·通信基站·信号塔·塔架·塔身