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)