📜  在 OpenCV 中使用深度学习进行年龄检测

📅  最后修改于: 2022-05-13 01:55:45.058000             🧑  作者: Mango

在 OpenCV 中使用深度学习进行年龄检测

在本教程中,我们将看到使用 OpenCV 创建年龄预测器和性别分类器项目的整个过程。

年龄检测

我们的目标是创建一个程序来预测使用图像的人的性别和年龄。但预测年龄可能不像你想象的那么简单,为什么呢?你可能认为年龄预测是一个回归问题,对吧?你这样想是对的。然而,研究人员在将其视为回归问题时面临许多不确定性,如相机质量、亮度、气候条件、背景等。

解决方案是什么?

这个问题的解决方法很简单,不是预测一个精确的图像,而是让我们将年龄分类到一个特定的范围内,比如 0-6,18-25 等。这就是研究人员所做的,发现结果非常惊人,而且准确性在现实世界的场景中上升了很多。

现在我们已经清楚了我们的问题,让我们继续并开始创建我们的程序。

工作流程:

下载所需文件

我们将使用预训练模型进行年龄预测,因为我们的主要关注点是如何使用 OpenCV 实现年龄预测器,使用这些模型。

您可以在此处下载所需的所有文件。

构建主程序

我将主程序分解为 5 个步骤以使其更易于理解,最后我为整个程序编写了代码,您可以自己尝试运行。

第 1 步:创建图像实例

在这里,我们将使用 OpenCV 包为输入图像实例化一个对象,如果您不理解这一点,那么您应该首先阅读有关如何在 OpenCV 中读取/捕获视频的信息。

现在我们有了输入图像,下一步就是实例化我们的模型。

第 2 步:使用模型创建 DNN

在 OpenCV 中,我们创建了一个 DNN——深度神经网络来加载预训练模型并将其传递给模型文件。

我们首先创建变量来存储模型文件的文件路径,然后定义模型变量——这些变量因模型而异,我将这些值用于我们正在使用的Caffe模型。

注意:这是使用 OpenCV 为计算机视觉使用预训练模型所需遵循的过程/步骤。

现在我们有了模型,让我们尝试检测图像/视频中的人脸。

第 3 步:人脸检测

对于这个程序,为了简单起见,我使用dlib.get_frontal_face_detector()方法进行人脸检测,但您绝对可以尝试使用自定义模型或预训练模型。

有很多注释可以让你更容易理解每一行代码。

第 4 步:年龄检测

在我们将图像作为输入传递之前,我们必须将其更改为所需的尺寸,即根据我们模型的输入层,对吧?这是由blobFromImage()完成的  OpenCV 中的函数。

然后这个 blob 作为输入传递给年龄检测器模型。

第 5 步:显示带有检测的结果图像

现在我们有了预测,我们将把它们作为文本显示在最终的输出图像中。

下面是完整的实现

这是最终的程序代码,它结合了您可以直接在计算机上运行的所有 5 个步骤。

Python3
import cv2
import dlib
import numpy as np
  
img = cv2.imread('assets/kid1.jpg')
img = cv2.resize(img, (720, 640))
frame = img.copy()
  
# ------------ Model for Age detection --------#
age_weights = "Models/age_deploy.prototxt"
age_config = "Models/age_net.caffemodel"
age_Net = cv2.dnn.readNet(age_config, age_weights)
  
# Model requirements for image
ageList = ['(0-2)', '(4-6)', '(8-12)', '(15-20)',
           '(25-32)', '(38-43)', '(48-53)', '(60-100)']
model_mean = (78.4263377603, 87.7689143744, 114.895847746)
  
# storing the image dimensions
fH = img.shape[0]
fW = img.shape[1]
  
Boxes = []  # to store the face co-ordinates
mssg = 'Face Detected'  # to display on image
  
# ------------- Model for face detection---------#
face_detector = dlib.get_frontal_face_detector()
# converting to grayscale
img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  
# -------------detecting the faces--------------#
faces = face_detector(img_gray)
  
# If no faces our detected
if not faces:
    mssg = 'No face detected'
    cv2.putText(img, f'{mssg}', (40, 40),
                cv2.FONT_HERSHEY_SIMPLEX, 2, (200), 2)
    cv2.imshow('Age detected', img)
    cv2.waitKey(0)
  
else:
    # --------- Bounding Face ---------#
    for face in faces:
        x = face.left()  # extracting the face coordinates
        y = face.top()
        x2 = face.right()
        y2 = face.bottom()
  
        # rescaling those coordinates for our image
        box = [x, y, x2, y2]
        Boxes.append(box)
        cv2.rectangle(frame, (x, y), (x2, y2), 
                      (00, 200, 200), 2)
  
    for box in Boxes:
        face = frame[box[1]:box[3], box[0]:box[2]]
  
        # ----- Image preprocessing --------#
        blob = cv2.dnn.blobFromImage(
            face, 1.0, (227, 227), model_mean, swapRB=False)
  
        # -------Age Prediction---------#
        age_Net.setInput(blob)
        age_preds = age_Net.forward()
        age = ageList[age_preds[0].argmax()]
  
        cv2.putText(frame, f'{mssg}:{age}', (box[0],
                                             box[1] - 10), 
                    cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                    (0, 255, 255), 2, cv2.LINE_AA)
  
        cv2.imshow("Detecting Age", frame)
        cv2.waitKey(0)


输出:

来自 pexels 的库存图片

进一步改进/自己尝试:

  1. 尝试编辑实时提要的代码
  2. 尝试使用另一种预训练模型,例如 YOLO 或创建自己的模型
  3. 您还可以添加另一个模型来检测人的活力/情绪