python 基于dlib的人脸识别

现在使用的是dlib库

  1. 安装 python3
    百度搜索python下载安装即可。下载地址https://www.python.org/downloads/windows/
    安装完输入python出现版本号安装成功在这里插入图片描述
  2. 安装pytohn 的opencv库
    如果获取视频要用到opencv库
    pip install opencv-python 安装
    安装完import cv2 测试是否安装成功在这里插入图片描述
  3. 安装dlib库
    人脸识别是基于dlib实现的。
    Dlib是一个包含机器学习算法的C++开源工具包。Dlib可以帮助您创建很多复杂的机器学习方面的软件来帮助解决实际问题。目前Dlib已经被广泛的用在行业和学术领域,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。Dlib是开源的、免费的;官网和git地址:#官网http://dlib.net/#githubhttps://github.com/davisking/dlibDlib
    可以下载未编译的,自己编译,可以开启显卡运行识别,速度会有提升,得有vs与cmake;也可直接下载python对应版本的。
    下载地址https://pypi.org/project/dlib/。
    下载与python对应版本的dlib库后 pip install 下载的dlib 安装
    下面是我自己修改的代码,我首先把人脸的 信息加入mysql数据库,方便以后对比识别,需要安装pymysql,pip install pymysql

加入数据库代码

import pymysql.cursors
import face_recognition
import os

# 连接MySQL数据库
connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='root', db='face', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)

#通过cursor创建游标
cursor = connection.cursor()
rootdir = 'E:\\'#照片路径
list = os.listdir(rootdir) #列出文件夹下所有的目录与文件
for i in range(0,len(list)):
    path = os.path.join(rootdir,list[i])
    if path.endswith('.jpg') or path.endswith('.png') or path.endswith('.bmp') or path.endswith('.JPG'):
        image = face_recognition.load_image_file(path)
        face_encoding = face_recognition.face_encodings(image)[0]
        # 创建sql 语句,并执行
        sql = "INSERT INTO `face` (`user_name`, `encoding`) VALUES ('{}', '{}')".format(list[i],face_encoding)
        print(sql)
        cursor.execute(sql)
        # 提交SQL
        connection.commit()
connection.close()

实时识别代码

获取存入数据库的人脸,进行实时对比识别

import sys
import dlib
import cv2
import os
import glob
from skimage import io
import numpy as np
import time
import pymysql.cursors

current_path = os.getcwd()  # 获取当前路径
# 模型路径
 predictor_path = current_path + "\\model\\shape_predictor_68_face_landmarks.dat"
face_rec_model_path=current_path + "\\model\\face_model.dat'
video_path=0

# 读入模型
detector = dlib.get_frontal_face_detector()
shape_predictor = dlib.shape_predictor(predictor_path)
face_rec_model = dlib.face_recognition_model_v1(face_rec_model_path)
# 创建数组的编码和他们的名字
known_face_encodings = []
known_face_names = []
# 连接MySQL数据库
connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='root', db='face', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
# 通过cursor创建游标
cursor = connection.cursor()
sql="select user_name,encoding from face"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
    uname = row['user_name']
    encod = list(map(float,row['encoding'].replace('[','').replace(']','').replace('\n','').split()))
    known_face_names.append(uname)
    known_face_encodings.append(encod)
    print('add'+uname)
			

def getFace():
    video_capture = cv2.VideoCapture(video_path)
    while True:
        ret, frame = video_capture.read()
        if frame is None:
            video_capture = cv2.VideoCapture(video_path)
            print('丢失帧')
        else:
            rgb_frame = frame[:, :, ::-1]    
        # print("Processing file: {}".format(img_path))
        # opencv 读取图片,并显示
        # img = cv2.imread(img_path, cv2.IMREAD_COLOR)
    # # opencv的bgr格式图片转换成rgb格式
    # print(img)
    # b, g, r = cv2.split(img)
    # img2 = cv2.merge([r, g, b])

        dets = detector(rgb_frame, 1)   # 人脸标定
        print("Number of faces detected: {}".format(len(dets)))
        for index, face in enumerate(dets):
            # print('face {}; left {}; top {}; right {}; bottom {}'.format(index, face.left(), face.top(), face.right(), face.bottom()))
            # cv2.rectangle(frame, (face.left, face.top), (face.right, face.bottom), (0, 0, 255), 2)
            shape = shape_predictor(rgb_frame, face)   # 提取68个特征点
            # for i, pt in enumerate(shape.parts()):
                 #print('Part {}: {}'.format(i, pt))
                # pt_pos = (pt.x, pt.y)
                # cv2.circle(frame, pt_pos, 2, (255, 0, 0), 1)
                # #print(type(pt))
            # #print("Part 0: {}, Part 1: {} ...".format(shape.part(0), shape.part(1)))
            # cv2.namedWindow(img_path+str(index), cv2.WINDOW_AUTOSIZE)
            face_descriptor = face_rec_model.compute_face_descriptor(rgb_frame, shape)   # 计算人脸的128维的向量
            print(comparePersonData(face_descriptor,0.4))#对比得到人脸图片,第二个参数阀值判断,越小越精准
            # print(face_descriptor)
      #  cv2.imshow('Video', frame)
        # 点击键盘上的“q”退出!
       # if cv2.waitKey(1) & 0xFF == ord('q'):
        #    break

def comparePersonData(data1,val):
    facei=0
    for encoding in known_face_encodings:
        diff = 0
        # for v1, v2 in data1, data2:
            # diff += (v1 - v2)**2
        for i in range(len(data1)):
            diff += (data1[i] - encoding[i])**2
        diff = np.sqrt(diff)
        # print(diff)
        if(diff < val):#阈值判断,越小越精准
            return known_face_names[facei]
        # else:
            # print('>0.4')
        facei+=1
if __name__ == '__main__':
    getFace()

k = cv2.waitKey(0)
cv2.destroyAllWindows()

此处设置阀值
在这里插入图片描述
结束

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值