學習如何使用 OpenCV 和 Python 實現人臉識別!

語言: CN / TW / HK

在這篇文章中,我們將看看什麼是人臉識別以及它與人臉檢測有何不同? 

我們先簡單瞭解一下人臉識別的原理,然後跳轉到編碼部分!! 
在本文的最後,你也可以開發一個人臉識別程式來識別影象中的人臉!!!

人臉檢測概述

如果機器能夠在沒有人工干預的情況下自動檢測影象中的物體會怎樣? 

每個人的人臉可能略有不同,但畢竟可以肯定地說,所有人臉都有特定的特徵。目前存在各種人臉檢測演算法,但 Viola-Jones 演算法是當今仍在使用的最古老的方法。

人臉檢測通常是邁向許多與人臉相關的應用程式(如人臉識別或人臉驗證)的第一步。 但是,人臉檢測有非常有用的應用。人臉檢測最成功的應用之一可能是“拍照”。 示例:當單擊朋友的照片時,內建人臉檢測演算法的相機會檢測人臉所在的位置並相應地調整焦距。

人臉識別概述

一般來說,人臉識別是一種通過人臉識別或驗證個人身份的方法。各種演算法可用於人臉識別,但它們的準確性可能會有所不同。 本文我將與大家討論如何使用深度學習進行人臉識別。 現在讓我們瞭解如何使用深度學習識別人臉。 

在這裡,我們使用人臉嵌入,其中每個人臉都被轉換為向量。 將人臉轉換為向量的技術稱為深度度量學習。 讓我把這個過程分成三個簡單的步驟,以便更好、更容易地理解:

1.人臉檢測: 

我們執行的第一個任務是檢測影象(照片)或影片流中的人臉。現在我們知道人臉的確切座標/位置,所以我們提取這張人臉進行進一步處理。 

2.特徵提取: 

現在看到我們已經從影象中裁剪掉了人臉,因此我們從中提取了特定的特徵。在這裡,我們將看到如何使用人臉嵌入來提取人臉的這些特徵。

正如我們所知,神經網路將人臉影象作為輸入,並輸出一個表示人臉最重要特徵的向量!在機器學習中,這個向量不過是所謂的嵌入,因此我們稱之為向量人臉嵌入。

現在這將如何幫助識別不同人的面孔? 當我們訓練神經網路時,網路學習為看起來相似的人臉輸出相似的向量。讓我們考慮一個例子,如果我在不同的時間間隔內有多個人臉影象,很明顯某些特徵可能會改變但不會太多。所以在這個問題中,與人臉相關的向量是相似的,或者我們可以說它們在向量空間中非常接近。 

至此,我們已經瞭解了這個網路是如何工作的,讓我們看看如何在我們自己的資料上使用這個網路。在這裡,我們將資料中的所有影象傳遞給這個預訓練的網路,以獲取相應的嵌入並將這些嵌入儲存在檔案中以備下一步使用。

3. 人臉對比: 

我們在檔案中儲存了資料中每個人臉的人臉嵌入,下一步是識別不在我們資料中的新影象。因此,第一步是使用我們之前使用的相同網路計算影象的面部嵌入,然後將此嵌入與我們擁有的其餘嵌入進行比較。 如果生成的嵌入與任何其他嵌入更接近或相似,我們就能識別出人臉。

瞭解什麼是 OpenCV

在人工智慧領域,計算機視覺是最有趣和最具挑戰性的任務之一。計算機視覺充當計算機軟體和視覺化之間的橋樑。計算機視覺允許計算機軟體理解和了解周圍環境的視覺化。 

讓我們來了解一個例子:根據形狀、顏色和大小決定水果。 這個任務對人腦來說很容易,但是在計算機視覺管道中,首先我們需要收集資料,然後我們執行資料處理操作,再然後我們訓練和教授模型以瞭解如何區分基於水果的水果 果實的大小、形狀和顏色。

如今,有各種軟體包可用於執行機器學習、深度學習和計算機視覺問題。到目前為止,計算機視覺是解決此類複雜問題的最佳模組。OpenCV 是一個開源庫。它被不同的程式語言如 R、Python 等支援。它可能執行在大多數平臺上,如 Windows、Linux 和 macOS。

OpenCV 的優點:

1. Open CV 是免費的,是一個開源庫。 

2. Open CV 速度快,因為它是用 C/C++ 語言編寫的,與其他語言相比 

3. 系統 RAM 越少,OpenCV 效果越好。 

4. 支援大部分作業系統,如Windows、Linux、macOS。 

執行

在本節中,我們將使用 OpenCV 和 Python 實現人臉識別。 

首先,讓我們看看我們需要哪些庫以及如何安裝它們: 

1.OpenCV 

2.dlib 

3.人臉識別

OpenCV 是一個影片和影象處理庫,用於影象和影片分析,如面部檢測、車牌讀取、照片編輯、高階機器人視覺等。 

dlib 庫包含我們的“深度度量學習”實現,用於構建用於實際識別過程的人臉嵌入。

face_recognition 庫非常容易使用,我們將在我們的程式碼中使用它。 

首先,在安裝face_recognition之前記得先安裝dlib庫。使用 OpenCV 的任何人臉識別應用程式的輸出將如下所示:

face recognition how to

要安裝 OpenCV、dlib 和人臉識別,請在命令提示符中鍵入以下程式碼段。

pip install opencv-pythonconda install -c conda-forge dlibpip install face_recognition

現在讓我們做程式碼吧! 

從人臉中提取特徵

首先需要一個數據集,甚至建立自己的資料集。只需確保將所有影象排列在資料夾中,每個資料夾僅包含一個人的影象。

現在,將資料集儲存在與要製作檔案相同的資料夾中。 這是程式碼,我在需要的地方添加了註釋:

from imutils import paths #imutils includes opencv functions
import face_recognition
import pickle
import cv2
import os

#get paths of each file in folder named Images
#Images here that contains data(folders of various people)
imagePath = list(paths.list_images('Images'))
kEncodings = []
kNames = []

# loop over the image paths
for (i, ip) in enumerate(imagePath):
# extract the person name from the image path
name = ip.split(os.path.sep)[-2]
# load the input image and convert it from BGR
image = cv2.imread(ip)
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

boxes = face_recognition.face_locations(rgb,model='hog')
# compute the facial embedding for the any face
encodings = face_recognition.face_encodings(rgb, boxes)
# loop over the encodings
for encoding in encodings:
kEncodings.append(encoding)
kNames.append(name)

#save emcodings along with their names in dictionary data
data = {"encodings": kEncodings, "names": kNames}
#use pickle to save data into a file for later use
f = open("face_enc", "wb")
f.write(pickle.dumps(data))#to open file in write mode
f.close()#to close file

現在看到我們已經將嵌入儲存在一個名為“face_enc”的檔案中,因此我們可以使用它們來識別影象(照片)或實時影片流中的人臉。下一部分是我們將看到如何從影象中識別人臉。

如何識別影象中的人臉

以下指令碼用於檢測和識別影象中的人臉。 我在需要的地方在程式碼旁邊給出了註釋幫助初學者能夠有效地理解程式碼。

import face_recognition
import imutils #imutils includes opencv functions
import pickle
import time
import cv2
import os

#to find path of xml file containing haarCascade file
cfp = os.path.dirname(cv2.__file__) + "/data/haarcascade_frontalface_alt2.xml"
# load the harcaascade in the cascade classifier
fc = cv2.CascadeClassifier(cfp)
# load the known faces and embeddings saved in last file
data = pickle.loads(open('face_enc', "rb").read())

#Find path to the image you want to detect face and pass it here
image = cv2.imread(Path-to-img)
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
#convert image to Greyscale for HaarCascade
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = fc.detectMultiScale(gray,
scaleFactor=1.1,
minNeighbors=6,
minSize=(60, 60),
flags=cv2.CASCADE_SCALE_IMAGE)

# the facial embeddings for face in input
encodings = face_recognition.face_encodings(rgb)
names = []
# loop over the facial embeddings incase
# we have multiple embeddings for multiple fcaes
for encoding in encodings:
#Compare encodings with encodings in data["encodings"]
#Matches contain array with boolean values True and False
matches = face_recognition.compare_faces(data["encodings"],
encoding)
#set name =unknown if no encoding matches
name = "Unknown"
# check to see if we have found a match
if True in matches:
#Find positions at which we get True and store them
matchedIdxs = [i for (i, b) in enumerate(matches) if b]
count = {}
# loop over the matched indexes and maintain a count for
# each recognized face face
for i in matchedIdxs:
#Check the names at respective indexes we stored in matchedIdxs
name = data["names"][i]
#increase count for the name we got
count[name] = count.get(name, 0) + 1
#set name which has highest count
name = max(count, key=count.get)
# will update the list of names
names.append(name)

# do loop over the recognized faces
for ((x, y, w, h), name) in zip(faces, names):
# rescale the face coordinates
# draw the predicted face name on the image
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(image, name, (x, y), cv2.FONT_HERSHEY_SIMPLEX,
0.75, (0, 255, 0), 2)
cv2.imshow("Frame", image)
cv2.waitKey(0)

輸出

face recognition output

結語

現在我們已經完成了人臉識別的過程。

拓展閱讀

人臉識別技術是一種高精度、易於使用、穩定性高、難仿冒的生物識別技術,具有極其廣闊的市場應用前景。在公安、國防、海關、交通、金融、社保、醫療及其他民用安全控制等行業和部門存在著廣泛的需求。

我們TSINGSEE青犀影片的研發人員近期也在積極開發人臉檢測、人臉識別、人流量統計、安全帽檢測等AI技術,並積極融入到現有的影片平臺中。典型的示例如EasyCVR影片融合雲服務,具有AI人臉識別、車牌識別、語音對講、雲臺控制、聲光告警、監控影片分析與資料彙總的能力,廣泛應用在小區、樓宇的智慧門禁,周界可疑人員徘徊檢測、景區人流量統計等場景中。