如题目所示,直接上代码
NOTE:代码中的路径注意更换
python
import os
import glob
import time
import shutil
import subprocess
import concurrent.futures
from joblib import Parallel, delayed
from tqdm import tqdm
#------------------------------------------#
# 对单个视频文件进行处理
# 适配于Ubuntu-20.04操作系统
#------------------------------------------#
def process_one_video(video_file, in_dir, out_dir, img_size=112):
file_name = os.path.splitext(os.path.basename(video_file))[0]
out_dir = os.path.join(out_dir, file_name)
if os.path.exists(out_dir):
print(f'Note: "{out_dir}" already exist!')
return video_file
else:
os.makedirs(out_dir)
cmd = f'/home/data/openface/OpenFace/build/bin/FeatureExtraction -f "{video_file}" -out_dir "{out_dir}" -simalign -simsize {img_size} -format_aligned jpg -nomask'
subprocess.call(cmd, shell=True)
return video_file
#----------------------------------------#
# 基于上面的process_one_video函数构建主函数
# 默认使用多进程进行处理
#----------------------------------------#
def main(video_dir, out_dir, multi_process=True, video_template_path='*.mp4', img_size=112):
#---------------------------------#
# 根据视频的类型不同 需要更换后缀名
#---------------------------------#
video_files = glob.glob(os.path.join(video_dir, video_template_path)) # with emo dir
n_files = len(video_files)
print(f'Total videos: {n_files}.')
if not os.path.exists(out_dir):
os.makedirs(out_dir)
start_time = time.time()
#-------------------------#
# 多进程处理
# 我们默认进行多线程处理
#-------------------------#
if multi_process:
Parallel(n_jobs=256)(delayed(process_one_video)(video_file, video_dir, out_dir, img_size) for video_file in tqdm(video_files))
else:
for i, video_file in enumerate(video_files, 1):
print(f'Processing "{os.path.basename(video_file)}"...')
process_one_video(video_file, video_dir, out_dir, img_size)
print(f'"{os.path.basename(video_file)}" done, rate of progress: {100.0 * i / n_files:3.0f}% ({i}/{n_files})')
end_time = time.time()
print('Time used for video face extraction: {:.1f} s'.format(end_time - start_time))
#------------------------#
# 对目录的文件结构进行复制
#------------------------#
def copy_one_video(src_dir, tgt_dir):
shutil.copytree(src_dir, tgt_dir)
print(f'Copy "{src_dir}" to "{tgt_dir}"')
if __name__ == '__main__':
#--------------------------------#
# 确定数据集根目录与视频地址
#--------------------------------#
video_dir = '/home/data/labeled/data/clips'
img_size = 256
#-----------------------------#
# 确定视频模板与输出文件夹地址
#-----------------------------#
file_ext = 'mp4'
video_template_path = f'*.{file_ext}'
out_dir = "/home/data/labeled/data/openface"
#----------------------------------#
# 1. 使用openface进行人脸的抽取
#----------------------------------#
main(video_dir, out_dir, video_template_path=video_template_path, multi_process=False, img_size=img_size)
#------------------------------#
# 2. 重新组织已提取人脸的文件夹
# P.S. 最后输出为face_aligned
#------------------------------#
src_root = out_dir
tgt_root = out_dir.replace('openface', 'face_aligned')
count = 0
src_dirs, tgt_dirs = [], []
for sample_dir in os.scandir(src_root):
sample_name = sample_dir.name
tgt_dir = os.path.join(tgt_root, sample_name) # organize videos in the original way
src_dir = os.path.join(sample_dir, f'{sample_name}_aligned')
src_dirs.append(src_dir)
tgt_dirs.append(tgt_dir)
count += 1
print(f'Total videos: {count}.')
Parallel(n_jobs=64)(delayed(copy_one_video)(src_dir, tgt_dir) for src_dir, tgt_dir in tqdm(zip(src_dirs, tgt_dirs)))
openface的安装可以参考我的另外一篇blog:
https://blog.csdn.net/m0_47623548/article/details/138171121?spm=1001.2014.3001.5501