調包俠系列之—調用face_recognition進行人臉識別


前兩天,我問過一個大佬,像我這種沒基礎的多久能做一個人臉識別的小樣。大佬答曰兩三天吧。我深感驚訝。追問道,像我這種沒基礎的。大佬又曰一個星期吧,看看論文,看看源碼,提升很快的。抱着將信將疑的態度,開始了人臉識別的學習。在經歷兩天安裝openCV,dlib之後,仍然沒有代碼實現,直到調用了face_recogniton.

face_recognition 是啥

俺也不知道face_recognition是誰家開發的,但是聽說face_recognition是世界上最簡單的人臉識別庫,在Python或命令行中識別和操作人臉。使用dlib最先進的人臉識別技術構建而成,並具有深度學習功能。 該模型在Labeled Faces in the Wild基準中的準確率爲99.38%。
我在使用之後發現,face_recognition簡直就是神器,是傻瓜般的人臉操作,使用face_recognition,十分鐘學會人臉識別不是夢。

face_recognition 安裝與配置

俺不知道是否需要先安裝dlib,因爲我已經安裝dlib(費了不少勁兒)。先嚐試一下pip install face_recognition再說了,不行的那就是需要安裝dlib了。安裝dlib方式如下:

安裝dlib

通過如下網址進入到dlib主頁
https://pypi.org/project/dlib/18.17.100/
然後選擇合適的版本,我選的是18.17.100,如下操作

pip install dlib==18.17.100

檢測人臉,並用框框框起來

face_recognition 的人臉檢測函數是face_locations(image),返回image裏的所有的臉的座標,是一個鏈表,每一個元素是(top, right, bottom, left)。

# -*- coding: utf-8 -*-
# @Time    : 2019/11/30 11:21
# @Author  : HelloWorld!
# @FileName: xxx.py
# @Software: PyCharm
# @python.version:3.6

#框臉
import face_recognition
from PIL import ImageDraw,Image
image_file='D:\\AITFPy\\Face\\data_beauty\\3.jpg'
image=face_recognition.load_image_file(image_file)
face_location=face_recognition.face_locations(image) #返回所有的臉的座標框
top, right, bottom, left=face_location[0]            #第一個臉的座標,我們圖片裏只有一個臉,所以取第一個

#把原來臉的基礎上畫出來臉
pil_image=Image.fromarray(image)
d=ImageDraw.Draw(pil_image,'RGBA')
d.rectangle((left,top,right, bottom),outline=(0,255,0,128),width=3)
pil_image.show()

效果是下面這樣的:
在這裏插入圖片描述
kuang
在這裏插入圖片描述

衆裏尋他千百度,查看此人在不在

下面我們在圖片裏尋找一下某人在不在。其操作步驟是把圖片所有的人臉檢測出來然後編碼,與被測人臉的編碼對比,如果其距離小於某個值(默認0.6),則認爲某人在圖片中。採用的編碼調用函數是faces_encodings=face_recognition.face_encodings(image,face_locations),而比較函數是face_recognition.compare_faces([face_encoding],face_encoding_a66),裏面調用了兩個編碼的距離計算函數face_recognition.face_distance([face_encoding], face_encoding_a66)
下面從紅軍利物浦的一張合照裏找一下我們的紅軍太子小機靈鬼阿諾德在不在圖裏。帥氣的合照liv2.jpg如下,小機靈鬼在範大腿和馬大腿之間。在這裏插入圖片描述太子阿諾德的定妝照a66.jpg如下:
在這裏插入圖片描述
我們首先把圖片裏的所有紅軍將士的臉框起來,然後在看看阿諾德在不在圖裏。

#框臉
import face_recognition
from PIL import ImageDraw,Image
image_file='D:\\AITFPy\\Face\\data_beauty\\liv2.jpg'
img_file_a66='D:\\AITFPy\\Face\\data_beauty\\a66.jpg'
image=face_recognition.load_image_file(image_file)
face_locations=face_recognition.face_locations(image) #返回所有的臉的座標框
pil_image=Image.fromarray(image)
d=ImageDraw.Draw(pil_image,'RGBA')
#把原來臉的基礎上畫出來臉
for face in face_locations:
    top, right, bottom, left=face
    d.rectangle((left,top,right, bottom),outline=(0,255,0,128),width=3)
pil_image.show()
pil_image.save("3k.jpg")

#獲取圖片裏面所有的臉的編碼
faces_encodings=face_recognition.face_encodings(image,face_locations)

#讀待測圖片的臉位置和編碼
image_a66=face_recognition.load_image_file(img_file_a66)
face_a66=face_recognition.face_locations(image_a66)
face_encoding_a66=face_recognition.face_encodings(image_a66,face_a66)[0]

for face_encoding in faces_encodings:
    result=face_recognition.compare_faces([face_encoding],face_encoding_a66)
    distance = face_recognition.face_distance([face_encoding], face_encoding_a66)
    print("distance is ",distance)
    if result[0]:
        print("a66 is in the picture")

框臉的結果如下,除了我們的煙燻太歲馬大腿都被框出來了,這也許就是人臉識別的種族歧視把。
在這裏插入圖片描述
再看一下人臉測距結果 ,我們發現阿諾德在合照裏。那麼他和誰更像一點distance is [0.66382813],這個更近,定位了一下是馬向前馬蒂普馬大腿。。。,果然後衛一家親。

distance is  [0.80983155]
distance is  [0.68695194]
distance is  [0.42896597]
a66 is in the picture
distance is  [0.8394327]
distance is  [0.80912881]
distance is  [0.69498012]
distance is  [0.66382813]
distance is  [0.75636502]
distance is  [0.73218545]
distance is  [0.8141693]

百變星君,美顏美圖隨心所欲

我們看到女孩們通過美圖美顏個個賽貂蟬,在圖片上摸個口紅,隆個鼻都可以,那麼是怎麼做的呢。其中用到了讀取臉部特徵的函數face_landmarks_list=face_recognition.face_landmarks(image),face_landmarks的輸出結果是關於嘴脣、眼睛等五官的特徵。通過調試,我們看到有9個基本特徵,以字典的數據格式存放,如下圖。
在這裏插入圖片描述
今天我們給圖裏的人臉上口紅,即在top_lip,bottom_lip這兩個特徵上做文章。原圖如下:
在這裏插入圖片描述
經過如下操作

#美圖
import face_recognition
from PIL import Image, ImageDraw
img_filename='D:\\AITFPy\\Face\\data_beauty\\9.jpg'
image=face_recognition.load_image_file(img_filename)
face_location=face_recognition.face_locations(image)
face_landmarks_list=face_recognition.face_landmarks(image)
for face_landmark in face_landmarks_list:
    pil_image=Image.fromarray(image)
    d=ImageDraw.Draw(pil_image,'RGBA')
    d.polygon(face_landmark['top_lip'], fill=(255, 0, 0, 128))
    d.polygon(face_landmark['bottom_lip'], fill=(0, 0, 0, 128))
    d.line(face_landmark['top_lip'], fill=(150, 0, 0, 64), width=3)
    d.line(face_landmark['bottom_lip'], fill=(150, 0, 0, 64), width=3)
    pil_image.show()
    pil_image.save('v.jpg')

美妝博主的效果如下:
在這裏插入圖片描述

總結

face_recognition 實在是太簡單了,太方便了,搞個小玩意,做個小樣,妥妥滴。然後作爲一個嚴肅的深度學習愛好者,絕對不能僅僅侷限於此,後面我們要深挖背後的技術原理,然後學習其他的人臉識別方法和框架。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章