手把手:用OpenCV親手給小扎、Musk等科技大佬們做一張「平均臉」(附Python代碼)

2021-02-14 大數據文摘

作者:SATYA MALLICK

編譯:HAPPEN、Chloe、錢天培


緊盯這張照片5秒鐘,你能否看出任何異樣呢?

照片中的女性同時擁有白人血統、西班牙人血統、亞洲人血統以及印度人血統

她皮膚光彩無暇,眼神撲朔迷離,似乎美得不真實。

她並不真實存在,但她也並非完全虛構。

創造她的正是文摘菌今天要介紹的一項黑科技——「平(da)均(zhong)臉」

文摘菌今天的手把手專欄將為大家介紹,如何用OpenCV隨心所欲幫各種人組合「平均臉」。完整的python代碼可在後臺回復「平均臉」獲取。

讓我們先來看兩張文摘菌好奇的平均臉。

成功男性科技界企業家平均臉長什麼樣?

下圖是小扎,馬斯克,拉裡·佩奇,和傑夫·貝索斯的平均臉。傑夫·貝索斯似乎拉低了發量平均值,不過幸好這張平均臉並沒有全禿。

小扎,馬斯克,拉裡·佩奇,和傑夫·貝索斯的平均臉

奧斯卡最佳女主角平均臉又長什麼樣呢?

下圖為布麗·拉爾森,朱麗安·摩爾,凱特·布蘭切特,詹妮弗·勞倫斯的平均臉。這張平均臉真是非常迷人了!她的牙齒比企業家平均臉潔白整齊得多。一點也不意外!

近四屆奧斯卡最佳女主角:布麗·拉爾森,朱麗安·摩爾,凱特·布蘭切特,詹妮弗·勞倫斯的平均臉

最後,文摘菌還用平均臉生成了一張文摘家主編大大們的平均臉,翻到文末看大大們的顏值哦~

為何平均臉的顏值看起來如此之高?在進入代碼實操之前,讓我們先來簡單了解一下平均臉的歷史。

「平均臉」源於達爾文的堂兄Francis Galton在1878年提出的一種新的攝影技術——通過對準眼睛來合成人臉。他認為,通過生成罪犯的平均臉,人們就可以根據面部特徵來預測一個人是否是罪犯。很顯然,他的假設是錯誤的——你不能通過照片來預測一個人是否是罪犯。然而,「平均臉」這個創意卻流傳了下來。

此後,多項研究證明,平均臉其實比個體臉更具有吸引力。在其中一項研究中,研究者們生成了22名入圍2002年德國小姐評選決賽的選手的平均臉,並讓吃瓜群眾打分。結果顯示人們認為平均臉比22位選手的臉更有吸引力,包括贏得比賽的柏林小姐。緊接著人們發現,柏林小姐的長相和這張平均臉非常接近。噢!原來柏林小姐的臉吸引人,正是因為她的臉接近平均水平!

按常理說,平均臉不應該很平庸嗎?為什麼平均臉吸引人?

根據進化假說,有性繁殖的動物會尋找長著平均臉的伴侶,因為偏離平均值可能產生不利的突變。平均臉也是對稱的,因為臉的左邊和右邊的變化是平均的。(文摘菌頓悟瞬間——原來「大眾臉」可以是個褒義詞。)

接下來,就讓我們一起來OpenCV學習創造「平均臉」!

美國總統的平均臉:從Carter到Obama

文摘菌將以美國總統的臉為例(因為美國總統像清晰且高度一致!),給大家介紹生成平均臉的關鍵技術步驟,完整的python代碼可在後臺回復「平均臉」獲取。

首先,我們需要使用dlib庫在每張面部圖像上建立68個面部基準點。安裝dlib庫的步驟較為複雜,如果你無法成功安裝dlib,可以跳過該步,使用文摘菌為大家準備的面部基準點示例文檔(即為faces文檔中的txt文件)。

面部特徵檢測案例

我們手頭的面部圖像的尺寸很可能是不一樣的,同時面部也很可能處於圖像的不同位置,所以我們需要標準化面部特徵,並把它們放到同一參考坐標系下。

為了實現這一點,我們將圖像大小轉為600*600,把左眼(外眼角)放在像素位置(180,200)右眼(外眼角)放在像素位置(420,200)。我們稱該坐標系統為輸出坐標系統,稱原始圖像坐標為輸入坐標系統。

因為我希望確保兩隻眼睛的點都在一個水平線上面部中心大約在離頂端三分之一高度的位置。所以我將眼角位置設為(0.3*寬,高/3)(0.7*寬,高/3)

在原始圖像的68個面部基準點中,左眼外眼角右眼外眼角分別在基準點36和45。因此我們可以利用這兩個點計算圖像的相似變換矩陣(旋轉、變換和縮放),將輸入坐標系統的點進行轉換為輸出坐標系統

3000*2300大小的輸入圖像通過相似變換矩陣轉為600*600大小的輸出圖像

什麼是相似變換矩陣?(不想學數學的同學可以簡單略過)

如果你想對一個正方形作出轉換,使正方形在x和y方向上分別縮放s_x和s_y,同時將它旋轉theta角度,再在x和y方向上平移t_x和t_y,對應的相似變換矩陣就是

對於一個(x, y)點來說,它的新位置就將會是

代碼實現很簡單(這裡你需要安裝cv2庫):

cv2.estimateRigidTransform(inPts, outPts, False)

相似變換矩陣是一個2*3矩陣,用於轉換點坐標或整個圖像。矩陣前兩列用於轉換與縮放最後一列用於變換(如移位)

這兒還存在一個小問題:

OpenCV要求你至少提供3個點,雖然通過兩點你就可以計算相似變換矩陣了。好消息是,我們可以簡單假設第三個點,讓它與已知的兩個點組成等邊三角形,然後我們就可以使用 estimateRigidTransform了。

得到相似變換矩陣後,我們就可以用來它將輸入圖像和基準點轉換生成輸出坐標了。我們使用warpAffine來轉換圖像,用transform來轉換點。(詳見代碼)

第二步後直接生成的平均臉

上一步中,我們能夠將所有的圖像和關鍵點變換到輸出圖像坐標系。現在所有圖像都是相同大小,並且眼睛的兩角都分別對齊。似乎對這些圖像每個像素的值進行平均我們就能得到平均臉啦。但如果你真這麼做了,會得到上圖這樣的結果。當然眼睛肯定是對齊的,但是其他面部特徵都沒對齊。

如果我們知道兩張輸入圖像的點如何一一對應,那我們很容易就能將兩張圖像完美對齊。然而我們並沒有這些信息。我們只知道這些輸入圖像68個對應點的位置。所以,我們可以用這68個點把圖像分成若干三角形區域,然後對齊這些區域,再對像素值進行平均

平均基準點的Delaunay三角剖分

首先,我們需要計算這68個基準點的坐標平均值,我們利用這68個點(圖6藍色點)以及輸出圖像邊界上的8個點(上圖綠色點)來計算Delaunay三角剖分(上圖紅色邊框)。更多Delaunay三角剖分細節請看這裡(https://www.learnopencv.com/delaunay-triangulation-and-voronoi-diagram-using-opencv-c-python/)。

Delaunay三角剖分將圖像分解成若干三角形。Delaunay三角剖分的結果是一個三角形列表,用76個點(68個人臉基準點+8個邊界點)的序號表示。下面的矩陣展示了部分三角形列表,我們看到,關鍵點62、68和60形成一個三角形32、50和49形成另一個三角形,等等。

[

62 68 60

32 50 49

15 16 72

9 8 58

53 35 36

…  ]

基於Delaunay三角剖分的圖像扭曲

至此,我們計算出了人臉基準點的平均位置,並用這些位置計算出Delaunay三角剖分,將圖像分成若干三角形。如上圖所示,左圖是變換後輸入圖像的Delaunay三角剖分,中圖是平均關鍵點的三角剖分。注意,左圖的三角形1對應中圖的三角形1。用左圖三角形1的三個頂點及其對應的中圖三個頂點計算變換矩陣。用這一變換將左圖三角形1中的所有像素變換到中圖的三角形1中去。對左圖每個三角形重複該過程,得到右圖這一結果。右圖只是將左圖扭曲到平均臉。

現在,激動人心的時刻到了!

經過了上述處理之後,我們就可以對這些照片的像素取平均值,得到神奇的平均臉了。

當然,你也可以生成對稱臉,將一張臉及其鏡像進行平均。比如:

對歐巴馬的圖像(左)及其鏡像(右)進行平均得到對稱臉(中)

彩蛋部分!文摘菌也製作了編輯大大們的平均臉。噔噔噔噔!

   歡迎評論猜他們都是誰呀:)

如果你也想自己製作平均臉,可以在大數據文摘後臺回復「平均臉」獲取Python代碼

課程推薦

數據科學實訓營第4期

優秀助教推薦|姜姜

作為一枚對數據分析的理解僅限於Excel的小白,曾經一直認為通過寫代碼來分析數據是件無比高大上的事。可是,在文摘的數據科學實訓營居然就實現了!

手把手的教學方式,助教和同學們熱烈的交流討論,讓我慢慢地覺得一行行代碼如此親切。而當把自己頭腦中的構思通過代碼實現,看到結果的那一刻,真是無比激動!

經過Kaggle、天池的案例的歷練,對這些數據比賽也開始興趣盎然,有沒有小夥伴有興趣一起去玩一玩的?

作為第4期的北美地區助教,寄語各位學員:前方高能,請準備好足夠的時間,如果你能按時提交作業,結業時一定脫胎換骨。

點擊圖片閱讀

聯合國曝光AI殺手機器人,這可能是你見過最恐怖的視頻

相關焦點

  • 「python opencv 計算機視覺零基礎實戰」第一節
    本文系統及環境:本文將在windows7作業系統下以python作為程式語言,完成對opencv的程序編寫。python版本是3.8。2.2 opencv可以做什麼opencv應用廣泛,例如人臉識別、車牌識別、機器人、指紋、文字等,還可以對圖片信息進行方便的編輯,例如可以模糊圖片、檢測目標等;我們可以通過學習opencv可以做一個「檢測老闆面部自動切屏程序」、「類似於圖片摳圖等圖片操作的軟體」、「自動駕駛」等。
  • python利用opencv實現證件照換底
    網上交證件照的時候不同單位對底色的要求不一樣,當你手裡只有一張藍底照片,卻要求交紅底或者白底的證件照時,不免就尷尬了些。此時的你為了避免重拍的麻煩,不得不打開ps一點一點地去摳圖換背景,費時費力。opencv今天就給大家介紹一下python利用opencv庫進行藍底換紅底或者白底照片的操作。
  • 測試~python庫介紹(一) opencv
    這個需求如果放在4年前,我的做法是這樣的1、取一款60FPS手機(若粒度精細可使用iPhone的慢動作,最高可達240fps),使用支架固定,打開開發者指針位置;2、取測試機放在鏡頭前,手動點擊app,跳轉完成後清除數據重複操作;3、用KMplayer播放視頻,按F鍵一幀一幀的計算圖像變化,算出啟用加載的總時長。
  • 「python opencv視覺零基礎」十、圖片效果毛玻璃
    一、學習目標了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 樹莓派3b編譯安裝完整OpenCV-3.4.1 for Python3
    從頭開始的手把手帶大家編譯安裝OpenCV3.4.1哦,包過包教會。要開車了,還沒上車的趕緊上車!一、Python3虛擬環境和swap分區的配置需要注意的是我們需要擴大swap分區,因為樹莓派默認的1GB RAM + 100MB SWAP不夠用!
  • Python OpenCV查找圖中的四邊形/矩形
    實例來源於OpenCV自帶歷程,這裡以OpenCV4.2為例,路徑為:F:\opencv4.2_release\opencv
  • 基於opencv 的圖像處理入門教程
    /代碼和樣例圖片的地址:https://github.com/ccc013/CodesNotes/tree/master/opencv_noteshttps://github.com/ccc013/CodesNotes/blob/master/opencv_notes/opencv_image_process_tutorial.ipynb
  • python 基於opencv 繪製圖像輪廓
    這篇文章主要介紹了python 基於opencv 繪製圖像輪廓的示例,幫助大家更好的利用python的opencv庫處理圖像,感興趣的朋友可以了解下
  • OpenCV人臉識別之一:數據收集和預處理
    本系列人臉識別文章用的是opencv2,最新版的opencv3.2的代碼請參考文章:《OpenCV之識別自己的臉——C++源碼放送》;《人臉識別源碼運行指南》(小編附在文末)前段時間對人臉檢測進行了一些嘗試:人臉檢測(C++/Python)(http://www.jianshu.com/p/504c081d7397)但是檢測和識別是不同的,檢測解決的問題是圖片中有沒有人臉;而識別解決的問題是
  • 畢業設計| 樹莓派3B+與opencv3+PyQt5實現人臉識別門禁系統
    在開始大幹之前,需要做一些準備:在電腦上,先把程序跑通再移植到樹莓派上部署,我在pycharm上面把程序跑通(代碼在後頭)。id=9d025059ad0326d9511ea4fc2bea321b&type=note注意:opencv-python庫、opencv-contrib-python庫這兩個庫的版本要一致。opencv-contrib-python庫是opencv-python庫的升級版,人臉識別的算法在裡面。
  • 10行代碼實現python人臉識別
    用攝像機或攝像頭採集含有人臉的圖像或視頻流,並自動在圖像中檢測和跟蹤人臉,進而對檢測到的人臉進行臉部識別的一系列相關技術,通常也叫做人像識別、面部識別。目前的人臉識別技術已經非常成熟了,還發展成3D人臉識別。而且現在各大廠商也都提供了人臉識別的API接口供我們調用,可以說幾行代碼就可以完成人臉識別。但是人臉識別的根本還是基於圖像處理。
  • 自己動手製作「平均臉」【2】
    幸運的是,這麼複雜的操作,我們用OpenCV,幾行代碼就搞定了!完整代碼在筆者的GitHub的AverageFace項目:https://github.com/juliali/AverageFace用大合影構造「平均臉」原理和代碼都非常簡單,不過在實際運行當中,我們需要注意:
  • 【附完整代碼:AI實戰】動手編寫人臉識別
    既然人臉識別這麼有用,那麼我們能否自己來實現一個人臉識別呢?答案是肯定的。接下來將在之前我們搭建好的AI基礎環境上(見文章:手把手教你搭建AI基礎環境),實現人臉識別模型。同樣地,再通過其它的矩形模板進行掃描,當發現具備眼睛、鼻梁、嘴巴等特徵且超過一定的閾值時,則判定為是一張人臉。
  • 用Python玩人臉合成,你也能有一張明星臉(附代碼)
    變臉視頻,一睹為快下面小編就帶領大家從以下的幾個方面來打造一款向上圖所示的人臉識別軟體。1).首先是人臉識別的原理介紹要進行人臉的融合,且融合後兩個人臉的位置應該大體一致,這要如何才能做到呢?首先便是人臉的檢測,只有檢測到了人臉,才能進行接下來的工作。
  • 使用visual studio或msys2(mingw64)與VS Code編譯並使用openCV
    2.3 安裝python2.7OpenCV編譯需要python的numpy工具包,如果要編譯OpenCV的python接口,同樣需要安裝python,雖然目前python已經停止對python2的支持,但和大多數歷史遺留項目一樣,opencv仍然需要安裝python2版本。
  • Python也能成為畢卡索?我用Python給小姐姐畫了幅油畫
    點擊上方「菜鳥學Python」,選「星標」公眾號重磅乾貨,第一時間到達小編的舍友最近交了一個女朋友所以,小編今天也來畫畫,都說Python無所不能,今天就來秀一下如何把圖片轉化為油畫效果。小編不僅給大家展示結果,還要用白話給大家解釋背後的原理,嘿嘿!一起來看看吧!01.程序原理下圖展示的是圖片轉為油畫的原理。
  • 20行代碼竟然就可以給證件照換底色!快收藏
    Python裡竟然20行代碼就可以搞定,學會快收藏!首先我們來準備好需要換證件照:第一步,我們需要在Python中讀取圖片並且顯示出來。這裡面要用到的一個模塊是cv2,如果沒有的話使用pip install opencv-python就可以安裝,注意這裡是安裝opencv-python採可以直接用cv2這個模塊。
  • Python一行代碼,能玩這麼多童年的遊戲?
    >,一行代碼就能進入使用Python開發的小遊戲快樂玩耍!安裝完之後我們可以使用python -m freegames list來查看所有的遊戲列表貪吃蛇現在我們可以使用一行代碼啟動相關遊戲,比如貪吃蛇snakepython -m freegames.snake
  • python3+dlib人臉識別及情緒分析
    2、眉毛上揚,17-21 或者 22-26 號特徵點距離面部識別框頂部與識別框高度的比值越小,說明眉毛上揚越厲害,可表示驚訝、開心。眉毛的傾斜角度,開心時眉毛一般是上揚,憤怒時皺眉,同時眉毛下壓的比較厲害。3、眯眼睛,人在開懷大笑的時候會不自覺的眯起眼睛,憤怒或者驚訝的時候會瞪大眼睛。