目录
1.环境配置(jupyter notebook python 3.6.5)
废话
嗯,开局说点废话,之前用stm32和esp8266改装了下宿舍门,但终究觉得没人脸识别来得舒服,所以就有了这篇文章
1.环境配置(jupyter notebook python 3.6.5)
我这里用的是python3.6,如果你想搭建一个3.6的环境又不想影响原有的,可以用小黑窗(Anaconda Prompt)搭建一个虚拟环境(虚拟环境是一个独立的空间不会影响外界,也不会受外界影响,适合应对不同版本python的需求)
当你搭建好虚拟环境后,第三方库的安装也要安在虚拟环境里,那么如何切换到虚拟环境里呢
打开小黑窗
activate 虚拟环境名字
就可以激活了效果如下:
看到小括号就说明已经切换到虚拟环境里了
然后就可以安装所需的第三方库了,eg.Opencv,scipy,request,dlib,安装方法如下:
1)OpenCV
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python==3.4.2.16
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python==3.4.2.16
2)scipy
pip install scipy
3) request
pip install request
4) dlib
dlib库的安装比较麻烦,你得先找到对应版本,因为不同python版本对应不同dlib
缺版本或找不到对应版本可以留言
2.训练集准备
这个训练集捏,是借助recognizer.train得到的.yml文件,所以精度没特别高,但是拿来玩玩门锁 还是够用,追求精度可以走深度学习
代码如下:
1)第一步准备照片(即你的人脸像),以“序号.名称”命名,例如“1.xx"这是为了方便切片和保存(即我们可以通过切片将每张照片的脸部特征,序号,名称一一对应)记得你照片的存放路径
2)第二步准备人脸数据集haarcascade_frontalface_alt2.xml,这个是opencv自带的用于检测人脸(注意是检测人脸不是识别人脸)这种做法我觉得有点像RIO ,就是我们在一张图片中匹配人像特征不是从角落开始,而是定位人脸,然后规划一个区域,在区域内进行匹配,这样节省很多时间
3)第三步,跑代码就完事了,然后你会在你指定的文件夹里面找到yml文件,这就是你的训练集
import os
import sys
from PIL import Image
import numpy as np
import cv2
def getImageAndLabels(path):
#建两个空列表后续存储数据
facesSamples=[]
ids=[]
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
#检测人脸
face_detector = cv2.CascadeClassifier('E:\jupyter_notebook\practice\haarcascades\haarcascade_frontalface_alt2.xml')
#打印数组imagePaths
print('路径:',imagePaths)
#遍历列表中的图片
for imagePath in imagePaths:
#打开图片,灰度
PIL_img=Image.open(imagePath).convert('L')
#此时获取的是整张图片的数组
img_numpy=np.array(PIL_img,'uint8')
#获取图片人脸特征,相当于rio
faces = face_detector.detectMultiScale(img_numpy)
#将文件名前的名字转化为ID并记录下来
str_id = os.path.split(imagePath)[1].split('.')[0]
id = int(str_id)
#id = os.path.split(imagePath)[1].split('.')[0]
#预防检测到无面容照片
for x,y,w,h in faces:
#把ID写进ids列表中
ids.append(id)
#把所画的方框写进facesSamples列表中
facesSamples.append(img_numpy[y:y+h,x:x