暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【原创技术分享】PYTHON 人脸识别

众智创新团队 2021-10-27
2546

点击蓝字 关注我们



一、准备工作



 1.导入项目所需要的库



根据图1.1-图1.4的步骤进行操作。



图1.1 点击“文件”



图1.2 点击“设置”



图1.3 点击“Python Interpreter”



图1.4 添加的库



二、信息录入



1.程序介绍



此步骤的主要作用,是将你想识别的人脸的图片保存到一个新建文件夹中,并以此人姓名命名图片,为下一步的数据训练作准备。



这里我调用了人脸检测库,当检测到人脸就将图片保存,一共保存100张(可以根据需要自行调节),达到100张后程序自动结束。



2.代码展示及解读



    import cv2 as cv  # 导入模块
    cap = cv.VideoCapture(0) # 读取摄像头
    flag = 1
    num = 1
    while(cap.isOpened()): # 检查是否在开启状态
    ret_flag, Vshow = cap.read() # 得到每帧图像
    gray = cv.cvtColor(Vshow, cv.COLOR_BGR2GRAY) # 灰度图转化
    face_detect = cv.CascadeClassifier(
    "D:/PYcharmProject/Hello World/venv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml")
    face = face_detect.detectMultiScale(gray, 1.2, 5) # 调用人脸检测库
    for (x, y, w, h) in face: # 检测人脸,如果检测到则将图片保存到“D:/PYcharmProject/face shibie/venv/jm/”目录下
    cv.rectangle(Vshow, (x, y), (x + w, y + h), color=(0, 0, 225), thickness=2)
    cv.imwrite("D:/PYcharmProject/face shibie/venv/jm/" + str(num) + ".1001" + ".Tang" + ".jpg", Vshow)
    print('成功保存图片' + str(num) + '.jpg')
    num += 1
    if num == 101: # 判断保存图片到达100张跳出循环
    break
    cv.imshow('Capture_Test', Vshow) # 显示图像
    k = cv.waitKey(1) & 0xFF # 按键判断
    if k == ord(' '): # 如果按空格键则程序结束
    break
    cv.destroyAllWindows() # 释放内存
    cap.release() # 释放摄像头



    3.效果展示



    捕获并录入人脸,如图2.1所示。



    图2.1 录入



    三、数据训练



    1.程序介绍



    此步骤主要是将录入的人脸信息进行训练,即把图片信息通过函数和算法转换成计算机可以识别的数据信息,并将其保存到一个新建的yml文件中,用于下一步人脸识别时的数据比对。



    2.代码展示及解读



      # 导入以下模块
      import cv2
      import os
      from PIL import Image
      import numpy as np
      # 创建getImageAndLabels函数
      def getImageAndLabels(path):
      facesSamples = [] # 储存人脸数据
      ids = [] # 储存姓名数据
      imagePaths = [os.path.join(path, f)for f in os.listdir(path)] # 储存图片信息
      face_detect = cv2.CascadeClassifier( # 加载分类器
      'D:/PYcharmProject/Hello World/venv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml' )
      for imagePath in imagePaths: # 遍历列表中的图片
      # 打开图片,灰度化PIL有九种不同的模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F
      PIL_img = Image.open(imagePath).convert('L')
      img_numpy = np.array(PIL_img, 'uint8') # 将图像转换为数组,用于计算机判别
      faces = face_detect.detectMultiScale(img_numpy) # 调用分类器提取人脸区域数组
      id = int(os.path.split(imagePath)[1].split('.')[1]) # 获取每张图片的id和姓名
      for (x, y, w, h) in faces: # 预防无面容的照片
      ids.append(id)
      facesSamples.append(img_numpy[y:y+h, x:x+w])
      print("id:", id) # 打印id
      print("fs:", facesSamples) # 打印脸部特征
      return facesSamples, ids
      if __name__ == '__main__':
      path = './venv/jm/' # 图片路径
      facesSamples, ids = getImageAndLabels(path) # 调用getImageAndLabels函数,获取图片数组和id标签数组和姓名
      recognizer = cv2.face.LBPHFaceRecognizer_create() # 加载识别器
      recognizer.train(facesSamples, np.array(ids)) # 图片训练
      recognizer.write('trainer/trainer.yml') # 保存图片到新建的yml文件下




      四、人脸识别



      1.程序介绍



      此步骤主要功能是人脸识别。首先调用摄像头检测人脸并将人脸框出,然后调用上一步创建好的yml文件,将本次检测到的人脸信息与保存的人脸信息进行比对,匹配成功则在人脸框的左上方显示此人姓名,匹配不成功则显示“unknow”。



      2.代码展示及解读



        # 导入以下模块
        import cv2
        import os
        recognizer = cv2.face.LBPHFaceRecognizer_create() # 加载训练数据集文件
        recognizer.read('trainer/trainer.yml') # 加载数据
        names = [] # 名称
        warningtime = 0 # 警报全局变量
        # 准备识别的图片
        def face_detect_demo(img):
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转为灰度图
        face_detect = cv2.CascadeClassifier( # 加载分类器
        'D:/PYcharmProject/Hello World/venv/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
        face = face_detect.detectMultiScale(gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE) # 调用人脸检测库
        for (x, y, w, h) in face:
        cv2.rectangle(img, (x, y), (x + w, y + h), color=(255, 0, 0), thickness=2) # 检测人脸并将人脸框起来
        ids, confidence = recognizer.predict(gray[y:y+h, x:x+w]) # 对人脸进行评分,评分值越大越不可信
        if confidence > 80:
        global warningtime
        warningtime += 1 # 评分值大于80,警报变量加一
        if warningtime > 100:
        warningtime = 0
        # 警报变量大于100,判断不是正确人脸,在框左上角显示'Unknown'
        cv2.putText(img, 'Unknown', (x+10, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 1)
        else:
        # 警报变量不大于100,判断是正确人脸,在框左上角显示姓名
        cv2.putText(img, str(names[ids-1000]), (x+10, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
        cv2.imshow('result', img)
        def Name():
        path = './venv/jm/' # 图片路径
        imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
        for imagePath in imagePaths:
        name = str(os.path.split(imagePath)[1].split('.')[2]) # 获取姓名
        names.append(name)
        # 打开摄像头
        cap = cv2.VideoCapture(0)
        Name() # 调用Name函数
        while True:
        flag, frame = cap.read() # 得到每帧图像
        if not flag:
        break
        face_detect_demo(frame) # 调用def face_detect_demo函数
        if ord(' ') == cv2.waitKey(1): # 判断如果是空格键程序结束
        break
        cv2.destroyAllWindows() # 释放内存
        cap.release() # 释放摄像头



        3.效果展示



        识别已录入的人脸,如图4.1所示。



        图4.1 识别





        点点“分享”,给我充点儿电吧~

        文章转载自众智创新团队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论