使用 OpenCV 进行图像中的性别预测和年龄检测
这篇文章介绍了如何使用Python和OpenCV库从图像中检测年龄和性别。主要内容包括:
使用OpenCV和Caffe模型进行人脸检测、年龄和性别分类
通过预训练模型加载权重文件,构建检测器
从输入图像中获取边界框坐标,并对检测到的人脸进行年龄和性别预测
在Google Colab中运行代码进行测试
提供了相关的下载资源和扩展模块教程,帮助读者进一步学习和实践
点击上方“小白学视觉 ”,选择加"星标 "或“置顶 ”
重磅干货,第一时间送达

一、介绍
照片中的面部分析得到了广泛的关注,因为它在多个方面具有显著的应用价值。例如,它不仅能够提升客户定位的准确性,还能优化内容推荐效果,加强安全监控能力,以及在其他相关领域发挥重要作用。此外,该技术还可以通过广告链接(如广告)进一步拓展其应用范围。
年龄与性别构成了面部特征的关键要素,它们的确定是此类活动成功的关键。这些技术在众多企业中被广泛应用,原因包括客户关系管理的简化、需求预测的准确性以及提升用户体验的便利性。通过分析年龄和性别特征,人们能够更精准地识别和预测他们的需求。
尽管对于人类来说,从图像中识别性别和年龄同样具有挑战性,这一技术完全依赖于外表特征,预测结果往往不可靠,因为不同年龄段的人的外貌可能与人们的预期存在显著差异。
应用
在监控领域,计算机视觉技术常用于年龄和性别预测。随着计算机视觉技术的进步,这一预测方式变得更加实用,也更受公众欢迎。该研究课题在智能现实应用中展现出显著的实用性,取得了重大进展。
一个人的身份、年龄、性别、情绪和种族都由他们的面部特征来决定。年龄和性别这两个特征在多个实际应用场景中具有显著价值,例如在社会学研究和医疗诊断中。
-
安全和视频监控
-
人机交互
-
生物识别技术
-
娱乐
还有很多。
实施
掌握Python OpenCV库的应用方法,以便在相机或图片输入的情况下识别年龄和性别。
使用的框架是 Caffe,用于使用原型文件创建模型。
让我们开始吧,如果我们还没有安装 OpenCV,请确保已经安装了它。
$ pip install opencv-python numpy
第 1 步:导入库
# Import required modules
import cv2 as cv
import math
import time
from google.colab.patches import cv2_imshow
第 2 步**:在框架中查找边界框坐标**
通过调用该用户自定义的函数,我们可以获取边界框的坐标信息,同样可以表示为人脸在图像中的位置信息。
def getFaceBox(net, frame, conf_threshold=0.7):
frameOpencvDnn = frame.copy()
frameHeight = frameOpencvDnn.shape[0]
frameWidth = frameOpencvDnn.shape[1]
blob = cv.dnn.blobFromImage(frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], True, False) net.setInput(blob)
detections = net.forward()
bboxes = []
for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > conf_threshold:
x1 = int(detections[0, 0, i, 3] * frameWidth)
y1 = int(detections[0, 0, i, 4] * frameHeight)
x2 = int(detections[0, 0, i, 5] * frameWidth)
y2 = int(detections[0, 0, i, 6] * frameHeight)
bboxes.append([x1, y1, x2, y2])
cv.rectangle(frameOpencvDnn, (x1, y1), (x2, y2), (0, 255, 0), int(round(frameHeight/150)), 8)
return frameOpencvDnn, bboxes
第 3 步**:加载模型和权重文件**
项目目录中必须包含以下文件:
-
gender_net.caffemodel:用于性别检测的预训练模型权重。
-
deploy_gender.prototxt:性别检测模型的模型架构。
-
age_net.caffemodel:用于年龄检测的预训练模型权重。
-
deploy_age.prototxt:年龄检测模型的模型架构。
-
res10_300x300_ssd_iter_140000_fp16.caffemodel:用于人脸检测的预训练模型权重。
-
deploy.prototxt.txt:人脸检测模型的模型架构。
我们有一个用于人脸检测的 protobuf 文件,它存储有模型的图形定义和训练权重。该 protobuf 格式文件(协议缓冲区)是用于存储模型的二进制数据。我们计划通过该 protobuf 文件来运行经过训练的模型以实现人脸检测。值得注意的是,虽然 protobuf 格式文件(.pb)以二进制形式存储 protobuf 数据,但 protobuf 文本格式文件(.pbtxt)则以文本形式存储 protobuf 数据。此外,protobuf 文件中还包含了与 tensorflow 相关的文件。.prototxt 文件具体描述了年龄和性别的网络配置,而 .caffemodel 文件则描述了神经网络层的状态参数。
然后,对于人脸、年龄和性别检测模型,定义权重和结构变量。
faceProto = "/content/opencv_face_detector.pbtxt"
faceModel = "/content/opencv_face_detector_uint8.pb"
ageProto = "/content/age_deploy.prototxt"
ageModel = "/content/age_net.caffemodel"
genderProto = "/content/gender_deploy.prototxt"
genderModel = "/content/gender_net.caffemodel"
第 4 步**:年龄和性别类别列表**
设置模型的平均值以及要从中进行分类的年龄组和性别列表。
MODEL_MEAN_VALUES = (78.4263377603, 87.7689143744, 114.895847746)
ageList = ['(0-2)', '(4-6)', '(8-12)', '(15-20)', '(25-32)', '(38-43)', '(48-53)', '(60-100)']
genderList = ['Male', 'Female']
第 5 步**:加载网络**
请使用 readNet() 方法加载网络。第一个参数用于存储训练权重,而第二个参数则用于保存网络配置。
# Load network
ageNet = cv.dnn.readNet(ageModel, ageProto)
genderNet = cv.dnn.readNet(genderModel, genderProto)
faceNet = cv.dnn.readNet(faceModel, faceProto)
第 6 步**:预测性别和年龄的函数**
该用户自定义的函数可被描述为名为pipline的实现,或者可视为主要工作流程的核心部分。其中,图像作为输入进入该函数,首先被用于获取位置信息,随后系统将基于此信息进一步预测年龄范围和性别。
def age_gender_detector(frame):
# Read frame
t = time.time()
frameFace, bboxes = getFaceBox(faceNet, frame)
for bbox in bboxes:
# print(bbox)
face = frame[max(0,bbox[1]-padding):min(bbox[3]+padding,frame.shape[0]-1),max(0,bbox[0]-padding):min(bbox[2]+padding, frame.shape[1]-1)]blob = cv.dnn.blobFromImage(face, 1.0, (227, 227), MODEL_MEAN_VALUES, swapRB=False)
genderNet.setInput(blob)
genderPreds = genderNet.forward()
gender = genderList[genderPreds[0].argmax()]
# print("Gender Output : {}".format(genderPreds))
print("Gender : {}, conf = {:.3f}".format(gender, genderPreds[0].max()))ageNet.setInput(blob)
agePreds = ageNet.forward()
age = ageList[agePreds[0].argmax()]
print("Age Output : {}".format(agePreds))
print("Age : {}, conf = {:.3f}".format(age, agePreds[0].max()))label = "{},{}".format(gender, age)
cv.putText(frameFace, label, (bbox[0], bbox[1]-10), cv.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2, cv.LINE_AA)
return frameFace
第 7 步**:预测**
from google.colab import files
uploaded = files.upload()
input = cv.imread("2.jpg")
output = age_gender_detector(input)
cv2_imshow(output)

在分析中,我们观察到性别预测的有信心水平达到100%,而相比之下,年龄预测的有信心水平较低,因为其预测的准确性较难达到。

在本文中,我们被教授了如何构建一个年龄识别系统,它不仅能够识别你的面部特征,还能通过边框突出显示来增强识别效果。
下载1:OpenCV-Contrib扩展模块中文版教程
关注「小白学视觉」公众号后,直接回复「扩展模块中文教程」,即可获取这份全网第一份OpenCV扩展模块中文版教程,包括扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理 等具体内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:「Python视觉实战项目」,即可获取到包含图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力掌握计算机视觉核心技术。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号的后台查看:OpenCV实战项目20讲,通过这个资源,您将能够掌握20个基于OpenCV的实战项目,从而实现OpenCV学习的进一步提升。
交流群
欢迎加入公众号读者群,与同行专家进行深入交流。目前主要开设了视觉SLAM、深度感知技术、传感器技术、智能驾驶技术、计算摄影技术、目标检测、图像分割、特征识别、医学影像分析、GAN模型应用、算法竞赛等专业微信群。为了方便您加入,建议您通过扫描下面的微信二维码进行操作。请在添加时备注:"昵称+学校/公司名称+研究领域",例如:"张三 + 上海交大 + 视觉SLAM"。按照备注要求填写后发送,将根据研究领域进行精准匹配。请注意,群内禁止发送与研究无关的广告信息,否则将导致您被请出群聊。感谢您的理解与配合。


