基於Python的face_recognition庫實現人臉識別



一、face_recognition庫簡介


face_recognition是Python的一個開源人臉識別庫,支持Python 3.3+和Python 2.7。引用官網介紹:

Recognize and manipulate faces from Python or from the command line with the world's simplest face recognition library.

之所以選用這個庫,是因為

1、用這個庫來實現一個人臉識別程序非常簡單,環境配置也很容易;

2、可以直接使用已經訓練好的模型,不需要在本地重新訓練。一般普通的電腦都可以直接運行識別程序,硬件環境要求不高。
PS:很多人在學習Python的過程中,往往因為遇問題解決不了或者沒好的教程從而導致自己放棄,為此我整理啦從基礎的python腳本到web開發、爬蟲、django、數據挖掘等【PDF等】需要的可以進Python全棧開發交流.裙 :一久武其而而流一思(數字的諧音)轉換下可以找到了,里面有最新Python教程項目可拿,不懂的問題有老司機解決哦,一起相互監督共同進步

二、環境安裝
我自己的環境如下:

硬件:08年的筆記本電腦,奔騰雙核,算是比較低端的筆記本了

系統:win7x64

python:3.6 (注意:建議用3.6版本配置環境。我自己用3.7配置環境失敗了,dlib安裝總是失敗。)

用3.6安裝的過程比較簡單,可以參考https://www.jianshu.com/p/8296f2aac1aa

用pip安裝之前,注意首先修改pip為阿里的源,這樣速度就快多了。

三、代碼實現
import face_recognition
import cv2
import os
import numpy as np
from PIL import Image,ImageDraw,ImageFont

#路徑參數配置
basefacefilespath = "0s" # faces文件夾中放待識別任務正面圖,文件名為人名,將顯示於結果中
destfacefilepath = "0d" #用於識別的目標圖片目錄

#寫入中文字符支持
def paint_chinese_opencv(im, chinese, pos, color):
img_PIL = Image.fromarray(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))
font = ImageFont.truetype('simsun.ttc', 14)
fillColor = color # (255,0,0)
position = pos # (100,100)
#chinese = chinese.decode('utf-8')
draw = ImageDraw.Draw(img_PIL)
draw.text(position, chinese, font=font, fill=fillColor)

img = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)
return img


# 加載待識別人臉圖像並識別。
baseface_titles = [] # 圖片名字列表
baseface_face_encodings = [] # 識別所需人臉編碼結構集
#讀取人臉資源
for fn in os.listdir(basefacefilespath): #fn 人臉文件名
baseface_face_encodings.append(
face_recognition.face_encodings(face_recognition.load_image_file(basefacefilespath+"/"+fn))[0])
#fn = fn.split("_")[1]
fn = fn[:(len(fn) - 4)]
baseface_titles.append(fn)
print(fn)

#從識別庫中讀取一張圖片並識別
for fd in os.listdir(destfacefilepath):
# 獲取一張圖片
faceData = face_recognition.load_image_file(destfacefilepath + "/" + fd)
print(fd)

# 人臉檢測,並獲取幀中所有人臉編碼
face_locations = face_recognition.face_locations(faceData)
face_encodings = face_recognition.face_encodings(faceData, face_locations)
# 遍歷圖片中所有人臉編碼
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
# 與baseface_face_encodings匹配否?
name = "?"
for i,v in enumerate(baseface_face_encodings):
match = face_recognition.compare_faces([v], face_encoding,tolerance=0.5)
name = "?"
if match[0]:
name = baseface_titles[i]
print("識別出:" + name)
break

#如果遇到沒有識別出的人臉,則跳過
if name == "?":
continue

# 圍繞臉的框
cv2.rectangle(faceData, (left, top), (right, bottom), (0, 0, 255), 2)
# 框下的名字(即,匹配的圖片文件名)
cv2.rectangle(faceData, (left, bottom), (right, bottom+25), (0, 0, 255), cv2.FILLED)
#faceData = cv2.putText(faceData, name,(left + 2, bottom + 12), cv2.FONT_HERSHEY_SIMPLEX,0.5, (255, 255, 255),1)
faceData = paint_chinese_opencv(faceData, name, (left + 2, bottom + 4), (255, 255, 255))
# frame = ft.draw_text(frame, (left + 2, bottom + 12), name, 16, (255, 255, 255))

# show結果圖像
cv2.imshow(fd, cv2.cvtColor(faceData, cv2.COLOR_BGR2RGB))

cv2.waitKey()
cv2.destroyAllWindows()
圖片分為兩個文件夾:0s和0d

0s中存放的是基礎人臉數據

 

0d文件夾中存放的是接下來要進行識別的圖片,我這里放了3張:

 

四、運行效果
運行結果:

 

五、問題總結
1、cv2.imshow,這個最開始顯示的圖片顏色不對,后來修改如下:

cv2.imshow(fd, cv2.cvtColor(faceData, cv2.COLOR_BGR2RGB))

將圖片的顏色模式調整為RGB,然后色彩就正常了。

2、中文字符支持,最開始用 cv2.putText,但是這個函數只支持英文字符,中文字符會顯示問號亂碼。

后加入中文字符支持函數,用 PIL 庫中的 ImageDraw 來寫入中文字符。
總結:很多人在學習Python的過程中,往往因為遇問題解決不了或者沒好的教程從而導致自己放棄,為此我整理啦從基礎的python腳本到web開發、爬蟲、django、數據挖掘等【PDF等】需要的可以進Python全棧開發交流.裙 :一久武其而而流一思(數字的諧音)轉換下可以找到了,里面有最新Python教程項目可拿,不懂的問題有老司機解決哦,一起相互監督共同進步

本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM