訂閱
糾錯(cuò)
加入自媒體

一文教你使用LBPH算法理解人臉識(shí)別

介紹**LBPH(Local Binary Pattern Histogram,局部二進(jìn)制模式直方圖)**是一種人臉識(shí)別算法,用于識(shí)別人臉。它以其性能以及如何能夠從正面和側(cè)面識(shí)別人臉而聞名。在開始了解 LBPH 算法之前,讓我們先了解一下圖像和像素的基礎(chǔ)知識(shí),以便在我們開始有關(guān)人臉識(shí)別的內(nèi)容之前,了解圖像是如何表示的。因此,讓我們開始了解圖像和像素。圖像和像素

所有圖像都以矩陣格式表示,如你在此處所見,由行和列組成。圖像的基本組成部分是像素。圖像由一組像素組成。每一個(gè)都是小方格。通過將它們并排放置,我們可以形成完整的圖像。單個(gè)像素被認(rèn)為是圖像中最少可能的信息。對(duì)于每張圖像,像素值的范圍在 0 到 255 之間。此圖像寬 32 像素,高 32 像素。而當(dāng)我們將 32 乘以 32 時(shí),結(jié)果是 1024,也就是圖像中的總像素?cái)?shù)。每個(gè)像素由三個(gè)值組成:R、G、B,分別是紅、綠、藍(lán)的基本顏色。這三種基本顏色的組合將在圖像中創(chuàng)建所有這些顏色,因此我們得出結(jié)論,單個(gè)像素具有三個(gè)通道,每個(gè)基本顏色一個(gè)通道。由于現(xiàn)在我們對(duì)圖像和像素有了一些了解,現(xiàn)在就更容易理解 LBPH 算法了。LBPH(局部二進(jìn)制模式直方圖)

讓我們從分析表示圖像片段的矩陣開始。正如你之前了解到的,圖像以這些格式表示。在這個(gè)例子中,我們有三行三列,像素總數(shù)為九。讓我們?cè)谶@里選擇中心像素,值為 8,并應(yīng)用一個(gè)條件。如果該值大于或等于 8,則結(jié)果為 '1',否則,如果該值小于 8,則結(jié)果為零。使用此條件后,矩陣現(xiàn)在看起來像這樣。

這個(gè)算法的基本計(jì)算就是應(yīng)用這個(gè)條件,選擇矩陣的中心元素,F(xiàn)在我們需要生成一個(gè)二進(jìn)制值。二進(jìn)制值 = 11100010 。算法將開始應(yīng)用從左上角元素到第 2 行的 1 元素的條件,就像它正在制作一個(gè)這樣的圓圈。

將二進(jìn)制值轉(zhuǎn)換為十進(jìn)制值后,我們得到**十進(jìn)制值 = 226。**它表示中心值周圍的所有這些像素等于 226。當(dāng)涉及到亮斑時(shí),該算法是穩(wěn)健的。如果將手電筒放在圖像上,像素值會(huì)增加。值越高,圖像越亮,值越低,圖像越暗。由于這個(gè)原因,該算法在明暗圖像上都有很好的效果,因?yàn)楫?dāng)圖像變亮或變暗時(shí),這里的鄰域內(nèi)的所有像素都會(huì)發(fā)生變化。將光放在圖像上后,矩陣將如下所示。應(yīng)用上述條件后,我們將得到與上述相同的二進(jìn)制值,即11100010

讓我們?cè)谶@里考慮另一個(gè)圖像。為了更好地理解算法將如何識(shí)別人臉。

我們這里有一張臉的圖像,算法將做的是創(chuàng)建幾個(gè)正方形。例如,這里的方格不只代表一個(gè)像素,而是設(shè)置了三行四列的多個(gè)像素。三乘四等于這些方格中總共十二個(gè)像素,每個(gè)方格都是十二個(gè)像素。然后我們將該條件應(yīng)用于每一個(gè)。考慮中心像素。下一步是創(chuàng)建直方圖,這是一個(gè)統(tǒng)計(jì)概念,將計(jì)算每種顏色在每個(gè)方格中出現(xiàn)的次數(shù)。這是直方圖的表示。

例如,如果值 110 出現(xiàn) 50 次,則將創(chuàng)建此大小等于 50 的條形,如果 201 出現(xiàn) 110 次,則將在此直方圖中創(chuàng)建此大小等于 100 的另一個(gè)條形。通過對(duì)直方圖的比較,算法將能夠識(shí)別圖像的邊緣和角。例如,在第一個(gè)方格中,我們沒有關(guān)于人臉的信息。因此直方圖將不同于另一個(gè)具有人臉邊緣的方格?傊,算法知道哪些直方圖代表邊界,哪些直方圖代表人的主要特征,比如眼睛的顏色、嘴巴的形狀等等。所以這就是這個(gè)算法的基本理論,它基于直方圖的創(chuàng)建和比較。現(xiàn)在讓我們開始編碼部分注意:如果你在導(dǎo)入 cv2 庫(kù)時(shí)遇到錯(cuò)誤,例如“No module named 'cv2.cv2”。然后你就可以在 google colab 中編寫代碼了。我已經(jīng)在 Google Colab 中編寫了這段代碼。我將使用 yaleface 數(shù)據(jù)集1. 導(dǎo)入庫(kù)import os
import cv2
import zipfile
import numpy as np
from google.colab.patches import cv2_imshow
2. 數(shù)據(jù)收集path = "/content/drive/MyDrive/Datasets/yalefaces.zip"
zip_obj = zipfile.ZipFile(file = path,mode='r')
zip_obj.extractall('./')
zip_obj.close()
3. 數(shù)據(jù)清洗在向模型提供數(shù)據(jù)之前,這些圖像是 .gif 格式,因此我們需要將它們轉(zhuǎn)換為 ndarray,因此我們需要使用以下代碼from PIL import Image
def get_image_data() :
                 paths = [os.path.join("/content/yalefaces/train",f)for f in os.listdir(path="/content/yalefaces/train")]
                 faces = []
                 ids = []
                 #faces will contain the px of the images
                 #path will contain the path of the images
                 for path in paths :
                     image = Image.open(path).convert('L')
                     image_np = np.a(chǎn)rray(image,'uint8')
                     id = int(os.path.split(path)[1].split(".")[0].replace("subject"," "))
                     ids.a(chǎn)ppend(id)
                     faces.a(chǎn)ppend(image_np)
                   
                   return np.a(chǎn)rray(ids),faces
ids , faces = get_image_data()
4. 模型訓(xùn)練lbph_classifier = cv2.face.LBPHFaceRecognizer_create()
lbph_classifier.train(faces,ids)
#Below line will store the histograms for each one of the iamges
lbph_classifier.write('lbph_classifier.yml')
5. 識(shí)別人臉lbph_face_classifier = cv2.face.LBPHFaceRecognizer_create()
lbph_face_classifier.read("/content/lbph_classifier.yml")
#Now we will check the performance of model
test_image = "/content/yalefaces/test/subject03.leftlight.gif"
image = Image.open(test_image).convert('L')
image_np = np.a(chǎn)rray(image,'uint8')
#Before giving the image to the model lets check it first
cv2_imshow(image_np)
predictions = lbph_face_classifier.predict(image_np)
print(predictions)
expected_output = int(os.path.split(test_image)[1].split('.')[0].replace("subject"," "))
print(expected_output)
3<-That's our output

這是我們將要測(cè)試的圖像

第一個(gè)參數(shù)給出檢測(cè)到的人臉,第二個(gè)參數(shù)給出置信度。這是我們從 print(predictions) 得到的輸出cv2.putText(image_np, 'Pred.' +str(predictions[0]),(10,30),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,0))
cv2.putText(image_np, 'Expec.' +str(expected_output),(10,50),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,0)
)
cv2_imshow(image_np)
最后結(jié)果

結(jié)論在本文中,我們介紹了以下內(nèi)容:什么是LBPH算法LBPH算法如何識(shí)別人臉并進(jìn)行計(jì)算理解代碼如何使用LBPH算法識(shí)別人臉

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)