1. 从零开始构建自定义动作识别数据集
动作识别是计算机视觉领域的重要研究方向,而构建高质量的数据集是训练出优秀模型的第一步。我最近在医疗监护项目中尝试用SlowFast模型识别跌倒行为,发现自定义数据集的构建过程有不少需要注意的细节。
1.1 视频素材的选择与处理
选择视频素材时,要根据你的应用场景来决定。比如做手势识别就需要各种手势视频,做跌倒检测就需要包含不同跌倒姿势的素材。我建议初期先用少量视频测试流程,等跑通后再扩充数据量。
处理视频时,ffmpeg是最实用的工具。下面这个命令可以把长视频裁剪成3秒的片段:
ffmpeg -ss 00:00:00.0 -to 00:00:03.0 -i input.mp4 output.mp41.2 视频帧的提取策略
SlowFast模型需要两种帧率的数据:
- 标注用帧率(每秒1帧)
- 训练用帧率(每秒30帧)
提取标注用帧的命令:
ffmpeg -i input.mp4 -r 1 -q:v 1 output_%06d.jpg提取训练用帧的命令:
ffmpeg -i input.mp4 -r 30 -q:v 1 output_%06d.jpg1.3 使用Faster R-CNN自动检测人物
手动标注效率太低,我推荐使用Detectron2中的Faster R-CNN来自动检测人物位置。安装Detectron2后,可以用几行代码实现人物检测:
from detectron2 import model_zoo from detectron2.engine import DefaultPredictor cfg = model_zoo.get_config("COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml") cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml") predictor = DefaultPredictor(cfg)1.4 使用VIA工具进行标注修正
虽然Faster R-CNN能自动检测人物,但还是需要人工检查。我习惯用VGG Image Annotator(VIA)来修正检测结果。导入自动检测的CSV后,可以删除错误的检测框,保留质量好的检测结果。
注意:在VIA中不需要添加动作标签,因为SlowFast使用的标签格式与VIA不同,我们后续会手动添加动作标签。
2. 构建AVA格式的数据集
SlowFast默认使用AVA数据集格式,我们需要将自己的数据转换成这种格式。经过几次尝试,我总结出了一套可行的方案。
2.1 数据集目录结构
完整的AVA格式数据集包含以下文件和目录:
annotations/ ava_train_v2.2.csv ava_val_v2.2.csv ava_action_list_v2.2.pbtxt person_box_67091280_iou90/ ava_detection_train_boxes_and_labels.csv frame_lists/ train.csv val.csv frames/ video1/ video1_000001.jpg video1_000002.jpg ...2.2 关键文件详解
ava_action_list_v2.2.pbtxt定义了动作类别:
item { name: "fall" id: 1 }ava_train_v2.2.csv包含训练集的标注,格式为:
视频名,时间戳,x1,y1,x2,y2,动作ID,置信度 video1,1,0.395,0.230,0.545,0.933,1,0train.csv列出了所有训练帧:
original_video_id,video_id,frame_id,path,labels video1,0,0,video1/video1_000001.jpg,""2.3 数据集划分技巧
我建议将数据按视频划分训练集和验证集,而不是随机划分帧。这样可以避免同一视频的相似帧同时出现在训练集和验证集中,导致评估结果不准确。
3. 配置SlowFast训练环境
有了数据集后,下一步是配置训练环境。这里有几个关键点需要注意。
3.1 预训练模型的选择
SlowFast提供了多个预训练模型,我推荐使用SLOWFAST_32x2_R101_50_50.pkl。下载后放在configs/AVA/c2/目录下。
提示:使用预训练模型可以显著缩短训练时间,特别是在数据量不大的情况下。
3.2 配置文件详解
创建自定义配置文件时,有几个关键参数需要调整:
TRAIN: CHECKPOINT_FILE_PATH: 'path/to/pretrained/model.pkl' DATA: PATH_TO_DATA_DIR: 'path/to/your/dataset' AVA: FRAME_DIR: 'path/to/frames' FRAME_LIST_DIR: 'path/to/frame_lists' ANNOTATION_DIR: 'path/to/annotations' MODEL: NUM_CLASSES: 1 # 根据你的动作类别数调整3.3 启动训练
配置完成后,用以下命令启动训练:
python tools/run_net.py --cfg configs/AVA/your_config.yaml训练过程中常见的问题:
- 显存不足:减小BATCH_SIZE
- 损失不下降:检查数据标注是否正确
- 过拟合:增加数据量或使用正则化
4. 模型部署与效果验证
训练完成后,我们需要验证模型效果并部署使用。
4.1 创建推理配置文件
在demo/AVA/目录下创建配置文件,主要修改以下参数:
DEMO: LABEL_FILE_PATH: "path/to/your_labels.json" INPUT_VIDEO: "path/to/input.mp4" OUTPUT_FILE: "path/to/output.mp4"4.2 修改AVA Helper
需要调整ava_helper.py中的帧范围设置,匹配你的数据:
AVA_VALID_FRAMES = range(1, 6) # 根据你的实际帧数调整4.3 运行推理
使用以下命令进行视频推理:
python tools/run_net.py --cfg demo/AVA/your_demo_config.yaml4.4 效果优化技巧
如果识别效果不理想,可以尝试:
- 增加训练数据量
- 调整数据增强参数
- 微调模型架构
- 优化检测阈值
我在实际项目中发现,SlowFast对光照变化比较敏感,建议在数据采集时保持光照条件一致。另外,模型对快速动作的识别效果较好,但对缓慢变化的动作有时会漏检。