基于视频的行为识别常见的数据库有UCF101、HMDB-51、Something-Something V2、AVA v2.2、Kinetic-700等。其中UCF101的标记方式是针对一段视频做一个类别的标记,AVA v2.2的标记共包含五个部分,video_id(视频名称)、middle_Frame_timestam(关键帧位置)、person_box(视频中人物的边界框)、action_id(动作类别)、person_id(bbox中人物编号)。UCF101是分类的任务,而AVA v2.2针对的是检测的任务,更多对AVA v2.2数据集的详细解析可以点击这里。
本文选用的行为识别数据集为UFC101。
UCF数据集包含两个压缩文件,UCF101.rar和UCF101TrainTestSplits-RecognitionTask.zip,前者将不同类别的视频存放于不同的文件夹下,后者存放UCF101数据集的3种训练集与测试集划分方式以及标签文件。其中testlist01.txt和trainlist01.txt对应第一种划分方式。
`-- ucfTrainTestlist
|-- classInd.txt
|-- testlist01.txt
|-- testlist02.txt
|-- testlist03.txt
|-- trainlist01.txt
|-- trainlist02.txt
`-- trainlist03.txt
1 directory, 7 files
目的:将UCF101划分为以下存储结构方式(使用trainlist01.txt和testlist01.txt进行划分)
.
`-- dataset
|-- test
| |-- class1
| | |-- 01.mp4
| | |-- 02.mp4
| | |-- 03.mp4
| | `-- 04.mp4
| |-- class2
| | |-- 01.mp4
| | |-- 02.mp4
| | |-- 03.mp4
| | `-- 04.mp4
| |-- class3
| | |-- 01.mp4
| | |-- 02.mp4
| | |-- 03.mp4
| | `-- 04.mp4
| `-- class4
| |-- 01.mp4
| |-- 02.mp4
| |-- 03.mp4
| `-- 04.mp4
`-- train
|-- class1
| |-- 01.mp4
| |-- 02.mp4
| |-- 03.mp4
| `-- 04.mp4
|-- class2
| |-- 01.mp4
| |-- 02.mp4
| |-- 03.mp4
| `-- 04.mp4
|-- class3
| |-- 01.mp4
| |-- 02.mp4
| |-- 03.mp4
| `-- 04.mp4
`-- class4
|-- 01.mp4
|-- 02.mp4
|-- 03.mp4
`-- 04.mp4
使用到的工具为shutil,环境为python,工具pip安装命令为
pip install pytest-shutil
python程序如下,程序的设计思想是先将testlist01中的文件移到“dataset/test/”路径下,再将剩下的文件夹重命名为“train”后移到dataset目录下
import shutil
import os
test_src_path = "T:/Dataset/UCF101/UCF-101/"
test_dest_path = "T:/Dataset/UCF101/dataset/test/"
train_src_path = "T:Dataset/UCF101/UCF-101/"
train_src_path_rename = "T:/Dataset/UCF101/train"
train_dest_path = "T:/Dataset/UCF101/dataset/"
# move testlist
with open("./UCF101TrainTestSplits/testlist01.txt", encoding='utf-8') as f:
test_video_paths = f.readlines()
test_video_paths = [c.strip() for c in test_video_paths] # 去掉换行符
for test_video_path in test_video_paths:
if not os.path.exists(os.path.join(test_dest_path, test_video_path[:-4])):
os.makedirs(os.path.join(test_dest_path, test_video_path[:-4]))
os.rmdir(os.path.join(test_dest_path, test_video_path[:-4]))
shutil.move(os.path.join(test_src_path, test_video_path), os.path.join(test_dest_path, test_video_path))
# move trainlist
os.rename(train_src_path, train_src_path_rename)
shutil.move(train_src_path_rename, train_dest_path)
工具:ffmpeg
ffmpeg下载地址:https://ffmpeg.org/download.html
压缩ffmpeg-release-essentials.zip
到指定目录,进入bin
目录,里面有三个文件
ffmpeg.exe
ffplay.exe
ffprobe.exe
将这三个文件的路径放到conda创建的python环境中,和pythonw.exe在同一个路径,然后打开控制台激活这个python环境,输入ffmpeg -h命令查看帮助
脚本(extract_frames.sh):
IN_DATA_DIR="./dataset"
OUT_DATA_DIR="./UCF101_frames"
if [[ ! -d "${OUT_DATA_DIR}" ]]; then
echo "${OUT_DATA_DIR} doesn't exist. Creating it.";
mkdir -p ${OUT_DATA_DIR}
fi
for dir1 in $(ls -A1 -U ${IN_DATA_DIR})
do
for dir2 in $(ls -A1 -U ${IN_DATA_DIR}/${dir1})
do
for video in $(ls -A1 -U ${IN_DATA_DIR}/${dir1}/${dir2})
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}/${dir1}/${dir2}/${video_name}/
mkdir -p "${out_video_dir}"
out_name="${out_video_dir}/${video_name}_%06d.jpg"
ffmpeg -i "${IN_DATA_DIR}/${dir1}/${dir2}/${video}" "${out_name}"
done
done
done
将脚本放在dataset同一级目录下,然后在安装有ffmpeg的conda环境下bash执行
./extract_frames.sh