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 [


6746

被折叠的 条评论
为什么被折叠?



