實現 AI 換臉的第一步:人臉搜尋

GitChat 精品課發表於2019-04-23

前段時間,AI 換臉這條新聞你關注了嗎?


說的是一位博主將 1994 年版《射鵰英雄傳》裡朱茵的臉換成了楊冪的臉。因為該視訊涉及到版權問題已被下架,但大家可以看看圖片對比來感受一下“移花接木”效果:


640?wx_fmt=jpeg


是不是足夠可以以假亂真了!這樣的視訊用一款實時視訊模擬軟體 Face2Face 就可以達到,在軟體中輸入一個說話的人臉錄影,通過演算法生成對應的人臉模型,套用這個模型就可以創造 DeepFakes。最恐怖的是,這個逼真的效果看起來毫無違和感。


讓我們一起來看看 AI 換臉背後的原理:

人臉檢測 → 多人臉區域分別做面部關鍵點檢測 → 面部區域分割 → 影象線性融合


順著這個思路,我們可以看到 AI 換臉裡最重要的一環就是人臉檢測,要進行人臉識別,得經過這麼幾個過程:


人臉檢測 → 人臉對齊 → 提取特徵編碼 → 編碼比對


人臉檢測:就是定位一張圖片中人臉的位置。

人臉對齊:就是根據人臉中五個特徵點位置(兩個眼睛、兩個嘴角、鼻子)將人臉縮放到一定的尺寸。

提取特徵編碼:通過訓練一個人臉識別模型來提取人臉特徵編碼。

編碼比對:將某個人臉的編碼與編碼庫中的編碼進行對比,得出距離或相似度。


01

實現 AI 換臉的第一步


以下關於人臉檢測、人臉對齊均使用基於 Tensorflow 的 MTCNN 模型,生成特徵編碼使用基於 Mxnet 的 Insightface 模型。


圖為人臉搜尋整體架構設計:

640?wx_fmt=png


首先,我們會下載 Insightface 原始碼及其訓練好的模型檔案,在這個原始碼的基礎上,我們開發一個 API 程式,程式呼叫模型進行人臉檢測、人臉對齊、生成特徵編碼,然後完成人臉入庫、人臉搜尋功能。


該程式主要使用 Flask 來進行 API 開發,使用 Annoy 來進行人臉特徵向量搜尋。在部署上,使用 Docker 容器部署 Python 環境,讓 API 程式執行在 Docker 容器中,使用 Gunicorn 來啟動 Flask 程式。


另外,使用 Nginx 部署一個圖片伺服器,用於前端的圖片展示,也是執行在 Docker 容器中。最後,我們再提供一個簡單 Web 頁面,該頁面允許使用者進行入庫、搜尋操作(呼叫後端的人臉入庫、搜尋 API )。


最終的 Web 頁面展示如下:

640?wx_fmt=png


02

人臉搜尋實現


首先你得有一個 Linux 環境,可以通過 VMware 構建一個 Ubuntu 16.04 的環境, iso 檔案為 ubuntu-16.04.5-desktop-amd64.iso 。


考慮到方便大家照著做,而且大家可能沒有 GPU 環境,所以以下構建環境我均使用 CPU 。


1. 克隆專案並修改相關原始碼

cd /opt
git clone https://github.com/deepinsight/insightface.git

將 /opt/insightface/src/api/face_model 第 61 行

self.model.ctx = mx.gpu(args.gpu)

改為

self.model.ctx = mx.cpu()

將第 34 行

for idx in xrange(data.shape[0]):

改為:

for idx in range(data.shape[0]):

下載作者訓練好的模型檔案。


將模型檔案解壓至 /opt/insightface/models ,目錄結構如下:

640?wx_fmt=png


2. 編寫人臉入庫、搜尋 API 程式

這裡我們利用訓練好的模型檔案,使用 Flask 編寫一個人臉特徵編碼入庫、搜尋 API 。我們將入庫的特徵編碼存於程式中的一個陣列裡面。


首先,我們先建立用於圖片入庫及圖片搜尋的目錄。


然後編碼 API 程式,在 /opt/insightface/src/api 建立 app_flask.py 。

程式碼詳見 Github。


3. 安裝 Docker

安裝軟體,我一般從官網去獲取安裝操作說明,讓自己在安裝過程中少走些彎路。


4. 構建 Docker Nginx 圖片伺服器映象

我們要做人臉搜尋系統,在前端頁面就是要上傳一張圖片,然後點選“搜尋”按鈕,在頁面上顯示人臉庫中與該圖片相似度最高的 top6 圖片,所以我們要用到圖片伺服器,使用 url 進行圖片展示。

我們首先要建立一個圖片根目錄。


mkdir /opt/images

然後使用 Docker 拉取一個 Nginx 映象。


然後我們就可以啟動容器了:

docker run --name image-server -itd -p 8082:8080  -v /opt/insightface/src/api/conf/nginx.conf:/etc/nginx/nginx.conf  -v /opt/images:/opt/images nginx


通過瀏覽器訪問 http://192.168.247.128:8082/

640?wx_fmt=png

5. 構建 Docker Insightface 映象

我們從一個基礎映象 python:3.5 來構建我們的 Insightface 映象

docker pull python:3.5

然後我們使用 Dockerfile 來構建 Insightface 映象,主要是進行 Python 庫環境的安裝,比如 Tensorflow、Mxnet 。


最後,讓我們連續入庫 5 張梁靜茹和 1 張陳慧嫻的照片,然後用第 6 張梁靜茹的照片來搜尋,效果圖如下:

640?wx_fmt=png

最後,以上並非完整全文,提示大家如果有 Gpu 環境的話,可以使用 Gpu 來進行模型推理,以上操作我均使用 root 使用者。本文所提到的程式碼都上傳到我的 Github 上了。


掃描下方二維碼檢視完整全文

獲取原始碼 Github 地址

開始你的 AI 換臉實踐

640?wx_fmt=jpeg


點選閱讀原文,直達原文,上手 AI 換臉操作!

相關文章