先決條件
對影象分類的基本理解
Python 和深度學習知識
對深度學習中各種模組的概念理解
介紹
在這篇文章中,我們將看看什麼是人臉識別?以及它與人臉檢測有何不同?
我們先簡單瞭解一下人臉識別的原理,然後跳轉到編碼部分!
在本文的最後,你將能夠開發一個人臉識別程式來識別影象中的人臉!
目錄
人臉檢測概述
人臉識別概述
瞭解什麼是OpenCV
使用Python實現
人臉檢測概述
如果機器能夠在沒有人工干預的情況下自動檢測影象中的物體會怎樣?讓我們看看:人臉檢測是我們在影象中檢測人臉的問題。人臉可能略有不同,但可以肯定地說,所有人臉都有特定的特徵。存在各種人臉檢測演算法,Viola-Jones演算法是現在也在使用的最古老的方法。
人臉檢測通常是邁向許多與人臉相關的應用程式(如人臉識別或人臉驗證)的第一步。但是,人臉檢測有非常有用的應用。人臉檢測最成功的應用之一可能是“拍照”。
示例:當你單擊朋友的照片時,內建人臉檢測演算法的相機會檢測人臉所在的位置並相應地調整焦距。
人臉識別概述
現在我們已經看到我們的演算法可以檢測人臉,但我們還能識別出誰的臉嗎?如果演算法能夠識別人臉呢?
一般來說,人臉識別是一種透過人臉識別或驗證個人身份的方法。各種演算法可用於人臉識別,但它們的準確性可能會有所不同。在這裡,我將與你討論如何使用深度學習進行人臉識別。
現在讓我們瞭解如何使用深度學習識別人臉。在這裡,我們使用人臉嵌入,其中每個人臉都被轉換為向量。將人臉轉換為向量的技術稱為深度度量學習。讓我把這個過程分成三個簡單的步驟,以便更好、更容易地理解。
1。人臉檢測
我們執行的第一個任務是檢測影象(照片)或影片流中的人臉。現在我們知道人臉的確切座標/位置,所以我們提取這張人臉進行進一步處理。
2。 特徵提取
現在看到我們已經從影象中裁剪掉了人臉,因此我們從中提取了特定的特徵。在這裡,我們將看到如何使用人臉嵌入來提取人臉的這些特徵。
正如我們所知,神經網路將人臉影象作為輸入,並輸出一個表示人臉最重要特徵的向量!在機器學習中,這個向量不過是所謂的嵌入,因此我們稱之為向量人臉嵌入。現在這將如何幫助識別不同人的面孔?
當我們訓練神經網路時,網路學習為看起來相似的人臉輸出相似的向量。
讓我們考慮一個例子,如果我在不同的時間間隔內有多個人臉影象,很明顯某些特徵可能會改變但不會太多。所以在這個問題中,與人臉相關的向量是相似的,或者我們可以說它們在向量空間中非常接近。
至此,我們已經瞭解了這個網路是如何工作的,讓我們看看如何在我們自己的資料上使用這個網路。在這裡,我們將資料中的所有影象傳遞給這個預訓練的網路,以獲取相應的嵌入並將這些嵌入儲存在檔案中以備下一步使用。
3。 人臉對比
我們在檔案中儲存了資料中每個人臉的人臉嵌入,下一步是識別不在我們資料中的新影象。因此,第一步是使用我們之前使用的相同網路計算影象的面部嵌入,然後將此嵌入與我們擁有的其餘嵌入進行比較。如果生成的嵌入與任何其他嵌入更接近或相似,我們就能識別出人臉。
瞭解什麼是 OpenCV
在人工智慧領域,計算機視覺是最有趣和最具挑戰性的任務之一。計算機視覺充當計算機軟體和視覺化之間的橋樑。計算機視覺允許計算機軟體理解和學習周圍的視覺效果。
讓我們來了解一個例子:根據形狀、顏色和大小決定水果。這個任務對人腦來說很容易,但是在計算機視覺中,首先我們需要收集資料,然後執行資料處理操作,然後訓練和教授模型如何根據水果的大小、形狀和顏色來區分水果。
如今,有各種軟體包可用於執行機器學習、深度學習和計算機視覺問題。到目前為止,計算機視覺是解決此類複雜問題的最佳模組。
OpenCV
是一個開源庫。它被不同的程式語言如 R、Python 等支援。它可能執行在大多數平臺上,如 Windows、Linux 和 macOS。
OpenCV 的優點:
Open CV 是免費的,是一個開源庫。
Open CV 速度快,因為它是用 C/C++ 語言編寫的
系統 RAM 越少,OpenCV 效果越好。
支援大部分作業系統,如Windows、Linux、macOS。
執行
在本節中,我們將使用 OpenCV 和 Python 實現人臉識別。
首先,讓我們看看我們需要哪些庫以及如何安裝它們:
OpenCV
dlib
Face_recognition
OpenCV
是一個影片和影象處理庫,用於影象和影片分析,如面部檢測、車牌讀取、照片編輯、高階機器人視覺等。
DLIB
庫包含我們實現的“深度度量學習”,用於構建實際識別過程的人臉嵌入。
face_recognition
庫非常容易使用,我們將在我們的程式碼使用這個。
首先,在安裝face_recognition之前記得先安裝dlib庫。
使用 OpenCV 的任何人臉識別應用程式的輸出將如下所示:
要安裝 OpenCV、dlib 和face_recognition,請在命令提示符中鍵入以下程式碼段。
pip install opencv-python
conda install -c conda-forge dlib
pip install face_recognition
現在讓我們編碼吧!
從人臉中提取特徵
首先,你需要一個數據集,甚至建立你自己的資料集。只需確保將所有影象排列在資料夾中,每個資料夾僅包含一個人的影象。
或者你可以從此連結下載資料集:https://www。kaggle。com/atulanandjha/lfwpeople
現在,將資料集儲存在與你要製作檔案相同的資料夾中。
這是程式碼,我在需要的地方添加了註釋:
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 = []
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
下一部分是我們將看到如何從影象中識別人臉。
如何識別影象中的人臉
以下指令碼用於檢測和識別影象中的人臉。我在需要的地方給出了註釋。因此,你將能夠有效地理解程式碼。
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, ) + 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), (, 255, ), 2)
cv2。putText(image, name, (x, y), cv2。FONT_HERSHEY_SIMPLEX,
0。75, (, 255, ), 2)
cv2。imshow(“Frame”, image)
cv2。waitKey()
輸出
☆ END ☆
如果看到這裡,說明你喜歡這篇文章,請轉發、點贊。微信搜尋「uncle_pn」,歡迎新增小編微信「 woshicver」,每日朋友圈更新一篇高質量博文。