《博主简介》
小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。
👍感谢小伙伴们点赞、关注!
《------往期经典推荐------》
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
引言
在当今社会,人工智能技术在各个领域都发挥着越来越重要的作用。其中,人脸识别技术作为计算机视觉领域的热点,已经广泛应用于安全监控、智能交互等多个场景。本文将带领大家深入了解如何使用OpenCV库进行人物的年龄预测。通过这个项目,我们将学习如何将先进的人工智能技术应用于实际生活中,实现对人物年龄的智能识别。
在本教程中,我们将看到使用OpenCV创建年龄预测器项目的整个过程。实现效果如下:
年龄检测
我们的目标是创建一个程序,使用图像预测人的年龄。但是预测年龄可能不像你想象的那么简单,为什么?你可能认为年龄预测是一个回归问题,对吗?你这么想是对的。然而,当研究人员将其视为回归问题时,他们面临着许多不确定性,如相机质量,亮度,气候条件,背景等。
解决办法是什么?
这个问题的解决方案很简单,我们可以不是预测一个精确的年龄数值,而是将年龄分类到一个特定的范围,如0- 6,18 -25等,这就是研究人员所做的,发现结果是惊人的,准确性在现实世界的场景中上升了很多。
现在我们已经清楚了我们的问题,让我们继续并开始创建我们的程序。
工作流程
下载所需文件
我们将使用预先训练的模型进行年龄预测,因为我们的主要重点是如何使用OpenCV实现年龄预测器。
您可以在这里下载所需的所有文件,下载地址:https://drive.google.com/file/d/1yy_poZSFAPKi0y2e2yj9XDe1N8xXYuKB/view
【注:我已经将需要的文件都下载打包好了,需要的小伙伴也可以在文末获取。】
构建主程序
我把主程序分解成5个步骤,使其更容易理解,然后在最后我写了整个程序的代码,你可以尝试和运行自己。
步骤1:创建镜像实例
在这里,我们将使用OpenCV包来实例化输入图像的对象,如果你不明白这一点,那么你应该首先阅读如何在OpenCV中读取/捕获视频。
现在我们有了输入图像,下一步是实例化我们的模型。
import cv2
import dlib
import numpy as np
img = cv2.imread('assets/kid1.jpg')
img = cv2.resize(img, (720, 640))
frame = img.copy()
步骤2:使用模型创建DNN
在OpenCV中,我们创建一个DNN深度神经网络来加载预训练的模型并将其传递到模型文件。
我们首先创建变量来存储模型文件的文件路径,然后定义模型变量-这些变量因模型而异,我已经为我们使用的Caffe模型取了这些值。
# ------------ 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)
注意:这是使用OpenCV将预训练模型用于计算机视觉所需遵循的过程/步骤。
现在我们有了模型,让我们尝试在图像/视频中检测人脸。
步骤3:人脸检测
在这个程序中,为了简单起见,我使用了***dlib.get_frontal_face_detector()***方法进行人脸检测,但你绝对可以尝试使用自定义模型或预训练模型。
有很多注释,使您更容易理解代码的每一行。
# ------------- 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)
步骤4.年龄检测
在我们传递图像作为输入之前,我们必须根据模型的输入层将其更改为所需的尺寸,对吗?这是通过OpenCV中***的blobFromImage()***函数完成的。
然后,将此blob作为输入传递到年龄检测器模型。
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()]
步骤5:显示检测结果图像
现在我们有了预测,我们将把它们作为文本,并在最终的输出图像中显示它们。
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)
完整源码
这是最终的程序代码,结合了所有5个步骤,您可以直接在计算机上运行。
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或创建自己的模型
- 您还可以添加另一个模型来检测人的活力/情绪。
好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!