python⼈脸⽐对算法_Python的⼈脸识别,欧式距离⽐对,机器训
练,⼈脸采集,离线识别...
Python ⼈脸识别,⽐对,机器训练,离线识别.⼈脸采集的功能实现及code
博主还是抱着开源精神,因为下⾯这些code是经过了上千次baidu和google搜索出来得到的结果及其想法,提供给⼤家共同学习进步,注释的都很清楚,功能完全实现
先上⼀下效果图
(我知道我很帅,请勿吐槽,谢谢.否则请直接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 ud in both industry and academia in a wide range of domains including robotics, embedded devices, mobile phones, and large high performance computing enviro
nments. Dlib's open source licensing allows you to
u 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 进⾏安装.但是这只是下载下来,如下载过程⽐较慢,建议使⽤切换⼀下源,建议使⽤阿⾥巴巴源或者清华⼤学的源,下载完毕后,会提⽰你运⾏tup.py⽂件.这时候你需要打开python3的库的⽬录(以mac⽰例:路径为:/Library/
Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/),刚才下载的dilb库就在这⾥,这时候你需要⽤命令进⼊该⽬录.执⾏(请注意):python tup.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 = _frontal_face_detector();
5.然后开始while死循环.进⾏检测.
experiences
6.检测到⼈脸后,⽣成特征码face_recognition.face_encodings,⽽后利⽤face_recognition的compare_faces⽅法进⾏⽐对
7.返回识别结果
8.⽂件⽬录
west是什么意思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_l') # 加载⾯部识别的分类器
# 改⽤dlib的⾯部识别
detector = _frontal_face_detector();
# 调⽤dlib的⾯部68点识别训练库⽂件
predictor = dlib.shape_predictor("lib/shape_predictor_68_face_landmarks.dat")
while True:
result, img = ad() # 因为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中取出的angle类的对象,包含了⼈脸的区域等信息
# left()、top()、right()、bottom()都是angle类的⽅法,对应矩形四条边的位置
for index, face in enumerate(faces):
stimulated# 这⾥画出⼈脸框
left = face.left()
top = p()
right = face.right()
bottom = face.bottom()
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
el:
迈克尔杰克逊的歌曲pass
cv2.destroyAllWindows(); # 关闭所有弹出的窗⼝
下⾯的是⼈脸采集
import numpy as np
import cv2
import dlib
import face_recognition
# 注释掉opencv的⾯部分类识别器,因为感觉不是很好使
# detector = cv2.CascadeClassifier('xml/haarcascade_l')
# 改⽤dlib的⾯部识别
detector = _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 = ad() # 接收噶你⽅法返回的结果
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 = p()
right = face.right()
uribottom = face.bottom()
i += 1 #计步器⾃增
cv2.imwrite("img/ur." + str(UID) + '.' + str(i) +
".jpg", gray[top:bottom, left:right]) # 存储照⽚
cv2.imshow('frame', img) # 展⽰图⽚
el:
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
cv2.destroyAllWindows()
下⾯的是⼈脸训练
import cv2
import os
import numpy as np
from PIL import Image
terribleimport 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)
survive是什么意思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=Fal)
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)