python实验课大作业 人脸识别项目

原理简介

在这里插入图片描述

OpenCV提供了大量的HAAR训练器与检测器
• 介绍:OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
• 主要功能:读取图像、灰度转换、人脸检测、人脸识别
• 学会运用OpenCV的基本内置函数,能够进行简单的图像处理
• 对于人脸识别有初步的认识,了解基础的原理与常用方法
• 基于OpenCV的内置函数,实现简单的人脸检测
• 基于OpenCV的内置训练集,学习人脸识别的基础操作
• 创建自己的训练集,实现小组成员的人脸检测

  • LBPH算法
    局部二进制模式直方图(LBPH)算法的原理是标记图像的像素,并且对于每一个像素的邻域进行处理,并将结果转化为二进制数。该算法基于二维前缀和的方法,将图像的局部信息转化为一个数字。
    该方法注重于从图像中提取局部特征值,因此具有比较高的适用性,往往用于人脸检测

  • HAAR级联算法
    HAAR级联算法是一种基于机器学习的方法。他将图像分为正面图象和负面图像,在两类图像的对比学习中实现对于特征值的提取。在人脸识别中,正面图象为具有人脸的图片,负面图像为没有人脸的图片。
    OpenCV提供了大量的HAAR训练器与检测器

人脸检测步骤

作为人脸识别的前提,人脸检测是本项目中重要的一环。下面笔者以检测图像中的人脸为例,向读者介绍人脸检测的各环节。
(1)读取图像。本步骤旨在从文件中读取照片。
(2)灰度转换。本步骤是将彩色图片转换为灰度图片,以加快识别速度。
(3)修改尺寸。本步骤是压缩图片尺寸,同样是为了加快识别速度。为了得到较为准确的最终结果,本过程可在下一步骤执行前多次执行。
(4)计算特征值。本步骤是以某种特定规则对输入源进行处理得到具有唯一性质量化的值,从而将图片信息转换为计算机可识别的二进制信息。
(5)识别器加载。完成上述准备过程后,本步骤是将OpenCV中的级联分类器加载过来,用于处理图像的特征值。
(6)可视化处理。在完成人脸检测后,本步骤通过在人脸区域绘制矩形框(圆形框)来进行检测结果的反馈。至此,人脸检测完成。
基于视频的人脸检测过程大致相同。视频就是逐帧播放的图片,对视频中的人脸进行检测,就是不断重复以上的过程。最终的呈现结果就是矩形框(圆形框)时刻随着视频中人物的脸进行移动。在使用本程序进行人脸检测时,还可以通过连接摄像头,直接在摄像头捕捉的画面中进行人脸检测。

人脸识别步骤

人脸识别,就是在完成人脸检测的基础上,根据人脸给出相应信息。下面笔者将分步讲解具体过程。
(1)数据获取。在完成人脸识别前,我们首先要获取足够的人脸数据来对程序进行训练。这些图像数据的来源可以是在相关网站上下载,也可以自行拍摄一些照片。本小组采用的方法是后者。
(2)数据训练。此步骤的目的在于通过对大量数据进行识别,获得一个文件。此文件中存放相关联的人脸数据与id数据,是最后进行人脸识别的依据。具体方法为先将第一步获得的包含人脸的图片进行灰度化处理,再通过本文标题三中介绍的人脸检测的方法识别出图像中的人脸并裁剪出包含人脸的部分,最后获取图片相应的id信息,并将图像与id一一关联后写入一个文件内,得到训练集。至此,数据训练工作完成。
(3)人脸识别。先读取要进行识别的图像,再进行人脸检测,获取人脸部分的数据,最后与已获得的训练集中的信息进行对比,给出人脸对应的id信息与可信度。这里的可信度由程序给出的置信度评分进行衡量。本小组使用的是基于LBPH的人脸识别,这是一种比较灵活的人脸识别算法,因为这是唯一允许模型样本人脸和检测样本人脸在形状、大小上可以不同的算法。对于本算法给出的置信度评分,数值为0表明完全匹配,此时一般是因为样本与模型中某个数据重合。对于一般的识别结果,置信度评分小于50就可认为匹配度较高,而当置信度评分大于80时,一般认为结果可信度较低。

主要目标

在这里插入图片描述

• 学会运用OpenCV的基本内置函数,能够进行简单的图像处理
• 对于人脸识别有初步的认识,了解基础的原理与常用方法
• 基于OpenCV的内置函数,实现简单的人脸检测
• 基于OpenCV的内置训练集,学习人脸识别的基础操作
• 创建自己的训练集,实现小组成员的人脸检测

遇到的问题

在本次小组作业的完成中,我们所遇到的问题主要有两个:人脸检测结果不准确、人脸识别时偶发人脸与信息匹配失误。
对于第一个问题,经查证发现:这属于HAAR检测器的误差,属于模型的问题。由于对机器学习的认识比较浅显,我们无法去编写更加高效的识别器或者是基于已有的识别器进行修改,最终我们选择通过增加人脸识别的限制从而达到目的。例如限制图像分割的尺寸,限制图像识别的次数。最后我们发现,对于大部分HAAR识别器,将其最小识别次数限制到3~5次时可以得到最佳的效果,但在实时检测时会出现卡顿现象,这有待进一步改进。
对于第二个问题,经研讨,我们认为这与我们小组创建的训练集较小有着直接关系。由于技术与时间限制,我们无法创建新的训练集,基于上次的经验,我们尝试增加人脸检测的限制来提高准确率,然而效果甚微。最终根据本组成员的面貌特征,我们分别应用正脸、眼睛、微笑这三种识别器生成测试方法进行测试。发现基于眼睛与微笑生成的测试方法在进行识别时准确率大幅提高。后经资料查询得知:在目前成熟的人脸识别技术中,基于人的眼轴进行识别是一种更为精准的方法。

代码展示

人脸检测.py

#导入cv模块
import cv2 as cv

def face_detect_single(img):
    # 图片灰度化
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    face_detect = cv.CascadeClassifier('D:\python(bushi)\Opencv\opencv\sources\data\haarcascades\haarcascade_smile.xml')
    # 运用识别器
    face = face_detect.detectMultiScale(gray,minNeighbors=200)

    for x, y, w, h in face:
        cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 125, 20), thickness=10)
    #绘制矩形,圈出人脸
    cv.imshow('result', img)

def face_detect_group(img):
    gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    face_detect = cv.CascadeClassifier('D:\python(bushi)\Opencv\opencv\sources\data\haarcascades_cuda\haarcascade_frontalface_default.xml')
    # 运用识别器
    face = face_detect.detectMultiScale(gray,minSize=(100,100))
    
    for x,y,w,h in face:
        if w<200 or h<200:
            continue
        cv.rectangle(img,(x,y),(x+w,y+h),color=(0,225,100),thickness=5)
    cv.imshow('result',img)
        
# 读取摄像头
cap = cv.VideoCapture(0)
# 读取视频
# cap = cv.VideoCapture('此处填写视频文件地址')
# 循环  
while True:
    flag, frame = cap.read()
    if not flag:
        break
    face_detect_single(frame)
    if ord('q') == cv.waitKeyEx(10):     # 按q结束
        break

# 释放内存
cv.destroyAllWindows()
# 释放摄像头
cap.release()

人脸识别.py

# -*- coding: utf-8 -*-
"""
Created on Thu May 26 20:59:20 2022
"""

import cv2 as cv
import numpy as np
import os

recog=cv.face.LBPHFaceRecognizer_create()
recog.read("./data/train/smile.yml")
img=cv.imread('./data/test/t1.jpg')
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
face_dector= cv.CascadeClassifier('D:\python(bushi)\Opencv\opencv\sources\data\haarcascades_cuda\haarcascade_smile.xml')
faces= face_dector.detectMultiScale(gray,minNeighbors=3)
for x,y,w,h in faces:
    cv.rectangle(img,(x,y),(x+w,y+h),(0,255,255))
    ids,con=recog.predict(gray[y:y+h,x:x+w])
    print("标签:",ids,"评分:",con)
cv.imshow("result",img)
cv.waitKey(0)
cv.destoryAllWindows()

训练集生成.py

#-*- coding:gb2312 -*-
import cv2 as cv
import os
import sys
from PIL import Image
import numpy as np
def getImageANdLabels(path):
    facesSample=[]
    ids=[]
    imagepaths=[os.path.join(path,f) for f in os.listdir(path)]
    #¼ì²âÈËÁ³
    face_detect=cv.CascadeClassifier('D:\python(bushi)\Opencv\opencv\sources\data\haarcascades_cuda\haarcascade_smile.xml')
    #±éÀú±íÖеÄͼƬ
    
    for imagepath in imagepaths:
        PIL_img=Image.open(imagepath).convert('L')
        #½«±íÖеÄͼƬת»»³ÉÊý×é
        img_numpy=np.array(PIL_img,'uint8')
        faces=face_detect.detectMultiScale(img_numpy)
        #»ñȡͼƬid
        cid=int(os.path.split(imagepath)[1].split('.')[0])
        for x,y,w,h in faces:
            facesSample.append(img_numpy[y:y+h,x:x+w])
            ids.append(cid)
    return facesSample,ids

if __name__ == '__main__':
    #ͼƬ·¾¶
    path='./data/train/jm/'
    #»ñȡͼÏñÊý×é
    faces,ids=getImageANdLabels(path)
    #»ñȡѵÁ·¶ÔÏó
    recognizer=cv.face.LBPHFaceRecognizer_create()
    recognizer.train(faces,np.array(ids))
    #±£´æÎļþ
    recognizer.write('./data/smile.yml')

在这里插入图片描述
别忘了修改下文件路径,拍几张小组成员的照片制作训练集,有问题的uu可以留言哦!

猜你喜欢

转载自blog.csdn.net/m0_63388363/article/details/128475342