face_recognition 庫介紹
時間:2024-11-27 來源:華(hua)清遠見(jian)
face_recognition 是一個流行(xing)的 Python 庫,用于(yu)進行(xing)人(ren)臉檢測和人(ren)臉識別(bie)。它基(ji)于(yu)深(shen)度學(xue)習技(ji)術(shu),通(tong)過(guo)處理圖
像來識別和驗證人(ren)臉(lian)(lian)。這個庫特別適用于需要(yao)人(ren)臉(lian)(lian)識別功能的應用程序(xu),比(bi)如面(mian)部(bu)身份驗證、照(zhao)片(pian)組織(zhi)、監(jian)控系統(tong)
等。
下面是它的主要功能介紹
人臉檢測
檢測圖像中(zhong)的(de)人臉,并返回(hui)每(mei)張人臉的(de)位置。
使用(yong) face_recognition.face_locations() 函數(shu)來(lai)檢測圖像中的人臉。
案例演示:
人臉識別
識(shi)別圖像中的(de)人(ren)臉,并與已(yi)知的(de)人(ren)臉進(jin)行比(bi)較。
使(shi)用 face_recognition.face_encodings() 來提取人臉的特(te)征向量(liang),這(zhe)些(xie)向量(liang)可以用于比對。
import face_recognition
image = face_recognition.load_image_file("your_image.jpg")
face_locations = face_recognition.face_locations(image)
import face_recognition
from PIL import Image
image = face_recognition.load_image_file("D:/faceImages/999.jpg")
face_locations = face_recognition.face_locations(image)
print(face_locations)
# 遍歷所有檢測到的人臉
pil_image = Image.fromarray(image)
for (top, right, bottom, left) in face_locations:
# 裁剪人臉區域
face_image = pil_image.crop((left, top, right, bottom))
face_image.save("test.jpg") # 保存裁剪后(hou)的(de)圖像
face_encodings = face_recognition.face_encodings(image)[0]計算人(ren)臉編碼之間的歐幾里得距離來(lai)判斷(duan)它(ta)們是否屬于同一(yi)個人(ren)
distance 值越小,相似度越高
案例:
歐幾里得距離
歐(ou)幾里得(de)距(ju)離(Euclidean distance)是一種測(ce)量兩(liang)個點之間直線距(ju)離的(de)方式,常用于數學、物(wu)理(li)學和計算(suan)機科學
中(zhong)的各種應用,包括機器學習中(zhong)的數據點(dian)距(ju)離計算。它是基于歐幾里(li)得幾何(he)的概念,通常用于計算空間中(zhong)兩點(dian)之間
的距離。
應用
數(shu)(shu)據分析(xi): 歐(ou)幾里得距離(li)常用于計算數(shu)(shu)據點(dian)之間的(de)距離(li),例如在聚(ju)(ju)類(lei)算法(如K均(jun)值聚(ju)(ju)類(lei))中。
計算機視覺: 在人(ren)臉識(shi)別等任務中(zhong),歐幾(ji)里得(de)距離用于(yu)計算特(te)征向量之間的相似度。
優化(hua): 在路徑規(gui)劃和(he)優化(hua)問題中,計算兩(liang)點之間(jian)的歐幾(ji)里得距離可(ke)以幫(bang)助尋找(zhao)最短路徑。
歐(ou)幾里(li)得距(ju)離(li)的意義
1. 距離越(yue)小,相似度(du)越(yue)高(gao):
特征(zheng)向量相似:當歐幾里得距離越小說明兩(liang)個特征(zheng)向量之間的(de)差異(yi)越小,即這(zhe)兩(liang)個人臉在特征(zheng)空(kong)間中很
接近。因此,這兩(liang)個圖像可能是同一(yi)個人或(huo)者相似度很高。
# 獲取已知的(de)人臉的(de)編碼
train_encode01=
# 獲取要檢測的人臉的編碼
train_encode02=
# 計算兩個人臉編碼之間的歐幾里得距離。
distance = np.linalg.norm(train_encode01 ‐ train_encode02)
import face_recognition
import numpy as np
image01 = face_recognition.load_image_file("D:/faceImages/999.jpg")
face_locations01 = face_recognition.face_locations(image01)
# 獲(huo)取已知的人(ren)臉的編碼
train_encode01 = face_recognition.face_encodings(image01, face_locations01)[0]
image02 = face_recognition.load_image_file("D:/faceImages/888.jpg")
face_locations02 = face_recognition.face_locations(image02)
# 獲(huo)取要檢(jian)測的人臉的編碼
train_encode02 = face_recognition.face_encodings(image02, face_locations02)[0]
# 計算兩個人臉編碼之間的歐幾里得距離。
distance = np.linalg.norm(train_encode01 ‐ train_encode02)
print(distance)相同身份的(de)概率大:在許多人臉識別系統中,如果計算(suan)出的(de)距離(li)小于某個(ge)設定的(de)閾(yu)值,則(ze)系統會認為這(zhe)
兩(liang)個(ge)面孔屬于同一(yi)個(ge)人。
2. 距(ju)離(li)閾值(zhi):
匹配判斷(duan)(duan):通常(chang),系統(tong)會設置一(yi)個閾值來判斷(duan)(duan)兩個特征向量是(shi)否屬于同(tong)一(yi)身份(fen)。如果(guo)計算出的距離小于
這個閾(yu)值(zhi),則(ze)認(ren)為兩張圖片中(zhong)的人(ren)臉是相同的;如果距離大于閾(yu)值(zhi),則(ze)認(ren)為是不同的身份。
誤識別(bie)率:設置的(de)(de)閾值(zhi)會影響系統的(de)(de)誤識別(bie)率(假(jia)陽性(xing)和假(jia)陰性(xing)率)。距離(li)閾值(zhi)的(de)(de)選擇需要根據具體應
用場景進行調整。
python中計算(suan)歐幾里得距離(li)的函數
np.linalg.norm() 是 NumPy 庫中的一(yi)個(ge)函數(shu)(shu),用于計算數(shu)(shu)組或矩陣的范數(shu)(shu)(norm)。范數(shu)(shu)是一(yi)個(ge)衡量向量或
矩陣大(da)小的指(zhi)標。常(chang)見的范(fan)(fan)數(shu)包括歐幾里得范(fan)(fan)數(shu)(2-范(fan)(fan)數(shu))、曼(man)哈(ha)頓范(fan)(fan)數(shu)(1-范(fan)(fan)數(shu))等
例如:
web頁面開啟攝像頭(tou)
這(zhe)里采用javascript封裝好的打開攝像(xiang)頭的工具庫
1 導入faceUitl.js文件(jian)到項目中(zhong)
2 在頁面創(chuang)建一個 id='video'的p,在文(wen)檔加載事件調用打開攝像頭(tou)函數
django項目中(zhong)獲取攝像頭傳來的圖片(pian)
1 前(qian)端通過faceUtile 獲取圖(tu)片的編碼,傳值到后端
import numpy as np
vector1 = np.array([3, 4,5])
vector2 = np.array([4, 4,5])
norm = np.linalg.norm(vector1‐vector2)
print(norm)
<p id="video"></p>
$(function () {
//設置調用攝像(xiang)頭的寬度和高度
faceUtile.width = 900;
faceUtile.height = 500;
//調用攝像(xiang)頭(tou)
faceUtile.openVideo('video');
})
function getFace() {
//獲取圖片的編碼
const dataURL = faceUtile.getDecode()2 在后(hou)端接受(shou)圖片(pian)編(bian)碼,把圖片(pian)轉(zhuan)換成(cheng)二(er)進制變(bian),然后(hou)寫入到指定目錄中,保存圖片(pian)
$.ajax({
url: '/faceCollect/',
type: 'POST',
data: JSON.stringify({ image: dataURL }),
success: function(rs) {
console.log(rs)
},
});
}
import json
import base64
import io
from PIL import Image
from django.http import JsonResponse
import numpy as np
#
def register(request):
if request.method == 'POST':
data = json.loads(request.body.decode('utf‐8'))
image_data = data['image']
# 解碼圖像數據
image_data = image_data.split(',')[1]
#獲取圖片的二進制編碼
image_bytes = base64.b64decode(image_data)
file_path = f'D:/faceImages/1.jpg' # 指定保存路徑
with open(file_path, 'wb') as file:
file.write(image_bytes)
data ={"code":200,"data":"success"}
return JsonResponse(data)

