• Python开发指南[2]之人脸模型训练与人脸识别


    程序之美

    前言

    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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    人脸识别核心代码

    #!/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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    逻辑分析

    人脸检测是 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

  • 相关阅读:
    【算法合集】学习算法第五天(递归/回溯篇)
    20212416 2023-2024-2 《移动平台开发与实践》综合实践
    IDEA 宝贝插件
    在博客园随笔中插入3D分子模型
    基于javaweb的教务信息查询系统(java+ssm+bootstrap+c3p0+mysql)
    计数的窗口函数应用(2)
    java实现图书管理系统
    RFSoC应用笔记 - RF数据转换器 -21- API使用指南之配置ADC相关工作状态
    IOI 2022 简要题解
    222页8万字智慧园区IOC平台运维管理平台解决方案
  • 原文地址:https://blog.csdn.net/hnjzfwy/article/details/125462006