为了账号安全,请及时绑定邮箱和手机立即绑定

关于 ModelScope 的视频 “AI 换脸” 优化方案

前言

前面一文,初步完成了一下 “AI 换脸” 视频处理程序。完成了视频拆帧,拆帧图片人脸融合,已经音频提取和最后的人脸融合图片的整合(也就是将图片和音频组成视频)。但是在人脸融合部分由于是单线程,处理起来非常耗时,所以这里就对那部分进行优化。

优化前情况

“敏捷开发,快速迭代”,好像这种思维从多年前就埋在了脑子里 (借口)。所以前文算是个初版 demo,并且在环境中运行只是用 cmd 来完成,没有使用专门 Python 的 IDE。也很有可能是这个原因,在执行代码里,只要是关于获取当前目录的地方都不起效果,这是一点另一点就是上面重点要解决的,提升人脸替换的处理速度,这里要用到多线程。

编码

  1. 人脸替换部分

用法就不多讲了,Py 相关的文档有讲,以下只是代码片段,可以用这个替换前面文章代码里的 face_replace 函数。经过测试,相同的张数的图片 (这里只有 403 张),处理时间比前者缩短了半小时。

def face_replace(user_path=""):
    import threading
    from pathlib import Path

    import cv2
    from modelscope.outputs import OutputKeys
    from modelscope.pipelines import pipeline
    from modelscope.utils.constant import Tasks
    import os
    os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'

    max_workers = 2
    semaphore = threading.Semaphore(max_workers)

    def my_function(img_path):

        with semaphore:
            print(f"{img_path}  开始")
            image_face_fusion = pipeline(Tasks.image_face_fusion,
                                         model='damo/cv_unet-image-face-fusion_damo')
            template_path = img_path
            filename = os.path.splitext(os.path.basename(img_path))[0]

            result = image_face_fusion(dict(template=template_path, user=user_path))
            cv2.imwrite(f'video_imgout/{filename}.jpg', result[OutputKeys.OUTPUT_IMG])
            print(f"{filename}.png ok")

    threads = []
    BASE_PATH = os.path.dirname(__file__)
    for dirpath, dirnames, filenames in os.walk(BASE_PATH + "/video_img"):
        for filename in filenames:
            print(filename)
            if filename.endswith('.jpg'):
                file_path = Path(os.path.join(dirpath, filename))
                t = threading.Thread(target=my_function, args=(str(file_path),)).start()
                threads.append(t)

pycharm 部分

由于也有一些没有接触过 python 的小伙伴留言,这里就再介绍一下 IDE 的运行,也为了解决在 cmd 中运行出现获取当前路径问题。前面也有文章介绍关于 Python 虚拟环境的创建,这里就跳过了,直接演示在 IDE 中配置虚拟环境和运行代码。

  1. 查看当前环境下的环境列表。

  1. 打开 IDE 创建项目后进入。

  1. 选择 Project,选择已经创建好的虚拟环境。

  1. 查看当前项目是否在该环境下

  1. 最后就可以直接用于代码了。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消