现在人脸识别功能已经很成熟了,就想做个好玩的小功能:
只要某人来到摄像头前,就播放语音:某某某,你好!

分解一下实现步骤,大概就是:
摄像头采集图像,然后运行人脸识别算法,识别出人脸特征,进行人脸比对,并进行语音提示。

再说一下编程语言的选取,目前做人工智能的,用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相关推荐

  1. python 人脸识别demo

    使用python第三方模块face_recognition实现人脸识别,并根据已命名的图片把名字显示在屏幕上. 安装模块 需要安装opencv,face_recognition,face_recogn ...

  2. Android人脸识别Demo竖屏YUV方向调整和图片保存

    2019独角兽企业重金招聘Python工程师标准>>> 本博客包含三个常用方法,用于盛开Android版人脸识别Demo中竖屏使用时送入yuv数据,但一直无法识别的情况. 1.首先可 ...

  3. python人工智能图像识别_人工智能之Python人脸识别技术,人人都能做识别!

    原标题:人工智能之Python人脸识别技术,人人都能做识别! 作者丨Python小哥哥 https://www.jianshu.com/p/dce1498ef0ee 一.环境搭建 1.系统环境 Ubu ...

  4. python人脸识别、人脸关键点检测、性别检测

    python人脸识别.人脸关键点检测.性别检测 文章目录 根据人脸预测年龄性别和情绪 (python + keras)(三) 一款入门级的人脸.视频.文字检测以及识别的项目. age-gender-e ...

  5. Python人脸识别教程 - 基于Python的开源人脸识别库:离线识别率高达99.38%

    Python人脸识别教程 - 基于Python的开源人脸识别库:离线识别率高达99.38% 仅用 Python 和命令行就可以实现人脸识别的库开源了.该库使用 dlib 顶尖的深度学习人脸识别技术构建 ...

  6. python人脸识别系统下载_简单的Python人脸识别系统

    案例一 导入图片 思路: 1.导入库 2.加载图片 3.创建窗口 4.显示图片 5.暂停窗口 6.关闭窗口 # 1.导入库 import cv2 # 2.加载图片 img = cv2.imread(' ...

  7. python 人脸识别调整人脸大的距离_Python 人脸识别就多简单,看这个就够了!

    原标题:Python 人脸识别就多简单,看这个就够了! 今天给大家介绍一个世界上最简洁的人脸识别库 face_recognition,你可以使用 Python 和命令行工具进行提取.识别.操作人脸. ...

  8. Python | 人脸识别系统 — 用户操作

    本博客为人脸识别系统的摄像头画面展示代码解释 人脸识别系统博客汇总:人脸识别系统-博客索引 项目GitHub地址:Su-Face-Recognition: A face recognition for ...

  9. Python人脸识别黑科技(二):教你使用python+Opencv完成人脸解锁

    继上一篇"Python人脸识别黑科技(一):50行代码运用Python+OpenCV实现人脸追踪+详细教程+快速入门+图像识",那么今天我们来讲关于使用python+opencv+ ...

最新文章

  1. Windows 7 PE RAM 引导盘及WIM 镜像制作
  2. php每个月头一天与最后一天,PHP获取每月第一天与最后一天
  3. 使用 Python 获取 Linux 系统信息的代码
  4. 华为荣耀v20是android10,荣耀V20和荣耀V10买哪个好
  5. 92年清华本科,做了30年技术,43岁在CTO的位置上被优化!找了一年多工作,有些迷茫!...
  6. append一个option会多出一个空的_Collections | 你必须会的Python库
  7. 使用loadrunner进行服务器性能测试(winsocket)
  8. 激活策略 查询_苹果手机未激活也可能不是原装货,激活过的手机到底能不能买?...
  9. 什么叫做形态学图像处理_Python图像处理膨胀与腐蚀
  10. laravel插入数据时报 502 Bad Gateway
  11. Android Xml解析
  12. {errcode:40125,errmsg:invalid appsecret, view more at http:\/\/t.cn\/RAEkdVq, hints: [ req_id:
  13. AUTOCAD——表格样式
  14. 为什么打印还要另存为_为什么打印图片时出现文件另存为
  15. 首个非逆向,不需要手机!的微信视频号采集方案
  16. cad二次开发-C#-VS-镜像-判断用户当前是否已选择实体-将实体对象添加到模型空间-添加实体到块表记录-将块定义插入到模型空间
  17. 【uniapp】 读取手机通讯录权限
  18. 如何判断两个随机变量是否独立,同分布
  19. 网传外企巨头Oracle北京裁员900多人,良心赔偿N+6
  20. 微信小程序,自定义switch组件

热门文章

  1. Linux网络编程经典书籍推荐
  2. 地图/天地图/echarts
  3. 计算机研究生未来职业发展计划书,计算机专业职业生涯规划书结束语2020
  4. MySQL的慢sql优化
  5. 桌面程序使用JavaDB
  6. Android 实现live555 RTSP代理播放器
  7. c#中使用轻量级数据库sqlite开发总结
  8. 数据之美 百度GOOGLE统计的秘密
  9. 彩色图片转为黑白灰阶图片
  10. ROSS仿真系统简单教程