Python 人脸识别,比对,机器训练,离线识别.人脸采集的功能实现及code

博主还是抱着开源精神,因为下面这些code是经过了上千次baidu和google搜索出来得到的结果及其想法,提供给大家共同学习进步,注释的都很清楚,功能完全实现

先上一下效果图

bVbzccs?w=828&h=1792

(我知道我很帅,请勿吐槽,谢谢.否则请直接exit())

很长时间没发文了,今天跟大家分享一下关于Python原生的人脸识别(不调用任何第三方的接口),离线版本.

刚开始编写的时候,参考了很多的文章,首先在此先进行感谢一波!

感谢广州工业大学的煎鱼不可能有BUG

当然我后期发现煎鱼的文章中很多Code是来自于CSDN的大佬HongBin_xu关于Python DLIB库的论文

最后感谢机器学习的树莓派

文章可能讲的比较片面,但是你把我在文章的code copy下去,肯定包你能用,识别率可以达到百分之90以上,代码性能有待优化.但是授之以鱼,不如授之以渔.下方我会开始从环境的部署开始讲解.有讲错或者bug的地方,欢迎给我留言.

文章会从所调用的库进行介绍.而后介绍库的安装及部署,希望大家耐心看:

OPENCVOpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法

Dlib is a modern C++ toolkit containing machine learning algorithms and tools for creating complex software in C++ to solve real world problems. It is used in both industry and academia in a wide range of domains including robotics, embedded devices, mobile phones, and large high performance computing environments. Dlib's open source licensing allows you to use it in any application, free of charge.摘抄自于DLIB的官网

face_recognition 这是整个我们需要进行人脸识别,比对.欧式距离分析比较重要的库

剩下比较重要的两个库,在此不做简绍:json numpy.

下面将会介绍库的导入,请务必按照文中顺序跟随(文中环境,命令以mac为主)

在安装dlib之前,首先必须安装cmake库,直接命令pip3 install cmake

安装完cmake之后继续安装boost库,命令:pip3 install boost

安装opecv库,命令 pip3 install opencv.导入的时候注意,code为:import cv2;为什么是cv2,我google查过,因为版本迭代的问题.所以无需太在意

安装完上述两个库之后,到了最麻烦的dlib库,首先还是用命令:pip3 install dlib 进行安装.但是这只是下载下来,如下载过程比较慢,建议使用切换一下源,建议使用阿里巴巴源或者清华大学的源,下载完毕后,会提示你运行setup.py文件.这时候你需要打开python3的库的目录(以mac示例:路径为:/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/),刚才下载的dilb库就在这里,这时候你需要用命令进入该目录.执行(请注意):python setup.py install命令,请别敲错了.

如果你成功完成了上一步,下面就很简单了.我们继续安装face_recognition库,命令还是:pip3 install face_recognition

然后剩下的常用库不再做简绍

完成上述步骤后,首先得恭喜你,完成了opencv,face_recognition,dlib的部署.继续下面的工作,您需要先进行阅读下面的文章:来自Github的face_recognition介绍,中文翻译为同济大学的子豪兄Tommy;

看完子豪兄Tommy的github翻译之后,请继续看face_recognition的方法介绍,这是经过博主综合评估及踩坑之后力荐的;

好的,如果你看完了上述资料,那么我开始给大家讲解这次整个人脸识别程序的流程

打开电脑的摄像头

camera = cv2.VideoCapture(0) # 调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2

调用dlib的面部68点识别训练库文件(这个已经是训练好了的库,请直接使用)直接附上下载链接 传送门文件90多M,慢慢下.

predictor = dlib.shape_predictor("lib/shape_predictor_68_face_landmarks.dat")

使用dlib进行面部识别

detector = dlib.get_frontal_face_detector();

5.然后开始while死循环.进行检测.

6.检测到人脸后,生成特征码face_recognition.face_encodings,而后利用face_recognition的compare_faces方法进行比对

7.返回识别结果

8.文件目录

bVbzcb4?w=508&h=594

ok,废话已经很多.so,下面直接上code,首先从功能性示范开始(代码注释的已经非常详细了,因为我是python菜鸡)

import numpy as np;

import cv2;

import dlib;

camera = cv2.VideoCapture(0) # 调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2

# 注释掉opencv的面部分类识别器,因为感觉不是很好使

# detector = cv2.CascadeClassifier('lib/haarcascade_frontalface_default.xml') # 加载面部识别的分类器

# 改用dlib的面部识别

detector = dlib.get_frontal_face_detector();

# 调用dlib的面部68点识别训练库文件

predictor = dlib.shape_predictor("lib/shape_predictor_68_face_landmarks.dat")

while True:

result, img = camera.read() # 因为read方法反回了两个变量.所以需要定义两个变量进行接收该方法的返回值

# exit();

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换图片为灰度

faces = detector(gray, 1) # 检测出人脸数

# len(faces) > 1

# 利用cv2.putText输出

for i in range(len(faces)):

landmarks = np.matrix([[p.x, p.y] for p in predictor(img, faces[i]).parts()])

# enumerate是一个Python的内置方法,用于遍历索引

# index是序号;face是dets中取出的dlib.rectangle类的对象,包含了人脸的区域等信息

# left()、top()、right()、bottom()都是dlib.rectangle类的方法,对应矩形四条边的位置

for index, face in enumerate(faces):

# 这里画出人脸框

left = face.left()

top = face.top()

right = face.right()

bottom = face.bottom()

cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 3)

shape = predictor(img, face) # 寻找人脸的68个标定点

print(shape)

print(shape.num_parts)

# 遍历所有点,打印出其坐标,并用蓝色的圈表示出来

for index, pt in enumerate(shape.parts()):

print('Part {}: {}'.format(index, pt))

pt_pos = (pt.x, pt.y)

cv2.circle(img, pt_pos, 2, (0, 255, 0), 1)

cv2.imshow('frame', img) # 展示

if cv2.waitKey(1) & 0xFF == ord('q'): # 监听键盘 每一秒检测一下是否按下了Q.

break

else:

pass

camera.release() # 释放摄像头资源

cv2.destroyAllWindows(); # 关闭所有弹出的窗口

下面的是人脸采集

import numpy as np

import cv2

import dlib

import face_recognition

# 注释掉opencv的面部分类识别器,因为感觉不是很好使

# detector = cv2.CascadeClassifier('xml/haarcascade_frontalface_default.xml')

# 改用dlib的面部识别

detector = dlib.get_frontal_face_detector()

# 调用dlib的面部68点识别训练库文件

predictor = dlib.shape_predictor("lib/shape_predictor_68_face_landmarks.dat")

camera = cv2.VideoCapture(0) # 调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2

i = 0 # 设置计步器

UID = input('enter your id: ')

while True:

result, img = camera.read() # 接收噶你方法返回的结果

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度

faces = detector(gray, 1) # 检测出人脸数

if len(faces) == 1:

for index, face in enumerate(faces):

left = face.left()

top = face.top()

right = face.right()

bottom = face.bottom()

cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 3) # 画出框子

i += 1 #计步器自增

cv2.imwrite("img/user." + str(UID) + '.' + str(i) +

".jpg", gray[top:bottom, left:right]) # 存储照片

cv2.imshow('frame', img) # 展示图片

else:

cv2.putText(img, "Warning: can only appear for one person", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

cv2.imshow('frame', img)

if cv2.waitKey(100) & 0xFF == ord('q'): #每秒检查是否按下Q

break

elif i >= 20: # 20次后自动退出

break

camera.release()

cv2.destroyAllWindows()

下面的是人脸训练

import cv2

import os

import numpy as np

from PIL import Image

import face_recognition

import json

def get_images_and_labels(path):

image_paths = [os.path.join(path, f) for f in os.listdir(path)]

# print(image_paths);

faces = []

for src in image_paths:

data = {}

img = cv2.imread(src)

list_of_face_encodings = face_recognition.face_encodings(img)

# print(list_of_face_encodings)

if len(list_of_face_encodings):

data['face'] = list_of_face_encodings[0].tolist()

image_id = int(src.split('.')[1])

data['id'] = image_id

# print(data)

faces.append(data)

print(faces)

return faces

result = get_images_and_labels('img')

# print(result);exit();

# print(json.jumps(result))

with open("data/data.json", "w") as f:

json.dump(result, f, sort_keys=True, indent=4, ensure_ascii=False)

print("加载入文件完成...")

人脸识别

import cv2

import numpy as np

import dlib

import face_recognition

import json

def bejson():

f = open("data/data.json", encoding='utf-8') # 设置以utf-8解码模式读取文件,encoding参数必须设置,否则默认以gbk模式读取文件,当文件中包含中文时,会报错

data = json.load(f)

faces = []

ids = []

for value in data:

faces.append(np.asarray(value['face']));

ids.append(value['id']);

return ids, faces

camera = cv2.VideoCapture(0) # 调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2

# 改用dlib的面部识别

detector = dlib.get_frontal_face_detector()

# 调用dlib的面部68点识别训练库文件

predictor = dlib.shape_predictor("lib/shape_predictor_68_face_landmarks.dat")

font = cv2.FONT_HERSHEY_SIMPLEX

def max_count(lt):

# 定义一个字典,记录元素及次数

d = {}

# 记录最大次数的元素

max_key = None

for i in lt:

# 判断字典中是否没有该元素

if i not in d:

# 计算该元素在列表中出现的次数

count = lt.count(i)

# 保存到字典中

d[i] = count

# 记录最大元素

if count > d.get(max_key, 0):

max_key = i

# for key in d:

# if d.get(max_key, 0) < d[key]:

# max_key = key

return max_key

while True:

result, img = camera.read() # 因为read方法反回了两个变量.所以需要定义两个变量进行接收该方法的返回值

# exit();

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换图片为灰度

faces = detector(gray, 1) # 检测出人脸数

if len(faces) == 1:

# print(face_recognition.face_encodings(img))

face_encoding_to_check = face_recognition.face_encodings(img)

# print(face_encoding_to_check[0]);exit()

# 读取json

ids,data = bejson();

# print(data);exit();

result = face_recognition.compare_faces(

data, face_encoding_to_check[0], tolerance=0.4)

print(result)

uidArray = [] # 识别通过的id

for index, value in enumerate(result):

# print(value)

if value:

uidArray.append(index);

# print(uidArray)

if uidArray:

key = max_count(uidArray)

# 根据索引找到json中的这个人的id

# print(ids[key])

cv2.putText(img, "Verify Success User: No--" +

str(ids[key])+"--", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2)

else:

cv2.putText(img, "Verify Fail-2", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2)

# 利用cv2.putText输出

for i in range(len(faces)):

landmarks = np.matrix([[p.x, p.y] for p in predictor(img, faces[i]).parts()])

# enumerate是一个Python的内置方法,用于遍历索引

# index是序号;face是dets中取出的dlib.rectangle类的对象,包含了人脸的区域等信息

# left()、top()、right()、bottom()都是dlib.rectangle类的方法,对应矩形四条边的位置

for index, face in enumerate(faces):

# 这里画出人脸框

left = face.left()

top = face.top()

right = face.right()

bottom = face.bottom()

cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 3)

shape = predictor(img, face) # 寻找人脸的68个标定点

# print(shape)

# print(shape.num_parts)

# 遍历所有点,打印出其坐标,并用蓝色的圈表示出来

for index, pt in enumerate(shape.parts()):

# print('Part {}: {}'.format(index, pt))

pt_pos = (pt.x, pt.y)

cv2.circle(img, pt_pos, 2, (0, 255, 0), 1)

else:

cv2.putText(img, "Warning: can only appear for one person", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

cv2.imshow('face verify-3', img)

if cv2.waitKey(10) & 0xFF == ord('q'):

break

camera.release()

cv2.destroyAllWindows()

因为博主并不是很精通python,如果有不太ok的地方,望谅解.仅供学习!

happy coding! bye see you!

python人脸比对算法_Python的人脸识别,欧式距离比对,机器训练,人脸采集,离线识别...相关推荐

  1. Tensorflow2实现人脸关键点检测算法PFLD——一个精度高,速度快,模型小的人脸关键点检测模型

    1. 前言 最近,学了人脸关键点检测算法,发现一个比较好的人脸关键点检测模型,打算学一学,让我们来看看算法是如何实现的吧! 论文地址:https://arxiv.org/pdf/1902.10859. ...

  2. python实现k core算法_python实现密度聚类(模板代码+sklearn代码)

    本人在此就不搬运书上关于密度聚类的理论知识了,仅仅实现密度聚类的模板代码和调用skelarn的密度聚类算法. 有人好奇,为什么有sklearn库了还要自己去实现呢?其实,库的代码是比自己写的高效且容易 ...

  3. python实现k core算法_python实现k-近邻算法

    参考:<机器学习实战>- Machine Learning in Action 一. 必备的包 实现此算法需要准备以下的包: • matplotlib,用于绘图 • numpy,数组处理库 ...

  4. python实现冒泡排序完整算法_Python实现冒泡排序算法的完整实例

    冒泡排序:顾名思义就是(较小的值)像泡泡一样往上冒,(大的值)往下沉. 实现原理:依次将相邻两个数值进行比较,较小的数值移到左边,较大的数值移到右边,依次比较完第一轮后,最大的数值应该排在最右边.然后 ...

  5. python实现快排算法_Python实现快速排序算法

    Python实现快速排序算法 快速排序算法是一种基于交换的高效的排序算法,由C.R.A.Hoare于1962年提出,是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide and ...

  6. python实现k均值算法_python实现kMeans算法

    聚类是一种无监督的学习,将相似的对象放到同一簇中,有点像是全自动分类,簇内的对象越相似,簇间的对象差别越大,则聚类效果越好. 1.k均值聚类算法 k均值聚类将数据分为k个簇,每个簇通过其质心,即簇中所 ...

  7. python 多条件 选择 算法_python部署python算法 - 快速寻找满足条件的两个数

    题目前提是一定存在这样两个数 解法一就不写了...一般想不到吧 一开始想到的是解法二最后的用hash表 (其实是想到创建一个跟target一样大的数组啦..存在就写入index,但是要全部找出,那得二 ...

  8. python中难的算法_Python算法很难吗?python神书《算法图解》PDF电子版分享给你

    许多小伙伴后台私信说,python算法让自己很头疼,有没有可以让算法像小说一样有趣的书籍资料呢?看这里吧!小宋为大家找到了这本<算法图解>的PDF电子版!让你在学习python的路上变得轻 ...

  9. python新式类c3算法_python中的MRO和C3算法

    一. 经典类和新式类 1.python多继承 在继承关系中,python子类自动用友父类中除了私有属性外的其他所有内容.python支持多继承.一个类可以拥有多个父类 2.python2和python ...

  10. python新式类c3算法_Python新式类的方法解析顺序MRO与Super

    新式类与经典类的方法解析顺序 MOR(方法解析顺序) 经典类:深度优先 DFS python3以前 新式类:广度优先 python2.2 新式类:广度优先的C3算法实现(拓扑排序) BFS pytho ...

最新文章

  1. 【我翻译的文章】你还需要数据层吗?
  2. python可以实现操作系统管理_Python并发编程 —— 操作系统基础
  3. Asp.Net Web控件 (八)(TabControl 选项卡控件)
  4. CSS的样式小计(1)
  5. CentOS7安装DNS报错IPv6无法解析
  6. 牛客小白月赛9: div.2 A(线性筛)
  7. Apache 配置文件:.htaccess
  8. 前端缓存之HTTP缓存(二)
  9. app开发的三大技术框架
  10. “百度开放云编程马拉松”成都赛区19件作品及团队介绍
  11. 数字图像处理(三):函数fspecial
  12. indy-sdk tutorials数字身份认证(一)
  13. Alpha 事后诸葛亮(团队)
  14. 个人所得税 java_通过Java程序计算个人所得税
  15. app跳转到指定app
  16. HDU 2246 神题?一千多行
  17. Golang 企业级web后端框架
  18. 什么是Type-c降噪耳机?type-c接口耳机降噪方案
  19. maya镜像模型但不改变点序 对称操作
  20. 飞跃计划 | 袋鼠云与睿呈时代达成战略合作,携手助推传统行业数字化转型

热门文章

  1. 80年代的我们对儿时零食的回忆
  2. 如何设置蓝牙音频设备与Mac配合使用呢?
  3. 如何永久的关闭macOS 更新提示?
  4. 临时修改 macOS 应用的界面语言
  5. 基于django的视频点播网站开发-step9-后台视频管理功能
  6. 超过父控件的部分不能响应事件怎么办
  7. 终端会话和孤儿进程组(POSIX-2.2.2.52)--解释问题
  8. C# TimeSpan 计算时间差(时间间隔)
  9. phoenix 开发API系列(一)创建简单的http api
  10. openstack instance bootmgr is missing 问题 修复