1. 熟悉数据框架
我们假设 AVA 数据集放置在 data/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
您可以通过以下步骤或通过创建数据的符号链接 来准备此结构。
2. 下载数据集
cd dataset_tools/ava
./download_videos.sh
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
这些视频文件占用 157 GB 空间。
https://s3.amazonaws.com/ava-dataset/annotations/ava_file_names_trainval_v2.1.txt
https://s3.amazonaws.com/ava-dataset/annotations/ava_file_names_test_v2.1.txt
Download-AVA_Kinetics-and-AVA_Actions
这个库下面也有下载连接。
复制链接使用迅雷下载。下载时,我发现下载的内容有部分缺失,所以写个代码查询哪些视频缺失了。
import os
IN_DATA_DIR = "dataset_prepration/videos"
OUT_DATA_DIR = "dataset_prepration/videos_15min"
if not os.path.isdir(OUT_DATA_DIR):
os.makedirs(OUT_DATA_DIR)
# Read videos from the videos directory and print their names
# for filename in os.listdir(IN_DATA_DIR):
# if filename.endswith(".mp4") or filename.endswith(".mkv"):
# print(filename)
count = 0
for video in os.listdir(IN_DATA_DIR):
count += 1
print(f"There are {count} videos.")
# Compare files in the videos directory with a txt file to find missing ones
txt_file = "dataset_prepration/ava_file_names_trainval_v2.1.txt"
missing_files = []
with open(txt_file, "r") as file:
txt_files = file.read().splitlines() # txt_files是一个list
# print(txt_files)
for filename in txt_files:
if filename not in os.listdir(IN_DATA_DIR):
missing_files.append(str(filename))
output_file = open("missing_files.txt", "w")
# Save missing_files to a txt file
with open("missing_files.txt", "w") as file:
missing_files
for file_name in missing_files:
output_file.write(file_name + "\n")
缺失视频如下,进行下载后上传。原来是后缀为webm的文件无法下载。
上传视频文件到服务器。
验证集同理。
https://s3.amazonaws.com/ava-dataset/annotations/ava_file_names_test_v2.1.txt
3. 将每个视频从第 15 分钟剪切到第 30 分钟
import os
IN_DATA_DIR = "dataset_prepration/cuttest_videos"
OUT_DATA_DIR = "dataset_prepration/cuttest_videos_15min"
if not os.path.isdir(OUT_DATA_DIR):
print(f"{OUT_DATA_DIR} doesn't exist. Creating it.")
os.makedirs(OUT_DATA_DIR)
for video in os.listdir(IN_DATA_DIR):
print(video)
out_name = os.path.join(OUT_DATA_DIR, os.path.basename(video))
if not os.path.isfile(out_name):
os.system(f"ffmpeg -ss 900 -t 901 -i '{IN_DATA_DIR+'/'+video}' '{out_name}'") # 使用ffmpeg命令剪切视频
430个视频要裁剪一上午了。
4. 提取帧
import os
IN_DATA_DIR = "dataset_prepration/videos_15min" # 输入数据目录
OUT_DATA_DIR = "dataset_prepration/frames" # 输出数据目录
if not os.path.isdir(OUT_DATA_DIR):
print(f"{OUT_DATA_DIR} doesn't exist. Creating it.")
os.makedirs(OUT_DATA_DIR)
for video in os.listdir(IN_DATA_DIR):
video_name = os.path.basename(video)
if video_name.endswith(".webm"):
video_name = video_name[:-5]
else:
video_name = video_name[:-4]
out_video_dir = os.path.join(OUT_DATA_DIR, video_name)
os.makedirs(out_video_dir, exist_ok=True)
out_name = os.path.join(out_video_dir, f"{video_name}_%06d.jpg")
ffmpeg_command = f"ffmpeg -i {os.path.join(IN_DATA_DIR, video)} -r 30 -q:v 1 {out_name}"
ret = os.system(ffmpeg_command)
assert ret == 0, f"帧提取失败,退出值为{ret // 256}"
print(f"[成功] ({video})", flush=True)
提取帧的文件保存在 frame文件夹的每个以视频命名的子文件夹下,下面的代码可以查询
- 每个二级子文件夹下有多少张图片,
- 共有多少子文件
- 共有多少图片
import os
# Get the list of subdirectories in the frames folder
subdirectories = [subdir for subdir in os.listdir("dataset_prepration/frames") if os.path.isdir(os.path.join("dataset_prepration/frames", subdir))]
# Iterate over each subdirectory and count the number of images
for subdir in subdirectories:
subdir_path = os.path.join("dataset_prepration/frames", subdir)
num_images = len(os.listdir(subdir_path))
print(f"The subdirectory {subdir} contains {num_images} images.")
num_subdirectories = len(subdirectories)
print(f"The frames folder contains {num_subdirectories} subdirectories.")
num_files = sum([len(files) for _, _, files in os.walk("dataset_prepration/frames")])
print(f"The frames folder contains {num_files} files.")
5. 下载注释
6. 其他
下载“帧列表”(train、val)并将它们放入frame_lists文件夹中(参见上面的结构)。
https://dl.fbaipublicfiles.com/video-long-term-feature-banks/data/ava/frame_lists/train.csv
https://dl.fbaipublicfiles.com/video-long-term-feature-banks/data/ava/frame_lists/val.csv
下载人员框(train、val、test)并将它们放入注释文件夹中(参见上面的结构)。如果您更喜欢使用自己的人员检测器,请参阅 GETTING_STARTED.md 中的详细信息。
https://dl.fbaipublicfiles.com/video-long-term-feature-banks/data/ava/annotations/ava_train_predicted_boxes.csv
https://dl.fbaipublicfiles.com/video-long-term-feature-banks/data/ava/annotations/ava_val_predicted_boxes.csv
https://dl.fbaipublicfiles.com/video-long-term-feature-banks/data/ava/annotations/ava_test_predicted_boxes.csv
新版 V2.2
这里不要使用官网的默认版本,采用最新的2.2版本,官网有一个下载的链接:
https://dl.fbaipublicfiles.com/pyslowfast/annotation/ava/ava_annotations.tar
tar -xvf ava_annotations.tar 解压tar文件
├── ava_annotations
│ ├── ava_action_list_v2.1_for_activitynet_2018.pbtxt
│ ├── ava_action_list_v2.2_for_activitynet_2019.pbtxt
│ ├── ava_action_list_v2.2.pbtxt
│ ├── ava_included_timestamps_v2.2.txt
│ ├── ava_test_excluded_timestamps_v2.1.csv
│ ├── ava_test_excluded_timestamps_v2.2.csv
│ ├── ava_test_v2.2.csv
│ ├── ava_train_excluded_timestamps_v2.1.csv
│ ├── ava_train_excluded_timestamps_v2.2.csv
│ ├── ava_train_v2.1.csv
│ ├── ava_train_v2.2.csv
│ ├── ava_val_excluded_timestamps_v2.1.csv
│ ├── ava_val_excluded_timestamps_v2.2.csv
│ ├── ava_val_v2.1.csv
│ ├── ava_val_v2.2.csv
│ ├── person_box_67091280_iou75
│ │ ├── ava_detection_test_boxes_and_labels.csv
│ │ ├── ava_detection_train_boxes_and_labels_include_negative.csv
│ │ ├── ava_detection_train_boxes_and_labels_include_negative_v2.1.csv
│ │ ├── ava_detection_train_boxes_and_labels_include_negative_v2.2.csv
│ │ ├── ava_detection_val_boxes_and_labels.csv
│ │ ├── ava_detection_val_for_training_boxes_and_labels_include_negative.csv
│ │ └── ava_detection_val_for_training_boxes_and_labels_include_negative_v2.2.csv
│ ├── person_box_67091280_iou90
│ │ ├── ava_action_list_v2.1_for_activitynet_2018.pbtxt
│ │ ├── ava_detection_test_boxes_and_labels.csv
│ │ ├── ava_detection_train_boxes_and_labels_include_negative.csv
│ │ ├── ava_detection_train_boxes_and_labels_include_negative_v2.1.csv
│ │ ├── ava_detection_train_boxes_and_labels_include_negative_v2.2.csv
│ │ ├── ava_detection_val_boxes_and_labels.csv
│ │ ├── ava_detection_val_for_training_boxes_and_labels_include_negative.csv
│ │ ├── ava_detection_val_for_training_boxes_and_labels_include_negative_v2.1.csv
│ │ ├── ava_detection_val_for_training_boxes_and_labels_include_negative_v2.2.csv
│ │ ├── ava_train_predicted_boxes.csv
│ │ ├── ava_train_v2.1.csv
│ │ ├── ava_val_excluded_timestamps_v2.1.csv
│ │ ├── ava_val_predicted_boxes.csv -> ava_detection_val_boxes_and_labels.csv
│ │ ├── ava_val_v2.1.csv
│ │ ├── test.csv
│ │ ├── train.csv
│ │ └── val.csv
│ ├── test.csv
│ ├── train.csv
│ └── val.csv
└── ava_annotations.tar
V2.2比V2.1多了一列?不知道是什么?