文章目录
软硬件配置
win 11
python 3.8
pytorch 2.0.0
torchvision 0.15.0
CUDA 11.8
RTX3070
前言
这里是跟着b站视频视频行为识别模型—Slowfast算法实战教程(迪哥带你学CV)
根据我的任务,用AVA格式是最合适的,因此通过把官方数据集跑一下来练手
这篇文章里没有测试的部分
可以参考我的上一篇Win11下配置安装slowfast,并测试运行成功(疯狂踩坑版)
训练官方AVA数据集
基本步骤是按照官方文档DATASET.md的数据集制作
AVA数据集下载网站:下载
数据集准备
AVA v2.2 数据集包含 430 个视频,分为 235 个用于训练、64 个用于验证和 131 个用于测试。每个视频有 15 分钟的注释,间隔为 1 秒。AVA v2.2 与 v2.1 在两个方面不同。首先,进行了另一轮人工评分,以插入缺失的标签,使注释的数量增加了 2.5%。其次,对于少数宽高比远大于 16:9 的视频,对框位置进行了矫正。(此处来自于官网介绍)
ava数据集格式
ava
|_ frames
| |_ [video name 0]
| | |_ [video name 0]_000001.jpg
| | |_ [video name 0]_000002.jpg
| | |_ ...
| |_ [video name 1]
| |_ [video name 1]_000001.jpg
| |_ [video name 1]_000002.jpg
| |_ ...
|_ frame_lists
| |_ train.csv
| |_ val.csv
|_ annotations
|_ [official AVA annotation files]
|_ ava_train_predicted_boxes.csv
|_ ava_val_predicted_boxes.csv
因此目的就是按照这个数据集格式制作数据集
我在slowfast文件夹下新建了一个文件夹名为ava_demo
在ava_demo中新建子文件夹annotations、frame_lists、frames、videos
其中最重要的前三个,videos中存储的是下载的视频
annotations
存放标注文件
-
ava_action_list_v2.2.pbtxt:存放行为列表
-
ava_train/val_v2.2.csv:分别存放训练/测试的行为标签
以ava_train_v2.2.csv示例
第一列:视频数据的名称
第二列:开始的秒数
第三到六列:框的四角坐标
第七列:行为标签
第八列:身份ID
-
ava_train/val_excluded_timestamps_v2.2.csv:标注错误帧
如果某一帧是错误的就需要排除,记录一下需要排除的帧
frame_lists:帧列表,存放train.csv和val.csv两个文件
第一列:视频名称
第二列:视频id
第三列:帧id
第四列:视频路径
第五列:标签(空的)
下载视频
在这里使用一个训练视频和一个验证视频,不用测试视频
官方给出的下载视频的命令
DATA_DIR="../../data/ava/videos"
if [[ ! -d "${DATA_DIR}" ]]; then
echo "${DATA_DIR} doesn't exist. Creating it.";
mkdir -p ${DATA_DIR}
fi
wget https://s3.amazonaws.com/ava-dataset/annotations/ava_file_names_trainval_v2.1.txt
for line in $(cat ava_file_names_trainval_v2.1.txt)
do
wget https://s3.amazonaws.com/ava-dataset/trainval/$line -P ${DATA_DIR}
done
由于只想用一个视频进行测试,就没运行这个文件
而是直接在浏览器中复制
https://s3.amazonaws.com/ava-dataset/trainval/-5KQ66BBWC4.mkv
对于该视频的类型名,可以在https://s3.amazonaws.com/ava-dataset/annotations/ava_file_names_trainval_v2.1.txt
查到,直接ctrl+F
搜索就可以
将训练和验证的第一个视频都下载下来
存放在videos文件夹中
裁剪视频
直接使用官方的命令,我用的是绝对路径,会不容易混淆
对于代码中具体的命令含义,可以借助chatgpt搜索一下
IN_DATA_DIR="D:/file/SlowFast-main/ava_demo/videos"
OUT_DATA_DIR="D:/file/SlowFast-main/ava_demo/videos_15min"
if [[ ! -d "${OUT_DATA_DIR}" ]]; then
echo "${OUT_DATA_DIR} doesn't exist. Creating it.";
mkdir -p ${OUT_DATA_DIR}
fi
for video in $(ls -A1 -U ${IN_DATA_DIR}/*)
do
out_name="${OUT_DATA_DIR}/${video##*/}"
if [ ! -f "${out_name}" ]; then
ffmpeg -ss 900 -t 901 -i "${video}" "${out_name}"
fi
done
新建了一个.sh的文件将下面的代码复制进去
直接在cmd运行(因为我是windows系统,试了一下这样也可以)
sh videoTo15.sh
提取帧
每秒提取30帧,也就是所有的原始帧,是官方源代码,唯一的更改就是路径
IN_DATA_DIR="D:/file/SlowFast-main/ava_demo/videos_15min"
OUT_DATA_DIR="D:/file/SlowFast-main/ava_demo/frames"
if [[ ! -d "${OUT_DATA_DIR}" ]]; then
echo "${OUT_DATA_DIR} doesn't exist. Creating it.";
mkdir -p ${OUT_DATA_DIR}
fi
for video in $(ls -A1 -U ${IN_DATA_DIR}/*)
do
video_name=${video##*/}
if [[ $video_name = *".webm" ]]; then
video_name=${video_name::-5}
else
video_name=${video_name::-4}
fi
out_video_dir=${OUT_DATA_DIR}/${video_name}/
mkdir -p "${out_video_dir}"
out_name="${out_video_dir}/${video_name}_%06d.jpg"
ffmpeg -i "${video}" -r 30 -q:v 1 "${out_name}"
done
新建frames.sh文件,在cmd下运行
sh frames.sh
下载标注
当时不知道wget命令能不能在windows下运行,所以就直接自己在官网上下载的
直接下载解压后将里面的文件放在annotations文件夹下就可以,解压下的文件包含这些内容
下载帧列表
按照DATASET.md中AVA数据集的第五点
下载train.csv和val.csv放在frames_lists文件夹下
下载人的标注框
按照DATASET.md中AVA数据集的第六点
下载ava_train_predicted_boxes.csv、ava_val_predicted_boxes.csv和ava_test_predicted_boxes.csv放在annotations文件夹中
(理论上来说test是不需要的,就先下载下来备用吧)
至此所有需要的标注文件都下载完成了
接下来就是训练啦
数据集训练
配置文件(yaml)介绍
训练的时候需要更改yaml配置文件,写这篇教程的时候发现配置文件被我改的乱七八蕉的,而且SLOW_8x8_R50_SHORT和SLOWFAST_32x2_R101_50_50等等混在一起了,分不出配置文件的区别,因此在这里优先介绍一下配置文件
源代码中所配置的yaml文件,就是下图所示的这些
首先从命名上来看,命名规则是:模型架构类型_帧长度×采样率_ResNet深度(50/101).yaml,即不同文件名对应不同的网络架构
以SLOWFAST_32x2_R101_50_50.yaml为例来具体介绍一下
TRAIN: # 训练参数设置
ENABLE: False
DATASET: ava
BATCH_SIZE: 16
EVAL_PERIOD: 1
CHECKPOINT_PERIOD: 1
AUTO_RESUME: True
# CHECKPOINT_FILE_PATH: #path to pretrain model
CHECKPOINT_TYPE: pytorch # 权重保存格式
DATA: # 数据预处理参数
NUM_FRAMES: 32
SAMPLING_RATE: 2
TRAIN_JITTER_SCALES: [256, 320]
TRAIN_CROP_SIZE: 224
TEST_CROP_SIZE: 256
INPUT_CHANNEL_NUM: [3, 3]
DETECTION: # 检测设置
ENABLE: True
ALIGNED: False
AVA: # AVA数据集的特定设置
FRAME_DIR: # 原始帧路径
FRAME_LIST_DIR: # 帧列表路径
ANNOTATION_DIR: # 标签路径
DETECTION_SCORE_THRESH: 0.8
TRAIN_PREDICT_BOX_LISTS: [
"ava_train_v2.2.csv",
"person_box_67091280_iou90/ava_detection_train_boxes_and_labels_include_negative_v2.2.csv",
]
BGR: False
DETECTION_SCORE_THRESH: 0.8
TEST_PREDICT_BOX_LISTS: ["person_box_67091280_iou90/ava_detection_val_boxes_and_labels.csv"]
SLOWFAST: # slowfast模型配置
ALPHA: 4
BETA_INV: 8
FUSION_CONV_CHANNEL_RATIO: 2
FUSION_KERNEL_SZ: 5
RESNET: # ResNet模型配置
ZERO_INIT_FINAL_BN: True
WIDTH_PER_GROUP: 64
NUM_GROUPS: 1
DEPTH: 101
TRANS_FUNC: bottleneck_transform
STRIDE_1X1: False
NUM_BLOCK_TEMP_KERNEL: [[3, 3], [4, 4], [6, 6], [3, 3]]
SPATIAL_DILATIONS: [[1, 1], [1, 1], [1, 1], [2, 2]]
SPATIAL_STRIDES: [[1, 1], [2, 2], [2, 2], [1, 1]]
NONLOCAL: # 非局部块的设置
LOCATION: [[[], []], [[], []], [[6, 13, 20], []], [[], []]]
GROUP: [[1, 1], [1, 1], [1, 1], [1, 1]]
INSTANTIATION: dot_product
POOL: [[[2, 2, 2], [2, 2, 2]], [[2, 2, 2], [2, 2, 2]], [[2, 2, 2], [2, 2, 2]], [[2, 2, 2], [2, 2, 2]]]
BN: # 批归一化参数
USE_PRECISE_STATS: False
NUM_BATCHES_PRECISE: 200
SOLVER: # 优化器设置(训练的优化器设置会更详细)
BASE_LR: 0.1
LR_POLICY: steps_with_relative_lrs
STEPS: [0, 10, 15, 20]
LRS: [1, 0.1, 0.01, 0.001]
MAX_EPOCH: 20
MOMENTUM: 0.9
WEIGHT_DECAY: 1e-7
WARMUP_EPOCHS: 5.0
WARMUP_START_LR: 0.000125
OPTIMIZING_METHOD: sgd
MODEL: # 模型架构配置
NUM_CLASSES: 80
ARCH: slowfast
MODEL_NAME: SlowFast
LOSS_FUNC: bce
DROPOUT_RATE: 0.5
HEAD_ACT: sigmoid
TEST: # 测试配置
ENABLE: False
DATASET: ava
BATCH_SIZE: 8
DATA_LOADER: # 数据加载器配置
NUM_WORKERS: 2
PIN_MEMORY: True
NUM_GPUS: 1 # GPU数量
NUM_SHARDS: 1
RNG_SEED: 0
OUTPUT_DIR: .
# 可视化参数
TENSORBOARD:
MODEL_VIS:
TOPK: 2
DEMO: # 测试视频设置
ENABLE: True
LABEL_FILE_PATH: "./demo/AVA/ava.json"
INPUT_VIDEO: "./input/1.mp4" #视频输入路径
OUTPUT_FILE: "./output/1.mp4" #视频输出路径
#WEBCAM: 0
DETECTRON2_CFG: "COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml" # 目标检测架构
DETECTRON2_WEIGHTS: detectron2://COCO-Detection/faster_rcnn_R_50_FPN_3x/137849458/model_final_280758.pkl
训练前配置文件准备
- 根据实验需求和电脑配置,选择合适自己的网络架构,对应不同名字的配置文件
- 对选中的配置文件中的参数进行检查
下面是着重需要检查和设置的
DEMO下的目标检测那里的权重和配置文件应该是fastrcnn训练的可以对人进行目标检测的预训练权重
TRAIN: # 训练参数设置
ENABLE: # 是否启用训练
BATCH_SIZE: 16 # 内存溢出要降低该值
AVA: # 要注意换成自己的路径
FRAME_DIR: # 原始帧路径
FRAME_LIST_DIR: # 帧列表路径
ANNOTATION_DIR: # 标签路径
TRAIN_PREDICT_BOX_LISTS: [
"ava_train_v2.2.csv",
"person_box_67091280_iou90/ava_detection_train_boxes_and_labels_include_negative_v2.2.csv",
]
TEST_PREDICT_BOX_LISTS: ["person_box_67091280_iou90/ava_detection_val_boxes_and_labels.csv"]
MODEL:
NUM_CLASSES: 80 # 自制数据集要根据自己的类别更改该值
NUM_GPUS: 1 # GPU数量,根据电脑性能更改
NUM_SHARDS: 1
DEMO: # 测试视频设置
ENABLE:
LABEL_FILE_PATH: "./demo/AVA/ava.json" # 标签文件
INPUT_VIDEO: "./input/1.mp4" #视频输入路径
OUTPUT_FILE: "./output/1.mp4" #视频输出路径
DETECTRON2_CFG: "COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml" # 目标检测架构
DETECTRON2_WEIGHTS: detectron2://COCO-Detection/faster_rcnn_R_50_FPN_3x/137849458/model_final_280758.pkl
- 对官方数据集进行训练时,配置文件的设置
我使用的是SLOWFAST_32x2_R50.yaml这个配置文件
另外将TEST设置为false
进行训练
cfg后面放自己yaml文件所在的路径
python tools/run_net.py --cfg configs/AVA/c2/SLOWFAST_32x2_R50.yaml
后言
slowfast的教程零零散散的,一切都是自己摸索着来
看了很多教程,并且也遇到了很多报错
上面的是chatgpt加上自己的理解
我的实验主要是自制数据集,这篇的主要目的也是在自制数据集之前先熟悉一下流程
可能会有错误,欢迎大家指出
也欢迎大家交流
祝科研顺利!
下一篇就是自制数据集啦
参考链接
【slowfast复现 训练】训练过程 制作ava数据集
关于slowfast杨帆老师出了蛮多教程的,也是主要参考的他的帖子,推荐大家去看