2019-08-29 action recognition数据读取帧

小白的自我救赎

数据说明

两种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/"

  1. 打开终端,cd到UCF101目录下,输入:
    find . -type d >tmp.txt
  2. 在UCF101文件夹中会生成一个.txt文件,然后将文件复制到UCF101_n_frames文件夹中
  3. cd至UCF101_n_frames中,输入:
    xargs mkdir -p
    即可使得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/下所有子文件夹

参考代码

未经允许,禁止转载

你可能感兴趣的:(2019-08-29 action recognition数据读取帧)