20行代碼實(shí)現(xiàn)人臉檢測(cè)

如今活逆,“刷臉”已經(jīng)成為人們生活中的日常,刷臉支付拗胜、人臉解鎖蔗候、門禁等,都運(yùn)用了人臉識(shí)別技術(shù)埂软。人臉識(shí)別技術(shù)已廣泛應(yīng)用于金融锈遥、司法、公安勘畔、教育所灸、醫(yī)療等諸多領(lǐng)域,同時(shí)也涌現(xiàn)出如:曠視科技炫七、商湯科技等一批優(yōu)秀的企業(yè)爬立。

人臉識(shí)別算法主要分為三個(gè)流程:

  • 人臉檢測(cè)(Face Detection)
  • 人臉對(duì)齊(Face Alignment)
  • 人臉特征表征(Feature Representation)

本文我們主要針對(duì)人臉檢測(cè)這一部分,利用OpenCV和face_recognition庫(kù)分別實(shí)現(xiàn)圖片中的人臉檢測(cè)万哪。

開發(fā)環(huán)境

  • Windows 10(x64)
  • OpenCV 4.1.0.25
  • face_recognition 1.2.3

使用OpenCV進(jìn)行人臉檢測(cè)

OpenCV實(shí)現(xiàn)人臉檢測(cè)的主要思路為:

  • 將圖片轉(zhuǎn)換成灰度圖(降為一維的灰度侠驯,減低計(jì)算強(qiáng)度)
  • 使用訓(xùn)練分類器查找人臉
  • 圖片上畫矩形

圖片轉(zhuǎn)為灰度圖

使用OpenCV的cvtColor()方法轉(zhuǎn)換圖片顏色

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

使用訓(xùn)練分類器查找人臉

在使用OpenCV的人臉檢測(cè)之前抡秆,需要一個(gè)人臉訓(xùn)練模型,格式為xml吟策。

我們這里使用OpenCV提供好的人臉分類模型xml琅轧,下載地址如下:
https://github.com/opencv/opencv/tree/master/data/haarcascades

圖片上畫矩形

使用OpenCV的rectangle()繪制矩形

檢測(cè)結(jié)果

detection_with_face_recognition_result.png

完整代碼

# 使用OpenCV進(jìn)行人臉檢測(cè)
import cv2
from matplotlib import pyplot as plt

imagePath = './test_face_detection.jpg'
# 引入OpenCV提供的人臉分類模型xml
cascPath = './haarcascade_frontalface_default.xml'
# Create the haar cascade
faceCascade = cv2.CascadeClassifier(cascPath)

# 讀取圖像并轉(zhuǎn)為灰度圖
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 檢測(cè)圖片中的人臉
faces = faceCascade.detectMultiScale(
  gray,
  scaleFactor=1.1,
  minNeighbors=4,
  minSize=(30, 30)
)
color = (0, 255, 0)
# 用矩形框?qū)⑷四樋虺鰜?lái)
for (x, y, w, h) in faces:
  cv2.rectangle(image, (x, y), (x+w, y+h), color, 2)

plt.title("Found {0} faces!".format(len(faces)))
plt.axis("off")
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()

參數(shù)說(shuō)明

  • gray:轉(zhuǎn)換的灰度圖
  • scaleFactor:圖像縮放比例,可理解為相機(jī)的x倍鏡
  • minNeighbors:對(duì)特征檢測(cè)點(diǎn)周邊多少有效點(diǎn)同時(shí)檢測(cè)踊挠,這樣可避免因選取的特征檢測(cè)點(diǎn)太小而導(dǎo)致遺漏
  • minSize:特征檢測(cè)點(diǎn)的最小尺寸

使用face_recognition庫(kù)進(jìn)行人臉檢測(cè)

face_recognition庫(kù)是使用Dlib最先進(jìn)的面部識(shí)別功能構(gòu)建而成,具有深度學(xué)習(xí)功能冲杀。該模型在LFW上的準(zhǔn)確率為99.38%效床。

檢測(cè)結(jié)果

detection_with_opencv_result.png

從上面的結(jié)果來(lái)看,face_recognition庫(kù)的檢測(cè)準(zhǔn)確率比OpenCV的高权谁。

完整代碼

# 使用face_recognition庫(kù)進(jìn)行人臉檢測(cè)
import face_recognition
import cv2
from matplotlib import pyplot as plt

imagePath = './test_face_detection.jpg'

# 使用face_recognition加載圖片,并檢測(cè)人臉
image = face_recognition.load_image_file(imagePath)
#檢測(cè)圖片中所有人臉
face_locations = face_recognition.face_locations(image)

# 用矩形框框出檢測(cè)到的人臉
for (top, right, bottom, left) in face_locations:
  cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)

plt.title("Found {0} faces!".format(len(face_locations)))
plt.axis("off")
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()

識(shí)別人臉關(guān)鍵點(diǎn)

調(diào)用face_recognition.face_landmarks()方法即可得到人臉特征點(diǎn), 返回一個(gè)字典, 下圖是返回的數(shù)據(jù), 包括chin(下巴), left_eye(左眼)等剩檀。

{'chin': [(184, 182), (187, 198), (191, 213), (196, 229), (202, 243), (211, 256), (223, 266), (236, 275), (251, 277), (267, 273), (281, 263), (295, 251), (304, 236), (308, 219), (309, 201), (311, 184), (311, 167)], 'left_eyebrow': [(192, 170), (199, 163), (210, 162), (220, 163), (231, 166)], 'right_eyebrow': [(246, 163), (258, 158), (269, 155), (281, 155), (291, 160)], 'nose_bridge': [(240, 177), (240, 187), (240, 197), (241, 208)], 'nose_tip': [(233, 217), (238, 218), (243, 219), (248, 217), (254, 215)], 'left_eye': [(205, 181), (211, 177), (219, 177), (226, 180), (219, 183), (211, 183)], 'right_eye': [(258, 177), (264, 172), (272, 172), (279, 174), (273, 178), (265, 178)], 'top_lip': [(228, 242), (234, 236), (240, 231), (245, 232), (250, 230), (258, 233), (267, 238), (263, 238), (251, 237), (246, 238), (241, 238), (232, 242)], 'bottom_lip': [(267, 238), (259, 243), (252, 247), (247, 248), (241, 248), (235, 246), (228, 242), (232, 242), (241, 239), (246, 239), (251, 238), (263, 238)]}

人臉關(guān)鍵點(diǎn)檢測(cè)結(jié)果

test_face_landmarks_result.png

完整代碼

# 調(diào)用face_recognition.face_landmarks()方法得到人臉特征點(diǎn)
import face_recognition
import cv2
from matplotlib import pyplot as plt

imagePath = './test_face_landmarks.jpg'

image = face_recognition.load_image_file(imagePath)
face_landmarks_list = face_recognition.face_landmarks(image)

for each in face_landmarks_list:
  for i in each.keys():
    for any in each[i]:
      image = cv2.circle(image, any, 2, (0, 255, 0), 1)

plt.title("Face landmarks")
plt.axis("off")
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()

本文只是使用OpenCV和face_recognition庫(kù)進(jìn)行實(shí)現(xiàn)簡(jiǎn)單的人臉檢測(cè),基于此我們還可以進(jìn)行許多好玩的事情旺芽,比如:臉部輪廓繪制沪猴、數(shù)字化妝、頭像特效合成等等采章。

上述人臉檢測(cè)demo的github地址:
https://github.com/Hanpeng-Chen/tensorflow-learning/tree/master/face_detection

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末运嗜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子悯舟,更是在濱河造成了極大的恐慌担租,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抵怎,死亡現(xiàn)場(chǎng)離奇詭異奋救,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)反惕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門尝艘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人姿染,你說(shuō)我怎么就攤上這事背亥。” “怎么了盔粹?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵隘梨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我舷嗡,道長(zhǎng)轴猎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任进萄,我火速辦了婚禮捻脖,結(jié)果婚禮上锐峭,老公的妹妹穿的比我還像新娘。我一直安慰自己可婶,他們只是感情好沿癞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矛渴,像睡著了一般椎扬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上具温,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天蚕涤,我揣著相機(jī)與錄音,去河邊找鬼铣猩。 笑死揖铜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的达皿。 我是一名探鬼主播天吓,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼峦椰!你這毒婦竟也來(lái)了龄寞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤们何,失蹤者是張志新(化名)和其女友劉穎萄焦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冤竹,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拂封,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹦蠕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冒签。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钟病,靈堂內(nèi)的尸體忽然破棺而出萧恕,到底是詐尸還是另有隱情,我是刑警寧澤肠阱,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布票唆,位于F島的核電站,受9級(jí)特大地震影響屹徘,放射性物質(zhì)發(fā)生泄漏走趋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一噪伊、第九天 我趴在偏房一處隱蔽的房頂上張望簿煌。 院中可真熱鬧氮唯,春花似錦、人聲如沸姨伟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)夺荒。三九已至瞒渠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間技扼,已是汗流浹背在孝。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淮摔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓始赎,卻偏偏與公主長(zhǎng)得像和橙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子造垛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一點(diǎn)背景知識(shí) OpenCV 是一個(gè)開源的計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)庫(kù)魔招。它包含成千上萬(wàn)優(yōu)化過(guò)的算法,為各種計(jì)算機(jī)視覺應(yīng)用提...
    沬日十七閱讀 1,000評(píng)論 0 4
  • 在研究人臉識(shí)別的時(shí)候乡翅,收集了一下相關(guān)人臉檢測(cè)和識(shí)別的相關(guān)API,有的是免費(fèi)罪郊,有的是付費(fèi)的蠕蚜,但是都希望給讀者展示出來(lái)...
    浪跡當(dāng)歸閱讀 1,857評(píng)論 1 23
  • 去年靶累,因?yàn)楹⒆映錾覀儾]有出去打工癣疟,而是留在老家挣柬。 四月五日,清明節(jié)睛挚,按老公這邊的慣例邪蛔,是要一起祭祖。往常都是...
    杜言初閱讀 227評(píng)論 0 0