小白的自我救赎
数据说明
两种action recognition数据集:UCF101,Hdmb51,最新的ActivityNet,Kinectics两个数据集下载不下来,我太难了 /(ㄒoㄒ)/~~
Hdmb51数据说明
其他数据集说明
前期准备
由于下载下来的数据集,如UCF101一个文件夹,每个包含101个文件夹,这101个文件夹每个中包含100多个视频文件。目录结构为:
UCF101 -----101doc -----100多个.avi文件
假定存储文件位置为:
"./media/xidian/database/UCF101/"
创建一个UCF101_n_frames空文件夹,用于存放提取的帧图像,
位置为:
"./media/xidian/database/UCF101_n_frames/"
- 打开终端,cd到UCF101目录下,输入:
find . -type d >tmp.txt
- 在UCF101文件夹中会生成一个.txt文件,然后将文件复制到UCF101_n_frames文件夹中
- cd至UCF101_n_frames中,输入:
xargs mkdir -p <tmp.txt
即可使得UCF101_n_frames和UCF101具有相同结构的子文件夹。
参考博客
逐个.avi文件的索引以及帧图像的的保存:
import os
import sys
import subprocess
#%%
def class_process(dir_path, dst_dir_path, class_name):
class_path = os.path.join(dir_path, class_name)
if not os.path.isdir(class_path):
return
dst_class_path = os.path.join(dst_dir_path, class_name)
if not os.path.exists(dst_class_path):
os.mkdir(dst_class_path)
for file_name in os.listdir(class_path):
if '.avi' not in file_name:
continue
name, ext = os.path.splitext(file_name)#提取每个.avi文件的名字部分,以便在.../UCF101_n_frames/XX/创建**.avi文件的名字命名**的文件夹
dst_directory_path = os.path.join(dst_class_path, name)
video_file_path = os.path.join(class_path, file_name)
try:
if os.path.exists(dst_directory_path):
if not os.path.exists(os.path.join(dst_directory_path, 'image_00001.jpg')):
subprocess.call('rm -r \"{}\"'.format(dst_directory_path), shell=True)
print('remove {}'.format(dst_directory_path))
os.mkdir(dst_directory_path)#创建**.avi文件的名字命名**的文件夹
else:
continue
else:
os.mkdir(dst_directory_path)
except:
print(dst_directory_path)
continue
cmd = 'ffmpeg -i \"{}\" -vf scale=-1:240 \"{}/image_%05d.jpg\"'.format(video_file_path, dst_directory_path)#视频的读取与保存
print(cmd)
subprocess.call(cmd, shell=True)
print('\n')
if __name__=="__main__":
dir_path = './media/xidian/database/UCF101/'
dst_dir_path = './media/xidian/database/UCF101_n_frames'
for class_name in os.listdir(dir_path):
class_process(dir_path, dst_dir_path, class_name)#索引.../UCF101/下所有子文件夹
未经允许,禁止转载