基于Python的OpenCV+TensorFlow+Keras人脸识别实现

更新时间:2023-05-13 15:21:12 阅读: 评论:0

基于Python的OpenCV+TensorFlow+Keras⼈脸识别实现
前⾔:本节要讲的⼈脸识别主要是借鉴了 ⼀位研究⽣前辈的⽂章 我只是在他的基础上进⾏了改动,让代码能在现在的TensorFlow2.X 等的环境下运⾏
先看⼀下效果图
完整⼯程请点击链接下载:
⼀、准备⼯作,安装环境
注意:下列Python第三⽅包的版本⽐较重要,应为在这⾥⽤到的包⽐较多,如果两个包版本相差较⼤可能会导致错误,接下来我列出我⽤的包名及其版本信息供你参考
Python – 3.8.4
TensorFlow-GPU – 2.3.0
OpenCV – 4.4.0
keras – 2.0.9
sklearn – 0.19.0
scipy – 1.4.1
PIL – 7.2.0
注:这⾥说明⼀下,TensorFlow的CPU版本和GPU版本没太⼤区别,⽤哪个都⾏,只不过在GPU上运⾏代码会更快⼀点
⼆、⼈脸检测
实现⼈脸识别简单程序没⼏⾏,但是我们要实现的是识别这个是谁的脸。⾸先我们让系统识别⼈脸,这是opencv的⼯作,我们只需要调⽤其中的API函数就可以了。下⾯是调⽤opencv实现对于⼈脸的识别。咱们在程序下⾯对程序进⾏⼀些解释:
import sys
from PIL import Image
def CatchUsbVideo(window_name, camera_idx):
cv2.namedWindow(window_name)
#视频来源,可以来⾃⼀段已存好的视频,也可以直接来⾃USB摄像头
cap = cv2.VideoCapture(camera_idx)
#告诉OpenCV使⽤⼈脸识别分类器
classfier = cv2.CascadeClassifier("H:\\OpenCV\\opencv\\build\\etc\\haarcascades\\haarcascade_l") #识别出⼈脸后要画的边框的颜⾊,RGB格式
color =(0,255,0)
while cap.isOpened():
ok, frame = ad()#读取⼀帧数据
属蛇和属兔if not ok:
break
#将当前帧转换成灰度图像
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#⼈脸检测,1.2和2分别为图⽚缩放⽐例和需要检测的有效点数
faceRects = classfier.detectMultiScale(grey, scaleFactor =1.2, minNeighbors =3, minSize =(32,32)) if len(faceRects)>0:#⼤于0则检测到⼈脸
for faceRect in faceRects:#单独框出每⼀张⼈脸
x, y, w, h = faceRect
#显⽰图像
cv2.imshow(window_name, frame)
c = cv2.waitKey(10)
if c &0xFF==ord('q'):
break
#释放摄像头并销毁所有窗⼝
cv2.destroyAllWindows()
if __name__ =='__main__':
if len(sys.argv)!=1:
print("Usage:%s camera_id\r\n"%(sys.argv[0]))
el:
CatchUsbVideo("识别⼈脸区域",0)
1、 第⼀⾏import cv2,实际上,”cv2”中的”2”并不表⽰OpenCV的版本号。我们知道,OpenCV是基于
C/C++的,”cv”和”cv2”表⽰的是底 层CAPI和C++API的区别,”cv2”表⽰使⽤的是C++API。这主要是⼀个历史遗留问题,对于这个代码更详细的介绍请参见我专门写的⼀篇⽂章:
2、 D:\pyproject\renlianshibie\haarcascades\haarcascade_l, 这个地址是我存放OpenCV⼈脸特征数据集的地址,
⼈脸检测器(默认):haarcascade_l
⼈脸检测器(快速Harr):haarcascade_l
⼈脸检测器(侧视):l
眼部检测器(左眼):haarcascade_l
眼部检测器(右眼):haarcascade_l
嘴部检测器:haarcascade_l
⿐⼦检测器:haarcascade_l
情感口述性⾝体检测器:l
⼈脸检测器(快速LBP):l
***另外,如果我们想构建⾃⼰的分类器,⽐如识别⽕焰、汽车,数,花等,我们依然可以使⽤OpenCV训练构建。
注:这是我整个⼯程的所有⽂件路径,提供你做参考
3、
这个函数完成对⼈脸的识别以及⽤⼀个框框给框起来,其中grey是要识别的图像数据,转化为灰度可以减少计算量。scaleFactor:图像缩放⽐例,可以理解为同⼀个物体与相机距离不同,其⼤⼩亦不同,必须将其缩放到⼀定⼤⼩才⽅便识别,该参数指定每次缩放的⽐例。minNeighbors:对特征检测点周边多少有效点同时检测,这样可避免因选取的特征检测点太⼩⽽导致遗漏。minSize:特征检测点的最⼩值。
4、 对同⼀个画⾯有可能出现多张⼈脸,因此,我们需要⽤⼀个for循环将所有检测到的⼈脸都读取出
来,然后逐个⽤矩形框框出来,这就是接下来的for语句的作⽤。Opencv会给出每张⼈脸在图像中的起始坐标(左上⾓,x、y)以及长、宽(h、w),我们据此就可以截取出⼈脸。其中,angle()完成画框的⼯作,在这⾥外扩了10个像素以框出⽐⼈脸稍⼤⼀点的区域。angle()函数的最后两个参数⼀个⽤于指定矩形边框的颜⾊,⼀个⽤于指定矩形边框线条的粗细程度。
三、模型训练
模型训练的⽬的是让电脑知道,这个脸的特征是什么,从⽽可以在视频流中识别。在训练之前必须先准备⾜够的脸部照⽚作为机器学习的资料。
1.keras简介
利⽤深度学习库keras来训练⾃⼰的⼈脸识别模型。 我这⾥找到⼀篇keras的中⽂⽂档可能对你有些帮助。另外关于Keras, Keras是由纯python编写的基于theano/tensorflow的深度学习框架。Keras是⼀个⾼层神经⽹络API,⽀持快速实验,能够把你的idea迅速转换为结果,如果有如下需求,可以优先选择Keras:
a)简易和快速的原型设计(keras具有⾼度模块化,极简,和可扩充特性)
b)⽀持CNN和RNN,或⼆者的结合
c)⽆缝CPU和GPU切换
Keras的模块结构:电解工
使⽤Keras搭建⼀个神经⽹络:
数据格式(data_format):古筝英语
⽬前主要有两种⽅式来表⽰张量:
a) th模式或channels_first模式,Theano和caffe使⽤此模式。
b)tf模式或channels_last模式,TensorFlow使⽤此模式。
因为我装的是tensorflow因此我直接使⽤了keras的Tensorflow版,同时,为了验证其它深度学习库的夏目友人帐图片
效率和准确率,我还使⽤了Theano,利⽤CNN——卷积神经⽹络来训练我的⼈脸识别模型。本节专注把训练数据准备好。
完整代码如下:
import os
import sys
import numpy as np
import cv2
IMAGE_SIZE =64
#按照指定图像⼤⼩调整尺⼨
def resize_image(image, height = IMAGE_SIZE, width = IMAGE_SIZE):
top, bottom, left, right =(0,0,0,0)
#获取图像尺⼨
h, w, _ = image.shape
#对于长宽不相等的图⽚,找到最长的⼀边
longest_edge =max(h, w)
#计算短边需要增加多上像素宽度使其与长边等长
if h < longest_edge:
dh = longest_edge - h
top = dh //2
bottom = dh - top
elif w < longest_edge:
dw = longest_edge - w
left = dw //2
right = dw - left
el:
pass
#RGB颜⾊
BLACK =[0,0,0]
#给图像增加边界,是图⽚长、宽等长,cv2.BORDER_CONSTANT指定边界颜⾊由value指定
constant = pyMakeBorder(image, top , bottom, left, right, cv2.BORDER_CONSTANT, value = BLACK)
#调整图像⼤⼩并返回
size(constant,(height, width))
#读取训练数据
images =[]
labels =[]
def read_path(path_name):
for dir_item in os.listdir(path_name):
#从初始路径开始叠加,合并成可识别的操作路径
full_path = os.path.abspath(os.path.join(path_name, dir_item))
if os.path.isdir(full_path):#如果是⽂件夹,继续递归调⽤
read_path(full_path)
el:#⽂件
if dswith('.jpg'):
image = cv2.imread(full_path)
image = resize_image(image, IMAGE_SIZE, IMAGE_SIZE)
#放开这个代码,可以看到resize_image()函数的实际调⽤效果
#cv2.imwrite('1.jpg', image)
images.append(image)
labels.append(path_name)
return images,labels
#从指定路径读取训练数据
def load_datat(path_name):
images,labels = read_path(path_name)
#将输⼊的所有图⽚转成四维数组,尺⼨为(图⽚数量*IMAGE_SIZE*IMAGE_SIZE*3)
#我和闺⼥两个⼈共1200张图⽚,IMAGE_SIZE为64,故对我来说尺⼨为1200 * 64 * 64 * 3
#图⽚为64 * 64像素,⼀个像素3个颜⾊值(RGB)
images = np.array(images)
print(images.shape)
#标注数据,'liziqiang'⽂件夹下都是我的脸部图像,全部指定为0,另外⼀个⽂件夹下是同学的,全部指定为1
labels = np.array([dswith('liziqiang')el1for label in labels])
return images, labels
if __name__ =='__main__':
if len(sys.argv)!=1:
print("Usage:%s path_name\r\n"%(sys.argv[0]))
el:
images, labels = load_datat("D:\\pyproject\\renlianshibie\\kyq")
这段代码我们只是在前⾯代码的基础上增加脸部图像存储功能,⽐较简单。
def CatchPICFromVideo(window_name, camera_idx, catch_pic_num, path_name):
在函数定义中,⼏个参数,反别是窗⼝名字,摄像头系列号,捕捉照⽚数量,以及存储路径。根据⾃⼰需要进⾏修改,咱们这⾥为了精度⾼⼀点,选择捕捉1000张脸部照⽚。在你捕捉的时候由于精度的问题,会捕捉许多⾮脸部的照⽚,这时候需要你将不是脸部的照⽚清洗掉,使数据更加准确。另外,我们还需要捕捉另⼀个⼈的图⽚来提⾼模型的准确度。然后存储到另⼀个⽂件夹下,注意,⼀个⼈的照⽚存储到⼀个⽂件夹下,不可弄混。截图完成,就像下图这样。
2.模型训练
训练程序建⽴了⼀个包含4个卷积层的神经⽹络(CNN),程序利⽤这个⽹络训练我的⼈脸识别模型,并将最终训练结果保存到硬盘上。在我们实际动⼿操练之前我们必须先弄明⽩⼀个问题——什么是卷积神经⽹络(CNN)?
想知道你可以⾕歌,另外有关神经⽹络我会另外写⼀篇博客。这⾥就不多做介绍了。dna是什么东西
⾸先建⽴⼀个python⽂件,命名load_data.py。代码如下:
import os
import sys
import numpy as np
import cv2
IMAGE_SIZE =64
#按照指定图像⼤⼩调整尺⼨
def resize_image(image, height = IMAGE_SIZE, width = IMAGE_SIZE):
top, bottom, left, right =(0,0,0,0)
#获取图像尺⼨
h, w, _ = image.shape
#对于长宽不相等的图⽚,找到最长的⼀边
longest_edge =max(h, w)
入户走访
#计算短边需要增加多上像素宽度使其与长边等长
if h < longest_edge:
dh = longest_edge - h
皮肤问题top = dh //2
bottom = dh - top
elif w < longest_edge:
dw = longest_edge - w
left = dw //2

本文发布于:2023-05-13 15:21:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/893130.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:识别   图像   训练
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图