欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python基于Opencv來快速實現人臉識別過程詳解(完整版)

系統 1671 0

前言

隨著人工智能的日益火熱,計算機視覺領域發展迅速,尤其在人臉識別或物體檢測方向更為廣泛,今天就為大家帶來最基礎的人臉識別基礎,從一個個函數開始走進這個奧妙的世界。

首先看一下本實驗需要的數據集,為了簡便我們只進行兩個人的識別,選取了beyond樂隊的主唱黃家駒和貝斯手黃家強,這哥倆長得有幾分神似,這也是對人臉識別的一個考驗:

Python基于Opencv來快速實現人臉識別過程詳解(完整版)_第1張圖片

兩個文件夾,一個為訓練數據集,一個為測試數據集,訓練數據集中有兩個文件夾0和1,之前看一些資料有說這里要遵循“slabel”命名規則,但后面處理起來比較麻煩,因為目前opencv接受的人臉識別標簽為整數,那我們就直接用整數命名吧:


為了方便,我們每個人用20張照片來訓練,0代表黃家駒,1代表黃家強:


開始啦:

1.檢測人臉

這應該是最基本的,給我們一張圖片,我們要先檢測出人臉的區域,然后才能
進行操作,opencv已經內置了很多分類檢測器,我們這次用haar:

            
def detect_face(img):
 #將測試圖像轉換為灰度圖像,因為opencv人臉檢測器需要灰度圖像
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 #加載OpenCV人臉檢測分類器Haar
 face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
 #檢測多尺度圖像,返回值是一張臉部區域信息的列表(x,y,寬,高)
 faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
 # 如果未檢測到面部,則返回原始圖像
 if (len(faces) == 0):
 return None, None
 #目前假設只有一張臉,xy為左上角坐標,wh為矩形的寬高
 (x, y, w, h) = faces[0]
 #返回圖像的正面部分
 return gray[y:y + w, x:x + h], faces[0]
          

2.有了數據集和檢測人臉的功能后,我們就可以進行預訓練了

最后返回所有訓練圖片的人臉檢測信息和標簽:

            
# 該函數將讀取所有的訓練圖像,從每個圖像檢測人臉并將返回兩個相同大小的列表,分別為臉部信息和標簽
def prepare_training_data(data_folder_path):
 # 獲取數據文件夾中的目錄(每個主題的一個目錄)
 dirs = os.listdir(data_folder_path)
 # 兩個列表分別保存所有的臉部和標簽
 faces = []
 labels = []
 # 瀏覽每個目錄并訪問其中的圖像
 for dir_name in dirs:
 # dir_name(str類型)即標簽
 label = int(dir_name)
 # 建立包含當前主題主題圖像的目錄路徑
 subject_dir_path = data_folder_path + "/" + dir_name
 # 獲取給定主題目錄內的圖像名稱
 subject_images_names = os.listdir(subject_dir_path)
 # 瀏覽每張圖片并檢測臉部,然后將臉部信息添加到臉部列表faces[]
 for image_name in subject_images_names:
 # 建立圖像路徑
 image_path = subject_dir_path + "/" + image_name
 # 讀取圖像
 image = cv2.imread(image_path)
 # 顯示圖像0.1s
 cv2.imshow("Training on image...", image)
 cv2.waitKey(100)
 # 檢測臉部
 face, rect = detect_face(image)
 # 我們忽略未檢測到的臉部
 if face is not None:
 #將臉添加到臉部列表并添加相應的標簽
 faces.append(face)
 labels.append(label)
 cv2.waitKey(1)
 cv2.destroyAllWindows()
 #最終返回值為人臉和標簽列表
 return faces, labels
          

3.有了臉部信息和對應標簽后,我們就可以使用opencv自帶的識別器來進行訓練了

            
#調用prepare_training_data()函數
faces, labels = prepare_training_data("training_data")
#創建LBPH識別器并開始訓練,當然也可以選擇Eigen或者Fisher識別器
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.train(faces, np.array(labels))
          

4.訓練完畢后就可以進行預測了

在這之前我們可以設定一下預測的格式,包括用矩形框框出人臉并標出其名字,當然最后別忘了建立標簽與真實姓名直接的映射表:

            
#根據給定的(x,y)坐標和寬度高度在圖像上繪制矩形
def draw_rectangle(img, rect):
 (x, y, w, h) = rect
 cv2.rectangle(img, (x, y), (x + w, y + h), (128, 128, 0), 2)
# 根據給定的(x,y)坐標標識出人名
def draw_text(img, text, x, y):
 cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
#建立標簽與人名的映射列表(標簽只能為整數)
subjects = ["jiaju", "jiaqiang"]
          

5.現在就可以定義我們的預測函數了:

            
# 此函數識別傳遞的圖像中的人物并在檢測到的臉部周圍繪制一個矩形及其名稱
def predict(test_img):
 #生成圖像的副本,這樣就能保留原始圖像
 img = test_img.copy()
 #檢測人臉
 face, rect = detect_face(img)
 #預測人臉
 label = face_recognizer.predict(face)
 # 獲取由人臉識別器返回的相應標簽的名稱
 label_text = subjects[label[0]]
 # 在檢測到的臉部周圍畫一個矩形
 draw_rectangle(img, rect)
 # 標出預測的名字
 draw_text(img, label_text, rect[0], rect[1] - 5)
 #返回預測的圖像
 return img
          

6.最后使用我們test_data中的圖片進行預測并顯示最終效果:

            
#加載測試圖像
test_img1 = cv2.imread("test_data/test1.jpg")
test_img2 = cv2.imread("test_data/test2.jpg")
#執行預測
predicted_img1 = predict(test_img1)
predicted_img2 = predict(test_img2)
#顯示兩個圖像
cv2.imshow(subjects[0], predicted_img1)
cv2.imshow(subjects[1], predicted_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
          

來看看識別的結果:

Python基于Opencv來快速實現人臉識別過程詳解(完整版)_第2張圖片

這就是人臉識別最基本的流程,后續還會進一步的研究,下一篇我們將討論本次實驗的一些細節和注意事項,算是對本篇的一次挖掘和總結吧。

最后附上完整代碼:

            
# # -*- coding:utf-8 -*-
import cv2
import os
import numpy as np
# 檢測人臉
def detect_face(img):
 #將測試圖像轉換為灰度圖像,因為opencv人臉檢測器需要灰度圖像
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 #加載OpenCV人臉檢測分類器Haar
 face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
 #檢測多尺度圖像,返回值是一張臉部區域信息的列表(x,y,寬,高)
 faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
 # 如果未檢測到面部,則返回原始圖像
 if (len(faces) == 0):
 return None, None
 #目前假設只有一張臉,xy為左上角坐標,wh為矩形的寬高
 (x, y, w, h) = faces[0]
 #返回圖像的正面部分
 return gray[y:y + w, x:x + h], faces[0]
# 該函數將讀取所有的訓練圖像,從每個圖像檢測人臉并將返回兩個相同大小的列表,分別為臉部信息和標簽
def prepare_training_data(data_folder_path):
 # 獲取數據文件夾中的目錄(每個主題的一個目錄)
 dirs = os.listdir(data_folder_path)
 # 兩個列表分別保存所有的臉部和標簽
 faces = []
 labels = []
 # 瀏覽每個目錄并訪問其中的圖像
 for dir_name in dirs:
 # dir_name(str類型)即標簽
 label = int(dir_name)
 # 建立包含當前主題主題圖像的目錄路徑
 subject_dir_path = data_folder_path + "/" + dir_name
 # 獲取給定主題目錄內的圖像名稱
 subject_images_names = os.listdir(subject_dir_path)
 # 瀏覽每張圖片并檢測臉部,然后將臉部信息添加到臉部列表faces[]
 for image_name in subject_images_names:
 # 建立圖像路徑
 image_path = subject_dir_path + "/" + image_name
 # 讀取圖像
 image = cv2.imread(image_path)
 # 顯示圖像0.1s
 cv2.imshow("Training on image...", image)
 cv2.waitKey(100)
 # 檢測臉部
 face, rect = detect_face(image)
 # 我們忽略未檢測到的臉部
 if face is not None:
 #將臉添加到臉部列表并添加相應的標簽
 faces.append(face)
 labels.append(label)
 cv2.waitKey(1)
 cv2.destroyAllWindows()
 #最終返回值為人臉和標簽列表
 return faces, labels
#調用prepare_training_data()函數
faces, labels = prepare_training_data("training_data")
#創建LBPH識別器并開始訓練,當然也可以選擇Eigen或者Fisher識別器
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.train(faces, np.array(labels))
#根據給定的(x,y)坐標和寬度高度在圖像上繪制矩形
def draw_rectangle(img, rect):
 (x, y, w, h) = rect
 cv2.rectangle(img, (x, y), (x + w, y + h), (128, 128, 0), 2)
# 根據給定的(x,y)坐標標識出人名
def draw_text(img, text, x, y):
 cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
#建立標簽與人名的映射列表(標簽只能為整數)
subjects = ["jiaju", "jiaqiang"]
# 此函數識別傳遞的圖像中的人物并在檢測到的臉部周圍繪制一個矩形及其名稱
def predict(test_img):
 #生成圖像的副本,這樣就能保留原始圖像
 img = test_img.copy()
 #檢測人臉
 face, rect = detect_face(img)
 #預測人臉
 label = face_recognizer.predict(face)
 # 獲取由人臉識別器返回的相應標簽的名稱
 label_text = subjects[label[0]]
 # 在檢測到的臉部周圍畫一個矩形
 draw_rectangle(img, rect)
 # 標出預測的名字
 draw_text(img, label_text, rect[0], rect[1] - 5)
 #返回預測的圖像
 return img
#加載測試圖像
test_img1 = cv2.imread("test_data/test1.jpg")
test_img2 = cv2.imread("test_data/test2.jpg")
#執行預測
predicted_img1 = predict(test_img1)
predicted_img2 = predict(test_img2)
#顯示兩個圖像
cv2.imshow(subjects[0], predicted_img1)
cv2.imshow(subjects[1], predicted_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
          

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美在线精品一区二区在线观看 | 亚洲AV无码色情第一综合网 | 国产九色 | 麻豆网站入口 | 色中色在线视频 | 在线中文字幕亚洲 | 久久亚洲在线 | 中文一区 | 欧美18xxxx | 日韩 欧美 国产 师生 制服 | 午夜激情av| 久久在线中文字幕 | 欧美特黄aaaaaaaa大片 | 欧美三区在线观看 | 毛片在线观看视频 | 久久无码AV亚洲精品色午夜 | 国产婷婷色综合AV蜜臀AV | 亚洲呦呦系列视频 | 亚洲欧美在线免费观看 | 国产午夜精品一区二区三区嫩草 | 久操精品在线观看 | 成人伊人| 激情婷婷六月天 | 国产精品v欧美精品∨日韩 一级免费黄色免费片 | 日韩在线免费看网站 | 久久这里只有精品23 | 四虎影在线永久免费四虎地址8848aa | 国产精品国产三级国产aⅴ原创 | 无遮挡一级毛片私人影院 | 在线无码 | 欧美精品一区在线 | 毛片1毛片2毛片3毛片4 | 9l蝌蚪porny中文自拍 | 亚洲精品久久一区二区三区四区 | 久久香蕉综合精品国产 | 91久久国产露脸精品免费 | 久久av影院 | a天堂资源在线观看 | 欧美大码毛片在线播放 | 一级国产黄色片 | 成人精品鲁一区一区二区 |