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 (可能是参数不一致导致的)

相关推荐
孟健10 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞12 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
GPUStack12 小时前
Token 不再焦虑:用 GPUStack + OpenClaw 搭一个“无限用”的本地 AI 助手
ai·模型推理·gpustack·openclaw
曲幽14 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
敏编程19 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪19 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook19 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田1 天前
使用 pkgutil 实现动态插件系统
python
前端付豪1 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain