背景
公司的門禁,通過識別檢測,如果是公司的員工,就開門,否則不開門。用的是百度的人臉識別技術實現(xiàn)。突然公司要自研(畢竟百度是收費的),也許要彰顯公司的技術實力。任務分配給我,我一個搞Java的,Java并不擅長圖片的處理,調研下,python比較適合做這方面場景的應用,但是我對python,只能說了解,并不熟練,腫么辦呢?盡然給我了,當做學習了,硬著頭皮就上。
技術調研
谷歌是最好的老師,搜索下,找找這方面的資料。但是心里面也得想想大概的流程,第一步,我怎么才能檢測出圖片上,有沒有人呢,這是比較關鍵的一步,經過搜索比對,發(fā)現(xiàn)insightface,能識別出圖片上,有沒有人。那圖片上檢測出人,剩下的就是圖片上的人,跟目標圖片比對下,看兩個人的相似度是多少,設置一個閥值,達到這個值就是一個人,然后告訴門禁,開門,萬事大吉,搞定。理一理流程,流程如下:
insightface介紹
InsightFace 是一個開源的 2D 和 3D 深度人臉分析工具箱,主要基于 PyTorch 和 MXNet。
詳情查看網站。
InsightFace 有效地實現(xiàn)了豐富多樣的人臉識別、人臉檢測和人臉對齊的最新算法,并對訓練和部署進行了優(yōu)化。
環(huán)境搭建
前提先要安裝python,python版本3.6以上,安裝下面的庫
# 安裝人臉識別包
# 人臉識別庫
pip install -U insightface
# 圖片處理的庫
pip install opencv-python
識別人臉
import cv2
from insightface.app import FaceAnalysis
# 加載人臉識別模型
app = FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
# 讀取圖片
img = cv2.imread("./test.jpeg")
# 獲取人臉數(shù)據
faces = app.get(img)
# 把圖片中的人臉圈出來
rimg = app.draw_on(img, faces)
# 對圖片中的人臉處理后保存
cv2.imwrite('./t1_output.jpg', rimg)
測試圖片

識別后的效果

那現(xiàn)在我們準確的識別出測試圖片里面有三個人,同時標識出人臉的位置。其實,提出人臉數(shù)據是一些圖片像素點,人臉識別出來了,那接下來,就只需要,識別出,圖片里的人臉是誰,完成了檢測比對
人臉比對
錄入人臉數(shù)據
需要提前錄入人臉,進行識別,提取人臉數(shù)據,進行存儲,存儲可以本地文件存儲,也可以使用向量數(shù)據庫存儲,比如:milvus,此代碼演示使用pickle進行本地存儲,需要提前安排庫,
pip install pickle4
圖片數(shù)據
我們準備了楊紫、景甜的照片,也可以自己找其他圖片進行測試


注冊的核心代碼
import pickle
from numpy.linalg import norm
import cv2
import numpy as np
from insightface.app import FaceAnalysis
app = FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
faces_embedding = list()
# # 使用本地人家存儲
f = open('./face_ai_db', 'wb')
# 讀取照片
img1 = cv2.imread("./楊紫.jpeg")
# 提取人臉數(shù)據
yzFace = app.get(img1)
# 楊紫人臉數(shù)據加入到列表中
faces_embedding.append({"userName":"楊紫","embedding":yzFace[0].normed_embedding})
# 讀取景甜的照片
img2 = cv2.imread("./景甜.jpeg")
# 提取楊紫的人臉數(shù)據
jtFace = app.get(img2)
# 景甜人臉數(shù)據加入到列表中
faces_embedding.append({"userName":"景甜","embedding":jtFace[0].normed_embedding})
pickle.dump(faces_embedding,f)
f.close()
執(zhí)行此程序,楊紫、景甜提取的人臉數(shù)據已經存在,本地文件 face_ai_db文件中
對目標圖片進行識別
對目標圖片,進行識別,找出里面有沒有庫里的人
import pickle
from numpy.linalg import norm
import cv2
import numpy as np
from insightface.app import FaceAnalysis
app = FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
# 使用本地人家存儲
f = open('./face_ai_db', 'rb')
# 加載前面存儲的人臉數(shù)據
faces_embedding = pickle.load(f)
# 讀取圖片
img = cv2.imread("./test.jpeg")
# 圖片里面有多個人,faces就有多個值,是個數(shù)組
faces = app.get(img)
# 用提取的每一張人臉去跟庫里面的人臉數(shù)據比對,檢測出是否有庫里的注冊的人
for face in faces:
feat1 = face.normed_embedding
for t in faces_embedding:
feat2 = t["embedding"]
# 余弦相似度比較
sim = np.dot(feat1, feat2) / (norm(feat1) * norm(feat2))
sim = sim * 100
# 設置一個閾值,就是分數(shù),大于40,就得到我們庫里的人,打印下分數(shù) 以及是哪個明星
if sim >40:
print("姓名:{},分數(shù);{}".format(t['userName'],sim))
測試結果:準確的識別出圖片人
姓名:景甜,分數(shù);64.38514590263367
姓名:楊紫,分數(shù);44.4240003824234
這就簡單實現(xiàn)了,人臉的檢測識別,文章對你有幫助,麻煩點贊關注,謝謝,后續(xù)會繼續(xù)分享。