Python+Tensorflow+Opencv的人脸识别
简单的人脸识别
一直想做机器学习的东东,最近由于工作的调整,终于有开始接触的机会了,哈哈。本文主要代码是来源于“就是这个七昂”的博文,传送门在此:https://blog.youkuaiyun.com/qq_42633819/article/details/81191308。”就是这个七昂”大大在他的博文中已经将人脸识别的过程讲的很清楚了。说来忏愧,在算法上我没有改变(我自己还没搞清楚,打算好好看看keras),因为在大大博文评论区看到好多人问怎么实现多个用户的人脸识别。刚开始我也在纳闷,怎么做呢?于是我就大胆尝试了一把,
准备工作
在做人脸识别前,你的有一个可以做的环境吧,在这里我当一次搬运工。开发环境的配置可以在网上找一堆,这里简单介绍一下我自己的。
-
安装Anaconda
官网下载地址 https://www.anaconda.com/download/
选择相应的Anaconda进行安装(可能会很慢)
网盘分享链接:https://pan.baidu.com/s/1gtvSnoo7f0-Iu8SvZtospw
密码:3pzr
我电脑是win10 64位系统,我选择安装的是Anaconda3-2019.03-Windows-x86_64.exe这个版本。下载好了安装包,就像安装普通软件一样,安装就行。
一路点下去,在Advanced Option界面时,如果你电脑里面没有其他版本Python就两个都选了。
那就等着吧,时间有点儿长,安装完了可以测试一下
打开cmd,输入conda --version
-
安装Pycharm
首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/download/#section=windows,下载PyCharm安装包,根据自己电脑的操作系统进行选择,对于windows系统选择下图的框框所包含的安装包。这个也可以从网上找很多,而且安装很成功,个人学习的话,建议安装免费版本。 -
pycharm环境配置
打开Pycharm,随便先创建一个工程或者.py文件
点击File→Setting,打开界面在这个选择你刚才安装的anconda,具体可以找找教程(我承认,我懒了)
同时你可以在箭头2的位置添加我们这个项目的第三方库。
你需要到的库有:(我python3.7.1,以下是我安装的版本)
1.tensorflow 1.13.1
2.keras 2.2.4
3.scikit-learn 0.20.3
4.numpy(这个随便)
5.opecv-python 4.1.0.25
OK,差不多就这些。
开始——先获取必要的人脸图像
人脸识别其实就是分类和聚类的过程。
人脸图像获取的代码,我分为了三个脚本,代码如下:
首先是一个newuser_information_collection.py,这个脚本将调用其他脚本
###################################################
#相当于公司人力组织一次所有员工人脸信息采集
###################################################
from gain_face import CatchPICFromVideo
while True:
print("是否录入员工信息(Yes or No)?")
if input() == 'Yes':
#员工姓名(要输入英文,汉字容易报错)
new_user_name = input("请输入您的姓名:")
print("请看摄像头!")
#采集员工图像的数量自己设定,越多识别准确度越高,但训练速度贼慢
window_name = '信息采集' #图像窗口
camera_id = 0 #相机的ID号
images_num = 200 #采集图片数量
path = 'C:\\Users\\Administrator\\Documents\\Python Project\\Face recognition\\data\\' + new_user_name #图像保存位置
CatchPICFromVideo(window_name,camera_id,images_num,path)
else:
break
这个脚本可以让你不断写入图像数据,自定义每组数据大小,自动以你输入命名文件夹,这样就有了多个人脸的分类。
下面是gain_face.py的代码
################
#获取人的脸部信息,并保存到所属文件夹
################
import cv2
import sys
from createfolder import CreateFolder
from PIL import Image
def CatchPICFromVideo(window_name,camera_idx,catch_pic_num,path_name):
#检查输入路径是否存在——不存在就创建
CreateFolder(path_name)
cv2.namedWindow(window_name)
# 视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
cap = cv2.VideoCapture(camera_idx)
# 告诉OpenCV使用人脸识别分类器
classfier = cv2.CascadeClassifier("C:\Program Files (x86)\Python\Python37\Lib\site-packages\cv2\data\haarcascade_frontalface_alt2.xml")
#识别出人脸后要画的边框的颜色,RGB格式
color = (0, 255, 0)
num = 0
while cap.isOpened():
ok, frame = cap.read() # 读取一帧数据
if not ok:
break
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将当前桢图像转换成灰度图像
# 人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=2, minSize=(32, 32))
if len(faceRects) > 0: # 大于0则检测到人脸
for faceRect in faceRects: # 单独框出每一张人脸
x, y, w, h = faceRect