现在使用的是dlib库
- 安装 python3
百度搜索python下载安装即可。下载地址https://www.python.org/downloads/windows/
安装完输入python出现版本号安装成功 - 安装pytohn 的opencv库
如果获取视频要用到opencv库
pip install opencv-python
安装
安装完import cv2 测试是否安装成功 - 安装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()
此处设置阀值
结束