faceswap 工程搭建及测试

article/2025/10/7 6:24:04

目录

  • 1. 前言
  • 2. 2种搭建思路
  • 3. 写在前面的坑
    • (1)版本一定要严格遵守要求;
    • (2)下载faceswap的github源码
    • (3)Anacoda也不是万能的
    • (4)tensorflow 与cuda、cudnn、python、keras的版本对应
  • 4. 利用Anacoda搭建虚拟环境
    • 4.1下载并安装Anacoda
    • 4.2 首先安装cuda和cudnn
    • 4.3 安装其他主要依赖库
  • 5. 数据预处理
    • 5.1 3种数据
    • 5.2 数据预处理
  • 6. 脸部提取
  • 7. 训练模型
  • 8. 脸部替换
  • 9. 结果处理

1. 前言

最近比较火的AI换脸,其实都源于2018年github上deepfakes 的faceswap,今天就抽空下载faceswap的代码,在Ubuntu 18.04上搭建一下工程环境。

2. 2种搭建思路

有2种搭建思路,一是直接在本机上安装各种依赖库,另一种是利用Anacoda建立虚拟环境。
由于faceswap的代码较早,依赖库的版本普遍版本号很低,尤其是tensorflow和cuda等环境,在本地用pip等根本无法安装指定版本的,而经过本人2天的测试发现,只要faceswap要求的依赖项版本号稍微差一点,就可能出现各种问题。所以最终,我还是选择了在Ubuntu18.04上利用Anacoda搭建虚拟环境,在虚拟环境种安装。
这样的优点有三: 一是随时可以推翻重来; 二是怎么折腾都不影响本机环境; 三是可以利用conda install 安装一些主要依赖库,可以自动安装其他琐碎的依赖项。

3. 写在前面的坑

(1)版本一定要严格遵守要求;

GPU版faceswap需要的主要依赖库和版本号为:
pathlib1.0.1
scandir
1.6
h5py2.7.1
Keras
2.1.2
opencv-python3.3.0.10
tensorflow-gpu
1.4.0
scikit-image
dlib
face_recognition
tqdm

(2)下载faceswap的github源码

注意一定是官方的源码:
https://github.com/deepfakes/faceswap/tree/20753a64b76a156aea17724348269d60dd525f87

github上有一个国人自己搞的 faceswap-master,一开始我下了这个,结果太多的坑,实在走不下去了,浪费了大半天的时间。

(3)Anacoda也不是万能的

因为一些需要的依赖库版本实在太老了,用 conda install 根本找不到,需要在conda虚拟环境下再用pip安装依赖项。

(4)tensorflow 与cuda、cudnn、python、keras的版本对应

这是一个大坑,一定要实现查对好,否则在调用keras函数时出错、或者无法使用GPU进行计算。具体的对应关系参照下面两张图:

在这里插入图片描述在这里插入图片描述
根据前述内容,faceswap 需要 TensorFlow-GPU=1.4.0,对应keras=2.1.2、Python=3.5、cuda=8.0、cudnn=6.0.

4. 利用Anacoda搭建虚拟环境

参考博文如下:
https://blog.csdn.net/sinat_38816924/article/details/88752817
https://www.jianshu.com/p/7265011ba3f2
https://blog.csdn.net/ytusdc/article/details/99699228
https://blog.csdn.net/ytusdc/article/details/99699228

4.1下载并安装Anacoda

(1)可以去清华源下载:
https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/

(2)使用以下命令安装:

bash ~/Downloads/Anaconda3-*-Linux-x86_64.sh 
# *号对应下载的版本号

(3)环境变量配置
在Anaconda安装过程中会让你选择是否修改环境变量,主要要输入“y”,否则需要手动进行修改,运行以下命令:

export PATH="/home/anaconda3/bin:$PATH"
source ~/.bashrc
# 环境变量有问题时,输入 conda命令会提示你如何手动修改

(4)创建并激活虚拟环境,输入以下命令:

conda create -n faceswap python=3.5
conda activate faceswap
# 激活 faceswap 虚拟环境后,你的命令行前面会多出虚拟环境的名称 (faceswap)

在这里插入图片描述

(5)万一环境搞砸了,直接删除重来,输入以下命令删除faceswap虚拟环境:

conda remove -n faceswap --all
# 如果想卸载Anaconda,直接 sudo rm -rf */anaconda3

4.2 首先安装cuda和cudnn

(1) 首先根据上一步激活 faceswap 的虚拟环境;
(2)安装cuda8.0,输入以下命令:

conda install cudatoolkit=8.0 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64/
# 这里也可以在anaconda安装完成后替换一下源,具体操作见上述参考博文

(3)安装cudnn6.0,输入以下命令:

conda install cudnn=6.0 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64/

(4)注意,装完cuda和cudnn后,在虚拟环境中用常规的方法查到的是本机的版本,比如:

cat /usr/local/cuda/version.txt
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

只要安装过程中不报错就行。

4.3 安装其他主要依赖库

tensorflow、keras、opencv等直接用conda install 会找不到对应的版本,所以这里直接在虚拟环境下使用pip安装,输入以下命令:

pip install pathlib==1.0.1 scandir==1.6 h5py==2.7.1 Keras==2.1.2 opencv-python==3.3.0.10 tensorflow-gpu==1.4.0 scikit-image dlib face_recognition tqdm
# 如果失败了一般是网不好,可以加个源 -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 或者可以增加等待时间 --timeout=1000

5. 数据预处理

5.1 3种数据

假设我们要用B替换A,那么我们需要3种数据:
(1)B的训练数据:最好只有B一个人的、各个角度和衣服的图片或视频;
(2)A的训练数据:最好只有A一个人的、各个角度和衣服的图片或视频;
(3)想要替换的、原始的、有B的图片或视频。
注意faceswap原版是不支持视频的,我自己写了2个程序分别将视频转成帧图片和将帧图片合并成视频。

5.2 数据预处理

(1)在faceswap 源码的工程根目录下新建文件夹data,并根据使用次数建立相应的额test文件夹,代码如下:

cd data
mkdir test*
d test*
mkdir srcvideo srcpic srcface targetvideo targetpic targetface inputvideo inputpic outpic
# * 代表了次数,比如今天使用是test1

(2)拷贝数据
拷贝A的训练视频到 ‘/home/wz/Documents/faceswap-master/data/test*/srcvideo/’ 路径;
拷贝B的训练数据到 ‘/home/wz/Documents/faceswap-master/data/test*/targetvideo/’ 路径;
拷贝需要被替换的、含有A的视频到 ‘/home/wz/Documents/faceswap-master/data/test*/inputvideo/’ 路径。

(3)修改video2pic.py中的’videopath’ 和 ‘picpath’,分别修改运行3次,以便将B的训练视频、A的训练视频和需要被替换的视频转成图片。代码如下:

# video2pic.py
import cv2
import os
def save_img():video_path = '/home/wz/Documents/faceswap/data/test1/inputvideo/'pic_path = '/home/wz/Documents/faceswap/data/test1/inputpic/'videos = os.listdir(video_path)count = 0for video_name in videos:file_name = video_name.split('.')[0]#folder_name = video_path + file_name#os.makedirs(folder_name,exist_ok=True)vc = cv2.VideoCapture(video_path+video_name) #读入视频文件c=0rval=vc.isOpened()while rval:   #循环读取视频帧c = c + 1rval, frame = vc.read()#pic_path = folder_name+'/'if rval:# 通过修改 c%* == 0,来选择跳几帧图像if c%1==0:#height, width = frame.shape[:2] #frame = cv2.resize(frame,(512,int(height*(512/width))))print(pic_path + file_name+ '_'+str(c) + '.jpg')count = count + 1length=len(str(count))if length ==1:COUNT = '0000'+str(count)elif length == 2:COUNT = '000'+str(count)elif length == 3:COUNT = '00'+str(count)elif length == 4:COUNT = '0'+str(count)else:COUNT = str(count)cv2.imwrite(pic_path + COUNT + '.jpg', frame) #存储为图像,保存名为 文件夹名_数字(第几个文件).jpgelse:continueelse:breakvc.release()print('save_success')#print(folder_name)save_img()

这里还需要将图片中非人脸的照片手动删除。

这个程序,我在别人的代码上增加了5位数编码命名的过程,以便在后续视频合成的时候有顺序可寻。原始代码出自:(找不到了)

6. 脸部提取

还需要将转成图片的训练数据将脸部裁剪出来进行模型训练,这一步需要在conda虚拟环境中进行,代码如下:

python3 faceswap.py extract -i /home/Documents/faceswap/data/test*/srcpic/ -o /home/Documents/faceswap/data/test*/srcface/
python3 faceswap.py extract -i /home/Documents/faceswap/data/test*/targetpic/ -o /home/Documents/faceswap/data/test*/targetface/
# 换成自己的路径

结果如下:
在这里插入图片描述
这里需要将非人脸或者非主角人脸的照片删除。

7. 训练模型

在虚拟环境中输入以下命令:

python3 faceswap.py train -A /home/Documents/faceswap/data/test*/srcface/ -B /home/Documents/faceswap/data/test*/targetface/
# 换成自己的额数据路径
# 切记 A是被替换的人脸数据,B是用来替换的人脸数据

如果这一步出错或者不能使用GPU训练,检查上述tensorflow、cuda、cudnn、keras和python的版本对应关系。
模型训练自动保存模型文件或者手动按回车键停止保存,停止后再次训练会自动加载之前的模型,所以不同的人脸替换,各自模型要及时转移保存。
在这里插入图片描述
在这里插入图片描述

8. 脸部替换

在虚拟环境中输入以下命令:

python3 faceswap.py convert -i /home/Documents/faceswap/data/test1/inputpic/ -o /home/Documents/faceswap/data/test1/outpic/ -m /home/Documents/faceswap/models/
# 换成自己的路径

此时的结果为图片。
转换时可以添加很多指定参数,推荐开启“-S --seamless -D --cnn”,使得替换结果看起来很自然。
可指定的参数源码如下:

def add_optional_arguments(self, parser):parser.add_argument('-m', '--model-dir',action=FullPaths,dest="model_dir",default="models",help="Model directory. A directory containing the trained model \you wish to process. Defaults to 'models'")parser.add_argument('-t', '--trainer',type=str,choices=("Original", "LowMem", "GAN"), # case sensitive because this is used to load a plug-in.default="Original",help="Select the trainer that was used to create the model.")parser.add_argument('-s', '--swap-model',action="store_true",dest="swap_model",default=False,help="Swap the model. Instead of A -> B, swap B -> A.")parser.add_argument('-c', '--converter',type=str,choices=("Masked", "Adjust", "GAN"), # case sensitive because this is used to load a plugin.default="Masked",help="Converter to use.")parser.add_argument('-D', '--detector',type=str,choices=("hog", "cnn"), # case sensitive because this is used to load a plugin.default="hog",help="Detector to use. 'cnn' detects much more angles but will be much more resource intensive and may fail on large files.")parser.add_argument('-fr', '--frame-ranges',nargs="+",type=str,help="frame ranges to apply transfer to e.g. For frames 10 to 50 and 90 to 100 use --frame-ranges 10-50 90-100. \Files must have the frame-number as the last number in the name!")parser.add_argument('-d', '--discard-frames',action="store_true",dest="discard_frames",default=False,help="When used with --frame-ranges discards frames that are not processed instead of writing them out unchanged.")parser.add_argument('-f', '--filter',type=str,dest="filter",default="filter.jpg",help="Reference image for the person you want to process. Should be a front portrait")parser.add_argument('-b', '--blur-size',type=int,default=2,help="Blur size. (Masked converter only)")parser.add_argument('-S', '--seamless',action="store_true",dest="seamless_clone",default=False,help="Seamless mode. (Masked converter only)")parser.add_argument('-M', '--mask-type',type=str.lower, #lowercase this, because its just a string later on.dest="mask_type",choices=["rect", "facehull", "facehullandrect"],default="facehullandrect",help="Mask to use to replace faces. (Masked converter only)")parser.add_argument('-e', '--erosion-kernel-size',dest="erosion_kernel_size",type=int,default=None,help="Erosion kernel size. (Masked converter only)")parser.add_argument('-sm', '--smooth-mask',action="store_true",dest="smooth_mask",default=True,help="Smooth mask (Adjust converter only)")parser.add_argument('-aca', '--avg-color-adjust',action="store_true",dest="avg_color_adjust",default=True,help="Average color adjust. (Adjust converter only)")return parser

9. 结果处理

需要将上述步骤的结果图片合成为视频,代码如下:

# pic2video.py
import os
import cv2
def makeVideo(path, size):filelist = os.listdir(path)filelist2 = [os.path.join(path, i) for i in filelist]print(filelist2)fps = 30  # 我设定位视频每秒1帧,可以自行修改# size = (1920, 1080)  # 需要转为视频的图片的尺寸,这里必须和图片尺寸一致video = cv2.VideoWriter(path + "result.avi", cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), fps,size) filelist2.sort()for item in filelist2:if item.endswith('.jpg'):print(item)img = cv2.imread(item)video.write(img)video.release()cv2.destroyAllWindows()print('视频合成生成完成啦')if __name__ == '__main__':# 换成你自己的路径path = r'/home/wz/Documents/faceswap/data/test1/inputpic/' # 需要转为视频的图片的尺寸,必须所有图片大小一样,不然无法合并成功# 手动指定尺寸size = (720, 1280)makeVideo(path, size)

这个程序,我在别人的代码上增加了对遍历文件夹后的名称目录排序的语句,保证合成的视频帧顺序不会乱。
原始代码出自:
https://blog.csdn.net/weixin_42081389/article/details/100517667

效果视频我就不放了,有伤风化。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/sih9LFBx.shtml

相关文章

Faceswap文档之---部署安装

前言 本篇博客,记录了部署github上的明星项目faceswap的过程,和一些踩坑记录。这个项目可以很好的实现视频换脸,感兴趣同学可以试一下。 说明:本篇文章我将项目部署在linux操作系统进行使用的,因为我们公司服务器性能更…

DeepFake技术--win7下faceswap环境配置(一)(二)(三)

win7下faceswap环境配置(一)- 软件安装 By admin Deepfakes 24 Comments Deepfakes环境配置 以下以64位Win7环境下Faceswap为例,零编程基础学习deepfakes的环境搭配。 Faceswap 简介 由于Win7用openfaceswap会出现错误,所以…

深度学习换脸:faceswap项目实践

faceswap项目解析 一、简介二、数据提取三、模型训练四、人脸转换五、总结 一、简介 faceswap是采用人脸encoder-decoder的方式进行换脸,先提取人脸,包括人脸分割的mask,然后将两个人的人脸用同一个encoder编码,再使用对方的deco…

Windows下faceswap的安装

在Windows上安装Faceswap是一件轻而易举的事。除图形驱动程序外,Windows安装程序会安装您需要的所有内容。如果您使用的是显卡(强烈推荐。CPU上的换脸的速度非常慢),然后确保您的驱动程序是最新的。 下载(访问github可…

Faceswap文档之---使用手册

前言 本篇博客,记录了使用github上的明星项目faceswap的过程,和一些踩坑记录。这个项目可以很好的实现视频换脸,感兴趣同学可以试一下。 说明:本篇文章我将项目部署在linux操作系统进行使用的,因为我们公司服务器性能更…

STFT filter bank

STFT filter bank STFT根据公式不同的写法,可以推导出overlap-add和filter-bank两种不同的实现方式 X(w)∑nx(n)w(n−mR)e−jωn X ( w ) ∑ n x ( n ) w ( n − m R ) e − j ω n 先暂时讨论R 1的情况 filter bank可以用以下流程表示 分析下以上步骤&…

短时傅里叶变换(STFT)及matlab

笔记~自用版~ 短时傅里叶变换的基础理论 短时傅里叶变换(Short-Time Fourier Transform, STFT)是一种时频分析方法,它将信号在时间域上分成若干个短时段,对每个短时段进行窗函数加窗后再做傅里叶变换,得到每个时刻的频…

Revertable STFT

最近在做利用深度学习去噪的工作,大部分的工作都是利用spectrogram特征来做的,这就需要用到STFT, 本次利用的是python的scipy.signal模块。 在做去噪的时候,首先需要先将输入信号x利用stft转换成spectrogram: ff, tt…

时频分析之STFT:短时傅里叶变换的原理与代码实现(非调用Matlab API)

1. 引言 在信号分析中,傅里叶变换可称得上是神器。但在实际应用中,人们发现它还是存在一些不可忽视的缺陷。 为了便于叙述考察以下两种情形: Case 1 考察这样一个函数: fs 1000; t 0:1/fs:1 - 1/fs; x [10 * cos(2 * pi *…

C语言版本STFT/ISTFT

接上一篇:https://blog.csdn.net/SPESEG/article/details/101672559 注意:寡人的stft是有前提条件的,并不是完全与librosa.stft一一对应【我的版本参数是固定的,不可变,其他是一样的】,因为我的hop_length…

stft isar成像 matlab,基于STFT和FRFT的运动目标雷达三维成像方法与流程

本发明属于数字信号处理技术领域,特别涉及一种运动目标雷达三维成像方方法,可 用于对运动目标识别时,雷达ISAR对其三维成像。 背景技术: 逆合成孔径雷达ISAR是一种全天候、全天时的远程探测手段,具有对运动目标进行 成像的能力,被广泛应用于目标跟踪、目标识别、机场监视…

librosa 语音库(二)STFT 的实现

librosa是一个应用广泛的音频处理python库。 在librosa中有一个方法叫做stft,功能是求音频的短时傅里叶变换, librosa.stft 返回是一个矩阵 短时傅立叶变换(STFT),返回一个复数矩阵使得D(f,t) 当调用的形式是 np.abs( stft() ),…

python的opencv操作记录(七)——短时傅里叶变换(stft)

文章目录 DCT-傅立叶变换的局限性STFT 短时傅里叶变换从另一个角度来理解图像的“时域”数据看看fs和t这两个参数再看看怎么划分窗口最后看另外两个出参Zxx返回结构 图像的stft DCT-傅立叶变换的局限性 接上一篇DCT的文章,DCT只提取了整个信号域的频率信息&#xf…

傅里叶变换@(stft和istft)

一、窗函数之短时傅里叶变换stft 前提: 傅里叶变换是针对平稳信号的,但是很多实际应用中的信号都是非平稳的,如果要计算其傅里叶变换,需要假设其周期无限长,然后对这个无限长的信号做变换分析。但是这种无限长信号分…

scipy短时傅里叶分析STFT

scipy短时傅里叶分析 基本原理: 为了使STFT能够通过STFT逆变换反变换,信号加窗必须服从“非零重叠加”(NOLA)的约束,输入信号必须具有完整的加窗覆盖即 ( x . s h a p e [ a x i s ] − n p e r s e g ) (x.shape[axis] - nperseg) % (nper…

STFT笔记

因为不懂这个被鄙视了,调包侠来补作业。 基础知识 FFT(fast fourier transfrom)快速傅里叶变换。 推荐阅读《深入浅出的讲解傅里叶变换(真正的通俗易懂)》, 《梅尔频率倒谱系数(MFCC)》。 频谱只获得了频…

利用短时傅里叶变换(STFT)对信号进行时频谱分析和去噪声

利用短时傅里叶变换(STFT)对信号进行时频谱分析和去噪声 1、背景 傅里叶变换(TF)对频谱的描绘是“全局性”的,不能反映时间维度局部区域上的特征,人们虽然从傅立叶变换能清楚地看到一整段信号包含的每一个频率的分量值…

STFT(短时傅里叶变换)音频特征提取,用于语音识别 python

在各种音频相关的任务中,不管用什么模型或网络,得到所需的音频特征肯定是必要的一步。下面简单说一下STFT特征 一、原始信号 在说STFT之前,先说一下读入的原始信号,图像是在XY二维上描述的像素点的集合,相应的&#x…

STFT原理及MATLAB代码

原文地址:http://blog.csdn.net/shengzhadon/article/details/46811923 一、先说说STFT的理论 1.概念和特点 STFT(short-time Fourier transform,短时傅里叶变换)是和傅里叶变换相关的一种数学变换,用以确定时变信号其…

nvme分区选mbr还是guid_win7安装系统硬盘模式mbr和guid选哪个?

有很多系统之家的用户,还是喜欢安装win7系统的。但是在新的硬盘里面我们要分区的话,会出现mbr和guid是硬盘分区的两个格式,很多用户在做系统的时候不知道选哪个好,其实最好根据自己的电脑的配置,下面来看看详细的介绍吧…