python人脸识别demo
现在人脸识别功能已经很成熟了,就想做个好玩的小功能:
只要某人来到摄像头前,就播放语音:某某某,你好!
分解一下实现步骤,大概就是:
摄像头采集图像,然后运行人脸识别算法,识别出人脸特征,进行人脸比对,并进行语音提示。
再说一下编程语言的选取,目前做人工智能的,用python的最多,就用它了。
具体实现的时候,大体分为下面几部分:
1,找一个人脸识别库,运行起来;
2,添加人脸图片;
3,使用摄像头获取图像;
4,文字转换为音频文件;
5,播放音频文件;
6,人脸与音频播放关联起来;
7,循环执行。
下面具体说明下实现步骤:
一,找一个人脸识别库,运行起来
直接上网搜索,就有很多介绍推荐的,具体到能在自己的环境中运行起来,还是得试一试的。 我参考了几个例子后,选择的人脸识别库是:face_recognition,这是Github开源人脸识别项目。号称是世界上最简洁的人脸识别库,只需要几个接口,就完成了人脸识别功能。
我下面的demo中,只调用了如下4个接口:
定位图片中的所有人脸:
face_locations(face_image,number_of_times_to_upsample=1,model="hog")
识别人脸特征(128个特征向量):
face_encodings(face_image, known_face_locations=None, num_jitters=1)
人脸比对:
compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6)
人脸距离:
face_distance(known_face_encodings, face_encoding_to_check)
示例是快速上手一个新库的主要手段,从Face Recognition 官方库下载 源码 ,打开其中的 examples 目录,可以看到里面有各种示例,我是参考了 face_distance.py 、 find_faces_in_picture.py 和 facerec_ipcamera_knn.py 来熟悉这个 Face Recognition 库的使用。
有了示例程序,然后就是搭建环境,主要就是安装几个依赖库:
pip install numpy opencv-pythonpip install dlibpip install face_recognition
再然后就是把demo跑起来了。
文章后面我会提供完整代码。
二,添加人脸图片
demo目录结构如下图:
train中,存放的是底库图片,图片名就是底库人脸对应的人名,例如,lintax.jpg;
test中,存放的是测试图片,具体来说就是test.jpg。
audio目录中,存放的是音频文件。
main.py,就是python代码。
这里,我先把自己用手机拍的照片传进去,选一个有自己正脸的,裁剪得只有自己正脸的图片,编辑图片名称,做为人脸底库。然后换另一张多人的照片,看能否识别到自己。
开头试了下,竟然不能识别到!
做了如下几种调整后,可以识别了:
1,缩小底库图片;
我是缩小到240*240,与例程中图像分辨率比较接近就行了。
2,缩小测试图片,也是缩放到与例程分辨率比较接近的程度。
然后,就能识别到自己了。
然而,出现了一个新问题,有别人也被识别到我了。
考虑这个情况是比对的阈值选择问题,要更加严格一些。这里就需要来调整人脸比对的阈值;
看这个人脸比对函数:
compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6)
参考face_recognition项目的中文说明:
tolerance=0.6:两张脸之间有多少距离才算匹配。该值越小对比越严格,0.6是典型的最佳值。
再看另一处说明:
本项目的人脸识别是基于业内领先的C++开源库 dlib中的深度学习模型,用Labeled Faces in the Wild人脸数据集进行测试,有高达99.38%的准确率。但对小孩和亚洲人脸的识别准确率尚待提升。
亚洲人脸,毫无疑问,我的脸是属于其中的。我也不会去搞什么人脸训练工作,就调整下阈值试试吧。
试了下,把阈值改为0.4就可以了:
tolerance=0.4
到这里,主体功能算是可用了,剩下就是添枝加叶了。
三,使用摄像头获取图像
就是如下两步,就获取到摄像头的图像了:
cam = cv2.VideoCapture(0)
ret,img = cam.read()
接下来,就是把这个图片送入人脸识别,看看能否出结果。
当然,前提是电脑上有个摄像头,并且可以正常工作。
四,文字转换为音频文件
这里,我是采用的网络上的在线转换,见如下地址:
https://app.xunjiepdf.com/text2voice/
输入文字,然后转音频,下载,很方便的。
五,播放音频文件
选什么音频播放库,我对比了几个,选择了playsound,因为它支持mp3,而前面我获取的音频文件就是mp3格式的。
播放动作,也很方便,就是一句代码的事:
playsound('./audio/hello_lintax.mp3')
六,人脸与音频播放关联起来
这个也简单,就是选匹配度最高的特征,对应到人名,再与音频播放关联起来:
name = known_names[best_match] #选匹配度最高的名字if(name.lower()=="lintax"): #判断人名,与音频播放关联起来playsound('./audio/hello_lintax.mp3')
七,循环执行
就是在前面的一次性人脸识别之外,添加一个while循环。
我这里也是简单处理,每5秒从摄像机捕获一帧图像,进行特征提取、比对,根据匹配情况确定是否播放语音。
八,源码
整个demo的代码如下,当然,也可以直接下载(python人脸识别demo-深度学习文档类资源-CSDN下载):
import face_recognition as fr
import cv2
import numpy as np
import os
import time
from playsound import playsoundpath = "./train/"
known_names = []
known_name_encodings = []print("train:")
images = os.listdir(path)
for file_name in images:print(file_name)image = fr.load_image_file(path + file_name)image_path = path + file_nameencoding = fr.face_encodings(image)[0]#print(encoding)known_name_encodings.append(encoding)known_names.append(os.path.splitext(os.path.basename(image_path))[0].capitalize())print(known_names)#调用摄像头
cam = cv2.VideoCapture(0)
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)while True:print("cam.read")ret,img = cam.read()#展示捕获图片print("imshow")cv2.imshow('camera',img)k = cv2.waitKey(20)print("input key is ",k)if k == 27: # esc break#test_image = "./test/test.jpg"#image = cv2.imread(test_image)image = img# image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)print("face_locations:")face_locations = fr.face_locations(image)print("face_encodings:")face_encodings = fr.face_encodings(image, face_locations)for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):print("compare_faces:")matches = fr.compare_faces(known_name_encodings, face_encoding, tolerance=0.4)name = ""print(matches)print("face_distance:")face_distances = fr.face_distance(known_name_encodings, face_encoding)print(face_distances)best_match = np.argmin(face_distances)print(best_match)if matches[best_match]:name = known_names[best_match]print(name)if(name.lower()=="lintax"):playsound('./audio/hello_lintax.mp3') cv2.rectangle(image, (left, top), (right, bottom), (0, 0, 255), 2)cv2.rectangle(image, (left, bottom - 15), (right, bottom), (0, 0, 255), cv2.FILLED)font = cv2.FONT_HERSHEY_DUPLEXcv2.putText(image, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)#cv2.imwrite("./output.jpg", image)time.sleep(5)#释放资源
cam.release()
cv2.destroyAllWindows()
主要参考文章:
http://www.zzvips.com/article/210357.html
https://github.com/ageitgey/face_recognition
https://zhuanlan.zhihu.com/p/45827914
python人脸识别demo相关推荐
- python 人脸识别demo
使用python第三方模块face_recognition实现人脸识别,并根据已命名的图片把名字显示在屏幕上. 安装模块 需要安装opencv,face_recognition,face_recogn ...
- Android人脸识别Demo竖屏YUV方向调整和图片保存
2019独角兽企业重金招聘Python工程师标准>>> 本博客包含三个常用方法,用于盛开Android版人脸识别Demo中竖屏使用时送入yuv数据,但一直无法识别的情况. 1.首先可 ...
- python人工智能图像识别_人工智能之Python人脸识别技术,人人都能做识别!
原标题:人工智能之Python人脸识别技术,人人都能做识别! 作者丨Python小哥哥 https://www.jianshu.com/p/dce1498ef0ee 一.环境搭建 1.系统环境 Ubu ...
- python人脸识别、人脸关键点检测、性别检测
python人脸识别.人脸关键点检测.性别检测 文章目录 根据人脸预测年龄性别和情绪 (python + keras)(三) 一款入门级的人脸.视频.文字检测以及识别的项目. age-gender-e ...
- Python人脸识别教程 - 基于Python的开源人脸识别库:离线识别率高达99.38%
Python人脸识别教程 - 基于Python的开源人脸识别库:离线识别率高达99.38% 仅用 Python 和命令行就可以实现人脸识别的库开源了.该库使用 dlib 顶尖的深度学习人脸识别技术构建 ...
- python人脸识别系统下载_简单的Python人脸识别系统
案例一 导入图片 思路: 1.导入库 2.加载图片 3.创建窗口 4.显示图片 5.暂停窗口 6.关闭窗口 # 1.导入库 import cv2 # 2.加载图片 img = cv2.imread(' ...
- python 人脸识别调整人脸大的距离_Python 人脸识别就多简单,看这个就够了!
原标题:Python 人脸识别就多简单,看这个就够了! 今天给大家介绍一个世界上最简洁的人脸识别库 face_recognition,你可以使用 Python 和命令行工具进行提取.识别.操作人脸. ...
- Python | 人脸识别系统 — 用户操作
本博客为人脸识别系统的摄像头画面展示代码解释 人脸识别系统博客汇总:人脸识别系统-博客索引 项目GitHub地址:Su-Face-Recognition: A face recognition for ...
- Python人脸识别黑科技(二):教你使用python+Opencv完成人脸解锁
继上一篇"Python人脸识别黑科技(一):50行代码运用Python+OpenCV实现人脸追踪+详细教程+快速入门+图像识",那么今天我们来讲关于使用python+opencv+ ...
最新文章
- Windows 7 PE RAM 引导盘及WIM 镜像制作
- php每个月头一天与最后一天,PHP获取每月第一天与最后一天
- 使用 Python 获取 Linux 系统信息的代码
- 华为荣耀v20是android10,荣耀V20和荣耀V10买哪个好
- 92年清华本科,做了30年技术,43岁在CTO的位置上被优化!找了一年多工作,有些迷茫!...
- append一个option会多出一个空的_Collections | 你必须会的Python库
- 使用loadrunner进行服务器性能测试(winsocket)
- 激活策略 查询_苹果手机未激活也可能不是原装货,激活过的手机到底能不能买?...
- 什么叫做形态学图像处理_Python图像处理膨胀与腐蚀
- laravel插入数据时报 502 Bad Gateway
- Android Xml解析
- {errcode:40125,errmsg:invalid appsecret, view more at http:\/\/t.cn\/RAEkdVq, hints: [ req_id:
- AUTOCAD——表格样式
- 为什么打印还要另存为_为什么打印图片时出现文件另存为
- 首个非逆向,不需要手机!的微信视频号采集方案
- cad二次开发-C#-VS-镜像-判断用户当前是否已选择实体-将实体对象添加到模型空间-添加实体到块表记录-将块定义插入到模型空间
- 【uniapp】 读取手机通讯录权限
- 如何判断两个随机变量是否独立,同分布
- 网传外企巨头Oracle北京裁员900多人,良心赔偿N+6
- 微信小程序,自定义switch组件