Python3 利用face_recognition实现人脸识别的方法


Posted in Python onMarch 13, 2020

前言

之前实践了下face++在线人脸识别版本,这回做一下离线版本。github 上面有关于face_recognition的相关资料,本人只是做个搬运工,对其中的一些内容进行搬运,对其中一些例子进行实现。

官方描述:

face_recognition是一个强大、简单、易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,特别是兼容树莓派系统。本项目是世界上最简洁的人脸识别库,你可以使用Python和命令行工具提取、识别、操作人脸。本项目的人脸识别是基于业内领先的C++开源库 dlib中的深度学习模型,用Labeled Faces in the Wild人脸数据集进行测试,有高达99.38%的准确率。但对小孩和亚洲人脸的识别准确率尚待提升。

(关于兼容树莓派,以后有板子了再做一下)

下面两个链接划重点

https://github.com/ageitgey/face_recognition/blob/master/README_Simplified_Chinese.md
https://face-recognition.readthedocs.io/en/latest/face_recognition.html

环境配置

  • ubuntu16.04(其他环境的安装可以参考第一个链接,官方有说明)
  • pycharm(可忽略,怎么舒服怎么来)
  • python3
  • opencv(我的是4.1.2,三点几的版本应该也一样)

实际上只需要安装face_recognition,当然,没有opencv的也需要安装一下opencv

pip3 install face_recognition

图片准备

由于需要做一些图片的比对,因此需要准备一些图片,本文图片取自以下链接

https://www.zhihu.com/question/314169580/answer/872770507

接下来开始操作

官方还有提供命令行的操作(这个没去做),本文不做这个,我们只要是要在python中用face_recognition,因此定位到这一块。

Python3 利用face_recognition实现人脸识别的方法

这个api文档地址就是上面的第二个链接。进去之后可以看到:

Python3 利用face_recognition实现人脸识别的方法

part1.识别图片中的人是谁

代码

# part1
# 识别图片中的人是谁
import face_recognition
known_image = face_recognition.load_image_file("lyf1.jpg")
unknown_image = face_recognition.load_image_file("lyf2.jpg")

lyf_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]

results = face_recognition.compare_faces([lyf_encoding], unknown_encoding)	
# A list of True/False values indicating which known_face_encodings match the face encoding to check

print(type(results))
print(results)

if results[0] == True:
  print("yes")
else:
  print("no")

结果

<class 'list'>
[True]
yes

part2.从图片中找到人脸

代码

# part2
# 从图片中找到人脸(定位人脸位置)

import face_recognition
import cv2

image = face_recognition.load_image_file("lyf1.jpg")

face_locations_useCNN = face_recognition.face_locations(image,model='cnn')
# model ? Which face detection model to use. “hog” is less accurate but faster on CPUs.
# “cnn” is a more accurate deep-learning model which is GPU/CUDA accelerated (if available). The default is “hog”.

face_locations_noCNN=face_recognition.face_locations(image)
# A list of tuples of found face locations in css (top, right, bottom, left) order
# 因为返回值的顺序是这样子的,因此在后面的for循环里面赋值要注意按这个顺序来

print("face_location_useCNN:")
print(face_locations_useCNN)
face_num1=len(face_locations_useCNN)
print(face_num1)    # The number of faces


print("face_location_noCNN:")
print(face_locations_noCNN)
face_num2=len(face_locations_noCNN)
print(face_num2)    # The number of faces
# 到这里为止,可以观察两种情况的坐标和人脸数,一般来说,坐标会不一样,但是检测出来的人脸数应该是一样的
# 也就是说face_num1 = face_num2; face_locations_useCNN 和 face_locations_noCNN 不一样


org = cv2.imread("lyf1.jpg")
img = cv2.imread("lyf1.jpg")
cv2.imshow("lyf1.jpg",img) # 原始图片

# Go to get the data and draw the rectangle
# use CNN
for i in range(0,face_num1):
  top = face_locations_useCNN[i][0]
  right = face_locations_useCNN[i][1]
  bottom = face_locations_useCNN[i][2]
  left = face_locations_useCNN[i][3]

  start = (left, top)
  end = (right, bottom)

  color = (0,255,255)
  thickness = 2
  cv2.rectangle(img, start, end, color, thickness)  # opencv 里面画矩形的函数

# Show the result
cv2.imshow("useCNN",img)


# for face_location in face_locations_noCNN:
#
#   # Print the location of each face in this image
#   top, right, bottom, left = face_location
# # 等价于下面的这种写法

for i in range(0,face_num2):
  top = face_locations_noCNN[i][0]
  right = face_locations_noCNN[i][1]
  bottom = face_locations_noCNN[i][2]
  left = face_locations_noCNN[i][3]

  start = (left, top)
  end = (right, bottom)

  color = (0,255,255)
  thickness = 2
  cv2.rectangle(org, start, end, color, thickness)

cv2.imshow("no cnn ",org)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果

face_location_useCNN:
[(223, 470, 427, 266)]
1
face_location_noCNN:
[(242, 489, 464, 266)]
1

图片效果大致是这样

Python3 利用face_recognition实现人脸识别的方法

part3.找到人脸并将其裁剪打印出来(使用cnn定位人脸)

代码

# part3
# 找到人脸并将其裁剪打印出来(使用cnn定位人脸)

from PIL import Image
import face_recognition

# Load the jpg file into a numpy array
image = face_recognition.load_image_file("lyf1.jpg")

face_locations = face_recognition.face_locations(image, number_of_times_to_upsample=0, model="cnn")

print("I found {} face(s) in this photograph.".format(len(face_locations)))

for face_location in face_locations:
  top, right, bottom, left = face_location
  print("A face is located at pixel location Top: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom, right))

  face_image = image[top:bottom, left:right]
  pil_image = Image.fromarray(face_image)
  pil_image.show()

结果

I found 1 face(s) in this photograph.
A face is located at pixel location Top: 205, Left: 276, Bottom: 440, Right: 512

图片效果大致是这样

Python3 利用face_recognition实现人脸识别的方法

part4.识别单张图片中人脸的关键点

代码

# part4 识别单张图片中人脸的关键点

from PIL import Image, ImageDraw
import face_recognition

# Load the jpg file into a numpy array
image = face_recognition.load_image_file("lyf1.jpg")

# Find all facial features in all the faces in the image
face_landmarks_list = face_recognition.face_landmarks(image)
# print(face_landmarks_list)

print("I found {} face(s) in this photograph.".format(len(face_landmarks_list)))

# Create a PIL imagedraw object so we can draw on the picture
pil_image = Image.fromarray(image)
d = ImageDraw.Draw(pil_image)

for face_landmarks in face_landmarks_list:

  # Print the location of each facial feature in this image
  for facial_feature in face_landmarks.keys():
    print("The {} in this face has the following points: {}".format(facial_feature, face_landmarks[facial_feature]))

  # Let's trace out each facial feature in the image with a line!
  for facial_feature in face_landmarks.keys():
    d.line(face_landmarks[facial_feature], width=5)

# Show the picture
pil_image.show()

结果

I found 1 face(s) in this photograph.
The left_eyebrow in this face has the following points: [(305, 285), (321, 276), (340, 277), (360, 281), (377, 288)]
The right_eye in this face has the following points: [(422, 313), (432, 303), (446, 302), (459, 305), (449, 312), (435, 314)]
The nose_bridge in this face has the following points: [(394, 309), (394, 331), (395, 354), (396, 375)]
The right_eyebrow in this face has the following points: [(407, 287), (424, 278), (442, 273), (461, 272), (478, 279)]
The bottom_lip in this face has the following points: [(429, 409), (419, 421), (408, 428), (398, 430), (389, 429), (377, 424), (364, 412), (370, 413), (389, 414), (398, 415), (407, 413), (423, 411)]
The chin in this face has the following points: [(289, 295), (291, 323), (296, 351), (303, 378), (315, 403), (332, 428), (353, 448), (376, 464), (400, 467), (422, 461), (441, 444), (459, 425), (473, 403), (484, 377), (490, 351), (493, 323), (493, 296)]
The top_lip in this face has the following points: [(364, 412), (377, 407), (389, 403), (397, 406), (406, 402), (417, 405), (429, 409), (423, 411), (406, 412), (397, 414), (389, 413), (370, 413)]
The left_eye in this face has the following points: [(327, 308), (339, 304), (353, 306), (364, 314), (352, 317), (338, 316)]
The nose_tip in this face has the following points: [(375, 383), (386, 387), (396, 390), (407, 385), (416, 381)]

图片效果

Python3 利用face_recognition实现人脸识别的方法

到此这篇关于Python3 利用face_recognition实现人脸识别的方法的文章就介绍到这了,更多相关Python3 人脸识别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python httplib,smtplib使用方法
Sep 06 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 Python
python里使用正则表达式的组嵌套实例详解
Oct 24 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
Jan 09 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
Jul 09 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
Python实现多属性排序的方法
Dec 05 Python
python 创建一维的0向量实例
Dec 02 Python
python:解析requests返回的response(json格式)说明
Apr 30 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 Python
python flappy bird小游戏分步实现流程
Feb 15 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 #Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
Mar 13 #Python
详解用Python进行时间序列预测的7种方法
Mar 13 #Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 #Python
在django项目中导出数据到excel文件并实现下载的功能
Mar 13 #Python
Django choices下拉列表绑定实例
Mar 13 #Python
django model object序列化实例
Mar 13 #Python
You might like
php下将XML转换为数组
2010/01/01 PHP
php checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
2013/06/05 PHP
php对数组排序的简单实例
2013/12/25 PHP
php静态文件生成类实例分析
2015/01/03 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
2019/05/20 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
JS实现字符串转日期并比较大小实例分析
2015/12/09 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
详解Python中expandtabs()方法的使用
2015/05/18 Python
python中数据爬虫requests库使用方法详解
2018/02/11 Python
python获取服务器响应cookie的实例
2018/12/28 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
Python文件操作方法详解
2020/02/09 Python
学python最电脑配置有要求么
2020/07/05 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
中医药大学市场营销专业自荐信
2013/09/29 职场文书
运动会广播稿60字
2014/01/15 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
公司员工体检通知
2015/04/21 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
python和anaconda的区别
2022/05/06 Python