zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python开发指南[2]之人脸模型训练与人脸识别(附源码)

Python训练源码人脸开发 指南 模型 人脸识别
2023-09-14 09:15:01 时间

程序之美

前言

Python作为一门编程语言,这门语言的魅力和影响力已经远超C#、C++等编程语言前辈,被程序员誉为“美好的”编程语言。Python基本上可以说是全能的,系统运维、图形处理、数学处理、文本处理、数据库编程、网络编程、web编程、多媒体应用、pymo引擎、黑客编程、爬虫编写、机器学习、人工智能等等,Python应用无处不在。其优势更是不言而喻,简单易学、高层语言、免费开源、可移植性强、丰富的库、面向对象、可扩展性、可嵌入型、规范的代码等……
有很多初学Python的小伙伴们都觉得Python比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力…
故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学Python的小伙伴,避免走弯路,费时费力。

主体

本篇我们先学习下Python的人脸模型训练与人脸识别。话不多说,先看下效果图。

运行效果

人脸模型训练效果图

在这里插入图片描述

人脸识别效果图

在这里插入图片描述

摄像头人脸实时识别效果图

在这里插入图片描述
对于Python程序设计,主要就是基础语法、函数与模块、正则表达式、内存管理与多线程,即为Python的精髓。
1、基础语法:Python编程语言的变量、字符、常用运算符、元组和集合等等;
2、面向对象:这部分主要是学习从认识面向对象和类的特性,然后使用面向对象应用对遇到的异常进行处理;
3、函数与模块,这部分主要是学习函数的定义和标准模块与第三方模块、自定义包的实现等;
4、正则表达式,正则表达式是比较重要的,尤其是后面想从事爬虫的小伙伴,一定要把正则表达式学好;
5、内存管理与多线程,主要是了解Python编程语言的机制和掌握Python多线程。
初学者,不要怕麻烦,要不断的练习,看到自己感兴趣的,最好都能够亲自动手实践一下,特别是控件的重绘,最锻炼编程基础了。

核心代码

人脸模型训练核心代码

#!/usr/bin/env python
import threading
from logging import root

import cv2
import os
import sys
from PIL import Image
import numpy as np
def getImageAndLabels(path):
    facesSamples=[]
    ids=[]
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
    print(imagePaths)
    # 检测人脸
    face_detector = cv2.CascadeClassifier(
        '/home/fwy/AndroidStudio/OpenCV-android-sdk/sdk/etc/haarcascades/haarcascade_frontalface_default.xml')

    # 遍历列表中的图片
    for imagePath in imagePaths:
        # 打开图片
        PIL_img = Image.open(imagePath).convert('L')
        # 将图像转换为数组
        img_numpy = np.array(PIL_img,'uint8')
        faces = face_detector.detectMultiScale(img_numpy)
        # 获取每张图片的id
        print(os.path.split(imagePath))
        id = int(os.path.split(imagePath)[1].split('.')[0])
        for x,y,w,h in faces:
            facesSamples.append(img_numpy[y:y+h,x:x+w])
            ids.append(id)
    return facesSamples,ids


if __name__== '__main__':
    #图片路径
    path = './data/jm/'
    #获取图像 数组和id标签
    faces,ids=getImageAndLabels(path)
    #获取循环对象
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    recognizer.train(faces,np.array(ids))
    #保存文件
    recognizer.write('./data/trainer/trainer.yml')

人脸识别核心代码

#!/usr/bin/env python
import logging
import threading
import time
from logging import root

import cv2
import numpy as np
import os

    #获取当前时间
def get_current_time():
    now = time.time()
    mlsec = repr(now).split('.')[1][:3]
    current_time = time.strftime("%Y-%m-%d %H:%M:%S.{} %Z".format(mlsec),time.localtime(now))
    return current_time

#日志动态打印
def write_log_to_Text(logmsg):
    current_time = get_current_time()
    logmsg_in = str(current_time) +" " + str(logmsg)      #换行
    logging.error(logmsg_in)




def recognizerFace(frame):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    face_detector = cv2.CascadeClassifier(
        '/home/fwy/AndroidStudio/OpenCV-android-sdk/sdk/etc/haarcascades/haarcascade_frontalface_default.xml')
    t = time.strftime("%H %M %S")
    write_log_to_Text("start detection...")
    faces = face_detector.detectMultiScale(gray, minNeighbors=30)
    t = time.strftime("%H %M %S")
    write_log_to_Text("end detection...")

    #
    # 置信度评分用来衡量识别结果与原有模型之间的距离。0表示完全匹配。
    # 在LBPH中:通常情况下,认为小于50的值是可以接受的,如果该值大于80则认为差别较大。
    # 在EigenFaces中:值通常在0~20000之间,只要低于5000都被认为是相当可靠的识别结果。
    # 在Fisherfaces中:值通常在0~20000之间,只要低于5000都被认为是相当可靠的识别结果。
    #

    for x, y, w, h in faces:
        id, confidence = recognizer.predict(gray[y:y + h, x:x + w])  # 人脸识别
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        name = str(id)
        cv2.putText(frame, name, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (80, 80, 80), 2)
        print('标签id:', id, '置信评分:', confidence)

# 加载训练数据和文件
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('/home/fwy/PycharmProjects/FaceDetec/data/trainer/trainer.yml')
#准备识别的图片
img = cv2.imread('/home/fwy/PycharmProjects/C360_2018-12-14-08-58-20-612.jpg')#1707.jpg
recognizerFace(img)
cv2.namedWindow('result', 0)
cv2.imshow('result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

逻辑分析

人脸检测是 OpenCV 的一个重要的组成部分,也是人脸识别的基础。人脸识别其实就是一个能在给定图像或视频中识别出人脸。为了实现这一目标,我们可以使用一系列分好类的图像来进行“训练”,提出多种人脸特征,构成人脸特征库,然后再根据给定图像的人脸特征进行人脸库中特征比对,进行识别,根据相似度进行人脸判定。 这就是 基于OpenCV 人脸识别模型人脸识别的整个过程。 人脸识别模型的另一个重要特征是:每个识别都具有转置信(confidence)分值,也就是我们所说的对给定相似度的分值,可在实际应用中通过对其设置阈值来进行筛选控制。

获取到人脸训练库的数据,需要将这些数据加载到人脸识别算法进行比对处理。所有的人脸识别模型的face_detector.detectMultiScale函数返回值faces数组中,每一个face都有四个参数:图像x坐标,y坐标,w人脸图像宽度,h人脸图像高度。在通过id, confidence = recognizer.predict(gray[y:y + h, x:x + w]) 函数获取到人脸的ID和置信度,因此根据 ID 可以知道被识别的人是谁。要做到这一点,需用到「trainer/」目录中保存为.yml 文件,即训练人脸模型文件。

结束语

好了,今天就说这么多了,希望小伙伴们能从这篇文章中学到东西,也真心希望能够帮助正在苦学Python程序设计的小伙伴们,你们的成长是我最大的幸福。很感谢您能够在百忙之中浏览我的文章,有需要源码的小伙伴可以私信我。
源碼地址:https://download.csdn.net/download/hnjzfwy/85774111