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 used 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
use it in any application, free of charge.摘抄⾃于DLIB的官⽹
face_recognition 这是整个我们需要进⾏⼈脸识别,⽐对.欧式距离分析⽐较重要的库
剩下⽐较重要的两个库,在此不做简绍:json numpy.
下⾯将会介绍库的导⼊,请务必按照⽂中顺序跟随(⽂中环境,命令以mac为主)
在安装dlib之前,⾸先必须安装cmake库,直接命令pip3 install cmake
安装完cmake之后继续安oost库,命令: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 = _frontal_face_detector();
5.然后开始while死循环.进⾏检测.
6.检测到⼈脸后,⽣成特征码face_recognition.face_encodings,⽽后利⽤face_recognition的compare_faces⽅法进⾏⽐对
7.返回识别结果
8.⽂件⽬录
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):
# 这⾥画出⼈脸框
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))
rectangle函数opencvpt_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
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()
bottom = face.bottom()
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
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)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论