人脸识别三部曲

人脸识别三部曲

首先看目录结构

引用文121本

复制代码
opencv
│   采集图片.py  
│    训练模型.py
│   人脸识别.py
│
└───trainer
│   │   trainer.yml
│   
└───data
│   └───00_Wang
│       │   0_00001.jpg
│       │   0_00002.jpg
│       │   ...
│       
│   └───01_Liu
│       │   1_00001.jpg
│       │   1_00001.jpg
│       │   ...
│    

图像信息采集 采集图片.py

开始运行时,输入待录入的人脸姓名。 按下s键后,开始录入人脸图像,录入两百张后,结束程序。

复制代码
import cv2
import shutil
import os
"采集图片.py  "
path = "./data/"
file_num = len(os.listdir(path))

name = input('input name:\n')
name_dir = os.path.join(path,str(file_num).zfill(2)+ "_"+name)
if os.path.exists(name_dir): # 存在则清空,不存在则重建
    shutil.rmtree(name_dir)
os.makedirs(name_dir)

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')

count = 0

while cap.isOpened():
    ret, frame = cap.read()
    if ret is True:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_detector.detectMultiScale(gray, 1.3, 5)
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x + w, y + w), (255, 0, 0))
        cv2.imshow('image', frame)

        k = cv2.waitKey(1) & 0xFF  # 按键判断
        if (k == ord('s')):  # 保存
            count += 1
            cv2.imwrite(name_dir + "/" + str(file_num) + "_" + str(count).zfill(5) + ".jpg", gray)
            print("success to save  " + str(file_num) + "_" + str(count).zfill(5) + ".jpg")
        elif count >= 200:
            break
        elif k == ord(' '):  # 退出
            break

cap.release()
cv2.destroyAllWindows()

模型训练 训练模型.py

复制代码
import os
import cv2
import numpy as np
from PIL import Image
" 训练模型.py "
path = "./data/"
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')

def get_images_and_labels(path):
    image_paths = []
    name_dirs = [os.path.join(path, f) for f in os.listdir(path)]
    for i in range(0, len(name_dirs) ):
        print("name_dirs[{0}] : ".format(i) , name_dirs[i])
        image_paths += [os.path.join(name_dirs[i], f) for f in os.listdir(name_dirs[i])]

    face_samples = []
    ids = []

    for image_path in image_paths:
        img = Image.open(image_path).convert('L')
        img_np = np.array(img, 'uint8')
        if os.path.split(image_path)[-1].split(".")[-1] != 'jpg':
            continue

        id = int((os.path.split(image_path)[-1].split(".")[0])[0])
        faces = detector.detectMultiScale(img_np)

        for (x, y, w, h) in faces:
            face_samples.append(img_np[y:y + h, x:x + w])
            ids.append(id)
    return face_samples, ids

faces, ids = get_images_and_labels(path)
recognizer.train(faces, np.array(ids))
recognizer.save('trainer/trainer.yml')

人脸识别 人脸识别.py

复制代码
import cv2
import os
"人脸识别.py "
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
font = cv2.FONT_HERSHEY_SIMPLEX
idnum = 0

cam = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cam.set(6, cv2.VideoWriter.fourcc('M', 'J', 'P', 'G'))
minW = 0.1 * cam.get(3)
minH = 0.1 * cam.get(4)


path = "./data/"
names = []
for name in os.listdir(path):
    names.append(name.split("_")[1])
    print(names)


while True:
    ret, img = cam.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.2,
        minNeighbors=5,
        minSize=(int(minW), int(minH))
    )
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
        idnum, confidence = recognizer.predict(gray[y:y + h, x:x + w])

        if confidence < 80:
            idum = names[idnum-1]
            confidence = "{0}%".format(round(100 - confidence))
        else:
            idum = "unknown"
            confidence = "{0}%".format(round(100 - confidence))

        cv2.putText(img, str(idum), (x + 5, y - 5), font, 1, (0, 0, 255), 1)
        cv2.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (0, 0, 0), 1)

        cv2.imshow('camera', img)

    k = cv2.waitKey(1) & 0xFF  # 按键判断
    if k == ord(' '):  # 退出
        break

cam.release()
cv2.destroyAllWindows()

效果

相关推荐
2301_7766816510 分钟前
【用「概率思维」重新理解生活】
开发语言·人工智能·自然语言处理
蜡笔小新..13 分钟前
从零开始:用PyTorch构建CIFAR-10图像分类模型达到接近1的准确率
人工智能·pytorch·机器学习·分类·cifar-10
富唯智能33 分钟前
转运机器人可以绕障吗?
人工智能·智能机器人·转运机器人
视觉语言导航1 小时前
湖南大学3D场景问答最新综述!3D-SQA:3D场景问答助力具身智能场景理解
人工智能·深度学习·具身智能
AidLux1 小时前
端侧智能重构智能监控新路径 | 2025 高通边缘智能创新应用大赛第三场公开课来袭!
大数据·人工智能
引量AI1 小时前
TikTok矩阵运营干货:从0到1打造爆款矩阵
人工智能·矩阵·自动化·tiktok矩阵·海外社媒
Hi-Dison2 小时前
神经网络极简入门技术分享
人工智能·深度学习·神经网络
奋斗者1号2 小时前
机器学习之决策树模型:从基础概念到条件类型详解
人工智能·决策树·机器学习
LinkTime_Cloud2 小时前
谷歌引入 AI 反诈系统:利用语言模型分析潜在恶意网站
人工智能·语言模型·自然语言处理
张小九992 小时前
PyTorch的dataloader制作自定义数据集
人工智能·pytorch·python