face_recognition 是一個流行的 Python 庫,用于進行人臉檢測和人臉識別。它基于深度學習技術,通過處理圖
像來識別和驗證人臉。這個庫特別適用于需要人臉識別功能的應用程序,比如面部身份驗證、照片組織、監控系統
等。
下面是它的主要功能介紹
人臉檢測
檢測圖像中的人臉,并返回每張人臉的位置。
使用 face_recognition.face_locations() 函數來檢測圖像中的人臉。
案例演示:
人臉識別
識別圖像中的人臉,并與已知的人臉進行比較。
使用 face_recognition.face_encodings() 來提取人臉的特征向量,這些向量可以用于比對。
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") # 保存裁剪后的圖像
face_encodings = face_recognition.face_encodings(image)[0]計算人臉編碼之間的歐幾里得距離來判斷它們是否屬于同一個人
distance 值越小,相似度越高
案例:
歐幾里得距離
歐幾里得距離(Euclidean distance)是一種測量兩個點之間直線距離的方式,常用于數學、物理學和計算機科學
中的各種應用,包括機器學習中的數據點距離計算。它是基于歐幾里得幾何的概念,通常用于計算空間中兩點之間
的距離。
應用
數據分析: 歐幾里得距離常用于計算數據點之間的距離,例如在聚類算法(如K均值聚類)中。
計算機視覺: 在人臉識別等任務中,歐幾里得距離用于計算特征向量之間的相似度。
優化: 在路徑規劃和優化問題中,計算兩點之間的歐幾里得距離可以幫助尋找最短路徑。
歐幾里得距離的意義
1. 距離越小,相似度越高:
特征向量相似:當歐幾里得距離越小說明兩個特征向量之間的差異越小,即這兩個人臉在特征空間中很
接近。因此,這兩個圖像可能是同一個人或者相似度很高。
# 獲取已知的人臉的編碼
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)
# 獲取已知的人臉的編碼
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)
# 獲取要檢測的人臉的編碼
train_encode02 = face_recognition.face_encodings(image02, face_locations02)[0]
# 計算兩個人臉編碼之間的歐幾里得距離。
distance = np.linalg.norm(train_encode01 ‐ train_encode02)
print(distance)相同身份的概率大:在許多人臉識別系統中,如果計算出的距離小于某個設定的閾值,則系統會認為這
兩個面孔屬于同一個人。
2. 距離閾值:
匹配判斷:通常,系統會設置一個閾值來判斷兩個特征向量是否屬于同一身份。如果計算出的距離小于
這個閾值,則認為兩張圖片中的人臉是相同的;如果距離大于閾值,則認為是不同的身份。
誤識別率:設置的閾值會影響系統的誤識別率(假陽性和假陰性率)。距離閾值的選擇需要根據具體應
用場景進行調整。
python中計算歐幾里得距離的函數
np.linalg.norm() 是 NumPy 庫中的一個函數,用于計算數組或矩陣的范數(norm)。范數是一個衡量向量或
矩陣大小的指標。常見的范數包括歐幾里得范數(2-范數)、曼哈頓范數(1-范數)等
例如:
web頁面開啟攝像頭
這里采用javascript封裝好的打開攝像頭的工具庫
1 導入faceUitl.js文件到項目中
2 在頁面創建一個 id='video'的p,在文檔加載事件調用打開攝像頭函數
django項目中獲取攝像頭傳來的圖片
1 前端通過faceUtile 獲取圖片的編碼,傳值到后端
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 () {
//設置調用攝像頭的寬度和高度
faceUtile.width = 900;
faceUtile.height = 500;
//調用攝像頭
faceUtile.openVideo('video');
})
function getFace() {
//獲取圖片的編碼
const dataURL = faceUtile.getDecode()2 在后端接受圖片編碼,把圖片轉換成二進制變,然后寫入到指定目錄中,保存圖片
$.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)