文章目錄
- 引言
- 一、概述
- 二、代碼實現
- 1. 代碼整體結構
- 2. 導入庫解析
- 3. 訓練數據準備
- 4. 標簽系統
- 5. 待識別圖像加載
- 6. LBPH識別器創建
- 7. 模型訓練
- 8. 預測執行
- 9. 結果輸出
- 三、 LBPH算法原理解析
- 四、關鍵點解析
- 五、改進方向
- 總結
引言
人臉識別是計算機視覺領域的一個重要應用,今天我將分享一個使用Python和OpenCV實現的簡單人臉識別系統。這個系統能夠識別特定人物的照片,并給出識別結果的置信度。
一、概述
這個系統使用了OpenCV的LBPH(Local Binary Patterns Histograms)人臉識別算法,通過訓練已知的人臉圖像,然后對新的圖像進行預測識別。
二、代碼實現
import cv2
import numpy as np# 加載訓練用的人臉照片
images = []
images.append(cv2.imread('linyuner 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('linyuner 2.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 2.jpg', cv2.IMREAD_GRAYSCALE))# 對應標簽(0代表林允兒,1代表陳都靈)
labels = [0, 0, 1, 1]# 標簽字典,用于將數字標簽轉換為可讀名稱
dic = {0: '林允兒', 1: '陳都靈', -1: '無法識別'}# 加載待識別的人臉圖像
predict_image = cv2.imread('chendulin 3.jpg', cv2.IMREAD_GRAYSCALE)# 創建LBPH人臉識別器,設置閾值為80
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)# 訓練識別器
recognizer.train(images, np.array(labels))# 進行預測
label, confidence = recognizer.predict(predict_image)# 輸出結果
print('這人是:', dic[label])
print('置信度', confidence)
1. 代碼整體結構
這段代碼實現了一個簡單但完整的人臉識別系統,主要流程包括:
- 加載訓練圖像
- 準備對應標簽
- 創建識別器
- 訓練模型
- 預測新圖像
- 輸出結果
2. 導入庫解析
import cv2
import numpy as np
- cv2:OpenCV庫,提供計算機視覺相關功能,這里主要使用其人臉識別模塊
- numpy:Python科學計算基礎庫,用于處理數組和矩陣運算
3. 訓練數據準備
images = []
images.append(cv2.imread('linyuner 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('linyuner 2.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 2.jpg', cv2.IMREAD_GRAYSCALE))
- cv2.imread():讀取圖像文件
- 第一個參數:圖像路徑
- 第二個參數
cv2.IMREAD_GRAYSCALE
:以灰度模式讀取圖像,因為人臉識別通常不需要顏色信息
- 將讀取的圖像存儲在
images
列表中
4. 標簽系統
labels = [0, 0, 1, 1]
dic = {0: '林允兒', 1: '陳都靈', -1: '無法識別'}
- labels:與訓練圖像對應的數字標簽
- 0代表"林允兒"
- 1代表"陳都靈"
- dic:字典,將數字標簽映射為可讀的名稱
- -1表示無法識別的情況
5. 待識別圖像加載
predict_image = cv2.imread('chendulin 3.jpg', cv2.IMREAD_GRAYSCALE)
- 同樣以灰度模式加載待識別的圖像
- 放入一張陳都靈的照片進行檢驗,后面代碼會顯示預測結果
6. LBPH識別器創建
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)
- LBPH(Local Binary Patterns Histograms):局部二值模式直方圖
- 一種高效的人臉識別算法
- 對光照變化有一定魯棒性
- threshold=80:設置識別閾值
- 當預測的置信度距離大于此值時,返回-1(無法識別)
- 這個值需要根據實際情況調整
7. 模型訓練
recognizer.train(images, np.array(labels))
- 使用訓練圖像和對應標簽訓練模型
- 將Python列表轉換為numpy數組,這是OpenCV函數常見的輸入要求
8. 預測執行
label, confidence = recognizer.predict(predict_image)
- predict():對新的圖像進行預測
- 返回兩個值:
- label:預測的標簽(對應之前的0或1)
- confidence:置信度(距離值),越小表示匹配度越高
9. 結果輸出
print('這人是:', dic[label])
print('置信度', confidence)
- 使用字典將數字標簽轉換為可讀名稱
- 輸出識別結果和置信度
- 結果輸出如下:
三、 LBPH算法原理解析
LBPH工作的三個主要步驟:
-
局部二值模式(LBP)特征提取
- 對每個像素與其鄰域像素比較
- 生成二進制模式
-
直方圖構建
- 將圖像分成多個小區域
- 為每個區域構建LBP直方圖
-
比較直方圖
- 比較輸入圖像與訓練圖像的直方圖
- 使用卡方距離等度量方法
四、關鍵點解析
-
圖像加載:所有圖像都以灰度模式加載(
cv2.IMREAD_GRAYSCALE
),因為人臉識別通常不需要顏色信息。 -
標簽系統:使用數字標簽(0,1)對應不同人物,并通過字典轉換為可讀名稱。
-
LBPH算法:Local Binary Patterns Histograms是一種高效的人臉識別算法,對光照變化有一定的魯棒性。
-
閾值設置:閾值設為80,當預測的置信度高于此值時,返回-1(無法識別)。
-
訓練與預測:先使用已知圖像訓練模型,然后對新的圖像進行預測。
五、改進方向
- 增加更多的人臉樣本以提高準確性
- 實現實時攝像頭人臉識別
- 添加人臉檢測功能,自動裁剪人臉區域
- 使用更先進的深度學習模型
總結
通過這個簡單的示例,我們了解了如何使用OpenCV實現基礎的人臉識別功能。雖然這個系統比較簡單,但它展示了人臉識別的基本原理和工作流程。隨著樣本數量的增加和算法的優化,系統的識別準確率可以進一步提高。
希望這篇博客對你理解人臉識別技術有所幫助!如果你有任何問題或建議,歡迎在評論區留言。
萬事勝意,得償所愿!加油各位!!!🚀🚀🚀