通过opencv实现简单的人脸识别 您所在的位置:网站首页 人脸识别怎么操作 通过opencv实现简单的人脸识别

通过opencv实现简单的人脸识别

2024-01-25 09:47| 来源: 网络整理| 查看: 265

文章目录 通过opencv实现简单的人脸识别1.环境配置2.收集数据集3.人脸数据的处理4.通过神经网络训练模型5.进行人脸识别6.总结

通过opencv实现简单的人脸识别

​ 网上有很多通过opencv实现的简单人脸识别,本文于其他文章差别不大,仅为作者复现代码后的一个学习记录。实现的过程大致为收集人脸数据集,通过神经网络训练出模型,然后将实时人脸放到模型中进行识别,其实就是解决一个简单的二分类问题。所以它的实用性其实并不高,但是对于初入计算机视觉的小白们,这是理解如何通过神经网络训练出模型的一个好机会。

1.环境配置 1.window,ubantu环境均可 2.python3.6,3.7版本均可 3.opencv最新版即可(直接pip) 4.scipy(我是1.3.1版本,一般不用额外装) 5.sklearn 6.Keras 7.tensorflow(建议1.4.0左右的版本) 2.收集数据集

在这里插入图片描述 ​ 我们接触到的人脸识别系统首先都需要有个录脸的过程,收集数据集这个步骤就类似于录脸。目的在于收集我们的人脸数据,让计算机可以对你的人脸进行训练。

​ 收集数据的第一步就是打开摄像头,下述写了几个通过opencv打开摄像头的基本函数。

cv2.namedWindow(window_name) #窗口名字 cv2.VideoCapture(camera_id)#camera_id=0内置摄像头,也可以为本地视频路径 ok, frame = cap.read()#返回两个值(1.当前帧是否有效 2.当前帧截取的图片) cap.release() #关闭摄像头 cv2.destroyAllWindows() #释放全部窗口

classfier = cv2.CascadeClassifier()

​ 打开摄像头后,我们通过opencv内置的级联分类器CascadeClassifier进行捕捉人脸的步骤。

classfier = cv2.CascadeClassifier("D:/anaconda/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml")

​ 可以看到分类器后面有一个xml文件的路径,当下载opencv后,找到anaconda的安装路径,然后根据上面给定的路径找一般都能找到。这个xml文件是opencv官方共享的具有普适性的训练数据,然后通过这些数据可以获得一个良好的人脸分类器。官方也共享了笑脸分类器,眼镜分类器等,有兴趣的可以在官方网址了解其他文件的作用,将xml文件路径改了试一试。

(官方网址:https://github.com/opencv/opencv/tree/master/data/haarcascades)

classfier.detectMultiScale()

​ 得到人脸分类器的目的是获得视频中人脸的位置,并通过cv2.rectangle()对视频中捕捉的人脸进行画框。

classfier.detectMultiScale(const Mat& image, vector& objects,double scaleFactor=1.1, int minNeighbors=3,int flags=0, Size minSize=Size(), Size maxSize=Size()) 1.image表示的是分类器检测到的每一帧的图片作为输入 2.object表示检测到的人脸目标序列,一般可不写 3.scaleFactor默认为1.1,表示每次检测到的人脸目标缩小的比例 4.minNeighbors默认为3,表示检测过程中目标必须被检测三次才能被确定为人脸(分类器中是有个窗口对全局图片进行扫描的,即扫描过程中,窗口中出现了三次人脸可以确定该目标为人脸) 5.flag默认为0,一般可不写 6.minSize表示可截取的最小目标大小 7.maxSize表示可截取的最大目标大小 该函数输出的结果是人脸的位置(x,y,w,h),x,y指人脸位置的左上角坐标,w,h指长宽

收集人脸数据

​ 在对一些核心函数有了解之后,我们开始进行人脸数据的收集。首先就是创建一个face文件夹,该文件夹中再新建两个文件夹分别命名为自己的姓名和other。 在这里插入图片描述 ​ 一个文件夹下收集的人脸必须是同一个人的(所以完成这件事需要两个人),收集两份人脸的目的为了用于二分类,以提高模型的精度。每个文件夹下收集1000张图片(总共2000张),在收集过程中人脸分类器可能会将的灯,标志等错误录入,这时就需要手动删除这些错误图片,防止后面训练时造成误差。 在这里插入图片描述 附上该步骤完整代码(命名为face_capture)

import cv2 import sys from PIL import Image #定义函数Capture_picture;目的:获取人脸数据集;参数:窗口名,相机编号,收集图片的数量,保存图片的路径 def Capture_picture(window_name, camera_id, picture_num, path_name): cv2.namedWindow(window_name) cap = cv2.VideoCapture(camera_id) #camera_id = 0为内置摄像头,= 1为外接摄像头,也可以为本地视频的路径 #opencv内置的级联分类器,找到anaconda的安装位置往下找就可以找到 classfier = cv2.CascadeClassifier("D:/anaconda/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml") color = (0,255,0) #边框颜色 num = 0 while cap.isOpened(): ok, frame = cap.read() #cap.read()返回两个值,是否正确读取帧和当前帧的图片 #print(ok) #print(frame) if not ok: break #将图片转成灰度图 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #img_name = 'D:/desktop/face/gray/%d.jpg'%(num) #cv2.imwrite(img_name,gray) faceRects = classfier.detectMultiScale(gray, scaleFactor = 1.1, minNeighbors = 3, minSize = (32,32)) #print(faceRects) if len(faceRects) > 0: for faceRect in faceRects: x,y,w,h = faceRect img_name = 'D:/desktop/face/huangzhaohong/%d.jpg'%(num) image = frame[y - 10: y + h + 10, x - 10: x + w + 10] #将人脸框相应的扩大 cv2.imwrite(img_name, image) num += 1 if num > (picture_num): break cv2.rectangle(frame,(x - 10, y - 10), (x + w + 10, y + h + 10),color,2) font = cv2.FONT_HERSHEY_SIMPLEX #图片,标注文字,左上角坐标,字体形式,字体大小,颜色,字体粗细 cv2.putText(frame,'num:%d' %(num),(x + 30, y + 30), font, 1, (255,0,0),4) if num > picture_num:break cv2.imshow(window_name,frame) c = cv2.waitKey(10) #这里参数为0等于视频暂停 if c & 0xFF == ord(' '):break #手动结束视频按空格 #关闭摄像头,释放窗口 cap.release() cv2.destroyAllWindows() if __name__ == '__main__': if len(sys.argv) != 1: print("!!!") else: Capture_picture("face",0,1000,"D:/desktop/face/huangzhaohong") 3.人脸数据的处理

​ 机器学习中有一个很重要的概念叫有监督学习,而有监督学习中有细分两类问题:分类问题和聚类问题。**分类问题一般用于识别,回归问题一般用于检测。而在制作简单人脸识别的过程中,涉及到了两次的分类,一次的回归。**第一次的分类在上一步收集人脸数据时,识别视频中的人脸(知道是脸,但是不知道是谁的脸),第二次的分类在识别视频中的人脸是谁;回归用在上一步收集人脸时回归出人脸的位置。

​ 在完成上一步骤后,我们已经解决了一个分类问题和一个回归问题,就剩下识别人脸是谁这个步骤,也是制作人脸识别最核心的步骤。

​ 本步骤目的就是将收集到的图片进行一定的预处理,接下来介绍一下该步骤的几个函数。

def resize_image(image, height = ImageSize, width = ImageSize) 参数介绍:image指输入图片,height,width指最后输出图片的长宽,这里我们设置为64 x 64 函数目的:将图片填充为正方形,然后调整为64 x 64

在这里插入图片描述

def read_path(path_name) 参数介绍:path_name指文件路径(存放两个文件夹的文件夹) 函数目的:在做识别工作时,用的分类的方法,因此我们在制作数据时必须有图片和标签,而函数的目的就是将图片与标签一一对应,人脸识别问题中标签就是文件夹的名称(你自己的姓名和其他人),如下图

在这里插入图片描述

def load_dataset(path_name) 参数介绍:path_name指文件路径(存放两个文件夹的文件夹) 函数目的:在上面的函数中,我们让图片和标签一一对应了,但是对应的标签是一条路径对我们后续训练造成了不便,这里我们将路径为Hinton的标签设置为0,路径为other的标签设置为1,方便后面的代码编写。(其实就是二分类问题)

在这里插入图片描述

附上该步骤完整代码(命名为load_dataset)

import os import random import sys import cv2 import numpy as np from sklearn.model_selection import train_test_split ImageSize = 64 def resize_image(image, height = ImageSize, width = ImageSize): top,bottom,left,right = (0,0,0,0) h, w, _ = image.shape #print(h, w, _) longest = max(h, w) #print(longest) if h


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有