程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python開發指南[2]之人臉模型訓練與人臉識別

編輯:Python

Python開發指南[2]之人臉模型訓練與人臉識別

  • 程序之美
  • 前言
  • 主體
    • 運行效果
        • 人臉模型訓練效果圖
        • 人臉識別效果圖
        • 攝像頭人臉實時識別效果圖
    • 核心代碼
        • 人臉模型訓練核心代碼
        • 人臉識別核心代碼
    • 邏輯分析
  • 結束語

程序之美

前言

Python作為一門編程語言,這門語言的魅力和影響力已經遠超C#、C++等編程語言前輩,被程序員譽為“美好的”編程語言。Python基本上可以說是全能的,系統運維、圖形處理、數學處理、文本處理、數據庫編程、網絡編程、web編程、多媒體應用、pymo引擎、黑客編程、爬蟲編寫、機器學習、人工智能等等,Python應用無處不在。其優勢更是不言而喻,簡單易學、高層語言、免費開源、可移植性強、豐富的庫、面向對象、可擴展性、可嵌入型、規范的代碼等……
有很多初學Python的小伙伴們都覺得Python比較難學,看書吧,看了就忘了,網上的一些教程又是寫的含糊不清,故而學習起來很吃力…
故此,本專欄親自研究,實踐,由易到難,層層深入,將調試過程中所遭所遇進行詳細講解,注意事項進行一一列舉,希望能夠幫助到各位初學Python的小伙伴,避免走彎路,費時費力。

主體

本篇我們先學習下Python的人臉模型訓練與人臉識別。話不多說,先看下效果圖。

運行效果

人臉模型訓練效果圖

人臉識別效果圖

攝像頭人臉實時識別效果圖


對於Python程序設計,主要就是基礎語法、函數與模塊、正則表達式、內存管理與多線程,即為Python的精髓。
1、基礎語法:Python編程語言的變量、字符、常用運算符、元組和集合等等;
2、面向對象:這部分主要是學習從認識面向對象和類的特性,然後使用面向對象應用對遇到的異常進行處理;
3、函數與模塊,這部分主要是學習函數的定義和標准模塊與第三方模塊、自定義包的實現等;
4、正則表達式,正則表達式是比較重要的,尤其是後面想從事爬蟲的小伙伴,一定要把正則表達式學好;
5、內存管理與多線程,主要是了解Python編程語言的機制和掌握Python多線程。
初學者,不要怕麻煩,要不斷的練習,看到自己感興趣的,最好都能夠親自動手實踐一下,特別是控件的重繪,最鍛煉編程基礎了。

核心代碼

人臉模型訓練核心代碼

#!/usr/bin/env python
import threading
from logging import root
import cv2
import os
import sys
from PIL import Image
import numpy as np
def getImageAndLabels(path):
facesSamples=[]
ids=[]
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
print(imagePaths)
# 檢測人臉
face_detector = cv2.CascadeClassifier(
'/home/fwy/AndroidStudio/OpenCV-android-sdk/sdk/etc/haarcascades/haarcascade_frontalface_default.xml')
# 遍歷列表中的圖片
for imagePath in imagePaths:
# 打開圖片
PIL_img = Image.open(imagePath).convert('L')
# 將圖像轉換為數組
img_numpy = np.array(PIL_img,'uint8')
faces = face_detector.detectMultiScale(img_numpy)
# 獲取每張圖片的id
print(os.path.split(imagePath))
id = int(os.path.split(imagePath)[1].split('.')[0])
for x,y,w,h in faces:
facesSamples.append(img_numpy[y:y+h,x:x+w])
ids.append(id)
return facesSamples,ids
if __name__== '__main__':
#圖片路徑
path = './data/jm/'
#獲取圖像 數組和id標簽
faces,ids=getImageAndLabels(path)
#獲取循環對象
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.train(faces,np.array(ids))
#保存文件
recognizer.write('./data/trainer/trainer.yml')

人臉識別核心代碼

#!/usr/bin/env python
import logging
import threading
import time
from logging import root
import cv2
import numpy as np
import os
#獲取當前時間
def get_current_time():
now = time.time()
mlsec = repr(now).split('.')[1][:3]
current_time = time.strftime("%Y-%m-%d %H:%M:%S.{} %Z".format(mlsec),time.localtime(now))
return current_time
#日志動態打印
def write_log_to_Text(logmsg):
current_time = get_current_time()
logmsg_in = str(current_time) +" " + str(logmsg) #換行
logging.error(logmsg_in)
def recognizerFace(frame):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
face_detector = cv2.CascadeClassifier(
'/home/fwy/AndroidStudio/OpenCV-android-sdk/sdk/etc/haarcascades/haarcascade_frontalface_default.xml')
t = time.strftime("%H %M %S")
write_log_to_Text("start detection...")
faces = face_detector.detectMultiScale(gray, minNeighbors=30)
t = time.strftime("%H %M %S")
write_log_to_Text("end detection...")
#
# 置信度評分用來衡量識別結果與原有模型之間的距離。0表示完全匹配。
# 在LBPH中:通常情況下,認為小於50的值是可以接受的,如果該值大於80則認為差別較大。
# 在EigenFaces中:值通常在0~20000之間,只要低於5000都被認為是相當可靠的識別結果。
# 在Fisherfaces中:值通常在0~20000之間,只要低於5000都被認為是相當可靠的識別結果。
#
for x, y, w, h in faces:
id, confidence = recognizer.predict(gray[y:y + h, x:x + w]) # 人臉識別
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
name = str(id)
cv2.putText(frame, name, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (80, 80, 80), 2)
print('標簽id:', id, '置信評分:', confidence)
# 加載訓練數據和文件
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('/home/fwy/PycharmProjects/FaceDetec/data/trainer/trainer.yml')
#准備識別的圖片
img = cv2.imread('/home/fwy/PycharmProjects/C360_2018-12-14-08-58-20-612.jpg')#1707.jpg
recognizerFace(img)
cv2.namedWindow('result', 0)
cv2.imshow('result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

邏輯分析

人臉檢測是 OpenCV 的一個重要的組成部分,也是人臉識別的基礎。人臉識別其實就是一個能在給定圖像或視頻中識別出人臉。為了實現這一目標,我們可以使用一系列分好類的圖像來進行“訓練”,提出多種人臉特征,構成人臉特征庫,然後再根據給定圖像的人臉特征進行人臉庫中特征比對,進行識別,根據相似度進行人臉判定。 這就是 基於OpenCV 人臉識別模型人臉識別的整個過程。 人臉識別模型的另一個重要特征是:每個識別都具有轉置信(confidence)分值,也就是我們所說的對給定相似度的分值,可在實際應用中通過對其設置阈值來進行篩選控制。

獲取到人臉訓練庫的數據,需要將這些數據加載到人臉識別算法進行比對處理。所有的人臉識別模型的face_detector.detectMultiScale函數返回值faces數組中,每一個face都有四個參數:圖像x坐標,y坐標,w人臉圖像寬度,h人臉圖像高度。在通過id, confidence = recognizer.predict(gray[y:y + h, x:x + w]) 函數獲取到人臉的ID和置信度,因此根據 ID 可以知道被識別的人是誰。要做到這一點,需用到「trainer/」目錄中保存為.yml 文件,即訓練人臉模型文件。

結束語

好了,今天就說這麼多了,希望小伙伴們能從這篇文章中學到東西,也真心希望能夠幫助正在苦學Python程序設計的小伙伴們,你們的成長是我最大的幸福。很感謝您能夠在百忙之中浏覽我的文章,有需要源碼的小伙伴可以私信我。
源碼地址:https://download.csdn.net/download/hnjzfwy/85774111


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved