人工智能视频换脸初级教程

一些说明

FBI WARING at 2019.02.06

原文章写于 2018.02.20,将近于 1 年前,根据科技圈的进化规律,本文早已落伍。而且本文的本质是基于一款软件(fakeapp)写的教程,如果无法获取软件(因为官网早就挂了),那本文已无任何意义。不死心的可以试下磁力链接,在能下载到 fakeapp 的前提下,再阅读本文。本文的 fakeapp 是 2.0 的版本,其他版本自求多福。

环境配置,FakeApp (Windows 专用)

官网下载或使用磁力链接 (官网已挂,磁力自求多福),magnet:?xt=urn:btih:598F5888522C860D48629EB8EC267496B4322E70

GPU 加速 (强烈建议)

N 卡建议 GTX1060 起,显存 2G 以上
无 N 卡,可以使用 CPU, but very low
如果有 N 卡,建议使用 GPU 计算,需要先安装 Nvidia CUDA , 建议安装 8.0 版本,下载地址

VC 库 (可选)

附赠品,如果操作过程中报错了,可以选择安装 VC 库,下载地址

原理简介

如何把 A 视频的脸,替换进 B 视频?主要分以下几步:

1. 收集 A,B 的脸

因为是视频,所以要用一些特殊的技巧,把一个视频,转换成一张张图片,比如 10s 的视频,可能会有上百张图片,然后在上百张图片里,找出带有人脸的,最终都截取成相同大小的,比如 256*256 的脸图片

2. 训练模型,A->B

有了 A 的 256*256 脸,和 B 的 256*256 脸,通过一些特殊的技巧,能找到两张脸之间联系,图片数越多,联系也就越紧,找到关系后,保存成 模型。这个模型的作用就是,给一张 A 的脸,输入进模型,模型会给出 B 的脸

3. 换脸

随便找一个 A 的视频,依旧是转换成一张张图片,依旧要找出带有人脸的图片。把这一张张图片,丢进第 2 步得到的模型,就能得出一张张替换成 B 脸的图片。最后把所有的图片,再合并成视频,换脸完成

FakeApp 使用

分三步,分别对应上面的三部曲

1.GetDataSet

就一个参数,输入视频的路径。这里其实是要依次执行 2 个视频,一个 A 视频,一个 B 视频,比如 C:\video\a.mp4
执行完毕后,会在 c:\video 目录下,生成 dataset-a 目录
dataset-a 目录,就是一张张图片 ,dataset-a 里面,还有个 extracted 目录
extracted 目录,就是只保留人脸的图片,当然可能会有误差,因为是程序自动切的
注意:要浏览 extracted 目录,只保留 256*256 的人脸图片,其他都删掉
最终完成后,会有 dataset-a,dataset-b 两个目录,里面分别有 extracted 目录

第一步主要是从视频里取得人脸的样本集。 程序可能会报 Failed to execute script align_faces,这种情况可以尝试安装 VC 库,或者从其他途径获得人脸样本集,只要保证 2 张人脸的图片,大小一致

2.Train

有三个参数:

  1. model 可以在 c:\video 下,新建个目录叫 model,就是空的。那这个参数下就输入 c:\video\model,用来保存模型的结果
  2. Data A, 对应了截取后的人脸目录,也就是 c:\video\dataset-a\extracted
  3. Data B,同上,换上 b 的
    三个目录输入完后,点击 Train,开始漫长的等待,会有结果显示, Loss A,Loss B,一般小于 0.02,即可认为 OK,自主停掉程序

3.Created

还是三个参数:

  1. model,同上,输入跑完的模型目录,依然是 c:\video\model
  2. 输入要换脸的视频,可以拿 a 视频做测试 c:\video\a.mp4
  3. fps,30 or 24 ,没啥追求的就 24 吧
    跑完之后,就得到了换脸后的视频

总结

  1. 有个好显卡
  2. 两个视频的人物表情,角度尽量相似

相关开源项目