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

相关推荐
这里有鱼汤40 分钟前
原来基金经理都偷偷用这个指标选股,难怪回撤小还赚钱
后端·python
广州智造41 分钟前
EPLAN教程:流体工程
开发语言·人工智能·python·算法·软件工程·软件构建
Enougme1 小时前
python-使用鼠标对图片进行涂抹&自定义绘图
python·opencv
CF14年老兵1 小时前
🐍 Python黑魔法手册:让你的代码从能跑到飞起的奇技淫巧
后端·python·trae
天天进步20151 小时前
Python实战--基于Django的企业资源管理系统
开发语言·python·django
tkdsy0071 小时前
AI全产业链工作岗位分析:技术与非技术岗位全景图
人工智能·ai·ai产业链·ai工程师·ai岗位
万邦科技Lafite2 小时前
利用淘宝开放API接口监控商品状态,掌握第一信息
大数据·python·电商开放平台·开放api接口·淘宝开放平台
Hy行者勇哥4 小时前
Python 与 VS Code 结合操作指南
开发语言·python
大力水手(Popeye)4 小时前
Pytorch——tensor
人工智能·pytorch·python
飞翔的佩奇8 小时前
【完整源码+数据集+部署教程】表盘指针检测系统源码和数据集:改进yolo11-CA-HSFPN
python·yolo·计算机视觉·数据集·yolo11·表盘指针检测