图像识别步骤图
模型文件读取
predictor_path = os.path.join("模块名", "某个文件夹", "model", "shape_predictor_68_face_landmarks.dat")
face_rec_model_path = os.path.join("模块名", "某个文件夹", "model", "dlib_face_recognition_resnet_model_v1.dat")
class YourFaceCompare:
def __init__(self, predictor_path, face_rec_model_path):
self.predictor_path = predictor_path
self.face_rec_model_path = face_rec_model_path
self.detector = dlib.get_frontal_face_detector()
self.shape_predictor = dlib.shape_predictor(self.predictor_path)
self.face_rec_model = dlib.face_recognition_model_v1(self.face_rec_model_path)
shape_predictor_68_face_landmarks.dat文件
dlib库中用于人脸关键点检测的预训练模型文件。它基于shape_predictor_68_face_landmarks模型,该模型被训练用于检测人脸图像中的68个关键点,包括眼睛、眉毛、鼻子、嘴巴等面部特征。
通过加载shape_predictor_68_face_landmarks.dat文件,可以在图像或视频中检测人脸,并定位到每个人脸的68个关键点,然后利用这些关键点进行面部分析、表情识别、姿势估计等应用。
类似于dlib_face_recognition_resnet_model_v1.dat文件,需要在使用dlib库进行人脸关键点检测的代码中加载和引用
dlib_face_recognition_resnet_model_v1.dat文件
dlib库中一个用于人脸识别的模型文件。它是由dlib库提供的一个预训练模型,用于识别和比较人脸特征。这个模型基于ResNet深度神经网络架构,经过大量训练和调整,可以用于在图像或视频中检测和识别人脸,并提取特征向量,用于人脸比对和识别任务。
要使用dlib_face_recognition_resnet_model_v1.dat文件,需要在使用dlib库进行人脸识别的代码中加载和引用该模型文件。这个模型文件是一个二进制文件,可以通过dlib库提供的函数加载到内存中,并在人脸识别过程中使用。
shape_predictor_68_face_landmarks.dat文件。这个模型文件也是一个二进制文件,可以通过dlib库提供的函数加载到内存中,并在人脸关键点检测过程中使用。
识别人脸存储或返回人脸特征向量数据
首先,通过dlib.load_rgb_image()函数加载图像,将图像转换为RGB格式。
使用人脸检测器(self.detector)对图像进行人脸检测,返回检测到的人脸列表。如果未检测到人脸(即人脸列表为空),则返回0表示未检测到人脸。
如果检测到人脸,打印出检测到的人脸数量。对于每个检测到的人脸,使用人脸关键点检测器(self.shape_predictor即上面第1点的用处)获取人脸的68个特征点的位置。使用人脸识别模型(self.face_rec_model即上面第2点的用处)计算人脸的128维特征向量。这个特征向量表示人脸在特征空间中的位置。返回计算得到的人脸特征向量。
这一阶段使用了dlib库中的人脸检测器、人脸关键点检测器和人脸识别模型来识别人脸并提取人脸的特征向量。通过计算人脸特征向量,我们可以识别人脸存储人脸特征向量数据。
def face_detection(self, url_img):
img = dlib.load_rgb_image(url_img)
# 检测人脸
faces = self.detector(img)
if len(faces) == 0:
return 0
else:
# 这里假设每张图只有一个人脸
print('检测到了 %d 个人脸' % len(faces))
# # 提取68个特征点
shape = self.shape_predictor(img, faces[0])
# 计算人脸的128维的向量,即矩阵向量
face_message = self.face_rec_model.compute_face_descriptor(img, shape)
return face_message
欧氏距离计算确定是否同一人
人脸识别的欧式距离计算原理是通过比较两个人脸特征向量之间的距离来判断它们的相似度。欧式距离是一种常见的距离度量方法,它衡量了两个向量之间的直线距离。在人脸识别中,特征向量是从人脸图像中提取出来的数值表示,用于表示人脸的特征信息。
具体而言,欧式距离的计算公式如下:
dis = √((dist_1[0] - dist_2[0])^2 + (dist_1[1] - dist_2[1])^2 + … + (dist_1[n] - dist_2[n])^2)
其中,dist_1和dist_2是两个人脸特征向量,n是特征向量的维度。
在代码中,compare函数接收两个人脸特征向量dist_1和dist_2作为参数,使用NumPy库计算了这两个向量之间的欧式距离。通过将两个特征向量转换为NumPy数组,并进行元素级别的差值和平方运算,然后将结果求和并取平方根,得到了两个特征向量之间的欧式距离。最后,该函数返回了计算得到的距离值。
通过比较不同人脸的特征向量之间的欧式距离,我们可以判断它们的相似度。通常情况下,欧式距离越小,表示两个人脸特征越相似,相似度越高。而欧式距离越大,表示两个人脸特征越不相似,相似度越低。在人脸识别应用中,通常会设置一个阈值,来判断两个人脸是否属于同一个人。如果两个人脸的欧式距离小于阈值,则可以认为它们是同一个人。
# 欧式距离
def compare(self, dist_1, dist_2):
dis = np.sqrt(sum((np.array(dist_1) - np.array(dist_2)) ** 2))
return dis
def score(self, url_img):
data2 = self.face_detection(url_img)
for parent, dirnames, filenames in os.walk(os.path.join("faces")):
for img_path in filenames:
try:
data1 = self.face_detection(os.path.join("faces", img_path))
goal = self.compare(data1, data2)
print("==================", goal)
if goal < 0.4:
# 判断结果,如果goal小于0.4的话是同一个人,否则不是。我所用的是欧式距离判别
return goal, img_path
except Exception as e:
print(e)
pass
return 1
总结
图像识别过程图主要包括以下步骤:
加载预训练模型文件:shape_predictor_68_face_landmarks.dat和dlib_face_recognition_resnet_model_v1.dat。
人脸检测和关键点检测:使用加载的shape_predictor_68_face_landmarks.dat模型对图像进行人脸检测,然后使用人脸关键点检测器获取每个人脸的68个关键点的位置。
人脸识别和特征提取:使用加载的dlib_face_recognition_resnet_model_v1.dat模型对每个人脸进行识别,并计算其128维特征向量。
存储人脸特征向量数据:将计算得到的人脸特征向量保存到数据库或其他数据结构中,用于后续的人脸比对和识别任务。
欧氏距离计算:在人脸比对任务中,使用欧氏距离来衡量两个人脸特征向量之间的相似度。通过比较两个特征向量之间的距离,可以确定它们是否属于同一个人。
图像识别过程图中包括了加载预训练模型文件、人脸检测和关键点检测、人脸识别和特征提取、存储人脸特征向量数据以及欧氏距离计算等步骤。这些步骤通过使用预训练模型和算法,实现了从图像中识别人脸、提取人脸特征、存储特征向量以及进行人脸比对和识别的功能。
详细代码自行下载