保姆级教程:用YOWO和AVA数据集搞定视频中的人物动作检测(附代码)

张开发
2026/4/6 4:47:58 15 分钟阅读

分享文章

保姆级教程:用YOWO和AVA数据集搞定视频中的人物动作检测(附代码)
保姆级教程用YOWO和AVA数据集搞定视频中的人物动作检测附代码在短视频和智能监控爆发的时代视频动作检测技术正从实验室快速走向产业应用。想象一下你有一段街头监控视频需要自动识别其中打架、奔跑等危险行为或者你正在开发健身APP要实时分析用户深蹲动作是否标准——这些场景的核心技术就是时空动作检测。不同于静态图像识别它需要同时解决在哪里空间定位和在做什么动作分类两个关键问题。本文将手把手带您完成从环境搭建到模型部署的全流程使用YOWOYou Only Watch Once这一端到端解决方案和AVA数据集这一业界标杆数据。与常见理论教程不同我们聚焦三个实战目标零基础跑通全流程从驱动安装到最终预测每个步骤提供可执行代码避开新手的20个常见坑包括CUDA版本冲突、标注格式错误等实际问题实现自定义视频分析教您将训练好的模型应用到任意视频文件1. 开发环境配置从驱动到依赖库1.1 硬件与驱动准备动作检测是计算密集型任务建议使用NVIDIA显卡至少6GB显存。首先检查驱动兼容性# 查看CUDA驱动版本 nvidia-smi | grep CUDA Version # 输出示例| NVIDIA-SMI 515.48.07 Driver Version: 515.48.07 CUDA Version: 11.7 |若未安装驱动按以下步骤操作# Ubuntu系统示例 sudo apt install nvidia-driver-515 sudo reboot注意YOWO官方推荐CUDA 11.3PyTorch版本需≥1.8.0。版本不匹配会导致无法调用GPU加速。1.2 创建Python虚拟环境为避免依赖冲突建议使用conda管理环境conda create -n yowo python3.8 conda activate yowo pip install torch1.12.1cu113 torchvision0.13.1cu113 --extra-index-url https://download.pytorch.org/whl/cu1131.3 安装YOWO依赖库克隆官方仓库并安装必要组件git clone https://github.com/wei-yuma/YOWO.git cd YOWO pip install -r requirements.txt # 编译关键组件 cd libs/utils/box_utils/ python setup.py build_ext --inplace常见问题解决报错nvcc not found确认CUDA Toolkit路径已加入环境变量pycocotools安装失败尝试pip install githttps://github.com/philferriere/cocoapi.git#eggpycocotoolssubdirectoryPythonAPI2. AVA数据集处理实战2.1 数据集下载与结构分析AVA数据集包含430个电影片段标注了80类人类动作。下载命令wget https://s3.amazonaws.com/ava-dataset/trainval/ava_train_v2.2.zip wget https://s3.amazonaws.com/ava-dataset/trainval/ava_val_v2.2.zip unzip ava_train_v2.2.zip -d data/AVA unzip ava_val_v2.2.zip -d data/AVA数据集目录结构如下AVA/ ├── annotations/ # 标注文件 │ ├── ava_train_v2.2.csv │ └── ava_val_v2.2.csv ├── frames/ # 视频关键帧需自行提取 └── videos/ # 原始视频文件2.2 关键帧提取技巧AVA仅标注每秒1帧需用FFmpeg提取关键帧import subprocess def extract_frames(video_path, output_dir, fps1): cmd fffmpeg -i {video_path} -r {fps} {output_dir}/%06d.jpg subprocess.call(cmd, shellTrue) # 示例提取训练集第一个视频 extract_frames(data/AVA/videos/train/-5KQ66BBWC4.mp4, data/AVA/frames/train/-5KQ66BBWC4)提示批量处理建议使用多进程加速100个视频约需2小时8核CPU2.3 标注格式转换AVA原始标注需要转换为YOWO支持的JSON格式import pandas as pd import json def convert_annotations(csv_path, output_json): df pd.read_csv(csv_path) annotations [] for _, row in df.iterrows(): video_id row[0] timestamp int(row[1]) bbox [float(x) for x in row[2:6]] # x1,y1,x2,y2 action_id int(row[6]) frame_id f{video_id}/{timestamp:06d} annotations.append({ image_id: frame_id, bbox: bbox, category_id: action_id }) with open(output_json, w) as f: json.dump(annotations, f) convert_annotations(data/AVA/annotations/ava_train_v2.2.csv, data/AVA/annotations/train.json)3. YOWO模型训练与调优3.1 预训练模型加载YOWO提供在Kinetics-600上预训练的权重wget https://pjreddie.com/media/files/yolov3.weights -P model_weights/修改配置文件cfg/yowo.cfg[training] batch_size 8 learning_rate 0.001 pretrained_weights model_weights/yolov3.weights3.2 启动训练任务使用分布式训练加速2卡示例python -m torch.distributed.launch --nproc_per_node2 train.py \ --dataset AVA \ --data_path data/AVA \ --model_name yowo \ --batch_size 16 \ --num_workers 4训练过程常见问题问题现象解决方案GPU内存不足减小batch_size或使用梯度累积Loss出现NaN降低学习率或添加梯度裁剪验证指标不提升尝试冻结骨干网络前几层3.3 关键参数调优通过验证集mAP选择最佳超参数# 学习率搜索示例 for lr in [0.1, 0.01, 0.001]: !python train.py --learning_rate {lr} --validate mAP parse_validation_log(logs/val.log) print(fLR{lr}, mAP{mAP:.3f})推荐参数组合输入分辨率448x448优化器AdamW权重衰减0.05数据增强随机翻转色彩抖动4. 自定义视频动作检测实战4.1 模型导出为ONNX格式为提升推理速度建议转换为ONNXimport torch from models.yowo import YOWO model YOWO(num_classes80) model.load_state_dict(torch.load(weights/yowo_ava.pth)) dummy_input torch.randn(1, 3, 224, 224) torch.onnx.export(model, dummy_input, yowo.onnx, opset_version11)4.2 视频推理代码实现使用OpenCV处理视频流import cv2 import numpy as np def detect_actions(video_path, model, threshold0.5): cap cv2.VideoCapture(video_path) while cap.isOpened(): ret, frame cap.read() if not ret: break # 预处理 blob cv2.dnn.blobFromImage(frame, 1/255, (224,224)) model.setInput(blob) # 推理 detections model.forward() # 解析结果 for det in detections[0]: conf det[5] if conf threshold: x1,y1,x2,y2 map(int, det[:4]) cls_id int(det[6]) cv2.rectangle(frame, (x1,y1), (x2,y2), (0,255,0), 2) cv2.putText(frame, f{AVA_CLASSES[cls_id]}:{conf:.2f}, (x1,y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,0,255), 2) cv2.imshow(Action Detection, frame) if cv2.waitKey(1) 0xFF ord(q): break # 加载模型 net cv2.dnn.readNetFromONNX(yowo.onnx) detect_actions(test.mp4, net)4.3 性能优化技巧TensorRT加速转换ONNX为TensorRT引擎提升3-5倍速度多线程处理使用生产者-消费者模式分离IO和计算分辨率调整根据应用场景平衡精度与速度# TensorRT加速示例 import tensorrt as trt logger trt.Logger(trt.Logger.WARNING) builder trt.Builder(logger) network builder.create_network() parser trt.OnnxParser(network, logger) with open(yowo.onnx, rb) as f: parser.parse(f.read()) engine builder.build_cuda_engine(network)5. 进阶技巧与避坑指南5.1 处理遮挡场景的实用方法当视频中存在多人遮挡时可引入ByteTrack增强目标跟踪鲁棒性姿态估计辅助通过关节点信息区分重叠人物时序一致性约束利用前后帧关系修正检测结果# 结合ByteTrack示例 from byte_tracker import BYTETracker tracker BYTETracker() for frame in video_frames: detections model(frame) online_targets tracker.update(detections) for t in online_targets: print(fID:{t.track_id} 动作:{t.action_class})5.2 小样本迁移学习当目标动作不在AVA的80类中时冻结骨干网络权重仅训练最后的分类层使用数据增强生成更多样本# 迁移学习代码片段 for name, param in model.named_parameters(): if head not in name: # 冻结非分类头参数 param.requires_grad False optimizer torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()))5.3 部署到边缘设备在Jetson等设备上的优化策略量化模型为FP16/INT8使用DeepStream加速流水线调整帧率匹配设备算力# Jetson TX2上的性能测试 ./yowo_demo --modelyowo.trt --inputvideo.mp4 --outputresult.avi \ --input_size320x320 --fp16经过完整流程实践后我在实际项目中总结出三点经验首先数据质量比算法更重要AVA标注中的噪声需要仔细清洗其次时序信息利用是关键单纯堆叠CNN层效果不如精心设计的3D卷积最后工程部署决定落地效果模型压缩和流水线优化往往能带来质的提升。

更多文章