0%

AI换脸项目 - faceswap 基于Centos7 的部署、配置、训练、替换教程




AI换脸项目 - faceswap 基于Centos7 的部署、配置、训练、替换教程(原创)




知识拓展:

环境说明:

  • 系统:Centos7.9
  • Intel(R) Xeon(R) CPU E5-2678 v3
  • 2部署方式:CPU
  • 指令集强制要求(CPU方式安装):AVX
  • 软件:FFmpeg
  • python版本:3.10(强制要求,非3.10,很多环境不支持)



1、编译安装 python 3.10 环境:

cd /root

#只是将python3.11的安装包下载到 /root目录下
wget https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz

#下载最新的软件安装包
tar -xzf Python-3.10.9.tgz

#解压缩安装包
yum -y install gcc zlib zlib-devel libffi libffi-devel

#安装源码编译需要的编译环境
yum install readline-devel

#可以解决后期出现的方向键、删除键乱码问题,这里提前避免。
yum install openssl-devel openssl11 openssl11-devel

#安装openssl11,后期的pip3安装网络相关模块需要用到ssl模块。
export CFLAGS=$(pkg-config --cflags openssl11)
export LDFLAGS=$(pkg-config --libs openssl11)

#设置编译FLAG,以便使用最新的openssl库
cd /root/Python-3.10.9

#进入刚解压缩的目录
./configure --prefix=/usr/python --with-ssl

#指定python3的安装目录为 /usr/python 并使用ssl模块,指定目录好处是
#后期删除此文件夹就可以完全删除软件了。
make
make install

#就是源码编译并安装了,时间会持续几分钟。
# 如果下面命令执行,提示已经存在/usr/bin/python3 和 /usr/bin/pip3, 可以删除。建议删除,后续会方便很多,也可以不删除,后续执行python3.10也可
# 删除命令:rm -rf /usr/bin/python3 /usr/bin/pip3 # 然后在执行下面的命令
ln -s /usr/python/bin/python3 /usr/bin/python3
ln -s /usr/python/bin/pip3 /usr/bin/pip3
#指定链接,此后我们系统的任何地方输入python3就是我们安装的



2、yum 安装 ffmpeg 环境:

  • yum官方不支持ffmpeg,所以我们需要添加第三方源
# 安装epel-release,因为安装需要使用其他的repo源,所以需要epel支持:
yum install -y epel-release rpm

# 安装Nux-Dextop源:
rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
yum repolist

# 开始安装
yum install -y ffmpeg
  • ffmpeg 相关常用命令:
# 从视频input.mp4中,裁剪出从1分30秒开始的一分钟视频
ffmpeg -ss 0:1:30 -t 0:1:0 -i input.mp4 -vcodec copy -acodec copy out.mp4

# 视频转图片,-r:每秒钟提取的帧数,默认为30
ffmpeg -i input.mp4 -r 10 output/video_%d.jpg

# 图片转视频,-b:v:控制视频码率,默认为200,所以合成的视频像素很低
ffmpeg -i input/video_%04d.jpg -b:v 5626k out.mp4

# 视频合成,分为两步,先把每个视频转成ts流,再合成一个视频
ffmpeg -i input1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb input1.ts
ffmpeg -i input2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb input2.ts
ffmpeg -i "concat:input1.ts|input2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc concat.mp4



3、部署安装 faceswap, 基于 Centos7:

# 进入root 根目录,创建一个 ai 文件夹 用来存放所有的ai文件
cd /root
mkdir ai

# 进入 ai 文件夹
cd /root/ai

# 开始 clone 项目到本地
git clone --depth 1 https://github.com/deepfakes/faceswap.git
cd faceswap

# 安装项目相关依赖 不报错,就说明没问题
python3 install -r ./requirements/requirements_cpu.txt

# 安装完成,执行初始化
cd /root/ai/faceswap
python3 faceswap.py -h

# 此时会跳出让你选择的界面,我们是cpu方式运行,就选择 cpu就好



4、faceswap 项目运行:

  • 后期部署参考:换脸开源项目faceswap在centos的实现-CSDN博客

  • 工作流程(此处要把 gakki 的脸换成 刘亦菲):

    • 1、/root/ai/AiSetFiles/gakki:要被换脸的人原图,即从爬虫爬的图片
    • 2、/root/ai/AiSetFiles/gakki_video:要被换脸的人视频
    • 3、/root/ai/AiSetFiles/gakki_ready:要被换脸的人,原始图片/视频进行脸部特征抽取后,放置的文件夹
    • 4、/root/ai/AiSetFiles/lyf:要换成谁的脸的人原图,即从爬虫爬的图片
    • 5、/root/ai/AiSetFiles/lyf_video:要换成谁的脸 的人视频
    • 6、/root/ai/AiSetFiles/lyf_ready:要换成谁的脸的人,原始图片/视频进行脸部特征抽取后,放置的文件夹
    • 7、/root/ai/AiSetFiles/gakki_lyf_model:放置训练的模型文件
    • 8、/root/ai/AiSetFiles/convert:放置模型跑出来的最终结果,即已经换脸后的文件
  • 1、抽取脸部特征:

    # 抽取图片的脸部特征,传入的是文件夹,会保留原本的格式,即jpg文件抽取后的图片依然是jpg
    python faceswap.py extract -i /root/ai/AiSetFiles/gakki -o /root/ai/AiSetFiles/gakki_ready
    python faceswap.py extract -i /root/ai/AiSetFiles/lyf -o /root/ai/AiSetFiles/lyf_ready
    # 抽取视频里每帧图片的脸部特征,传入的是视频文件,默认保存为png格式
    python faceswap.py extract -i /root/ai/AiSetFiles/gakki_video/gakki.mp4 -o /root/ai/AiSetFiles/gakki_ready
    python faceswap.py extract -i /root/ai/AiSetFiles/lyf_video/lyf.mp4 -o /root/ai/AiSetFiles/lyf_ready

    # 若是从网上下了多个短视频,可以使用上面的ffmpeg命令进行视频合并

    # 若传入的是视频,则提取面部特征后的图片数量一般会比较巨大,若是想自己控制输出图片的数量,可以使用ffmpeg将视频切成图片,然后当作图片进行处理。不过我的ffmpeg无法操作png格式,只能转成jpg格式,会导致丢失很多信息。png格式的文件一般要比jpg格式文件大得多,模型的效果也要好些
  • 2、人工筛选:

    • 图片进行面部特征抽取后,会变成下面这种大头照。
    • 这时候就需要进行人工筛选了,这一步是最耗时的,因为最后入模型的就是这些图片,因此需要仔细的筛选。

面部特征抽取后.png

  • 3、训练模型:

    • 这里有个点要额外注意一下,我在使用nohup进行后台运行的时候,程序直接崩了,我也没搞清楚是什么问题,如果出现了这种情况,建议使用jupyter-lab --port 9999 --allow-root开启jupyter,然后在本地windows浏览器打开jupyter的终端,然后在这里进行模型训练。就不用担心关电脑后程序自动终止。
    • 模型训练没什么说的,这里的模型是手动停止的,自己觉得模型不再收敛,时间有差不多的时候,直接在命令行 敲回车 就可以直接停止了
    # python3 faceswap.py train -A <要被换掉人的脸的抽取面部特征的文件夹> -B <想要替换成谁的脸的面部特征文件夹> -m <训练后的model存放文件夹>
    python3 faceswap.py train -A /root/ai/AiSetFiles/gakki_ready -B /root/ai/AiSetFiles/lyf_ready -m /root/ai/AiSetFiles/gakki_lyf_model/
  • 4、调用模型进行换脸:

    • 对图片进行换脸:
    # python faceswap.py convert -i <输入文件夹> -o <输出文件夹> -m <模型文件夹>
    python faceswap.py convert -i /root/ai/AiSetFiles/gakki -o /root/ai/AiSetFiles/convert -m /root/ai/AiSetFiles/gakki_lyf_model/
    • 对视频进行换脸:

      • 如果想对视频进行换脸,必须调用ffmpeg把视频切成图片,然后再调用上面的命令,最后再自己把图片拼成视频。涉及的ffmpeg命令都在上面。
      • 换脸后生成的文件是png格式,如果ffmpeg操作不了png格式图片,就需要先转成jpg
    from PIL import Image
    img = Image.open('lyf_1.png')
    img.save('lyf_1.jpg')

    # 直接将png格式读进去,然后保存为jpg即可,再配合os模块即可批量转换

5、补充:

  • 使用频繁的linux命令:

    # 查看当前文件下的文件数量(仅文件)
    ls -l | grep "^-" | wc -l
    # 解压zip文件,可能会把一大堆文件直接解压在当前文件夹,建议在一个空文件夹内解压zip文件
    unzip lyf.zip
    # 压缩文件夹lyf内的所有文件
    tar -zcvf lyf.tar.gz ./lyf
    # 查看当前目录下所有的文件大小
    du -sh *