川普撞臉希拉里(基於 OpenCV 的面部特徵交換)

話說此次美國大選可謂賺足了眼球,在美國史上,恐怕沒有哪一年的總統大選會像今年同樣詭譎和熱鬧。 美國開國領袖們若是看到美國民衆只能在希拉里和川普中選擇,估計要集體氣活過來。
做爲一個閒得蛋疼的吃瓜羣衆,今天就拿這對冤家作例子,看如何利用OpenCV來實現將希拉里的臉安在川普臉上。固然,你還能夠觸類旁通,把吳彥祖的臉安到本身臉上試試效果......python

項目簡介:經過 OpenCV 庫來實現人臉面部特徵交換,其實就是將第二張人臉的眼睛、鼻子和嘴巴經過程序自動裁剪適配並覆蓋到第一張人臉上,而且爲了使得修改後的照片看着更加天然,咱們還須要調整皮膚顏色。
本教程由one_magician發佈在實驗樓,完整教程及在線練習地址:川普撞臉希拉里(基於 OpenCV 的面部特徵交換)git

1、教程介紹

1.1 內容簡介

經過 OpenCV 庫來實現人臉面部特徵交換。github

1.2 知識點

  • 人臉特徵交換程序設計思路算法

  • OpenCV 庫的使用編程

  • dlib 庫的使用bash

  • docopt 庫的使用機器學習

1.3 效果圖(自帶護目鏡)

這是原圖。函數

此處輸入圖片的描述
此處輸入圖片的描述

轉換以後的結果是這樣的。學習

前方高能ui

前方高能

前方高能

前方高能

此處輸入圖片的描述

2、環境配置

所謂「工欲善其事,必先利其器」,開始編寫代碼以前咱們須要先把用到的庫安裝好。

依賴的庫有:

  • dlib

  • opencv

  • docopt

2.1 安裝 dlib

dlib 是一個基於 C++ 編寫的擴展庫,包含有許多經常使用的機器學習算法以及圖像處理函數。而且還支持大量的數值計算,如矩陣、大整數隨機運算等。可是在編譯安裝 dlib 以前咱們還須要先給系統裝上各類依賴環境,步驟以下。

安裝 Python 的開發庫 python3-devpython3-setuptools

$ sudo apt-get update
$ sudo apt-get install python3-dev python3-setuptools

另外還要安裝 Boost Python 開發文件,它爲 Python 編程提供了簡單易用的 C++ 函數庫接口。

$ sudo apt-get install libboost-python-dev

dlib 原本能夠直接經過 pip3 指令進行編譯安裝,可是因爲虛擬機的內存資源不足沒法完成編譯,所以我這裏提供一份編譯好的 dlib 動態庫。能夠經過 wget 命令進行下載,並將 dlib.so 複製到 /usr/local/lib/python3.4/dist-packages/ 目錄之下,這樣就能夠全局使用該模塊了。

$ wget http://labfile.oss.aliyuncs.com/courses/686/dlib.so
$ sudo cp dlib.so /usr/local/lib/python3.4/dist-packages/

2.2 安裝 OpenCV

OpenCV 是一款功能強大的跨平臺計算機視覺開源庫,能夠用於解決人機交互、物體檢測、人臉識別等領域的問題。庫自己是採用 C++ 編寫的,可是同時也對 Python, Java, C# 等語言提供接口支持。

本門課程考慮到 OpenCV 的安裝過程相對較繁瑣且耗時較長,所以實驗環境已經配置好 OpenCV 3.1 的環境。

此處輸入圖片的描述

2.3 安裝 docopt

docopt 是 Python 的一個第三方參數解析庫,能夠根據使用者提供的文檔描述自動生成解析器。所以使用者能夠用它來定義交互參數與解析參數。

安裝 docopt 庫的過程就很是簡單了。

$ sudo pip3 install docopt

3、設計思路

咱們先來考慮一下這個程序須要完成的兩大個功能。

  1. 支持從命令行獲取指定圖像路徑

  2. 讀取指定圖像並進行處理保存

事實上,第一點要求經過藉助 docopt 庫能夠很是快速便捷地構建命令行解析器,具體用法在後續將會詳細介紹。

而第二點纔是咱們真正須要關注的問題。想象一下在現實生活中,給你兩張人像照片,如今要求你將他們的臉部特徵交換一下(本次實驗中的臉部特徵主要指眉毛、眼睛、鼻子和嘴巴組合而成的部位),那麼最簡單的方法就是將第二我的臉部特徵部分剪下拼接到第一我的的照片上。因此事實上,咱們的程序實現也是在模仿這一個過程。可是程序並不知道哪些部分是眉毛、眼睛、鼻子或者嘴巴,在電腦看來這些圖片僅僅是一連串二進制數,因此咱們還須要利用 dlib 庫中的機器學習算法來幫助咱們檢測並標記這些特徵部位。

因此咱們的處理方法主要分爲如下幾個步驟。

  1. 藉助 dlib 庫檢測出圖像中的臉部特徵

  2. 計算將第二張圖像臉部特徵對齊到一張圖像臉部特徵的變換矩陣

  3. 綜合考慮兩張照片的面部特徵得到合適的面部特徵掩碼

  4. 根據第一張圖像人臉的膚色修正第二張圖像

  5. 經過面部特徵掩碼拼接這兩張圖像

  6. 保存圖像

好吧,也許步驟看起來有些多,暫時看不懂也不要緊,跟着教程把項目作一遍,你將會對這些概念慢慢熟悉起來。

本項目教程的詳細步驟和所有代碼,能夠在實驗樓查看並在線完成:川普撞臉希拉里(基於 OpenCV 的面部特徵交換)
項目來源於 https://github.com/matthewearl/faceswap ,該項目基於 MIT 許可證。

系統化的Python學習路徑:Python研發工程師
更多經典練手項目:所有項目

相關文章
相關標籤/搜索