是不是足够可以以假乱真了!这样的视频用一款实时视频仿真软件 Face2Face 就可以达到,在软件中输入一个说话的人脸录像,通过算法生成对应的人脸模型,套用这个模型就可以创造 DeepFakes。最恐怖的是,这个逼真的效果看起来毫无违和感。
让我们一起来看看 AI 换脸背后的原理:
人脸检测 → 多人脸区域分别做面部关键点检测 → 面部区域分割 → 图像线性融合
顺着这个思路,我们可以看到 AI 换脸里最重要的一环就是人脸检测,要进行人脸识别,得经过这么几个过程:
人脸检测 → 人脸对齐 → 提取特征编码 → 编码比对
人脸检测:就是定位一张图片中人脸的位置。
人脸对齐:就是根据人脸中五个特征点位置(两个眼睛、两个嘴角、鼻子)将人脸缩放到一定的尺寸。
提取特征编码:通过训练一个人脸识别模型来提取人脸特征编码。
编码比对:将某个人脸的编码与编码库中的编码进行对比,得出距离或相似度。
01
实现 AI 换脸的第一步
以下关于人脸检测、人脸对齐均使用基于 Tensorflow 的 MTCNN 模型,生成特征编码使用基于 Mxnet 的 Insightface 模型。
图为人脸搜索整体架构设计:
首先,我们会下载 Insightface 源码及其训练好的模型文件,在这个源码的基础上,我们开发一个 API 程序,程序调用模型进行人脸检测、人脸对齐、生成特征编码,然后完成人脸入库、人脸搜索功能。
该程序主要使用 Flask 来进行 API 开发,使用 Annoy 来进行人脸特征向量搜索。在部署上,使用 Docker 容器部署 Python 环境,让 API 程序运行在 Docker 容器中,使用 Gunicorn 来启动 Flask 程序。
另外,使用 Nginx 部署一个图片服务器,用于前端的图片展示,也是运行在 Docker 容器中。最后,我们再提供一个简单 Web 页面,该页面允许用户进行入库、搜索操作(调用后端的人脸入库、搜索 API )。
最终的 Web 页面展示如下:
02
人脸搜索实现
首先你得有一个 Linux 环境,可以通过 VMware 构建一个 Ubuntu 16.04 的环境, iso 文件为 ubuntu-16.04.5-desktop-amd64.iso 。
考虑到方便大家照着做,而且大家可能没有 GPU 环境,所以以下构建环境我均使用 CPU 。
将 /opt/insightface/src/api/face_model 第 61 行
改为
将第 34 行
改为:
下载作者训练好的模型文件。
将模型文件解压至 /opt/insightface/models ,目录结构如下:
这里我们利用训练好的模型文件,使用 Flask 编写一个人脸特征编码入库、搜索 API 。我们将入库的特征编码存于程序中的一个数组里面。
首先,我们先创建用于图片入库及图片搜索的目录。
然后编码 API 程序,在
/opt/insightface/src/api 创建 app_flask.py 。
代码详见 Github。
安装软件,我一般从官网去获取安装操作说明,让自己在安装过程中少走些弯路。
我们要做人脸搜索系统,在前端页面就是要上传一张图片,然后点击“搜索”按钮,在页面上显示人脸库中与该图片相似度最高的 top6 图片,所以我们要用到图片服务器,使用 url 进行图片展示。
我们首先要创建一个图片根目录。
然后使用 Docker 拉取一个 Nginx 镜像。
然后我们就可以启动容器了:
通过浏览器访问 http://192.168.247.128:8082/
我们从一个基础镜像 python:3.5 来构建我们的 Insightface 镜像
然后我们使用 Dockerfile 来构建 Insightface 镜像,主要是进行 Python 库环境的安装,比如 Tensorflow、Mxnet 。
最后,让我们连续入库 5 张梁静茹和 1 张陈慧娴的照片,然后用第 6 张梁静茹的照片来搜索,效果图如下:
最后,以上并非完整全文,提示大家如果有 Gpu 环境的话,可以使用 Gpu 来进行模型推理,以上操作我均使用 root 用户。本文所提到的代码都上传到我的 Github 上了。