slowfast官方数据集复现版(AVA)及yaml文件介绍

软硬件配置

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中存储的是下载的视频
ava数据集列表

annotations

存放标注文件

  • ava_action_list_v2.2.pbtxt:存放行为列表
    ava_action_list_v2.2.pbtxt

  • ava_train/val_v2.2.csv:分别存放训练/测试的行为标签
    以ava_train_v2.2.csv示例
    第一列:视频数据的名称
    第二列:开始的秒数
    第三到六列:框的四角坐标
    第七列:行为标签
    第八列:身份ID
    ava_train/val_v2.2.csv

  • ava_train/val_excluded_timestamps_v2.2.csv:标注错误帧
    如果某一帧是错误的就需要排除,记录一下需要排除的帧

frame_lists:帧列表,存放train.csv和val.csv两个文件

第一列:视频名称
第二列:视频id
第三列:帧id
第四列:视频路径
第五列:标签(空的)
train.csv

下载视频

在这里使用一个训练视频和一个验证视频,不用测试视频
官方给出的下载视频的命令

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文件夹下就可以,解压下的文件包含这些内容
avav2.2

下载帧列表

按照DATASET.md中AVA数据集的第五点
下载帧列表
下载train.csvval.csv放在frames_lists文件夹下

下载人的标注框

按照DATASET.md中AVA数据集的第六点
下载人的标注框
下载ava_train_predicted_boxes.csvava_val_predicted_boxes.csvava_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这个配置文件
    AVA更改
    另外将TEST设置为false

进行训练

cfg后面放自己yaml文件所在的路径

python tools/run_net.py --cfg configs/AVA/c2/SLOWFAST_32x2_R50.yaml

后言

slowfast的教程零零散散的,一切都是自己摸索着来
看了很多教程,并且也遇到了很多报错
上面的是chatgpt加上自己的理解
我的实验主要是自制数据集,这篇的主要目的也是在自制数据集之前先熟悉一下流程
可能会有错误,欢迎大家指出
也欢迎大家交流
祝科研顺利!
下一篇就是自制数据集啦

参考链接

【slowfast复现 训练】训练过程 制作ava数据集
关于slowfast杨帆老师出了蛮多教程的,也是主要参考的他的帖子,推荐大家去看

YOLOv8是一个流行的实时目标检测模型,其训练过程通常需要配置文件来指导网络训练,比如`yolov8n.yaml`这样的配置文件。如果你想要使用自定义的数据集对YOLOv8进行训练,并且没有现成的`yolov8n.yaml`模板,你需要按照以下步骤操作: 1. **准备数据集**: - 将图片和对应的标注信息整理成YOLO所需的标注格式(如`.txt`文件,每个行包含物体框的位置和类别ID)。 - 分割数据集,一般会分为训练集、验证集和测试集。 2. **修改配置文件**: - 如果没有现成的`yolov8n.yaml`,你可以从官方YOLOv8 GitHub仓库(https://github.com/ultralytics/yolov5)找到类似的配置文件作为基础,然后根据实际需求修改关键参数,比如学习率、批量大小、训练轮数等。 - 需要注意更改数据集路径、类别数量以及预处理选项。 3. **运行训练脚本**: - 使用YOLOv8提供的训练命令行工具,比如Python脚本`python train.py`,将配置文件数据集路径作为参数传入。例如: ``` python train.py --cfg yolov8n.yaml --data your_dataset_path --weights '' --epochs 100 ``` - `--weights` 参数留空表示从头开始训练,如果有预训练权重可以填上。 4. **监控训练进度**: 训练过程中要监控损失函数和mAP值,以便调整超参数或者适时停止训练。 5. **验证和评估**: 训练完成后,在验证集上评估模型性能,如果满意则保存权重到新的 `.pt` 文件供后续使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值