用 OpenCV 进行年龄和性别检测

本文将向您介绍如何利用Python进行机器学习中的年龄与性別检测任务。该技术归类于计算机视觉领域,在Python编程环境中我们采用OpenCV库来执行相关操作
在学习Python进行年龄与性别的识别之前,请您跟我一起先了解这一概念的基本含义以及解决这类问题的方法。掌握这一概念对后续的学习至关重要。这将使您不仅能在Python中完成相关任务,在其他编程语言中也能游刃有余地应对同样的问题。
年龄和性别检测简介
这个检测年龄和性别的任务本质上是一个持续性的挑战,在众多计算机视觉任务中显得尤为棘手。其主要原因在于训练这些类型系统的所需数据
这个检测年龄和性别的任务本质上是一个持续性的挑战,在众多计算机视觉任务中显得尤为棘手. 其主要原因在于训练这些类型系统的所需数据
一般情况下,在训练的对象检测任务中,能够访问到的图像数量通常在几十万甚至上千万张。相比之下,在具有年龄或性别标签的数据集中,则数量少得可怜。
原因是想对这类图像进行标注以实现分类识别的目标需求时必须掌握相关数据信息其中特别提到的是他们的出生日期和性别尤其是出生日期这类信息更为难以获取
为了彻底解决这一问题的核心所在, 我们正致力于构建一个适应性的网络架构, 并采用先进的算法体系以实现对各种限制的有效应对.
用Python进行年龄和性别检测
该领域的研究基于年龄与性别的分类持续达数十年之久。多年以来,在解决这一问题的过程中已应用多种策略并取得了一定的效果。如今我们引入Python技术来识别年龄与性别。
我会把性别识别问题划分为分类任务,并把年龄识别问题划分为回归任务。然而, 使用回归模型来精确估计年龄显得具有挑战性。即使人类也无法通过持续注视一个人来精确判断他的年龄段, 但至少我们知道他们的年龄段大致在30岁至40岁之间。因此, 我们知道的是他们处于这一年龄段的具体细分阶段, 而这也是我利用Python完成的任务
请允许我们从现在起开始应用 Python 语言来处理年龄与性别检测的任务。请允许我们从现在起开始应用 Python 语言来处理年龄与性别检测的任务。首先,请注意我将负责编写用于面部检测的代码。由于没有有效的面部检测技术作为支撑,在后续的人脸年龄与性别预测任务中我们便难以取得可靠的成果。
您可从此处获取用于完成年龄和性别检测任务所需之OpenCV预训练模型。一旦您导入OpenCV模块至Python文件中,则可利用以下代码进行操作。
用于人脸检测的Python代码:
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
下一步将是识别人脸的性别。在这里,在此步骤中我会首先将 gender recognition network 加载至内存,并随后通过该网络将 detected faces 传递至 gender detection task进行分析。
性别检测的Python代码:
genderProto = "gender_deploy.prototxt"
genderModel = "gender_net.caffemodel"
ageNet = cv.dnn.readNet(ageModel, ageProto)
genderList = ['Male', 'Female']
blob = cv.dnn.blobFromImage(face, 1, (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 : {}".format(gender))
当前的下一个任务即为预测图像中人类的年龄。在此处,则采用前向传播的方式来进行输出计算。鉴于该网络架构与性别识别网络具有相似性特征,则能够充分运用所有的输出结果,并通过这些数据获得预期年龄段信息从而实现上述任务的目标
用于年龄检测的Python代码:
ageProto = "age_deploy.prototxt"
ageModel = "age_net.caffemodel"
ageNet = cv.dnn.readNet(ageModel, ageProto)
ageList = ['(0 - 2)', '(4 - 6)', '(8 - 12)', '(15 - 20)', '(25 - 32)', '(38 - 43)', '(48 - 53)', '(60 - 100)']
ageNet.setInput(blob)
agePreds = ageNet.forward()
age = ageList[agePreds[0].argmax()]
print("Gender Output : {}".format(agePreds))
print("Gender : {}".format(age))
我们需要编写的最后代码是显示输出:
label = "{}, {}".format(gender, age)
cv.putText(frameFace, label, (bbox[0], bbox[1]-20), cv.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 0), 3, cv.LINE_AA)
cv.imshow("Age Gender Demo", frameFace)
因此,从输出中可以看到,我们能够高度准确地预测性别和年龄。

更多阅读
半小时间掌握Python协程
这个程序运行速度较慢?难道你误用了某种版本或配置导致运行效率不高?
探讨赛博朋克科幻文化的起源与发展及其所具有的价值与意义
特别推荐
程序员摸鱼指南

为你精选的硅谷极客资讯,
来自FLAG巨头开发者、技术、创投一手消息

点击下方阅读原文加入****社区会员
