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...