用Python玩人臉合成,你也能有一張明星臉(附代碼)

2021-02-13 Python大本營

參加 2019 Python開發者日,請掃碼諮詢 ↑↑↑

作者 | 小安

來源 | 菜鳥學Python(ID:cainiao_xueyuan)

如今,隨著技術的不斷進步,「變臉」技術不再是四川喜劇的「獨門武功」。運用機器學習的方法,我們同樣可以實現人臉「融合」。當然這裡說的人臉融合指的是將兩個人的人臉照片進行融合,至於融合的比例,要按照自己的喜好來定。人臉融合的效果我們先看視頻。

變臉視頻,一睹為快

下面小編就帶領大家從以下的幾個方面來打造一款向上圖所示的人臉識別軟體。

1).首先是人臉識別的原理介紹

要進行人臉的融合,且融合後兩個人臉的位置應該大體一致,這要如何才能做到呢?首先便是人臉的檢測,只有檢測到了人臉,才能進行接下來的工作。人臉的檢測,我們採用的是Dlib函數庫,幫助我們進行人臉的檢測。如下圖所示:

得到人臉的位置後,接下來就是對於人臉的關鍵點的定位,什麼是關鍵點的定位呢,說的通俗一點,就是確定圖片中人臉的關鍵特徵的位置,比如眼睛,嘴巴,鼻子的位置。而這些關鍵點又被稱為Landmark。

2).如何檢測這些關鍵點呢

這裡又利用到了Dlib庫,Dlib庫為我們提供了68個標記點的Dlib官方人臉識別模型,用於構建Dlib的特徵提取器,幫助我們進行關鍵點的提取。提取效果如下圖所示:

有了關鍵點,相當於我們有了兩張臉的數據,接下來我們將針對於這些關鍵點進行融合,融合的公式代碼如下所示:

points = (1 - alpha) * np.array(points1) + alpha * np.array(points2)

其中alpha是我們的融合係數,而points1和points2分別代表兩張圖的關鍵點,points表示關鍵點融合的結果。接下來便是對points運用delaunay算法,這個算法將返回一個三角形列表。而至於效果則如下圖所示:

由上圖可以看出,兩張圖中的三角形抓取了近乎相似的區域。由上面我們可以得到圖片1中關鍵點的和圖片2中關鍵點的集合,以及合成圖片的關鍵點的集合。

我們也由delaunay算法得到了確定的三角形。接下來我們選取圖片1中的三角形和合成圖中的三角形進行仿射變換,也就是將圖片1中的三角形對應的映射到合成圖片當中去,關於仿射變換,我們可以使用opencv中的getAffineTransform函數進行。

對於圖片2,我們也採取同樣的處理方式,最後是基於我們提供的融合係數,進行兩張人臉的融合。部分源碼如下圖所示:

上述的morph_faces函數,用來進行人臉的融合,首先是讀取兩張人臉圖片,然後是獲取兩張人臉的關鍵點,分別命名為points1和points2並對points1和points2進行融合,命名為points,然後利用morph_triangle函數對人臉進行仿射變換,實現兩張人臉的對齊,並將對齊的兩張人臉按照融合係數進行融合。

軟體界面設計

以上就是關於人臉融合的基本原理,接下來就是運行界面的搭建了。

運行界面的搭建採用的是tkinter進行處理,

首先是打開文件夾,讀入我們想要進行融合的人臉

然後是輸入融合的比例係數,如果我們忘記輸入融合係數的話,軟體默認的係數便是0.5

最後點擊我們的「人臉融合」按鈕,軟體便會展示出人臉融合後的效果。

這裡需要注意的是,輸入的兩張圖片大小不需要嚴格的一致,程序會自動幫大家進行圖片大小的調整。

一共有4個按鈕,分布是打開圖片1,打開圖片2,人臉融合和退出軟體。

中間有3張圖片,前2張都是原始圖片,最後一個合成圖片,尤其是合成圖片那裡是關鍵中關鍵:

這裡面的main函數是調用後臺的算法函數,然後再輸入一個融合係數,就是entry.get()裡面獲取的用戶輸入的融合係數,一般默認是0.5,即兩個臉一半一半。

後臺的算法會把兩種圖片利用cv2和dlib進行處理合成,然後生成一個新的合成圖片。

最後我們用PIL庫把圖片讀出來,然後顯示在界面上即可。

看一下效果

最後,小編找了幾位明星,進行人臉的融合,效果如下圖所示:

這篇文章主要用了很多計算機視覺方面的庫opencv,這個庫很博大精深,幾乎玩圖像的無人不知無人不曉,有興趣的同學可以研究一下,後面還有一些跟圖像相關的趣味小例子。 現在發現Python是不是無所不能,歡迎留言點評,吱一聲!

限於篇幅,源碼沒有展開,變臉源碼獲取地址:

連結: https://pan.baidu.com/s/10JczvfApSJLn4Yl68CzOJA 

提取碼: mqxu 

(提醒一下,需要安裝cv2和dlib,cv2庫不太好安裝)

(*本文為Python大本營轉載文章,轉載請聯繫原作者)

福利

掃碼添加小助手,回覆:1,加入Python技術交流群,共享Python學習資料,定時更新。

敲黑板劃重點!7 折優惠限時搶購中,3 月 31 日前可享受優惠價 499,歡迎點擊閱讀原文報名參加。更多詳細信息請諮詢13581782348(微信同號)。


你也可以點擊閱讀原文,查看大會詳情。

相關焦點

  • 用Python進行人臉識別「包括原始碼」
    Python可以從圖像或視頻中檢測和識別你的臉。人臉檢測與識別是計算機視覺領域的研究熱點之一。
  • 手把手:用OpenCV親手給小扎、Musk等科技大佬們做一張「平均臉」(附Python代碼)
    創造她的正是文摘菌今天要介紹的一項黑科技——「平(da)均(zhong)臉」。文摘菌今天的手把手專欄將為大家介紹,如何用OpenCV隨心所欲幫各種人組合「平均臉」。完整的python代碼可在後臺回復「平均臉」獲取。讓我們先來看兩張文摘菌好奇的平均臉。
  • 人臉識別簡介(使用Python代碼)
    人臉識別已經在我們的生活中處處可見——無論是政府布置在大街小巷的「天眼」,還是手機軟體中用於驗證用戶個人身份的確認手段,刷臉解鎖、刷臉支付……每個人與生俱來的這張「獨一無二」的臉正在取代數字密碼,成為虛擬世界中的身份證明。
  • Python一行代碼,能玩這麼多童年的遊戲?
    安裝與使用安裝當然也很簡單一行代碼就可以pip install freegames由於該項目中的所有遊戲均是基於Python內置模塊Turtle製作,所以沒有太多依賴,安裝不會有困難。>貪吃蛇的玩法想必不用過多解釋了,使用鍵盤即可操控吃豆人吃豆人沒玩過也應該聽過,使用下面的代碼可以啟動一個類似吃豆人的遊戲python -m freegames.pacmanFlappy
  • Python 實現人臉檢測並不難,50 行代碼搞定!
    現在的人臉識別技術已經得到了非常廣泛的應用,支付領域、身份驗證、美顏相機裡都有它的應用。
  • 10行代碼實現python人臉識別
    ↑ 關注 + 星標 ~ 有趣的不像個技術號什麼是人臉識別人臉識別,是基於人的臉部特徵信息進行身份識別的一種生物識別技術。用攝像機或攝像頭採集含有人臉的圖像或視頻流,並自動在圖像中檢測和跟蹤人臉,進而對檢測到的人臉進行臉部識別的一系列相關技術,通常也叫做人像識別、面部識別。目前的人臉識別技術已經非常成熟了,還發展成3D人臉識別。
  • 【附完整代碼:AI實戰】動手編寫人臉識別
    、美顏,甚至支付寶還推出了刷臉支付、建設銀行還實現了刷臉取錢……,可見人臉識別的用處非常廣。 既然人臉識別這麼有用,那麼我們能否自己來實現一個人臉識別呢?答案是肯定的。接下來將在之前我們搭建好的AI基礎環境上(見文章:手把手教你搭建AI基礎環境),實現人臉識別模型。
  • 藉助攝像頭在Python中實現人臉檢測
    本篇博客是《25行Python代碼完成人臉識別》的後續,閱讀前請確認你已經看過了前篇。正如前篇所提,我們可以輕鬆地把在圖像中的人臉檢測技術通過攝像頭在視頻中運用——這正是本文將詳細介紹的。在評論區提問前請注意:1. 不要略過本文直接運行代碼。不僅要能正確運行,你還要明白如何調試代碼。2.
  • 生成「貓狗版」川普,造假臉工具StarGANv2被玩壞,算法已開源
    曉查 發自 凹非寺量子位 報導 | 公眾號 QbitAI如果你想用AI把川普的臉變成貓,又或者是把自己的臉與漂亮的奧妹結合起來,你會怎麼辦?也許你會想到兩樣AI工具。但是Deepfake生成人臉違和感太強,GAN生成假臉又很難深度定製。現在來自韓國團隊開發的風格遷移模型StarGANv2可以完美解決這個問題。如果你是一個對GAN長期關注的同學,那麼一定還記得StarGAN,它是韓國高麗大學和Clova AI研究院在2017年底推出的風格遷移模型。
  • python3+dlib人臉識別及情緒分析
    但是為了學習使用dlib中的各種python實例程序,還是需要下載一個dlib的壓縮包。直接訪問dlib官網即可下載:http://dlib.net/ml.htmldlib各種版本的whl文件:https://pypi.python.org/simple/dlib/4、如果想要使用人臉模型特徵標定的話,還需要一個人臉面部形狀預測器,這個可以通過自己的照片進行訓練,也可以使用dlib作者給出的一個訓練好的預測器:
  • 用dlib實現人臉識別的技巧
    很多人都認為人臉識別是一項非常難以實現的工作,看到名字就害怕,然後心懷忐忑到網上一搜,看到網上N頁的教程立馬就放棄了。這些人裡包括曾經的我自己。其實如果如果你不是非要深究其中的原理,只是要實現這一工作的話,人臉識別也沒那麼難。今天我們就來看看如何在40行代碼以內簡單地實現人臉識別。
  • 實戰|手把手教你用Python爬蟲(附詳細源碼)
    ,希望人人都能學到新知識。一句話概括就是告訴你哪些東西能爬哪些不能爬。了解了定義和規則,最後就是熟悉爬蟲的基本原理了,很簡單,作為一名靈魂畫手,我畫個示意圖給你看下就明白了。而python只要運行幾分鐘就能把所有數據保存到你的excel裡,是不是很舒服?
  • 動手實操 | 如何用 Python 實現人臉識別,證明這個楊冪是那個楊冪?
    人臉特徵提取的步驟真正的人臉識別需要很多的知識,大體上粗略的可以分為以下步驟:  1.人臉檢測(從圖片中找到人臉):返回人臉位置和大小的參數  2.人臉特徵定位:一般 69 點或者 106 個點對人臉的特徵定位,技術上有 Adaboost&haar,以及 MSRA 的 alignment。  3.人臉特徵歸一化(幾何歸一/灰度歸一):前者對圖像進行仿射變化使得不同的臉可以進行比對,後者則能使圖像展現更多的細節以及減弱光線光照的應用。  4.特徵提取-特徵後期融合。
  • 別再用PS了,我用五行Python代碼就實現了批量摳圖
    對於會PhotoShop的人來說,摳圖是非常簡單的操作了,有時候幾秒鐘就能扣好一張圖。不過對於一些比較複雜的圖,有時候還是需要花點時間的,今天就給大家帶了一個非常快速簡單的辦法,用Python來批量摳取人像。效果展示剛開始,我也不看好什麼自動摳圖,總覺得不夠精確,摳不出滿意的圖。
  • SIGGRAPH 2020 | 開原始碼實現從草圖生成人臉
    在 2009 年就有使用草圖作為輸入進行圖像合成的研究工作 Sketch2Photo [1],CVPR 2018 上的工作 Mask-guided[2] 實現了基於參考圖像和語義標籤的人臉圖像生成。2018 年 SIGGRAPH 上發表的工作 FaceShop[3] 利用草圖交互實現人臉圖像編輯。
  • 25條實用的Python一行代碼,你用過哪些?
    可能有些你還不知道,但對你未來的Python項目很有用。▍1、交換兩個變量# a = 4 b = 5a,b = b,a# print(a,b) >> 5,4讓我們通過交換兩個變量作為一個簡單的開始。此方法是最簡單、最直觀的方法之一,無需使用臨時變量或應用算術操作即可編寫。
  • 使用Python+OpenCV+Dlib實現人臉檢測與人臉特徵關鍵點識別
    這個庫是用C++程式語言創建的,它與C/C++、Python和java一起工作。值得注意的是,本教程可能需要對OpenCV庫有一定的了解,例如如何處理圖像、打開相機、圖像處理和一些小技巧。它是如何工作的?我們的臉有幾個可以識別的特徵,比如眼睛、嘴巴、鼻子等等。當我們使用DLib算法檢測這些特徵時,我們實際上得到了每個特徵點的映射。
  • OpenCV人臉識別之一:數據收集和預處理
    本系列人臉識別文章用的是opencv2,最新版的opencv3.2的代碼請參考文章:《OpenCV之識別自己的臉——C++源碼放送》;《人臉識別源碼運行指南》(小編附在文末)前段時間對人臉檢測進行了一些嘗試:人臉檢測(C++/Python)(http://www.jianshu.com/p/504c081d7397)但是檢測和識別是不同的,檢測解決的問題是圖片中有沒有人臉;而識別解決的問題是
  • 基於騰訊雲人臉識別做一款聖誕帽應用
    然而,微信官方並不會理睬你的需求。偶爾還會發生這樣的問題:   這時候,作為一個碼農,自己動手豐衣足食的優勢就來了。從原理上來說,其邏輯是簡單的。識別人臉,在人臉框上增加有透明度的聖誕帽即可。現下,我們可以用opencv, dlib完成這些事情,當然,從開發速率來說,我們也可以藉助雲廠商的人臉識別技術和擴展性來完成這款應用。
  • 使用OpenCV+Python進行人臉識別
    在本文的最後,你將能夠開發一個人臉識別程序來識別圖像中的人臉!目錄人臉檢測概述如果機器能夠在沒有人工幹預的情況下自動檢測圖像中的物體會怎樣?讓我們看看:人臉檢測是我們在圖像中檢測人臉的問題。人臉可能略有不同,但可以肯定地說,所有人臉都有特定的特徵。存在各種人臉檢測算法, Viola-Jones算法是現在也在使用的最古老的方法。