Advertisement

使用 OpenCV 进行图像中的性别预测和年龄检测

阅读量:

这篇文章介绍了如何使用Python和OpenCV库从图像中检测年龄和性别。主要内容包括:
使用OpenCV和Caffe模型进行人脸检测、年龄和性别分类
通过预训练模型加载权重文件,构建检测器
从输入图像中获取边界框坐标,并对检测到的人脸进行年龄和性别预测
在Google Colab中运行代码进行测试
提供了相关的下载资源和扩展模块教程,帮助读者进一步学习和实践

点击上方“小白学视觉 ”,选择加"星标 "或“置顶

复制代码
    重磅干货,第一时间送达
b0edd560c69d33ee16eb6ff87e63fcef.png

一、介绍

照片中的面部分析得到了广泛的关注,因为它在多个方面具有显著的应用价值。例如,它不仅能够提升客户定位的准确性,还能优化内容推荐效果,加强安全监控能力,以及在其他相关领域发挥重要作用。此外,该技术还可以通过广告链接(如广告)进一步拓展其应用范围。

年龄与性别构成了面部特征的关键要素,它们的确定是此类活动成功的关键。这些技术在众多企业中被广泛应用,原因包括客户关系管理的简化、需求预测的准确性以及提升用户体验的便利性。通过分析年龄和性别特征,人们能够更精准地识别和预测他们的需求。

尽管对于人类来说,从图像中识别性别和年龄同样具有挑战性,这一技术完全依赖于外表特征,预测结果往往不可靠,因为不同年龄段的人的外貌可能与人们的预期存在显著差异。

应用

在监控领域,计算机视觉技术常用于年龄和性别预测。随着计算机视觉技术的进步,这一预测方式变得更加实用,也更受公众欢迎。该研究课题在智能现实应用中展现出显著的实用性,取得了重大进展。

一个人的身份、年龄、性别、情绪和种族都由他们的面部特征来决定。年龄和性别这两个特征在多个实际应用场景中具有显著价值,例如在社会学研究和医疗诊断中。

  1. 安全和视频监控

  2. 人机交互

  3. 生物识别技术

  4. 娱乐

还有很多。

实施

掌握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)
1aad4d42d22feb3e54b4a5fa36da9e9a.png

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

e457331fc641273ff648d377393a7e2a.png

在本文中,我们被教授了如何构建一个年龄识别系统,它不仅能够识别你的面部特征,还能通过边框突出显示来增强识别效果。

下载1:OpenCV-Contrib扩展模块中文版教程

关注「小白学视觉」公众号后,直接回复「扩展模块中文教程」,即可获取这份全网第一份OpenCV扩展模块中文版教程,包括扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理 等具体内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:「Python视觉实战项目」,即可获取到包含图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力掌握计算机视觉核心技术。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号的后台查看:OpenCV实战项目20讲,通过这个资源,您将能够掌握20个基于OpenCV实战项目,从而实现OpenCV学习的进一步提升。

交流群

欢迎加入公众号读者群,与同行专家进行深入交流。目前主要开设了视觉SLAM、深度感知技术、传感器技术、智能驾驶技术、计算摄影技术、目标检测、图像分割、特征识别、医学影像分析、GAN模型应用、算法竞赛等专业微信群。为了方便您加入,建议您通过扫描下面的微信二维码进行操作。请在添加时备注:"昵称+学校/公司名称+研究领域",例如:"张三 + 上海交大 + 视觉SLAM"。按照备注要求填写后发送,将根据研究领域进行精准匹配。请注意,群内禁止发送与研究无关的广告信息,否则将导致您被请出群聊。感谢您的理解与配合。

eaef45f4d64c01c2c45388788d2875ee.png
047c2af1d66b302970320a623b2e74f8.png

全部评论 (0)

还没有任何评论哟~