opencv人脸性别年龄检测

一、引言

在计算机视觉领域,人脸分析是一个热门且应用广泛的研究方向。其中,人脸性别年龄检测能够自动识别图像或视频流中人脸的性别和年龄信息,具有诸多实际应用场景,如市场调研、安防监控、用户个性化体验等。OpenCV 作为一个强大的计算机视觉库,提供了丰富的工具和预训练模型来实现这一功能。

二、原理概述

人脸检测:首先需要在输入的图像或视频帧中检测出人脸。OpenCV 常用的人脸检测方法基于 Haar 级联检测器或基于深度学习的目标检测算法(如 SSD、YOLO 等)。Haar 级联检测器通过构建一系列简单的 Haar 特征,并利用 AdaBoost 算法训练出一个强分类器来识别图像中的人脸区域。基于深度学习的方法则通过在大规模人脸数据集上训练卷积神经网络(CNN),学习人脸的特征模式,从而实现更准确的人脸检测。​
性别年龄预测:一旦检测到人脸,将人脸区域进行预处理(如裁剪、归一化等)后输入到预训练的性别年龄预测模型中。这些模型通常也是基于深度学习的 CNN 架构。在训练过程中,模型学习到不同年龄和性别人脸的特征表示,通过对输入人脸图像的特征提取和分析,预测出该人脸对应的性别(通常为男性或女性)和年龄范围(如儿童、青少年、成年人、老年人等)。

pip install opencv - python

下载预训练模型:​
人脸检测模型:对于 Haar 级联人脸检测,可以从 OpenCV 官方的 GitHub 仓库下载haarcascade_frontalface_default.xml文件。该文件包含了训练好的 Haar 级联分类器参数。

性别年龄预测模型:性别年龄预测模型通常基于深度学习,如 Caffe 模型。可以从相关开源项目中下载预训练的deploy_gender.prototxt和gender_net.caffemodel文件用于性别预测,以及deploy_age.prototxt和age_net.caffemodel文件用于年龄预测。这些模型在大规模人脸数据集上进行了训练,具有一定的准确性。

准备输入数据:准备用于检测的图像或视频文件。确保图像或视频中的人脸清晰可见,光线条件良好,以提高检测的准确性。

三、代码实现

1.导入必要的库

import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np

导入cv2库用于计算机视觉处理,PIL库中的Image、ImageDraw、ImageFont用于在图像上绘制中文字符,numpy库用于数值计算。

2.加载模型文件路径

获取路径:通过网盘分享的文件:model2
链接: https://pan.baidu.com/s/1gS-5xqOexYyMQ_wUQJTR0w 提取码: ued3

faceProto = "model2/opencv_face_detector.pbtxt"
faceModel = "model2/opencv_face_detector_uint8.pb"
ageProto = "model2/deploy_age.prototxt"
ageModel = "model2/age_net.caffemodel"
genderProto = "model2/deploy_gender.prototxt"
genderModel = "model2/gender_net.caffemodel"

定义人脸检测、年龄预测和性别预测模型的配置文件(.pbtxt或.prototxt)和权重文件(.pb或.caffemodel)的路径。

3.读取模型

ageNet = cv2.dnn.readNet(ageModel, ageProto)
genderNet = cv2.dnn.readNet(genderModel, genderProto)
faceNet = cv2.dnn.readNet(faceModel, faceProto)

使用cv2.dnn.readNet函数读取年龄、性别和人脸检测模型,以便后续用于推理

4.定义年龄和性别标签列表及均值

ageList = ['0-2岁', '4-6岁', '8-12岁', '15-20岁', '25-32岁', '38-43岁', '48-53岁', '60-100岁']
genderList = ['男性', '女性']
mean = (78.4263377603, 87.7689143744, 114.895847746)

创建年龄和性别标签列表,用于将模型预测的类别索引转换为实际的年龄范围和性别描述。同时定义了图像归一化所需的均值。

5.人脸检测函数

def getBoxes(net, frame):frameHeight, frameWidth = frame.shape[:2]blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300),[104, 117, 123], True, False)net.setInput(blob)detections = net.forward()faceBoxes = []for i in range(detections.shape[2]):confidence = detections[0, 0, i, 2]if confidence > 0.7: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)faceBoxes.append([x1, y1, x2, y2])cv2.rectangle(frame, (x1, y1), (x2, y2),(0, 255, 0), int(round(frameHeight / 150)), 6)return frame, faceBoxes

这个函数接受一个模型net和一个视频帧frame作为输入。首先获取帧的高度和宽度,然后使用cv2.dnn.blobFromImage将帧转换为适合模型输入的 blob 格式,设置模型输入并进行前向推理得到检测结果。遍历检测结果,筛选出置信度大于 0.7 的检测框,将其坐标转换为实际图像中的坐标并添加到faceBoxes列表中,同时在原帧上绘制检测框。最后返回绘制了检测框的帧和检测框坐标列表。

6.在图像上绘制中文字符的函数

def cv2AddchineseText(img, text, position, textColor=(0, 255, 0), textSize=30):if isinstance(img, np.ndarray):img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img)fontStyle = ImageFont.truetype("simhei.ttf", textSize, encoding="utf-8")draw.text(position, text, textColor, font=fontStyle)return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

该函数用于在图像上绘制中文字符。首先判断输入的图像是否为 OpenCV 的numpy.ndarray格式,如果是则将其转换为PIL的Image格式。然后使用ImageDraw和ImageFont设置字体样式并在图像上指定位置绘制文本,最后再将图像转换回 OpenCV 的BGR格式并返回

7.主循环

cap = cv2.VideoCapture(0)
while True:_, frame = cap.read()frame = cv2.flip(frame, 1)frame, faceBoxes = getBoxes(faceNet, frame)if not faceBoxes:print("当前镜头中没有人")continuefor faceBox in faceBoxes:x1, y1, x2, y2 = faceBoxface = frame[y1:y2, x1: x2]blob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), mean)genderNet.setInput(blob)genderOuts = genderNet.forward()gender = genderList[genderOuts[0].argmax()]ageNet.setInput(blob)ageOuts = ageNet.forward()age = ageList[ageOuts[0].argmax()]result = "{},{}".format(gender, age)frame = cv2AddchineseText(frame, result, (x1, y1 - 30))cv2.imshow("result", frame)if cv2.waitKey(1) == 27:break
cv2.destroyAllWindows()
cap.release()

初始化摄像头设备,通过cv2.VideoCapture(0)打开默认摄像头。进入无限循环,不断读取摄像头的帧,使用cv2.flip对帧进行水平翻转(以实现镜像效果)。调用getBoxes函数进行人脸检测,获取绘制了检测框的帧和检测到的人脸框列表。如果没有检测到人脸,则打印提示信息并继续下一次循环。对于检测到的每一张人脸,提取人脸区域,将其转换为适合性别和年龄模型输入的 blob 格式,分别输入到性别和年龄预测模型中进行推理,获取预测结果并从标签列表中找到对应的性别和年龄描述,将两者组合成结果字符串,使用cv2AddchineseText函数在图像上绘制结果。最后使用cv2.imshow显示处理后的帧,当用户按下Esc键(键值为 27)时,退出循环。循环结束后,释放摄像头资源并关闭所有 OpenCV 窗口。

完整代码:

import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as npfaceProto = "model2/opencv_face_detector.pbtxt"
faceModel = "model2/opencv_face_detector_uint8.pb"
ageProto = "model2/deploy_age.prototxt"
ageModel = "model2/age_net.caffemodel"
genderProto = "model2/deploy_gender.prototxt"
genderModel = "model2/gender_net.caffemodel"ageNet = cv2.dnn.readNet(ageModel, ageProto)
genderNet = cv2.dnn.readNet(genderModel, genderProto)
faceNet = cv2.dnn.readNet(faceModel, faceProto)ageList = ['0-2岁', '4-6岁', '8-12岁', '15-20岁', '25-32岁', '38-43岁', '48-53岁', '60-100岁']
genderList = ['男性', '女性']
mean = (78.4263377603, 87.7689143744, 114.895847746)def getBoxes(net, frame):frameHeight, frameWidth = frame.shape[:2]blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300),[104, 117, 123], True, False)net.setInput(blob)detections = net.forward()faceBoxes = []for i in range(detections.shape[2]):confidence = detections[0, 0, i, 2]if confidence > 0.7: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)faceBoxes.append([x1, y1, x2, y2])cv2.rectangle(frame, (x1, y1), (x2, y2),(0, 255, 0), int(round(frameHeight / 150)), 6)return frame, faceBoxesdef cv2AddchineseText(img, text, position, textColor=(0, 255, 0), textSize=30):if isinstance(img, np.ndarray):  # 判断是否为OpenCV图片类型img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img)fontStyle = ImageFont.truetype("simhei.ttf", textSize, encoding="utf-8")draw.text(position, text, textColor, font=fontStyle)return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)cap = cv2.VideoCapture(0)  # 装载摄像头
while True:_, frame = cap.read()frame = cv2.flip(frame, 1)frame, faceBoxes = getBoxes(faceNet, frame)if not faceBoxes:print("当前镜头中没有人")continuefor faceBox in faceBoxes:x1, y1, x2, y2 = faceBoxface = frame[y1:y2, x1: x2]blob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), mean)genderNet.setInput(blob)genderOuts = genderNet.forward()gender = genderList[genderOuts[0].argmax()]ageNet.setInput(blob)ageOuts = ageNet.forward()age = ageList[ageOuts[0].argmax()]result = "{},{}".format(gender, age)frame = cv2AddchineseText(frame, result, (x1, y1 - 30))cv2.imshow("result", frame)if cv2.waitKey(1) == 27:break
cv2.destroyAllWindows()
cap.release()

最后实现对人脸性别年龄的检测

四、总结

通过 OpenCV,我们可以方便地实现人脸性别年龄检测。利用其提供的预训练模型和丰富的函数接口,结合简单的代码编写,就能够搭建起一个实用的人脸分析系统。希望本文能帮助你快速上手并在实际项目中应用这一技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NLP】 22. NLP 现代教程:Transformer的训练与应用全景解读

🧠 NLP 现代教程:Transformer的训练与应用全景解读 一、Transformer的使用方式(Training and Use) 如何使用Transformer模型? Transformer 模型最初的使用方式有两种主要方向: 类似 RNN 编码-解码器的架…

Spring Boot 集成 RocketMQ 全流程指南:从依赖引入到消息收发

前言 在分布式系统中,消息中间件是解耦服务、实现异步通信的核心组件。RocketMQ 作为阿里巴巴开源的高性能分布式消息中间件,凭借其高吞吐、低延迟、高可靠等特性,成为企业级应用的首选。而 Spring Boot 通过其“约定优于配置”的设计理念&a…

HTTPS实现安全的关键方法及技术细节

HTTPS(HyperText Transfer Protocol Secure)通过多种技术手段实现数据传输的安全性,其核心机制基于SSL/TLS协议,并结合数字证书、加密算法等技术。 SSL:Secure Sockets Layer,安全套接字层 TLS:…

Java【多线程】(8)CAS与JUC组件

目录 1.前言 2.正文 2.1CAS概念 2.2CAS两种用途 2.2.1实现原子类 2.2.2实现自旋锁 2.3缺陷:ABA问题 2.4JUC组件 2.4.1Callable接口 2.4.2ReentrantLock(与synchronized对比) 2.4.3Semaphore信号量 2.4.4CountDownLatch 3.小结 1…

【Docker】离线安装Docker

背景 离线安装Docker的必要性,第一,在目前数据安全升级的情况下,很多外网已经基本不好访问了。第二,如果公司有对外部署的需求,那么难免会存在对方只有内网的情况,那么我们就要做到学会离线安装。 下载安…

MecAgent Copilot:机械设计师的AI助手,开启“氛围建模”新时代

MecAgent Copilot作为机械设计师的AI助手,正通过多项核心技术推动机械设计进入“氛围建模”新时代。以下从功能特性、技术支撑和应用场景三方面解析其创新价值: 一、核心功能特性 ​​智能草图生成与参数化建模​​ 支持自然语言输入生成设计草图和3D模型,如输入“剖面透视…

MCU屏和RGB屏

一、MCU屏 MCU屏‌:全称为单片机控制屏(Microcontroller Unit Screen),在显示屏背后集成了单片机控制器,因此,MCU屏里面有专用的驱动芯片。驱动芯片如:ILI9488、ILI9341、SSD1963等。驱动芯片里…

7.5 使用MobileNet v3进行图像的区分

MobileNet v3是Google在2019年提出的轻量级卷积神经网络结构,旨在提高在移动设备上的速度和准确性,广泛的用于轻量级网络。 MobileNet v3-Small的网络结构如下,它的输入是224x224的3通道彩色图片。 使用过程如下: 1.创建模型、修改最终分类数量 #1.创建mobilenet_v3_small…

构建面向大模型训练与部署的一体化架构:从文档解析到智能调度

作者:汪玉珠|算法架构师 标签:大模型训练、数据集构建、GRPO、自监督聚类、指令调度系统、Qwen、LLaMA3 🧭 背景与挑战 随着 Qwen、LLaMA3 等开源大模型不断进化,行业逐渐从“能跑通”迈向“如何高效训练与部署”的阶…

PostgreSQL技术大讲堂 - 第86讲:数据安全之--data_checksums天使与魔鬼

PostgreSQL技术大讲堂 - 第86讲,主题:数据安全之--data_checksums天使与魔鬼 1、data_checksums特性 2、避开DML规则,嫁接非法数据并合法化 3、避开约束规则,嫁接非法数据到表中 4、避开数据检查,读取坏块中的数据…

【机器学习】机器学习笔记

1 机器学习定义 计算机程序从经验E中学习,解决某一任务T,进行某一性能P,通过P测定在T上的表现因经验E而提高。 eg:跳棋程序 E: 程序自身下的上万盘棋局 T: 下跳棋 P: 与新对手下跳棋时赢的概率…

Ubuntu20.04 设置开机自启

参考: Ubuntu20.04 设置开机自启_ubuntu进bos系统-CSDN博客

数据库中存储过程的流程语句讲解

一、流程语句讲解 二、总结 一、流程语句讲解 1.1 if语句讲解 语法: IF condition THENstatements; ELSEIF condition THENstatements; ELSEstatements; END IF; 题目示例: # 判断成绩等级 # 输入学生的编号,取出学生的第一门课,然后判断…

kubernetes》》k8s》》ConfigMap 、Secret

configmap官网 ConfigMap是一种 API 对象,使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap将配置和Pod解耦,更易于配置文件的更改和管理。ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的…

git在IDEA中使用技巧

git在IDEA中使用技巧 merge和rebase 参考:IDEA小技巧-Git的使用 git回滚、强推、代码找回 参考:https://www.bilibili.com/video/BV1Wa411a7Ek?spm_id_from333.788.videopod.sections&vd_source2f73252e51731cad48853e9c70337d8e cherry pick …

Spring 事务失效的原因及解决方案全解析,来复习了

Spring 事务失效是指在使用 Spring 声明式事务管理时,预期的事务行为(如事务的开启、提交、回滚等)未按预期执行,导致数据操作未满足 ACID 特性(原子性、一致性、隔离性、持久性),从而引发数据不…

「出海匠」借助CloudPilot AI实现AWS降本60%,支撑AI电商高速增长

🔎公司简介 「出海匠」(chuhaijiang.com)是「数绘星云」公司打造的社交内容电商服务平台,专注于为跨境生态参与者提供数据支持与智能化工作流。平台基于大数据与 AI 技术,帮助商家精准分析市场趋势、优化运营策略&…

python每日一练

题目一 输入10个整数,输出其中不同的数,即如果一个数出现了多次,只输出一次(要求按照每一个不同的数第一次出现的顺序输出)。 解题 错误题解 a list(map(int,input().split())) b [] b.append(a[i]) for i in range(2,11):if a[i] not in b:b.append(a[i]) print(b)但是会…

Docker实战:从零构建高可用的MySQL主从集群与Redis集群

在分布式系统架构中,数据库集群是保障数据高可用和性能的关键组件。本文将通过Docker技术,手把手教你搭建MySQL主从集群和Redis Cluster,并分享独创的优化技巧与运维实战经验。 一、为什么选择Docker部署集群? 传统数据库集群搭…

STM32电机库 电机控制特性

ST MC FW库提供FOC和六步法两种电机控制方式。这使得它能够驱动永磁同步电机 (PMSM) 和无刷直流电机 (BLDC)。FOC 更适合 PMSM,而六步法更适合 BLDC 电机。该固件可以驱动内嵌式PMSM 和标贴式PMSM。 ST Motor Control 固件库提供以下功能: FOC SVPWM 生成: 可配置的 PW…