Skip to content

FaceSwap进行视频AI换脸

引言

官网: https://faceswap.dev/

Faceswap is the leading free and Open Source multi-platform Deepfakes software.

源码: https://github.com/deepfakes/faceswap

FaceSwap is a tool that utilizes deep learning to recognize and swap faces in pictures and videos.

FaceSwap是目前GitHub上开源的使用比较多的AI换脸工具,要求NVIDIA显卡CUDA计算能力在3.5以上;目前手里的RTX3080计算能力是8.6。

下载安装包

$ wget https://github.com/deepfakes/faceswap/releases/download/v2.0.0/faceswap_setup_x64.exe

这个安装程序可以包办一切,如果安装失败则多尝试几次,可能是网络不顺畅导致的。

但也可以手动分步骤安装:

  • 安装Git
  • 安装Miniconda3
  • 创建Python3.10.6虚拟环境
  • 安装faceswap源码并安装
$ git clone https://github.com/deepfakes/faceswap.git
$ cd faceswap/

$ conda activate faceswap

$ pip3 install -r requirements/requirements_cpu.txt 
$ pip3 install -r requirements/requirements_amd.txt 
$ pip3 install -r requirements/requirements_nvidia.txt 

$ python faceswap.py -h
$ python faceswap.py gui # GUI方式

使用方法

它工作大致分为四个步骤:

  • 收集素材:包括图片和视频
  • 提取(Extraction):对素材进行人脸提取作为训练集
  • 训练(Training):根据提取的人脸进行训练
  • 转换(Convert):根据训练模型结果完成替换

可以通过命令行操作,也可以通过GUI操作,建议使用GUI。

提取(Extract)

准备几个目录:

  • src/video1.mp4: 用于被换脸的原始视频
  • src-extract/: 提取的原始人脸图片文件
  • dst/video2.mp4:用于换脸的替换视频
  • dst-extract/: 用于替换人脸的替换图片文件
  • model/: 训练模型保存目录
  • result/: 转换结果保存目录
$ python faceswap.py extract -i ./src/video1.mp4 -o ./src-extract
$ python faceswap.py extract -i ./dst/video1.mp4 -o ./dst-extract

提取后的结果,不但会有大量根据每帧导出的人脸图片文件,还会有一个.fsa对齐文件,这个对齐文件记录了每个人脸信息在原始视频中的帧对应位置信息。

但刚才只是初步提取人脸,还需要人工参与进来进行微调,比如原始视频里面出现多个人脸,但我们只想替换某个人,那么:

  • 在GUI中的【Tools】选择【Sort】对人脸进行排序,因为图片文件可能很多,排序后删除不需要的人脸图片文件,保留在1000~10000个图片文件比较好
  • 在GUI中的【Tool】选择【Alignment】根据清理后的人脸图片文件来自动清理对齐文件,因为我们最终转换的时候是通过对齐文件对原始视频转换的

这样处理后,我们的人脸图片文件目录和对齐文件里面都应该是我们确实准备用来训练进行替换的信息了,但如果想要更好的替换效果,还需要人工介入:

  • 在GUI中【Tools】选择【Manual】根据原始视频和对齐文件,挨帧进行脸部信息微调,对某些自动人脸识别不到位的地方调整,保存对齐文件
  • 在删除之前生成的提取人脸图片文件,重新根据对齐文件再次提取出人脸图片文件,这就是最终的训练集图片文件了

对原始视频、目标替换视频两个都做同样的操作,目的是拿到我们满意的人脸图片文件,用于训练。

训练(Train)

$ python faceswap.py train -A ./src-extract -B ./dst-extract -m ./model/ 

这个过程可能会很久,在GUI中可以通过预览图片看到替换后的效果进行评估,当训练到缺失值(Loss)小于0.02时,效果已经比较好了,可以随时停止和再次启动训练,这个过程是可以反复进行的。

转换(Convert)

$ python faceswap.py convert -i ./src/video1.mp4 -m ./model/ -o ./converted/ 

因为默认原始视频的对齐文件和它在同一个目录下,它会自动寻找这个对齐文件,然后根据训练的模型结果对原始视频进行替换,得到转换后的视频。

  • 视频转为图片与合成(ffmpeg):
$ python tools.py effmpeg -h
$ ffmpeg -i src/video.mp4 src-extract/video-frame-%d.png 
$ ffmpeg -i video-frame-%0d.png -c:v libx264 -vf "fps=25,format=yuv420p" src.mp4

在GUI中进行转换的时候选择effmpeg就自动完成视频的合成。

总结

  • 原始视频和替换视频的选择很重要,要有不同角度、光线下的人脸信息,建议1000~10000张图片
  • 提取人脸图片文件后,多花时间在对齐文件的调整上,因为后期一旦改变就导致重新训练,很费时间
  • 人脸图片训练集确定后,开始训练,训练到缺失值0.02以下就可以转换视频了
  • 如果视频不满意,则继续启动训练和转换,直到满意为止
  • 如果训练集素材找的不好,即使一直训练到100万次迭代,结果也一样不会很理想