AVA视频数据集制作

1. 熟悉数据框架

Data Prepration

我们假设 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多了一列?不知道是什么?
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值