如何利用 Deepfakes 换脸?

获取 deepfakes 工具包

git clone https://github.com/deepfakes/faceswap.git 复制代码

补齐依赖包:

pip install tqdmpip install cv2pip install opencv-contrib-pythonpip install dlibpip install keraspip install tensorflowpip install tensorflow-gpu(如机器带有gpu)pip install face_recognition

网络样本

手把手教你运用 Deepfakes 换脸

这里我选用的是新垣结衣的样本,费了好半天,下了 100 张图片

其余一个人的样本是凯瑞穆里根,由于实在是找图片麻烦,以是直接截取了《The Great Gatsby》里的视频,然后用 ffmpeg 转化为图片,大概有 70 张的样子。

如果你想要系统地学习人工智能,那么推举你去看床长人工智能教程。
非常棒的大神之作,教程不仅普通易懂,而且很风趣诙谐。

面部抓取

在网络完样本后,利用如下命令对样本图片进行面部抓取:

./faceswap.py extract –i input_folder/ –o output_folder/

做这个的缘故原由是由于我们紧张关注的是换脸,以是只须要获取脸部的特色,其他环境成分对换脸的影响并不大。

在面部抓取的过程完成后,我们可以得到所有脸部图片。
在此,我们可以人工筛选一下不得当的样本(如下图中的 49_1.jpg),将之去除。

面部检测算法 HOG

这里大略提一下脸部特色提取算法 HOG(Histogram of Oriented Gradient)。

严格来说,实在 HOG 是一个特色,是一种在打算机视觉和图像处理中用来进行物体检测的特色描述因子。
HOG 特色结合 SVM 分类器已经被广泛运用于图像识别中。

此处脸部检测的一个大略过程如下:

①首先利用黑白来表示一个图片,以此简化这个过程(由于我们并不须要颜色数据来检测一个脸部)。

②然后依次扫描图片上的每一个像素点 。
对每个像素点,找到与它直接相邻的像素点。
然后找出这个点周围暗度变革的方向。

例如下图所示,这个点周围由明到暗的方向为从左下角到右上角,以是它的梯度方向为如下箭头所示:

③在上一个步骤完成后,一个图片里所有的像素点均可由一个对应的梯度表示。
这些箭头表示了全体图片里由明到暗的一个趋势。

如果我们直接剖析这些像素点(也便是按色彩的办法剖析),那么那些非常亮的点和非常暗的点,它们的值(RGB 值)肯定有非常大的差别。

但是由于我们在这只关注通亮度改变的方向,以是由有色图和黑白图终极得到的结果都是一样的,这样可以极大简化问题办理的过程。

④但是保存所有这些梯度会是一个较为花费存储的过程,以是我们将全体图片分成多个小方块,并且打算里面有多少不同的梯度。

然后我们利用相同梯度最多的方向来表示这个小方块的梯度方向。
这样可以将原图片转化为一个非常大略的表现办法,并以一种较大略的方法抓取到面部的基本构造。

⑤当打算到一个图片的 HOG 特色后,可以利用这个特色来对通过演习大量图片得出的 HOG 特色进行比对。
如果相似度超过某个阈值,则认为面部被检测到。

开始演习

在提取两个人脸的面部信息后,直策应用下面命令开始进行模型的演习:

./faceswap.py train -A faceA_folder/ -B faceB_folder -m models/ 复制代码

个中 -m 指定被保存的 Models 所在的文件夹。
也可以在命令里加上 -p 参数开启 Preview 模式。

在演习过程中,可以随时键入 Enter 停滞演习,模型会保存在目标文件夹。

演习利用的深度学习框架是 Tensorflow,它供应了保存 Checkpoint 的机制(当然代码里必须用上)。

在停滞演习后,往后也可以随时利用上面的命令读取之前演习得出的权重参数,并连续演习。

转换人脸

在演习完模型后(丢失值较低),可以利用以下命令对目标图进行换脸:

./faceswap.py –i input_images_folder/ -o output_images_folder/ -m models/ 复制代码

此处的例子是找的一个视频,以是我们可以先用下面的命令将一个视频以一个固定频率转化为图片:

ffmpeg –i video.mp4 output/video-frame-%d.png 复制代码

然后实行转换人脸操作。
末了将转换后的人脸图片凑集,合成一个视频:

ffmpeg –i video-frame-%0d.png -c:v libx264 -vf “fps=25, format=yuv420p” out.mp4 复制代码

下面是两个换脸图(样本 A,110 张图片;样本 B,70 张图片,演习韶光 6 小时):

嗯…效果不咋样… 建议大家可以增大样本量,并延长演习韶光。

转换人脸的过程

下面大略的聊一下转换人脸的过程。
这里用到了 AutoEncoder(一种卷积神经网络),它会根据输入图片,重构这个图片(也便是根据这个图片再天生这个图片):

这里 AutoEncoder 模型做的是:首先利用 Encoder 将一个图片进行处理(卷积神经网络抽取特色),以一种压缩的办法来表示这个图片。
然后 Decoder 将这个图片还原。

详细在 Deepfakes 中,它用了一个 Encoder 和两个 Decoder。
在演习的部分,实在它演习了两个神经网络,两个神经网络都共用一个 Encoder,但是均有不同的 Decoder。

首先 Encoder 将一个图片转化为面部特色(通过卷积神经网络抽取面部的细节特色)。
然后 Decoder 通过这个面部特色数据,将图片还原。

这里有一个 error function(loss function)来判断这个转换的好坏程度,模型演习的过程便是最小化这个 loss function(value)的过程。

第一个网络只演习图片 A,第二个网络只演习图片 B。
Encoder 学习如何将一个图片转化为面部特色值。

Decoder A 用于学习如何通过面部特色值重构图片 A,Decoder B 用于学习如何通过面部特色值重构图片 B。

以是在演习时,我们会将两个图片均送入同一个 Encoder,但是用两个不同的 Decoder 还原图片。

这样末了我们用图片 B 获取到的脸,利用 Encoder 抽取特色,再利用 A 的 Decoder 还原,便会得到 A 的脸,B 的表情。
参考文献:K码农-http://kmanong.top/kmn/qxw/form/home?top_cate=28