PaddleVideo + YOWO 实现实时摄像头视频检测的完整代码示例
在 PaddleVideo 中YOWO 模型主要用于时空动作定位Spatio-Temporal Action Detection。由于 YOWO 需要同时输入一段连续的帧序列如 16 帧来进行时空特征提取因此实现实时摄像头检测的核心在于构建滑动窗口Sliding Window机制。以下是结合 PaddleVideo 官方推理逻辑与 OpenCV 实时流处理的完整代码示例。这段代码展示了如何在内存中维护帧队列并逐窗口进行推理importcv2importnumpyasnpimportpaddlefrompaddlevideo.configsimportget_cfgfrompaddlevideo.modelingimportbuild_model# 1. 配置与模型初始化 # 加载 YOWO 的配置文件请根据实际路径修改cfgget_cfg(configs/detection/yowo/yowo.yaml)# 构建模型并加载预训练权重modelbuild_model(cfg.MODEL)model_statepaddle.load(cfg.MODEL.pretrained)model.set_state_dict(model_state)model.eval()# 视频处理相关参数WINDOW_SIZE16# YOWO 通常需要的连续帧数STEP_SIZE4# 滑动窗口的步长每次滑过几帧用于降低计算量THRESHOLD0.5# 动作置信度阈值# 2. 视频流读取与滑动窗口构建 capcv2.VideoCapture(0)# 0 代表默认摄像头ifnotcap.isOpened():raiseRuntimeError(❌ 无法打开摄像头)frame_buffer[]# 内存中的帧队列frame_count0print( 开始实时动作检测按 ESC 键退出...)whileTrue:ret,framecap.read()ifnotret:print(❌ 无法读取摄像头画面)break# 预处理将 BGR 转换为 RGB 并 resize 到模型输入尺寸 (如 224x224)# 注意实际推理前还需要进行 Normalize 和 Transpose (HWC - CHW)# 这里为展示核心逻辑省略了完整的预处理 pipelinergb_framecv2.cvtColor(frame,cv2.COLOR_BGR2RGB)resized_framecv2.resize(rgb_frame,(224,224))frame_buffer.append(resized_frame)frame_count1# 当帧队列达到窗口大小且满足步长条件时触发一次推理iflen(frame_buffer)WINDOW_SIZEandframe_count%STEP_SIZE0:# 取出当前窗口的 16 帧组成 Batch Tensor: [1, T, C, H, W]clipnp.array(frame_buffer[-WINDOW_SIZE:])clip_tensorpaddle.to_tensor(clip).transpose([3,0,1,2]).unsqueeze(0)# 模型前向推理withpaddle.no_grad():outputsmodel(clip_tensor)# 解析输出假设输出包含 boxes, scores, labels# 具体的解析方式需参考 PaddleVideo YOWO 的官方后处理代码boxes,scores,labelsoutputs# 在原始帧上绘制检测框取窗口内的最新一帧进行绘制display_frameframe.copy()forbox,score,labelinzip(boxes,scores,labels):ifscoreTHRESHOLD:x1,y1,x2,y2map(int,box)cv2.rectangle(display_frame,(x1,y1),(x2,y2),(0,255,0),2)cv2.putText(display_frame,f{label}:{score:.2f},(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),2)# 实时显示cv2.imshow(YOWO Real-time Action Detection,display_frame)# 滑动窗口弹出最旧的帧保持内存占用稳定frame_bufferframe_buffer[STEP_SIZE:]else:# 未达到推理条件时仅显示实时画面cv2.imshow(YOWO Real-time Action Detection,frame)# 按 ESC 退出ifcv2.waitKey(1)0xFF27:break# 3. 释放资源 cap.release()cv2.destroyAllWindows() 核心工程要点说明内存管理代码中通过frame_buffer frame_buffer[STEP_SIZE:]实现了滑动窗口的滑动确保内存中始终只保留少量帧避免了显存/内存溢出。性能优化通过设置STEP_SIZE 4模型并不是每帧都推理而是每隔 4 帧推理一次。这在保证动作检测连续性的同时将计算开销降低了约 75%。数据预处理在实际工程中frame_buffer中存储的应该是经过完整预处理Resize、Normalize、ToTensor后的 NumPy 数组或 Tensor以加快推理时的组装速度。你可以将此代码作为基础模板根据你实际使用的 PaddleVideo 版本的 API 接口如数据预处理和后处理的具体函数进行微调即可快速跑通实时动作检测 Demo。