基于Openface在ubuntu上抽取人脸图像

如题目所示,直接上代码

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

相关推荐
wdxylb5 小时前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞翔的佩奇6 小时前
【完整源码+数据集+部署教程】表盘指针检测系统源码和数据集:改进yolo11-CA-HSFPN
python·yolo·计算机视觉·数据集·yolo11·表盘指针检测
飞雪20076 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪7 小时前
关于Linux内核中头文件问题相关总结
linux
Coovally AI模型快速验证8 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
Lovyk9 小时前
Linux 正则表达式
linux·运维
RaymondZhao349 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
Fireworkitte10 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
飞翔的佩奇10 小时前
【完整源码+数据集+部署教程】二维码与查找模式检测系统源码和数据集:改进yolo11-CSwinTransformer
python·yolo·计算机视觉·数据集·yolo11·二维码与查找模式检测
无规则ai10 小时前
动手学深度学习(pytorch版):第四章节—多层感知机(5)权重衰减
人工智能·pytorch·python·深度学习