用OpenCV进行年龄和性别检测的实现示例
作者:Python中文社区 发布时间:2021-02-17 18:18:19
本文主要介绍了用OpenCV进行年龄和性别检测的实现示例,分享给大家,具体如下:
在本文中,我将带您完成用 Python 进行机器学习的年龄和性别检测的任务。年龄和性别检测属于计算机视觉的范畴,因此我将在Python中使用OpenCV库。
在开始使用Python进行年龄和性别检测任务之前,我将首先带您了解该概念的含义以及如何处理年龄和性别检测问题。理解这个概念很重要,以便将来您不仅可以使用python,还可以使用任何编程语言轻松地执行年龄和性别检测任务。
年龄和性别检测简介
检测年龄和性别的任务是一个固有的难题,比许多其他计算机视觉任务更为困难。造成这种困难的主要原因在于训练这些类型的系统所需的数据。
尽管一般的对象检测任务通常可以访问成千上万甚至数百万张图像进行训练,但是带有年龄或性别标签的数据集却要小得多,通常只有几千个,或者最好是几万个。
原因是要为此类图像添加标签,我们需要访问图像中主题的个人信息。即,我们将需要他们的出生日期和性别,尤其出生日期是很难获取的信息。
因此必须解决这个问题的本质,我们正在用适应网络体系结构和算法方法来解决这些局限性。
用Python进行年龄和性别检测
按年龄和性别分类的领域已经研究了数十年。多年来,已经采取了各种方法来解决该问题,并且取得了不同程度的成功。现在,我们开始使用 Python 来检测年龄和性别。
我将把性别检测问题作为分类问题,将年龄检测问题作为回归问题。但是,使用回归准确估计年龄是困难的。甚至人类也无法通过注视一个人来准确预测年龄。但是,我们确实知道他们是30多岁还是40多岁。这也是我要使用Python进行的操作。
现在,让我们开始使用 Python 语言进行年龄和性别检测任务。首先,我将开始编写用于检测面部的代码,因为如果没有面部检测,我们将无法继续进行年龄和性别预测任务。
您可以从此处下载在年龄和性别检测任务中所需的必要的OpenCV预训练模型。现在,在您的python文件中导入OpenCV模块后,即可开始使用以下代码。
用于人脸检测的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
现在,下一步是预测图像中人的性别。在这里,我将把性别网络加载到内存中,并通过网络将检测到的面部发送给性别检测任务。
性别检测的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)
因此,从输出中可以看到,我们能够高度准确地预测性别和年龄。
来源:https://blog.csdn.net/BF02jgtRS00XKtCx/article/details/111570089


猜你喜欢
- springboot数据库查询时出现的时区差异最近项目中使用到多数据源将MySQL库中的数据迁移到mongo库中,发现取出后的数据与原数据时
- UPDATE是否会加锁?SQL语句为如下时,是否会加锁?UPDATE table1 SET num = num + 1 WHERE id=1
- 数据:一个db,2000个表格,2000张表格数据,每条记录30个column,平均每张表格4.3w条记录,总共86388670条记录。机器
- 1 前言前面文章Python爬虫获取基金列表、Python爬虫获取基金基本信息我们已经介绍了怎么获取基金列表以及怎么获取基金基本信息,本文我
- 前言段(segment)是一种在数据库中消耗物理存储空间的任何实体(一个段可能存在于多个数据文件中,因为物理的数据文件是组成逻辑表空间的基本
- 看到一篇Implementing an Infinite Scroll with Vue.js , 觉得挺实用的就看了下, 顺便简单翻译了一
- 1. 简介 追踪某些软件运行时所发生事件的方法, 可以在代码中调用日志中某些方法来记录发生的事情一个事件可以用一个可包含可选变量数
- 前言最近补 Golang channel 方面八股的时候发现用 channel 实现一个优雅退出功能好像不是很难,之前写的 HTTP 框架刚
- 0.引言利用python开发,借助Dlib库进行人脸识别,然后将检测到的人脸剪切下来,依次排序显示在新的图像上;实现的效果如下图所示,将图1
- 前言问题:做requests请求时遇到如下报错:{“code”:“500&
- 使用神经网络进行样本训练,要实现随机梯度下降算法。这里我根据麦子学院彭亮老师的讲解,总结如下,(神经网络的结构在另一篇博客中已经定义):de
- 集成 FCKEditor v2.6(当前为最新版本)的基本步骤如下:1. 下载FCKeditor 2.6 基本文件(Main Code)。将
- 字符串遍历>>> a_str = "hello itcast">>> for cha
- 安装了python3之后,会有pip31. 使用pip install XXX新安装的库会放在这个目录下面python2.7/site-pa
- 2016年9月22日凌晨,微信宣布“小程序”问世,妈的,论坛,博客全是小程序,昨天当之无愧抢了头条,当然只是开始内测了,微信公众平台对200
- tuple函数功能和list功能很相似,以序列为参数并把它转换为元组>>> tuple([1,2,3])(1, 2, 3)
- 前言和网络 IO 一样,文件读写同样是一个费事的操作。默认情况下,Python 使用的是系统的阻塞读写。这意味着在 asyncio 中如果调
- Python虚拟机注:本篇是根据教程学习记录的笔记,部分内容与教程是相同的,因为转载需要填链接,但是没有,所以填的原创,如果侵权会直接删除。
- 一、前言昨夜刷b站的时候,看到了一条评论,形式如下图,于是心血来潮写了个python脚本,可以根据文字来生成这种由emoji拼接成的“文字”
- vue项目页面空白但不报错产生的原因分析vue项目中我们请求一个路由,打开页面发现页面是空白的,产生的主要原因有四种:1.路由重复如果配置了