用Python進行人臉識別(五)

2021-09-21 14:49:22 字數 4825 閱讀 6376

opencv的基本操作已經學會了,那麼開始嘗試進行人臉識別吧。

人類區分不同的人臉是根據鼻子、醉、眼睛、眉毛、膚色等等因素,這些因素的大小、間距、形狀的不同,構成了形形色色的人臉,也構成了這個大千世界。人臉識別的前期就是按照這個思路進行,即幾何特徵法。但後來發現這玩應兒並不好用,發展出了許許多多的識別方法。

如果人眼是根據鼻子、嘴巴這些組織的「特徵」來區別人臉,那計算機可不可以按照其他格式的特徵來區別人臉呢?答案是肯定的。基於面部器官的特徵提取、基於模板的特徵提取、基於代數方法的特徵提取、基於彈性匹配法的特徵提取等多重方法應用而生,具體的細節就不介紹了。

但是這個世界上有數十億人,沒有足夠的特徵點根本無法區分如此龐大的人群。利用深度學習(神經網路)可以得到合適的人臉特徵值提取方法。深度學習通過百萬千萬級別的資料訓練,可以自動的提取出那些適合計算機理解的和區分的人臉特徵。現在有128、256、512、1024個特徵的特徵表。face_recognition採用的就是128特徵表。

所有的人臉識別都基於乙個基礎,同乙個人的人臉在不同的環境下所提取出的特徵值大概相等。只要不帶墨鏡、口罩一類的遮擋物,我們在不同影象中所看到的人臉基本相同(p圖過分的不算),計算機由相同的特徵提取方法所提取出的特徵值基本相等,而所對應在特徵空間中的點應該非常接近,不同的人會離的非常遠。

假設某兩個點的距離小於某一閾值則認為是同乙個人,大於這個閾值則認為是不同的人,通過所提取出的特徵點就可以判斷是否為同一人,這就是人臉識別的基本思想。閾值的具體數值需要通過大量的實驗和工程經驗來確定,在不同的環境下所對應的閾值是不同的。

face_recognition所採用的特徵值提取方法與人的膚色無關。戴口罩或墨鏡等掩飾物會使所提取到的特徵值偏離真實的人臉,導致無法識別或者識別錯誤。而在具體的應用環境中,閾值可能會受到影象採集裝置、人物所處環境的較大影響,最終影響識別的成功率。

此例為face_recognition官方給的示例,做了一些改動可以實時的檢測人臉。

import cv2

import os

import face_recognition

import numpy

from pil import image

#新建資料夾來儲存檔案

def make_file():

if os.path.exists('image_data'):

pass

else:

os.makedirs('image_data')

#獲取人物的資訊

def get_message():

#開啟攝像頭

cap = cv2.videocapture(0)

#獲得名字

name = str(input("please input your name"))

#建立儲存路勁

#啟動lbp模型 識別人臉

while true:

ret, image = cap.read()

if ret:#如果成功捕獲影象

cv2.puttext(image, 'please look forward', (10, 20), cv2.font_hershey_complex, 1.0, (255, 255, 255), 1)

gray = cv2.cvtcolor(image, cv2.color_rgb2gray) # 轉化為灰度圖

faces = face_cascade.detectmultiscale(gray, 1.3, 5)

for (x, y, w, h) in faces:

cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)

if (len(faces) != 0):

cv2.imwrite(new_path, gray)

break

cv2.imshow('test2', image)

if cv2.waitkey(1) & 0xff == ord('q'):

break

cap.release()

cv2.destroyallwindows()

return new_path, name

def get_image_encond(image_path, image_name):

image = face_recognition.load_image_file(image_path)

enconding_name = str(image_name) + '_face_encoding'

enconding_name = face_recognition.face_encodings(image)[0]

return enconding_name

人臉識別程式:

import cv2

import dlib

import face_recognition

from image_reserve import get_message, get_image_encond

from add_chinese import change_cv2_draw

import os

#開啟攝像頭

video_capture = cv2.videocapture(0)

obama_image = face_recognition.load_image_file('c://users/lenovo/desktop/test-data/test1.jpg')#載入

obama_face_enconding = face_recognition.face_encodings(obama_image)[0]#將進行編碼

#存入特徵值

know_face_encondings = [

obama_face_enconding,

biden_face_enconding,

]#匹配姓名

know_face_names = [

'obama',

'joe biden',

]#將新的人臉編碼

new_image_path,new_name = get_message()

new_encon = (get_image_encond(new_image_path,new_name))

face_locations =

face_encondings =

process_this_frame = true

#實時檢測

while true:

#讀取攝像頭影象

ret, frame = video_capture.read()

#把變成原來的 1/4 大小 減少計算量 加快執行速率

small_frame =cv2.resize(frame, (0,0), fx=0.25, fy=0.25)

rgb_samll_frame = small_frame[:, :, ::-1]

if process_this_frame:

face_locations = face_recognition.face_locations(rgb_samll_frame)

face_encondings = face_recognition.face_encodings(rgb_samll_frame, face_locations)

face_names =

for face_enconding in face_encondings:

#跟已有的資料庫進行查詢

matches = face_recognition.compare_faces(know_face_encondings, face_enconding, tolerance=0.5)

name = 'unknown'

if true in matches:

first_match_index = matches.index(true)

name = know_face_names[first_match_index]

process_this_frame = not process_this_frame

for(top, right, bottom, left), name in zip(face_locations, face_names):

top *= 4

right *= 4

bottom *= 4

left *= 4

cv2.rectangle(frame, (left, top), (right, bottom), (0,0,255), 2) #畫出邊框

font = cv2.font_hershey_duplex

cv2.puttext(frame, name, (left, top), font, 1.0, (255,255,255), 1)

frame = change_cv2_draw(frame, name, (left, top), 50, (255,0,0))

cv2.imshow('video', frame) #顯示影象

if cv2.waitkey(1) & 0xff == ord('q'): #按下q 退出

break

video_capture.release()#關閉攝像頭

cv2.destroyallwindows()

用Python進行人臉識別(二)

安裝anaconda 安裝pycharm pycharm是python ide,而anaconda是乙個基於python的環境管理工具。python有著強大的庫資源 標準庫和第三方庫 利用這些庫可以在不同的領域程式設計開發,而且語法較為簡單 易懂。python有這麼多庫,不同的庫又有不同的版本,那怎...

用python進行人臉識別(三)

由於anaconda3自帶的python包是py37,開發過程中有個包一直出錯,好長時間都沒有解決,直接換成py36。需要新建py36的虛擬環境,其他版本的python操作類似。當然,你也可以直接使用py37。我只是為了更快的完成,方便查詢資料才切換成py36.首先按下win r,輸入cmd開啟命令...

用Python進行人臉識別(四)

上一節已經成功的安裝 opnecv庫,這節介紹一下opnecv的基本用法。對進行讀取 複製 儲存,在設計中需要提取進行分類的訓練,或者呼叫庫對進行識別處理,以及人臉註冊時需要儲存相對應人物的。import cv2 import numpy as np from pil import image,im...