梳理一下实现人脸识别需要进行的步骤:
流程大致如此,在此之前,要先让人脸被准确的找出来,也就是能准确区分人脸的分类器,在这里我们可以用已经训练好的分类器,网上种类较全,分类准确度也比较高,我们也可以节约在这方面花的时间。
ps: 博主的宝贝来源已经放在下面链接里啦~
推荐:GitHub项目
https://github.com/opencv/opencv/tree/master/data/haarcascades
既然用的是python,那自然少不了包的使用了,在看代码之前,我们先将整个项目所需要的包罗列一下:
**· CV2(Opencv):**图像识别,摄像头调用
**· os:**文件操作
**· numpy:**NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库
**· PIL:**Python Imaging Library,Python平台事实上图像处理的标准库
二、接下来
=====
1. 对照人脸获取
#-----获取人脸样本-----
import cv2
#调用笔记本内置摄像头,参数为0,如果有其他的摄像头可以调整参数为1,2
cap = cv2.VideoCapture(0)
#调用人脸分类器,要根据实际路径调整3
face_detector = cv2.CascadeClassifier(r’X:/Users/73950/Desktop/FaceRec/haarcascade_frontalface_default.xml’) #待更改
#为即将录入的脸标记一个id
face_id = input(‘\n User data input,Look at the camera and wait …’)
#sampleNum用来计数样本数目
count = 0
while True:
#从摄像头读取图片
success,img = cap.read()
#转为灰度图片,减少程序符合,提高识别度
if success is True:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
else:
break
#检测人脸,将每一帧摄像头记录的数据带入OpenCv中,让Classifier判断人脸
#其中gray为要检测的灰度图像,1.3为每次图像尺寸减小的比例,5为minNeighbors
faces = face_detector.detectMultiScale(gray, 1.3, 5)
#框选人脸,for循环保证一个能检测的实时动态视频流
for (x, y, w, h) in faces:
#xy为左上角的坐标,w为宽,h为高,用rectangle为人脸标记画框
cv2.rectangle(img, (x, y), (x+w, y+w), (255, 0, 0))
#成功框选则样本数增加
count += 1
#保存图像,把灰度图片看成二维数组来检测人脸区域
#(这里是建立了data的文件夹,当然也可以设置为其他路径或者调用数据库)
cv2.imwrite(“data/User.”+str(face_id)+‘.’+str(count)+‘.jpg’,gray[y:y+h,x:x+w])
#显示图片
cv2.imshow(‘image’,img)
#保持画面的连续。waitkey方法可以绑定按键保证画面的收放,通过q键退出摄像
k = cv2.waitKey(1)
if k == ‘27’:
break
#或者得到800个样本后退出摄像,这里可以根据实际情况修改数据量,实际测试后800张的效果是比较理想的
elif count >= 800:
break
#关闭摄像头,释放资源
cap.realease()
cv2.destroyAllWindows()
经博主测试,在执行
“face_detector = cv2.CascadeClssifier(r’C:\Users\admin\Desktop\python\data\haarcascade_frontalface_default.xml’)”此语句时,实际路径中的目录名尽量不要有中文字符出现,否则容易报错。
这样,你的电脑就能看到你啦!
2. 通过算法建立对照模型
本次所用的算法为opencv中所自带的算法,opencv较新版本中(我使用的是2.4.8)提供了一个FaceRecognizer类,里面有相关的一些人脸识别的算法及函数接口,其中包括三种人脸识别算法(我们采用的是第三种)
1.eigenface
2.fisherface
3.LBPHFaceRecognizer
LBP是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的LBP算子是在3X3窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。这样就能得到一个八位二进制的码,转换为十进制即LBP码,于是得到了这个窗口的LBP值,用这个值来反映这个窗口内的纹理信息。
LBPH是在原始LBP上的一个改进,在opencv支持下我们可以直接调用函数直接创建一个LBPH人脸识别的模型。
我们在前一部分的同目录下创建一个Python文件,文件名为trainner.py,用于编写数据集生成脚本。同目录下,创建一个文件夹,名为trainner,用于存放我们训练后的识别器。
#-----建立模型、创建数据集-----#-----建立模型、创建数据集-----
import os
import cv2
import numpy as np
from PIL import Image
#导入pillow库,用于处理图像
#设置之前收集好的数据文件路径
path = ‘data’
#初始化识别的方法
recog = cv2.face.LBPHFaceRecognizer_create()
#调用熟悉的人脸分类器
detector = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
#创建一个函数,用于从数据集文件夹中获取训练图片,并获取id
#注意图片的命名格式为User.id.sampleNum
def get_images_and_labels(path):
image_paths = [os.path.join(path,f) for f in os.listdir(path)]
#新建连个list用于存放
face_samples = []
ids = []
#遍历图片路径,导入图片和id添加到list中
for image_path in image_paths:
#通过图片路径将其转换为灰度图片
img = Image.open(image_path).convert(‘L’)
#将图片转化为数组
img_np = np.array(img,‘uint8’)
if os.path.split(image_path)[-1].split(“.”)[-1] != ‘jpg’:
continue
#为了获取id,将图片和路径分裂并获取
id = int(os.path.split(image_path)[-1].split(“.”)[1])
faces = detector.detectMultiScale(img_np)
#将获取的图片和id添加到list中
for(x,y,w,h) in faces:
face_samples.append(img_np[y:y+h,x:x+w])
ids.append(id)
return face_samples,ids
#调用函数并将数据喂给识别器训练
print(‘Training…’)
faces,ids = get_images_and_labels(path)
#训练模型
recog.train(faces,np.array(ids))
#保存模型
recog.save(‘trainner/trainner.yml’)
这就让电脑认识到你是与众不同的那颗星~
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
(4)200多本电子书
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
(5)Python知识点汇总
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
(6)其他资料
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!