人脸识别项目实战

1、对于视频、图像基本操作

1.1、img_show(img)用于对于图像进行可视化操作

1.2、img_gray(filepath) 对于图像进行灰度处理,图像处理任务中基本都是转化成灰度图处理,由于灰度图通道数为1,易于处理。

1.3、img_size(filepath):对于图像进行放大、缩小操作;

1.4、img_draw(filepath):用于在图像上绘制矩形框和圆形框,主要用于对于识别的目标进行标示;

haarcascade_frontalface_alt2.xml 文件来源于opencv官方安装包中sources\data\haarcascades路径下;

# -*— coding:utf-8 -*-
# @time   :2021/11/17 10:27
# @Author :zhangzhoubin
'''
人脸识别
'''
import cv2
import os

#图片可视化展示
def img_show(img):
    cv2.imshow('new_img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#图像转化成灰度图、图像的保存
def img_gray(filepath):
    data=cv2.imread(filepath,cv2.IMREAD_GRAYSCALE) #转化成灰度图
    img_show(data)
    cv2.imwrite('1_hd.jpg',data)  #将处理后的灰度图进行保存
    print(data)

#图像的缩小、放大
def img_size(filepath):
    data2=cv2.imread(filepath)
    size_img=cv2.resize(data2,dsize=(200,200))
    img_show(data2)
    img_show(size_img)

#图像上绘制矩形和圆形,用于对于所需标注的地方进行标注
def img_draw(filepath):
    data3=cv2.imread(filepath)
    x,y,w,h=0,0,100,100
    data4=cv2.rectangle(data3,(x,y),(x+100,y+100),color=(0,0,255),thickness=2)  #图片上绘制矩形
    data4 = cv2.circle(data4, center=(x+50,y+50), radius=50, color=(0, 255, 0), thickness=2)  # 图片上绘制矩形
    cv2.imshow('zzb',data4)
    while  True:  #判断当按下q键时候关闭图像,释放计算资源
        if ord('q')==cv2.waitKey(0):
            break
    cv2.destroyAllWindows()

#图像人脸检测器,其中cv2.CascadeClassifier为级联分类器,里面加载的文件是安装opencv后,里面封装的人脸识别模型,face_cas.detectMultiScale为多目标识别器,导入含有人脸的图像数据,将自动识别输出来人脸坐标,默认是矩形框的坐标,其中坐标涉及左上角的x,y,然后矩形的宽度和长度w、h,通过这4个值送入矩形框函数 cv2.rectangle,对于识别到的人脸框出来,完成人脸的识别
def img_face2(data5):
    # data5=cv2.imread(filepath,cv2.IMREAD_GRAYSCALE)
    face_cas=cv2.CascadeClassifier('D:\opencv_python\opencv\sources\data\haarcascades\haarcascade_frontalface_alt2.xml')   
    faces = face_cas.detectMultiScale(data5)   #里面涉及几个可以调节的参数,
    for x,y,w,h in faces:
        print(x,y,w,h)
        cv2.rectangle(data5,(x,y),(x+w,y+h),color=(0,255,0),thickness=2)
    img_show(data5)

def img_face1():
    list = os.listdir(r'C:\Users\lenovo\Desktop\image_learning\Image_identifition\data')
    for i in list:
        filepath = '../data/{}'.format(i)
        print(filepath)
        img=cv2.imread(filepath,cv2.IMREAD_GRAYSCALE)
        img_face2(img)


#视频人脸检测器,
def video_img_face(data5):
    face_cas=cv2.CascadeClassifier('D:\opencv_python\opencv\sources\data\haarcascades\haarcascade_frontalface_alt2.xml')
    faces = face_cas.detectMultiScale(data5)   #里面涉及几个可以调节的参数,
    for x,y,w,h in faces:
        print(x,y,w,h)
        cv2.rectangle(data5,(x,y),(x+w,y+h),color=(0,255,0),thickness=2)
    cv2.imshow('zzb',data5)


#视频中人脸检测,视频的读取,是采用循环的方式一帧一帧进行读取,也是一帧一帧的处理。
def video_face():
    file2='1.mp4'
    vc=cv2.VideoCapture(file2)  #读取视频文件
    if vc.isOpened():  # 判断视频是否打开
        open, frame = vc.read()  # 读取第一帧
    else:
        open = False
    while open:  #循环
        ret, frame = vc.read()
        # print(ret)
        # print(frame)
        if frame is None: #等图像帧为空时退出
            break
        if ret == True:  #当读取的图像不为空继续读取
            gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)   #将图像转化为灰度图
            video_img_face(gray)   #可视化展示
            if cv2.waitKey(1) & 0xFF == 27:
                break
    vc.release()  # 释放视频
    cv2.destroyAllWindows()  # 关闭现在视频窗口

#视频拍照保存
def video_photograh():
    num = 9
    vc=cv2.VideoCapture(0) #视频的读取,当里面是0的时候默认捕捉当前电脑的摄像头
    if vc.isOpened():
        open_state,frame=vc.read()
    else:
        open_state=False
    while open_state: #循环

        open_state,frame=vc.read()
        if frame is None:
            break
        if open_state==True:
            gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)
            cv2.imshow('zzb',gray)
            if cv2.waitKey(1) & 0xFF==ord('q'):
                cv2.imwrite('../data'+str(num)+'.jpg',frame)
                print("拍照完成")
                num+=1
            elif cv2.waitKey(1) & 0xFF==ord('e'):
                break
    vc.release()
    cv2.destroyAllWindows()


#重构拍照保存
def video_photo():
    num=0
    vc=cv2.VideoCapture(0) #捕捉视频操作
    while(vc.isOpened()):
        open_state,frame=vc.read()
        cv2.imshow('臭宝',frame)
        k=cv2.waitKey(1)
        if k & 0xFF==ord('q'):
            print("第"+str(num)+"次"+"拍照完成")
            cv2.imwrite('../data/'+str(num)+"_test"+'.jpg',frame)
            num+=1
        elif k & 0xFF==ord('e'):
            break
    vc.release()
    cv2.destroyAllWindows()


if __name__=='__main__':
    filepath = '../data/6.jpg'

    #图像转化成灰度图、图像的读取
    # img_gray(filepath)

    # 图像的缩小
    # img_size(filepath)

    # 图像上绘制矩形和圆形
    # img_draw(filepath)

    #图像人脸识别
    # img_face1()

    #视频人脸识别
    # video_face()

    #视频拍照保存
    # video_photograh()
    # 重构视频拍照保存
    # video_photo()
    

2、实现人脸识别项目

'''
目标:实现人脸的录入,人脸的识别
'''
'''
实现人脸的录入功能开发
'''
import os
import cv2
import pandas as pd
import numpy as np

from PIL import Image, ImageDraw, ImageFont

#用于创建人员字典,该字典用于后期人员信息采集
# def  mkdir_name_list(img):
#     name_list = os.listdir(img)
#     name_num = [int(i.split('.')[0]) for i in name_list]
#     # 获取新员工的编号
#     name=['董明珠','郭晶晶','黄晓明','黄轩','马云','俞敏洪']
#     data=pd.DataFrame({
#         'id':name_num,
#         'name':name
#     })
#     print(data)
#     data.to_csv('name.csv',index = False)



#新员工姓名录入
def face_name(img):
    #获取新员工的姓名
    new_peple=input("请输入新员工姓名:")
    name_list=os.listdir(img)
    name_num=[int(i.split('.')[0]) for i in name_list]
    #获取新员工的编号
    new_name=max(name_num)+1
    # 加入新员工的姓名
    namelist=pd.read_csv('name.csv',encoding='utf-8')
    name_list=namelist.append({'id':new_name,'name':new_peple},ignore_index=True)
    name_list.to_csv('name.csv',index = False)
    print("新员工姓名录入成功!")
    return new_name

#人脸手动采集
def face_optimize(img):
    new_name=face_name(img)
    content=cv2.VideoCapture(0) #捕捉摄像头
    while content.isOpened():
        open_state,frame=content.read()     #视频读取
        cv2.imshow('result',frame)
        k=cv2.waitKey(1)
        if k & 0xFF ==ord('q'):
            cv2.imwrite('../data/'+str(new_name)+'.jpg',frame)
            print("人脸录入成功!")
        elif k & 0xFF ==ord('e'):
            break
    content.release()
    cv2.destroyAllWindows()

#基于现有图片数据,进行人脸模型训练
def face_recognition(img):
    faceimages=[]
    ids=[]
    #定义级联分类器
    face_detector=cv2.CascadeClassifier('D:\opencv_python\opencv\sources\data\haarcascades\haarcascade_frontalface_alt2.xml')
    imglist=[img+'/'+i for i in os.listdir(img)]
    for  i in imglist:

        image=cv2.imread(i ,cv2.IMREAD_GRAYSCALE)
        #利用多目标分类器提取人脸特征,输出人脸的左上角坐标和长、宽
        face=face_detector.detectMultiScale(image)
        id=i.split('/')[2].split('.')[0]
        for x,y,w,h in face:
            cv2.rectangle(image,(x,y),(x+w,y+h),color=[0,255,0],thickness=2)
            faceimages.append(image[y:y+h,x:x+w])
            ids.append(int(id))
            print(ids)
            print(faceimages)

            recognizer = cv2.face.LBPHFaceRecognizer_create()
            recognizer.train(faceimages, np.array(ids))
            recognizer.write('face_model.yml')
            # 加载人脸预测模型
            recognizer.read('face_model.yml')
    return faceimages,ids
#人脸识别模块
def face_detector(img):
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    #加载人脸预测模型
    recognizer.read('face_model.yml')

    #人脸检测模块
    face_detector=cv2.CascadeClassifier('D:\opencv_python\opencv\sources\data\haarcascades\haarcascade_frontalface_alt2.xml')
    imglist=[img+'/'+i for i in os.listdir(img)]
    for img in imglist:
        image=cv2.imread(img,cv2.IMREAD_GRAYSCALE)
        face=face_detector.detectMultiScale(image)
        for x,y,w,h in face:
            cv2.rectangle(image,(x,y),(x+w,y+h),color=[255,0,0],thickness=2)
            ids, confidence = recognizer.predict(image[y:y + h, x:x + w])
            if confidence <20:
                print("标签:"+str(ids) +'置信度:'+str(confidence))
                data=pd.read_csv('name.csv')
                for index,rows in data.iterrows():
                    if rows['id']==ids:
                        text=rows['name']
                        cv2charimg=img_ksh(image, text, x, y)
                        cv2.imshow('zzb', cv2charimg)
                        cv2.waitKey(0)
                        cv2.destroyAllWindows()
            else:
                cv2charimg = img_ksh(image, '陌生人', x, y)
                cv2.imshow('zzb', cv2charimg)
                cv2.waitKey(0)
                cv2.destroyAllWindows()


def img_ksh(image,text,x,y):
    # cv2读取图片
    cv2img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # cv2和PIL中颜色的hex码的储存顺序不同
    pilimg = Image.fromarray(cv2img)
    if not isinstance(text, str):
        text = text.decode('utf-8')
    # PIL图片上打印汉字
    draw = ImageDraw.Draw(pilimg)  # 图片上打印
    font = ImageFont.truetype("./simhei.ttf", 20, encoding="utf-8")  # 参数1:字体文件路径,参数2:字体大小
    draw.text((x+50, y-25), text, (255, 0, 0), font=font)  # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体
    # PIL图片转cv2 图片
    cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
    # cv2.imshow("图片", cv2charimg) # 汉字窗口标题显示乱码
    return  cv2charimg


if __name__=='__main__':
    img='../data'
    # mkdir_name_list(img)
    #人脸手动采集
    # face_optimize(img)
    # # 基于现有图片数据,进行人脸模型训练
    # face_recognition(img)
    #人脸识别模块
    face_detector(img)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种高级编程语言,并且非常适合进行人工智能领域的开发。MTCNN (多任务级联卷积神经网络) 是一种用于人脸检测、对齐和识别的深度学习模型。Facenet是一种基于卷积神经网络的人脸识别模型,该模型可以将两张不同的人脸图片转换为同一向量空间中的两个不同点。SVM(Support Vector Machine)是一种监督式学习算法,它的主要目标是将训练集中的不同类别数据分隔开来,以便将来被识别的新的样本能够被正确分类。 在这个项目中,我们使用Python编程语言和上述技术来实现了人脸识别系统。首先,我们使用MTCNN对输入图像进行了人脸检测和对齐,即找到并将人脸图像转换为标准大小,然后使用Facenet来将图像转换为向量表示。 接下来,我们使用支持向量机 (SVM)算法对向量进行分类并预测所属人脸的标签。如果已知标签,则可以将标签与输出进行比对,从而确认识别结果是否正确。 在实际项目中,我们面对的是不同的人脸照片,这些照片具有各种不同的外观和表情。为了提高识别准确性,我们引入了数据增强技术,例如旋转、缩放、剪切等操作,从而增加了机器学习模型的训练数据量。此外,我们还通过t-SNE降维可视化技术来研究不同人脸图像在高维特征空间的不同分布,从而更好地理解人脸识别模型的工作原理。 总的来说,Python基于MTCNN、Facenet、SVM等算法进行人脸识别项目实战,是一项非常有挑战性的任务。然而,随着深度学习技术的不断进步,越来越多的人脸识别项目可以得到解决。从这个意义上说,这项任务带给我们的启示是,通过深度学习算法和多种技术手段的结合,我们可以构建更加高效和智能的人脸识别系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值