基于Python的face_recognition库实现⼈脸识别
⼀、face_recognition库简介
face_recognition是Python的⼀个开源⼈脸识别库,⽀持Python 3.3+和Python 2.7。引⽤官⽹介绍:
Recognize and manipulate faces from Python or from the command line with the world's simplest face recognition library.之所以选⽤这个库,是因为
1、⽤这个库来实现⼀个⼈脸识别程序⾮常简单,环境配置也很容易;
2、可以直接使⽤已经训练好的模型,不需要在本地重新训练。⼀般普通的电脑都可以直接运⾏识别程序,硬件环境要求不⾼。
⼆、环境安装
我⾃⼰的环境如下:
硬件:08年的笔记本电脑,奔腾双核,算是⽐较低端的笔记本了
系统:win7x64
python:3.6 (注意:建议⽤3.6版本配置环境。我⾃⼰⽤3.7配置环境失败了,dlib安装总是失败。)
⽤pip安装之前,注意⾸先修改pip为阿⾥的源,这样速度就快多了。
三、代码实现
本⽂采⽤了cnn模型进⾏⼈脸检测,然后使⽤余弦相似度的⽅法来进⾏⼈脸识别。
import face_recognition
import cv2
import os
import numpy as np
from PIL import Image,ImageDraw,ImageFont
#路径参数配置
basefacefilespath = "0s" # faces⽂件夹中放待识别任务正⾯图,⽂件名为⼈名,将显⽰于结果中c语言常量占用存储空间吗
destfacefilepath = "0d" #⽤于识别的⽬标图⽚⽬录
def cos_sim(vector_a, vector_b):
"""
计算两个向量之间的余弦相似度
animation樱花动漫免费观看:param vector_a: 向量 a
:param vector_b: 向量 b
:return: sim
"""
vector_a = np.mat(vector_a)
vector_b = np.mat(vector_b)
num = float(vector_a * vector_b.T)
denom = (vector_a) * (vector_b)
cos = num / denom
sim = 0.5 + 0.5 * cos
return sim
#余弦相似度识别阈值
tolerance = 0.96前端工程师招聘案例
mathcad吧#写⼊中⽂字符⽀持
def paint_chinese_opencv(im, chinese, pos, color):
img_PIL = Image.fromarray(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))
font = uetype('', 14)
font = uetype('', 14)
fillColor = color # (255,0,0)
position = pos # (100,100)
#chinese = chinese.decode('utf-8')
draw = ImageDraw.Draw(img_PIL)
<(position, chinese, font=font, fill=fillColor)
img = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)
return img
# 加载待识别⼈脸图像并识别。
propertymebaseface_titles = [] # 图⽚名字列表
baseface_face_encodings = [] # 识别所需⼈脸编码结构集
#读取⼈脸资源
for fn in os.listdir(basefacefilespath): #fn ⼈脸⽂件名
baseface_face_encodings.append(
face_recognition.face_encodings(face_recognition.load_image_file(basefacefilespath+"/"+fn))[0])
#fn = fn.split("_")[1]
fn = fn[:(len(fn) - 4)]
baseface_titles.append(fn)
print(fn)
python安装教程win7#从识别库中读取⼀张图⽚并识别
for fd in os.listdir(destfacefilepath):
# 获取⼀张图⽚
faceData = face_recognition.load_image_file(destfacefilepath + "/" + fd)
print(fd)
# ⼈脸检测,并获取帧中所有⼈脸编码
# 参数说明,number_of_times_to_upsample可以理解为迭代次数,次数越⼤,⼈脸检测越准确,但是运⾏耗时越长。
# model默认为hog,运⾏速度快,但是识别率不⾼。后⾯第2张图分辨率低,所以必须⽤cnn并且迭代次数为2
face_locations = face_recognition.face_locations(faceData, number_of_times_to_upsample=2, model="cnn")
face_encodings = face_recognition.face_encodings(faceData, face_locations)
# 遍历图⽚中所有⼈脸编码
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
# 与baseface_face_encodings匹配否?
name = "?"
for i,v in enumerate(baseface_face_encodings):
#match = face_recognitionpare_faces([v], face_encoding,tolerance=0.5)
match = cos_sim([v], face_encoding)
name = "?"
if match>=tolerance:
name = baseface_titles[i]
print("识别出:" + name)
break
# 围绕脸的框
#如果遇到没有识别出的⼈脸,则跳过
if name == "?":
continue
# 框下的名字(即,匹配的图⽚⽂件名)
#faceData = cv2.putText(faceData, name,(left + 2, bottom + 12), cv2.FONT_HERSHEY_SIMPLEX,0.5, (255, 255, 255),1) faceData = paint_chinese_opencv(faceData, name, (left + 2, bottom + 4), (255, 255, 255))
# frame = ft.draw_text(frame, (left + 2, bottom + 12), name, 16, (255, 255, 255))
# show结果图像
cv2.imshow(fd, cv2.cvtColor(faceData, cv2.COLOR_BGR2RGB))
cv2.waitKey()
cv2.destroyAllWindows()
cv2.destroyAllWindows()
图⽚分为两个⽂件夹:0s和0d
0s中存放的是基础⼈脸数据
0d⽂件夹中存放的是接下来要进⾏识别的图⽚,我这⾥放了2张:
四、运⾏效果
运⾏结果:
五、问题总结
1、cv2.imshow,这个最开始显⽰的图⽚颜⾊不对,后来修改如下:
cv2.imshow(fd, cv2.cvtColor(faceData, cv2.COLOR_BGR2RGB))
将图⽚的颜⾊模式调整为RGB,然后⾊彩就正常了。
2、中⽂字符⽀持,最开始⽤ cv2.putText,但是这个函数只⽀持英⽂字符,中⽂字符会显⽰问号乱码。后加⼊中⽂字符⽀持函数,⽤ PIL 库中的 ImageDraw 来写⼊中⽂字符。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论