使用 OpenCV -6-使用 OpenCV 进行性别和年龄检测的有趣 Python 项目
一、前言
该文章仅作为个人学习使用
二、正文
项目源代码:使用 OpenCV 进行性别和年龄检测的有趣 Python 项目 - DataFlair (data-flair.training)
数据集:Adience 基准性别和年龄分类 (kaggle.com)
性别和年龄检测 Python 项目
首先向您介绍这个性别和年龄检测的高级 python 项目中使用的术语——
什么是计算机视觉?
计算机视觉 是一个研究领域,它使计算机能够像人类一样查看和识别数字图像和视频。它面临的挑战很大程度上来自对生物视觉的有限理解。计算机视觉涉及获取、处理、分析和理解数字图像,以从现实世界中提取高维数据,以生成符号或数字信息,然后可用于做出决策。该过程通常包括对象识别、视频跟踪、运动估计和图像恢复等实践。
什么是OpenCV?
OpenCV 是开源计算机视觉的缩写。顾名思义,它是一个开源的计算机视觉和机器学习库。该库能够处理实时图像和视频,同时还具有分析功能。它支持深度学习框架 TensorFlow 、Caffe 和 PyTorch。
什么是CNN?
卷积神经网络 是一种深度神经网络 (DNN),广泛用于图像识别和处理以及 NLP 。CNN 也称为 ConvNet,具有输入和输出层,以及多个隐藏层,其中许多是卷积层。在某种程度上,CNN是正则化的多层感知器。
性别和年龄检测 Python 项目 - 目标
构建一个性别和年龄检测器,该检测器可以在Adience数据集上使用深度学习来大致猜测图片中人(脸)的性别和年龄。
性别和年龄检测 – 关于项目
在这个 Python 项目中,我们将使用深度学习从一张人脸图像中准确识别一个人的性别和年龄。我们将使用 Tal Hassner 和 Gil Levi 训练的模型。预测的性别可能是“男性”和“女性”之一,预测的年龄可能是以下范围之一 - (0 – 2)、(4 – 6)、(8 – 12)、(15 – 20)、(25 – 32)、(38 – 43)、(48 – 53)、(60 – 100)(最终 softmax 层中的 8 个节点)。由于化妆、光线、障碍物和面部表情等因素,很难从单个图像中准确猜测确切的年龄。因此,我们把它变成一个分类问题,而不是把它变成一个回归问题。
CNN架构
此 python 项目的卷积神经网络有 3 个卷积层:
- 卷积层;96 个节点,内核大小 7
- 卷积层;256 个节点,内核大小 5
- 卷积层;384 个节点,内核大小 3
它有 2 个全连接层,每个层有 512 个节点,以及一个 softmax 类型的最终输出层。
为了进行 python 项目,我们将:
- 检测人脸
- 分为男性/女性
- 分为 8 个年龄段之一
- 将结果放在图像上并显示出来
数据集
对于这个 python 项目,我们将使用 Adience 数据集;该数据集在公共领域可用,您可以 在此处 找到它。该数据集可作为面部照片的基准,包括各种真实世界的成像条件,如噪点、照明、姿势和外观。这些图片是从 Flickr 相册中收集的,并在知识共享 (CC) 许可下分发。它共有 26,580 张照片,涉及 8 个年龄段的 2,284 个主题(如上所述),大小约为 1GB。我们将使用的模型已经在此数据集上进行了训练。
先决条件
您需要安装 OpenCV (cv2) 才能此项目。你可以用 pip- 来做到这一点
pip 安装 opencv-python
您需要的其他包是 math 和 argparse,但它们是标准 Python 库的一部分。
练习性别和年龄检测python项目的步骤
1. 下载此 zip。解压缩它并将其内容放在一个你称之为 gad 的目录中。
此 zip 的内容是:
- opencv_face_detector.pbtxt
- opencv_face_detector_uint8.pb
- age_deploy.prototxt
- age_net.咖啡模型
- gender_deploy.prototxt
- gender_net.咖啡模型
- 几张图片来尝试这个项目
对于人脸检测,我们有一个 .pb 文件 - 这是一个 protobuf 文件(协议缓冲区);它保存模型的图形定义和训练权重。我们可以使用它来经过训练的模型。虽然 .pb 文件以二进制格式保存 protobuf,但扩展名为 .pbtxt 的文件以文本格式保存它。这些是 TensorFlow 文件。对于年龄和性别,.prototxt 文件描述网络配置,.caffemodel 文件定义图层参数的内部状态。
2. 我们使用 argparse 库创建一个参数解析器,以便我们可以从命令提示符中获取图像参数。我们让它解析持有图像路径的参数,以对性别和年龄进行分类。
3. 对于人脸、年龄和性别,初始化协议缓冲区和模型。
4. 初始化模型的平均值以及要分类的年龄范围和性别列表。
5. 现在,使用 readNet() 方法加载网络。第一个参数保存经过训练的权重,第二个参数携带网络配置。
6. 让我们捕获视频流,以防您想对网络摄像头的流进行分类。将 padding 设置为 20。
7. 现在,在按下任何键之前,我们读取流并将内容存储到名称 hasFrame 和 frame 中。如果它不是视频,它必须等待,所以我们从 cv2 调用 waitKey(),然后中断。
8. 让我们使用 faceNet 和 frame 参数调用 highlightFace() 函数,这将返回什么,我们将存储在名称 resultImg 和 faceBox 中。如果我们得到 0 个 faceBox,则意味着没有要检测的人脸。
在这里,net 是 faceNet——这个型号是 DNN 人脸检测器,在磁盘上只能容纳大约 2.7MB。
- 创建框架的浅拷贝并获取其高度和宽度。
- 从浅层副本创建 Blob。
- 设置输入并向前传递到网络。
- faceBoxes 现在是一个空列表。对于 0 到 127 中的每个值,定义置信度(介于 0 和 1 之间)。只要我们发现置信度大于置信度阈值(即 0.7),我们就会得到 x1、y1、x2 和 y2 坐标,并将这些坐标的列表附加到 faceBox。
- 然后,我们在图像上为每个这样的坐标列表放置矩形,并返回两件事:浅拷贝和 faceBox 列表。
9. 但是,如果确实存在 faceBox,对于每个 faceBox,我们定义人脸,从图像创建一个 4 维 blob。在此过程中,我们对其进行缩放、调整大小并传入平均值。
10. 我们输入并给网络一个前向传递,以获得两个类的信心。以较高者为准,即图片中人的性别。
11.然后,我们对年龄做同样的事情。
12. 我们将性别和年龄文本添加到生成的图像中,并使用 imshow() 显示它。
用于性别和年龄检测的 Python 项目示例
现在让我们在我们自己的一些图像上尝试这个性别和年龄分类器。
我们将进入命令提示符,使用 image 选项脚本,并指定要分类的图像:
Python 项目示例 1

输出:

Python 项目示例 2

输出:

Python 项目示例 3

输出:

Python 项目示例 4

输出:

Python 项目示例 5

输出:

Python 项目示例 6

输出:

三、总结
在这个 python 项目中,我们实现了一个 CNN 来从一张脸部图片中检测性别和年龄。你和我们一起完成了这个项目吗?在你自己的照片上试试这个。使用 DataFlair 发布的 源代码查看更多很酷的 python 项目 。
