创建ava数据集为slowfast训练自己的数据集做准备

1  数据集视频准备

  先准备大于30s的视频。

2 视频抽帧

目的:

(1)1秒抽1帧图片,目的是用来标注,ava数据集就是1秒1帧

(2)1秒抽30帧图片,目的是用来训练,据说因为slowfast在slow通道里1秒会采集到15帧,在fast通道里1秒会采集到2帧。

目录结构如下:

videos_cut:存放的是切割后的30s长度的视频文件

rawframes:存放的是1秒抽30帧图片

labelframes:存入的是1秒抽1帧图片

文件夹videos中存入数据集原视频文件

1 )首先将视频切割为长度为30s的视频,文件名为:cut_videos.sh ,代码如下:

 
IN_DATA_DIR="./ava/videos"
OUT_DATA_DIR="./ava/videos_cut"
if [[ ! -d "${OUT_DATA_DIR}" ]]; then
  echo "${OUT_DATA_DIR} doesn't exist. Creating it.";
  mkdir -p ${OUT_DATA_DIR}
fi
for video in $(ls -A1 -U ${IN_DATA_DIR}/*)
do
  out_name="${OUT_DATA_DIR}/${video##*/}"
  if [ ! -f "${out_name}" ]; then
    ffmpeg -ss 0 -t 30 -i "${video}" -r 30 -strict experimental "${out_name}"
  fi
done

2)然后抽帧,文件名:extract_rgb_frames_ffmpeg.sh,代码如下 :

IN_DATA_DIR="./ava/videos_cut"
OUT_DATA_DIR="./ava/rawframes"
 
if [[ ! -d "${OUT_DATA_DIR}" ]]; then
  echo "${OUT_DATA_DIR} doesn't exist. Creating it.";
  mkdir -p ${OUT_DATA_DIR}
fi
 
for video in $(ls -A1 -U ${IN_DATA_DIR}/*)
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}/${video_name}
  mkdir -p "${out_video_dir}"
 
  out_name="${out_video_dir}/img_%05d.jpg"
 
  ffmpeg -i "${video}" -r 30 -q:v 1 "${out_name}"
done

文件:video2img.py ,代码如下:

import os
import shutil
from tqdm import tqdm
start = 0  #############
seconds = 30  ##############
 
video_path = './ava/videos'
labelframes_path = './ava/labelframes'
rawframes_path = './ava/rawframes'
cut_videos_sh_path = './cut_videos.sh'
 
if os.path.exists(labelframes_path):
    shutil.rmtree(labelframes_path)
if os.path.exists(rawframes_path):
    shutil.rmtree(rawframes_path)
 
fps = 30
raw_frames = seconds*fps
 
with open(cut_videos_sh_path, 'r') as f:
    sh = f.read()
sh = sh.replace(sh[sh.find('    ffmpeg'):], f'    ffmpeg -ss {start} -t {seconds} -i "${
  
  {video}}" -r 30 -strict experimental "${
  
  {out_name}}"\n  fi\ndone\n')
with open(cut_videos_sh_path, 'w') as f:
    f.write(sh)
# 902打到1798
os.system('bash cut_videos.sh')
os.system('bash extract_rgb_frames_ffmpeg.sh')
os.makedirs(labelframes_path, exist_ok=True)
video_ids = [video_id[:-4] for video_id in os.listdir(video_path)]

for video_id in tqdm(video_ids):#
    for img_id in range(2*fps+1, (seconds-2)*30, fps):
        shutil.copyfile(os.path.join(rawframes_path, video_id, 'img_'+format(img_id, '05d')+'.jpg'),
                        os.path.join(labelframes_path, video_id+'_'+format(start+img_id//30, '05d')+'.jpg'))#

3)进入 home路径,在命令行输入:python video2img.py,会自动进行视频切割和抽帧,但是我的1秒1帧没有抽成功,我自己又通过文件 cut_to_frames.sh 进行单独抽帧。 cut_to_frames.sh代码如下:

#切割图片,每秒抽1帧
IN_DATA_DIR="./ava/videos_cut"
OUT_DATA_DIR="./ava/labelframes"

if [
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值