关于dlib人脸对比,人脸识别

本文介绍了一种基于OpenCV和dlib库的人脸识别方法,通过提取人脸特征点并计算两张人脸之间的欧式距离来判断是否为同一人。文章详细展示了如何使用预训练模型进行人脸检测、特征点提取和特征向量计算,并提供了实际代码示例。
部署运行你感兴趣的模型镜像
  1. 人脸检测

  2. 人脸特征点提取

  3. 人脸对比,等于两张人脸对比,识别

封装的所有识别函数,直接看下面调用就好了。

# coding:utf-8
'''
本本次封装,我主要是做两张人脸对比。
就只人脸识别部分,简单应用。
# 调用注意事项,因为模型底层是外国人写的。所以路径图片名字千万别使用中文,这样它直接找不到
    好像是OpenCV的问题吧,一直没有解决。中文他会乱码。真的坑。
'''

import dlib
import cv2
import glob
import numpy as np

class face_recognition:
    '''
    模型路径
    predictor_path = "./face_model/shape_predictor_68_face_landmarks.dat"
    face_rec_model_path = "./face_model/dlib_face_recognition_resnet_model_v1.dat"

    # 调用注意事项,因为模型底层是外国人写的。所以路径图片名字千万别使用中文,这样它直接找不到
    好像是OpenCV的问题吧,一直没有解决。中文他会乱码。真的坑。
    '''

    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)

    def face_detection(self,url_img_1,url_img_2):
        img_path_list = [url_img_1,url_img_2]
        dist = []
        for img_path in img_path_list:
            img = cv2.imread(img_path)
            # 转换rgb顺序的颜色。
            b, g, r = cv2.split(img)
            img2 = cv2.merge([r, g, b])
            # 检测人脸
            faces = self.detector(img, 1)
            if len(faces):
                for index, face in enumerate(faces):
                    # # 提取68个特征点
                    shape = self.shape_predictor(img2, face)
                    # 计算人脸的128维的向量
                    face_descriptor = self.face_rec_model.compute_face_descriptor(img2, shape)

                    dist.append(list(face_descriptor))
            else:
                pass
        return dist

    # 欧式距离
    def dist_o(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_1,url_img_2):
        url_img_1 = glob.glob(url_img_1)[0]
        url_img_2 = glob.glob(url_img_2)[0]
        data = self.face_detection(url_img_1,url_img_2)
        goal = self.dist_o(data[0],data[1])
        # 判断结果,如果goal小于0.6的话是同一个人,否则不是。我所用的是欧式距离判别
        return 1-goal

调用封装识别函数进行,判别

# 调用 模型下载地址:http://dlib.net/files/
predictor_path = "./face_model/shape_predictor_68_face_landmarks.dat"
face_rec_model_path = "./face_model/dlib_face_recognition_resnet_model_v1.dat"
face_ = face_recognition(predictor_path,face_rec_model_path)
# img_1 = './faces/User.1.4.jpg'
# img_2 = './faces/User.1.46.jpg'
img_1 = './faces/fan.jpg'
img_2 = './faces/fan_2.jpg'
goal = face_.score(img_1,img_2)
print(goal)

 

 

这两张图片的距离为0.32左右,但是只要距离小于0.6就属于同一个人,所以对比结果还是比较好的。

 

转载于:https://www.cnblogs.com/wuzaipei/p/9883179.html

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值