前言
上次更新了SlowFast,虽然没得好多人看,但是还是想把他更新完,为什么呢,其实我开始拿到SlowFast这个facebook写得项目的时候,很头疼。中国这边介绍slowfast的少之又少,搜来搜去的没有一点结果,那我就抛开了那些,认认真真的去读官方的手册和翻墙去和外面的人讨论,最后也确实帮我提升了不少,相信用slowfast跑项目的我们这边的人,我们确实是一种缘分。也希望,这种比较好的项目能在我们中国也能讨论起来,借鉴学习一下。
回顾
上一次写的文章告诉大家要从我们上次项目结构中的1、2、4、8、9来进行改动和阅读。今天让超厂长带你一起来把这个项目运行起来。
第一步:看看facebook给出的demo文件
首先通俗的说,SlowFast是怎么识别视频的,为什么他知道视频中某个人物是在干什么,首先slowfast是用人工把很多很多的视频进行标注,通俗的说,就是比如1分30秒到1分34秒,某个人在干什么。比如A人物在那个时候是站着说话。那就有两个关键词语“站”和“说”这个两个动作,然后就是以这样的形式,标注了300左右的视频。每个视频15分钟。这消耗的人工是很大的。其实很多神经网络本身是不难的,但是进行数据的处理,是需要花费很长时间的。差不多占所有的90%的时间。通俗的说,你想做人物识别,手势识别,语音识别,90%的时候都是人工在标注一些文本数据。那这个文本数据拿来干嘛。这些标注好的数据,我们就进行训练。训练后得到训练集。
那我们在回到上面的照片,我们demo下面有三个“文件夹”,文件夹分别是AVA、Kinetics和visualization这个三个文件夹。我们注重看AVA和Kinetics。因为visualization这个文件夹主要是介绍可视化的一些东西。那其他两个文件是什么呢,两个不同的数据集提供的公司,分别是AVA和Kinetics,我们不需要理解,他们是干嘛的,我们就用知道,可以用AVA的数据集也可以用Kinetics的数据集,只是Kinetics数据集你需要翻盘去。所以我们就用AVA的数据集。然后我们打开AVA文件。
看到了一个SLOWFAST_32x2_R101_50_50.yaml的文件,这个也是用于驱动SlowFast项目跑起来的核心配置文件。这里面来修改一些命令,比如你是想让SlowFast为你训练,还是用训练好的训练集进行测试,配置训练集在哪个位置的config类的文件。这个文件就是SlowFast告诉你:我们用AVA的训练集跑出来的gif是怎么跑出来的,怎么配置的。我们打开就能看到:
打开就是这样的文件,这个配置config文件是都是最多二级菜单,大致先分为TRAIN、TEST和DEMO这三个。其中的ENABLE就是配置你到底想测试,训练。demo的输入和输出位置这些详细配置。
第二步:打开系统自带的config文件
上面是用于驱动slowfast跑起来的配置文件,slowfast系统中还存在一些固定变量的的config文件。目录在slowfast/config/defaults.py
这个配置文件就是配置一些,比如你训练的数据在哪个目录。用什么进行训练,这些超厂长等惠告诉你怎么修改。
第三步:怎么准备数据
通过阅读slowfast/datasets/DATASET.md这个文件,首先我们知道了第一步就是要下载数据
3.1 下载视频
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
通过这个命令就可以下载视频到你linux系统的data/ava/videos目录下。如果大家是用window跑项目。只需要更改一下wget改为window支持的下载的命令即可,超厂长是用我们公司下面的超算的GPU集群跑的项目。
3.2把下载好的视频剪辑到15分钟
IN_DATA_DIR="../../data/ava/videos"
OUT_DATA_DIR="../../data/ava/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
其实我们通过阅读这个命令知道他要干嘛,就是让我们上一步下载好的视频剪辑到15分钟。
3.3把剪辑好的视频每一帧提取出来,提取成图片
IN_DATA_DIR="../../data/ava/videos_15min"
OUT_DATA_DIR="../../data/ava/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
3.4下载注释文件
DATA_DIR="../../data/ava/annotations"
if [[ ! -d "${DATA_DIR}" ]]; then
echo "${DATA_DIR} doesn't exist. Creating it.";
mkdir -p ${DATA_DIR}
fi
wget https://research.google.com/ava/download/ava_train_v2.1.csv -P ${DATA_DIR}
wget https://research.google.com/ava/download/ava_val_v2.1.csv -P ${DATA_DIR}
wget https://research.google.com/ava/download/ava_action_list_v2.1_for_activitynet_2018.pbtxt -P ${DATA_DIR}
wget https://research.google.com/ava/download/ava_train_excluded_timestamps_v2.1.csv -P ${DATA_DIR}
wget https://research.google.com/ava/download/ava_val_excluded_timestamps_v2.1.csv -P ${DATA_DIR}
这里就是ava数据集需要的一些文件,其实我们也可以从名称就能知道他是干嘛的,比如 ava_train_v2.1.csv这个文件,就是ava公司发布的train训练集的2.1版本。
第四步:怎么配置环境
官方文档就在INSTALL.md就很清楚的介绍,跑slowfast需要的环境
这里其实没什么好说的,就是提醒大家安装pytorch和torchvision版本一定要一致,出问题了直接百度,还有个Detectron2这个库的安装,其实是很麻烦的。而且对window支持不是很好。当然如果大家不懂的可以评论区举手。超厂长会对某个你们都不会安装的库出一个专门的博客,今天我都是默认大家已经会安装环境。而且要问一定要问百度搜不出来的。基本是pip istall和conda install这两种方式去安装,这两个谁不行就换另外一个,而且INSTALL.md这个文件已经很清楚的告诉你怎么去安装,命令都是给你写好了。
第五步:开始跑起来
如果你能轻松来到第五步或者解决了第五步前面所有的问题差不多已经是一周差不多多了,那让我们把slowfast跑起来吧。
其实我们用slowfast来做事无非就两个需求
- 想用自己视频结合slowfast来进行人体的动作识别
- 想用自己的数据来进行训练,对一些特别动作的自学习自识别
其实我们从GETTING_STARTED.md这个文件就可以很清楚,slowfast告诉我们怎么进行训练和测试,以及怎么用自己的视频进行跑。
首先我们我们来到slowfast项目的首目录,这里已linux进行举例
5.1最简单的运行方式
如果你的配置文件也就是上面提到的第一步和第二部的这两个文件都是配好了,那直接用
python tools/run_net.py --cfg demo/AVA/SLOWFAST_32x2_R50_SHORT.yaml
--cfg:指的是你的配置文件的位置,这个文件是第一步讲的文件,上面就是告诉python我自己的config文件在demo/AVA/SLOWFAST_32x2_R50_SHORT.yaml这个文件。
5.2最灵活的运行方式
上面指的是你的config文件配置好了,但是每次你想训练还是想测试,都需要去更改文件,这样很麻烦,slowfast也是可以通过命令还更改的。
python tools/run_net.py --cfg demo/AVA/SLOWFAST_32x2_R50_SHORT.yaml TEST.CHECKPOINT_FILE_PATH /public/jiangc/SLOWFAST_32x2_R101_50_50_v2.1.pkl TEST.ENABLE: False
上面的命令相对于5.1来说,多了TEST.CHECKPOINT_FILE_PATH和TEST.UNABLE这两个,这说明了,很多配置的内容你其实也是可以通过命令来更改的,不用每次更改文件,比如还有输入输出视频的位置等等的配置内容。
总结
slowfast这个项目确实很优秀的,值得人去研究,入门其实门槛是不高的,也很容易让你理解,你其实只要认认真真的读官网使用手册,相信你还是很快的能运行出来的。这里总结一下
- 首先是准备视频准备训练数据。这个是很重要的
- 然后就是配置slowfast运行环境
- 然后就是修改一下slowfast上面所提到的第一步和第二步的配置文件即可。
这里应该最难的也是最麻烦的是第二步,因为slowfast对于库与库之间的版本还是有很有严格的要求的,但是基本是必应这些能搜出来的。好了下面给出我跑slowfast的配置文件
TRAIN:
ENABLE: False
DATASET: ava
BATCH_SIZE: 16
EVAL_PERIOD: 1
CHECKPOINT_PERIOD: 1
AUTO_RESUME: True
CHECKPOINT_FILE_PATH: .SLOWFAST_32x2_R101_50_50_v2.1.pkl #path to pretrain mod
CHECKPOINT_TYPE: caffe2
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:
BGR: False
DETECTION_SCORE_THRESH: 0.8
TEST_PREDICT_BOX_LISTS: ["person_box_67091280_iou90/ava_detection_val_boxes_and_labels.csv"]
SLOWFAST:
ALPHA: 4
BETA_INV: 8
FUSION_CONV_CHANNEL_RATIO: 2
FUSION_KERNEL_SZ: 5
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:
MOMENTUM: 0.9
WEIGHT_DECAY: 1e-7
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
NUM_SHARDS: 1
RNG_SEED: 0
OUTPUT_DIR: .
#TENSORBOARD:
# MODEL_VIS:
# TOPK: 2
DEMO:
ENABLE: True
LABEL_FILE_PATH: "/public/jiangc/newSlowfast/slowfast/demo/AVA/ava.json"
INPUT_VIDEO: "/public/jiangc/newSlowfast/slowfast/slowfast/datasets/data/data/ava/2fwni_Kjf2M_Trim.mp4"
OUTPUT_FILE: "/public/jiangc/newSlowfast/slowfast/slowfast/datasets/data/data/ava/IMG_3886.mp4"
# DISPLAY_WIDTH: 640
# DISPLAY_HEIGHT: 480
# WEBCAM: 0
DETECTRON2_CFG: "COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml"
#DETECTRON2_WEIGHTS: "/public/jiangc/newSlowfast/slowfast/demo/AVA/model_final_280758.pkl"
DETECTRON2_WEIGHTS: "detectron2://COCO-Detection/faster_rcnn_R_50_FPN_3x/137849458/model_final_280758.pkl"
运行命令
python tools/run_net.py --cfg demo/AVA/SLOWFAST_32x2_R50_SHORT.yaml TEST.CHECKPOINT_FILE_PATH /public/jiangc/SLOWFAST_32x2_R101_50_50_v2.1.pkl
还有不懂得可以关注微信公众号:程序员PG
或者加超厂长微信:y958231955