一行代碼搞定人臉識別

什麼,只要一行代碼就能搞定人臉識別?固然是假的啦。python

雖然不能一行就搞定,依靠python強大的人臉識別包,只要十多行代碼徹底能夠實現人臉識別的功能。這就叫站在巨人的肩膀上,看得更高更遠。linux

face-recognition,使用最早進的人臉識別技術構建而成的python包,並且具備深度學習功能。經測試識別正確率高達99.38%。確實很高。c++

安裝

由於face-recognition使用到了dlib庫,這是c++寫的一個包含機器學習,計算機視覺等算法的庫,因此使用以前要先安裝dlib。不過這還不行,dlib庫又依賴一個叫作boost的東西,總之有些麻煩,因此我就不寫詳細步驟啦╰( ̄▽ ̄)╭。linux下安裝比較簡單,命令行下幾行代碼就搞定,windows安裝見這裏。git

全部工做準備好以後,使用pip安裝:github

pip install face-recognition算法

人臉檢測

如何檢測一張圖片中的人臉?face-recognition把帶人臉的圖片當作是由像素組成的二維數組,使用face_locations方法返回識別到的人臉的座標(上下左右)。windows

這樣就能夠啦,接下來只要把這些人臉座標用矩形框圈出來,而後保存便可。數組

import face_recognition
from skimage import draw, io
%matplotlib inline
# 圖片文件
files = "F:\data\people.jpg"
# 加載圖片
image = face_recognition.load_image_file(files)
# 識別人臉座標
face_locations = face_recognition.face_locations(image)

# 咱們在此使用以前介紹過的skimage庫進行繪製
# 讀出的圖片在skimage中不能使用,故從新導入
img = io.imread(files)

print("I found {} face(s) in this photograph.".format(len(face_locations)))

# 循環標記人臉
for face_location in face_locations:
    # 每一個人臉的座標
    top, right, bottom, left = face_location
    # 爲每一個人臉畫四邊形
    # polygon_perimeter做用是繪製不填充的多邊形
    rr, cc = draw.polygon_perimeter([top, top, bottom, bottom], [left, right, right, left])
    # 設置顏色爲紅色
    draw.set_color(img, [rr, cc], [255, 0, 0])

# 保存
io.imsave('F:result.jpg', img)
I found 24 face(s) in this photograph.

咱們打開圖片看看效果。機器學習

import matplotlib.pyplot as plt
from skimage import io

origin = io.imread(files)
reco = io.imread('f:result.jpg')

plt.subplot(1, 2, 1)
plt.imshow(origin)
plt.subplot(1, 2, 2)
plt.imshow(reco)

圖片描述

效果不錯,都識別出來了。學習

人臉識別

既然可以識別出有沒有人臉,有可能知道這我的是誰嗎?固然能夠了,前提是你要提供一張包含某我的臉的照片。使用face_encodings對人臉進行編碼,而後使用compare_faces方法比較便可。看代碼。

import face_recognition

# 首先打開一張已經知道是誰的照片,而後打開另外一張照片
zhuyizhi_image = face_recognition.load_image_file("F:zhuyizhi.jpg")
unknown_image = face_recognition.load_image_file("F:unknow.jpg")

# 識別出已知和未知人臉的面部特徵
zhu_face_encoding = face_recognition.face_encodings(zhuyizhi_image)[0]
unknown_face_encoding = face_recognition.face_encodings(unknown_image)[0]

# 能夠添加多個已知的人臉照片
known_faces = [
    zhu_face_encoding,
 
]

# 比較已知人臉和未知人臉,返回結果爲true或者false。
results = face_recognition.compare_faces(known_faces, unknown_face_encoding)

print("Is the unknown face a picture of zhuyizhi? {}".format(results[0]))
print("Is the unknown face a new person that we've never seen before? {}".format(not True in results))
Is the unknown face a picture of zhuyizhi? True
Is the unknown face a new person that we've never seen before? False

除了能檢測出和識別出人臉以外,face-recognition還提供深度學習參數的支持,使得識別率更高。

本人才疏學淺,上文中不免有些錯誤,還請各位品評指正。若是以爲寫的還行,歡迎你們多多分享哈。

相關文章
相關標籤/搜索