在 OpenCV 中使用深度学习进行年龄检测
在本教程中,我们将看到使用 OpenCV 创建年龄预测器和性别分类器项目的整个过程。
年龄检测
我们的目标是创建一个程序来预测使用图像的人的性别和年龄。但预测年龄可能不像你想象的那么简单,为什么呢?你可能认为年龄预测是一个回归问题,对吧?你这样想是对的。然而,研究人员在将其视为回归问题时面临许多不确定性,如相机质量、亮度、气候条件、背景等。
解决方案是什么?
这个问题的解决方法很简单,不是预测一个精确的图像,而是让我们将年龄分类到一个特定的范围内,比如 0-6,18-25 等。这就是研究人员所做的,发现结果非常惊人,而且准确性在现实世界的场景中上升了很多。
现在我们已经清楚了我们的问题,让我们继续并开始创建我们的程序。
工作流程:
下载所需文件
我们将使用预训练模型进行年龄预测,因为我们的主要关注点是如何使用 OpenCV 实现年龄预测器,使用这些模型。
您可以在此处下载所需的所有文件。
构建主程序
我将主程序分解为 5 个步骤以使其更易于理解,最后我为整个程序编写了代码,您可以自己尝试运行。
第 1 步:创建图像实例
在这里,我们将使用 OpenCV 包为输入图像实例化一个对象,如果您不理解这一点,那么您应该首先阅读有关如何在 OpenCV 中读取/捕获视频的信息。
现在我们有了输入图像,下一步就是实例化我们的模型。
第 2 步:使用模型创建 DNN
在 OpenCV 中,我们创建了一个 DNN——深度神经网络来加载预训练模型并将其传递给模型文件。
我们首先创建变量来存储模型文件的文件路径,然后定义模型变量——这些变量因模型而异,我将这些值用于我们正在使用的Caffe模型。
#———-Model File Paths—————-#
ageProto=”Models/age_deploy.prototxt”
ageModel=”Models/age_net.caffemodel”
#———–Model Variables—————#
mean =(78.4263377603, 87.7689143744, 114.895847746) # these are taken from the official site
ageList=[‘(0-2)’, ‘(4-6)’, ‘(8-12)’, ‘(15-20)’, ‘(25-32)’, ‘(38-43)’, ‘(48-53)’, ‘(60-100)’]
#————-Creating the DNN————#
age_Net= cv2.dnn.readNet(ageModel,ageProto)
注意:这是使用 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)
输出:
进一步改进/自己尝试:
- 尝试编辑实时提要的代码
- 尝试使用另一种预训练模型,例如 YOLO 或创建自己的模型
- 您还可以添加另一个模型来检测人的活力/情绪