【Python自動戴聖誕帽】01 熟悉face_recognition庫

近兩三年每次一到聖誕節,朋友圈裏面就各類「@微信官方 給我一頂聖誕帽」。先不說微信官方到底給沒給,本着「求人不如求己」的想法,此次咱們來用Python寫一個自動戴聖誕帽的腳本。html

緣起

每到聖誕節,朋友圈就會變得熱鬧起來。你們都爭先恐後向微信官方討要聖誕帽:python

你還別說,微信官方真還圓了各位網友的願望:git

且不說有沒有人信,這波網友的演技絕對是滿分。github

注:本節圖片來自新浪新聞->重慶商報在2017年12月23日 12:35的 文章,若有侵權請聯繫刪除。shell

簡要分析

本着「本身動手,豐衣足食」的精神,打算本身擼一個戴聖誕帽的腳本,畢竟微信官方要照顧這麼多人的須要,着實挺忙的。微信

那麼,要把一頂聖誕帽自動戴到頭像(這裏只考慮頭像包含人臉的狀況)的正確位置,須要怎樣作呢?markdown

下面是我認爲的步驟:學習

  1. 獲取頭像定位人臉
  2. 獲取人臉關鍵點
  3. 獲取合適的聖誕帽位置
  4. 調整聖誕帽大小
  5. 合成頭像

人臉檢測

要定位人臉就不得不說到人臉檢測技術了。spa

人臉檢測和識別的研究一直很火熱,成熟的落地應用也很是多。多數地方坐火車能夠刷臉進站,甚至有些地方在付錢的時候某付寶還支持刷臉付款。code

與此同時,不少研究人員開源了本身的代碼庫供學習者參考。

本文采用的就是號稱世界上最簡潔的人臉識別庫——face_recognition庫。

熟悉face_recognition

face_recognition的人臉識別基於業內領先的深度學習模型,在Labeled Faces in the Wild人臉數據集下有高達99.38%的準確率,惟一美中不足的是對小孩和亞洲人臉的識別準確率尚待提高。在實際使用中,人臉檢測的效果還受臉部的光照以及遮擋等的影響,但無妨咱們作研究。

最近有一部很火的電視劇《慶餘年》,咱們就拿這部劇中的人物來作實驗。

下面是《慶餘年》的劇照或是宣傳照,真的是俊男美女呀:

在這裏提一下安裝方法。因爲face_recognition庫依賴的dlib包須要編譯,懶得麻煩的同窗能夠直接下載已經編譯好了的.whl文件用pip命令安裝,或者在公衆號後臺回覆face_recognition獲取。安裝命令以下:

pip install dlib-****.whl
複製代碼

人臉位置檢測

既然是號稱世界上最簡潔的人臉識別庫,代碼必然很簡潔。

首先天然是引入相關的包:

import face_recognition
import cv2
複製代碼

而後用face_recognition來讀取有人臉的圖片:

image = face_recognition.load_image_file('your-path-to-face')
複製代碼

關鍵代碼來了:

face_locations = face_recognition.face_locations(image)
複製代碼

對,你沒看錯,這一句話就檢測到了圖片中全部的人臉。簡單的處理一下,在檢測到臉的地方畫一個框:

for top, right, bottom, left in face_locations:
    cv2.rectangle(image, (left, top), (right, bottom), (0, 0, 255), 2)
    face_locations = face_recognition.face_locations(image)
cv2.imshow('rects_face', image[:,:,::-1])
cv2.waitKey(0)
複製代碼

細心的讀者可能會注意到image[:,:,::-1]。緣由是讀取圖片時,普通的方法通常是按照RGB的順序排列,而OpenCV中則是以BGR的順序排列,因此須要在最後一個維度使用::-1的方式進行倒序處理。

下面是人臉識別的結果:

是否是很簡單,加上包引入以及顯示的代碼總共才9行。

人臉關鍵點檢測

仔細觀察檢測到的臉部,會發現框住的位置都比較寬泛,沒辦法比較緊密的貼合臉部,這樣後面戴聖誕帽會很難作。不過好在face_recognition庫還爲咱們提供了人臉關鍵點檢測功能,能夠告訴咱們五官的詳細座標。

在獲取座標以前,仍是須要先檢測到人臉代碼與上面相似:

image = face_recognition.load_image_file(face)
face_locations = face_recognition.face_locations(image)
face_landmarks = face_recognition.face_landmarks(image, face_locations)
複製代碼

仍是一句代碼解決問題。face_landmarks裏面存儲的即是五官詳細位置。以「範閒」爲例,face_landmarks的具體信息以下:

[{
	'chin': [(148, 100), (149, 117), (152, 133), (155, 148), (161, 163), (169, 177), (178, 189), (190, 198), (203, 200), (216, 198), (226, 189), (235, 178), (244, 165), (250, 151), (254, 136), (257, 120), (259, 104)],
	'left_eyebrow': [(162, 105), (172, 103), (182, 106), (191, 109), (202, 112)],
	'right_eyebrow': [(213, 114), (222, 110), (231, 106), (241, 103), (250, 106)],
	'nose_bridge': [(206, 121), (206, 131), (206, 141), (206, 151)],
	'nose_tip': [(195, 156), (200, 157), (206, 159), (211, 157), (216, 155)],
	'left_eye': [(173, 118), (179, 117), (187, 117), (192, 121), (185, 123), (178, 122)],
	'right_eye': [(220, 122), (226, 118), (233, 117), (239, 119), (234, 123), (227, 123)],
	'top_lip': [(187, 174), (194, 171), (201, 169), (206, 171), (211, 169), (216, 171), (223, 173), (220, 174), (211, 174), (205, 175), (200, 174), (191, 174)],
	'bottom_lip': [(223, 173), (216, 180), (210, 184), (205, 185), (200, 184), (193, 181), (187, 174), (191, 174), (200, 175), (205, 176), (211, 175), (220, 174)]
}]
複製代碼

總共72個關鍵點,其中左右眉毛各5個、左右眼睛各6個、鼻子5個、鼻樑4個、上下嘴脣各12個和臉頰17個。

跟前面同樣,爲了直觀的觀察,用代碼將這些點畫出來,代碼以下:

for each in face_landmarks:
    for i in each.keys():
        for any in each[i]:
            points_face = cv2.circle(points_face, any, 3, (0,0,255), -1)
複製代碼

結果以下:

有了這些關鍵點,咱們就比較容易的定位聖誕帽的位置了。

下期預告

上面提到的這些都是face_recognition庫提供的最基礎的功能,face_recognition庫還有更多更好玩的地方。下期咱們會再簡單介紹其餘功能,而後實現咱們的自動戴帽腳本,敬請期待~

後記

無論寫什麼,但願能跟更多人溝通,有問題或者需求隨時歡迎交流。

我全部的項目源碼都會放在下面的github倉庫裏面,有須要能夠參考,有問題歡迎指正,謝謝!

https://github.com/TitusWongCN/WeChatSubscriptionArticles
複製代碼

下面是個人公衆號,有興趣能夠掃一下:

相關文章
相關標籤/搜索