python版opencv人脸训练与人脸识别

1.人脸识别准备

使用的两个opencv包

powershell 复制代码
D:\python2023>pip list |findstr opencv
opencv-contrib-python     4.8.1.78
opencv-python             4.8.1.78

数据集使用前一篇Javacv的数据集,网上随便找的60张图片,只是都挪到了D:\face目录下方便遍历

D:\face\1 30张刘德华图片

D:\face\2 30张刘亦菲图片

2.人脸识别模型训练

python 复制代码
# -*- coding: utf-8 -*-
import os

import cv2
import numpy as np

recognizer = cv2.face.LBPHFaceRecognizer().create() # Fisher需要reshape
classifier = cv2.CascadeClassifier('E:\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml')
def load_dataset(dataset_path):
    images=[]
    labels=[]
    for root,dirs,files in os.walk(dataset_path):
        for file in files:
            images.append(cv2.imread(os.path.join(root, file),cv2.IMREAD_GRAYSCALE))
            labels.append(int(os.path.basename(root)))
    return images,labels
if __name__ == '__main__':
    images,labels = load_dataset('D:\\face')
    recognizer.train(images,np.array(labels))
    recognizer.save('face_model.xml')

3.人脸识别推理预测

python 复制代码
# -*- coding: utf-8 -*-
import os

import cv2


def face_detect(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    classifier = cv2.CascadeClassifier('E:\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml')
    faces = classifier.detectMultiScale(gray, 1.2, 5)
    if (len(faces) == 0):
        return None, None
    (x, y, w, h) = faces[0]
    return gray[y:y + w, x:x + h], faces[0]


def draw_rectangle(img, rect):
    (x, y, w, h) = rect
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 0), 2)


def draw_text(img, text, x, y):
    cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)


def predict(image):
    image_copy = image.copy()
    face, rect = face_detect(image_copy)
    tuple = recognizer.predict(face)
    print(tuple)
    draw_rectangle(image_copy, rect)
    draw_text(image_copy, str(tuple[0]), rect[0], rect[1])
    return image_copy


if __name__ == '__main__':
    recognizer = cv2.face.LBPHFaceRecognizer().create()  # Fisher需要reshape
    recognizer.read("face_model.xml")
    for root, dirs, files in os.walk('D:\\face\\2'):
        for file in files:
            file_path = os.path.join(root, file)
            predict_image = predict(cv2.imread(file_path))
            cv2.imshow('result', predict_image)
            cv2.waitKey(1000)

总结

代码逻辑基本同Javacv,但更简洁,这里训练出来模型准确度也高于Javacv (可能是参数不一致导致的)

相关推荐
哥布林学者42 分钟前
吴恩达深度学习课程五:自然语言处理 第一周:循环神经网络 (一)序列数据与序列模型
深度学习·ai
Keep_Trying_Go1 小时前
基于无监督backbone无需训练的类别无关目标统计CountingDINO算法详解
人工智能·python·算法·多模态·目标统计
weixin_433179331 小时前
python - for循环,字符串,元组基础
开发语言·python
^哪来的&永远~1 小时前
Python 轻量级 UI:EEG 与 fNIRS 预处理图形界面
python·可视化·功能连接·eeg·mne·fnirs·eeglab
AI大佬的小弟2 小时前
Python基础(11):Python中函数参数的进阶模式详解
python·lambda函数·函数的参数解释·函数的参数进阶·位置参数·关键词参数·匿名函数与普通函数
智算菩萨2 小时前
Python可以做哪些小游戏——基于Python 3.13最新特性的游戏开发全指南(15万字超长文章,强烈建议收藏阅读)
python·pygame
智航GIS2 小时前
9.1 多线程入门
java·开发语言·python
nvd112 小时前
FastMCP 开发指南: 5分钟入门
人工智能·python
weixin_433179333 小时前
Python - word jumble游戏
开发语言·python
Iridescent11214 小时前
Iridescent:Day48
python