首页>>科技 >>内容

opencv测量,如何使用OpenCV通过深度学习进行年龄识别

发布时间:2023-10-28 15:00:42编辑:温柔的背包来源:

很多朋友对opencv测量,如何使用OpenCV通过深度学习进行年龄识别不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

opencv测量,如何使用OpenCV通过深度学习进行年龄识别

在本教程中,您将学习如何使用OpenCV、深度学习和Python来执行自动年龄识别/预测。学习本教程后,你将能够相当准确地自动预测静止图像文件和实时视频中的人的年龄。要了解如何使用OpenCV和深度学习进行年龄识别,请继续阅读!基于OpenCV和深度学习的年龄识别

在本教程的第一部分,您将学习年龄识别,包括从图片或视频中自动预测人的年龄所需的步骤(以及为什么年龄识别应该被视为分类问题而不是回归问题)。接下来,我们将介绍这个基于深度学习的年龄识别模型,然后学习如何使用这两个模型:1。静态图像中的年龄识别2。实时视频中的年龄识别。然后,我们将分析我们的年龄预测工作的结果。什么是年龄识别?

年龄识别是仅通过人脸照片自动识别人的年龄的过程。通常你会看到年龄识别可以分两个阶段实现:1。阶段1:检测输入图像/视频中的人脸。第二阶段:提取人脸(感兴趣区域,ROI)并通过年龄检测器算法预测人的年龄。对于阶段1,可以为图片中的人脸生成边界的人脸检测器是可用的,包括但不限于阿哈。

使用哪种人脸检测器取决于你的项Haar cascades速度很快,可以在嵌入式设备上实时运行,但问题是其准确率较低,容易出现误检。HOG线性SVM模型比Haar cascades更精确,但速度较慢。他们对遮挡(即脸部的一部分可见)或视角变化(即脸部的不同视图)的耐受性也较差。

基于深度学习的人脸检测器是最强大的,它提供了最高的准确性,但它比哈尔级联和猪线性SVM需要更多的计算资源。为您的应用选择人脸检测器时,请花些时间考虑您的项目需求。——速度和准确度,哪个对你更重要?我也建议在每个人脸检测器上做一些实验,让这些结果可以指导你的决定。

一旦你的面部检测器生成图像/视频中面部的边界框坐标,你就可以进入第二阶段——来识别人的年龄。确定人脸的包围盒坐标(x,y)后,首先提取人脸的ROI,忽略图像(帧)的其余部分。这样做可以让年龄检测器只关注人脸,而不是图像中其他不相关的“噪声”。然后将面部ROI传递给模型,以获得实际年龄预测。

年龄检测器的算法有很多,但最流行的是基于深度学习的年龄检测器——。在本教程中,我们将使用这个基于深度学习的年龄检测器。基于深度学习的年龄检测器模型

图2:深度学习的年龄识别是一个活跃的研究领域。在本教程中,我们使用的是Levi和Hassner在他们2015年的论文中构建和训练的模型(图片来源:https://talhassner.github.io/home/projects/CNN _ age gender/CVPR 2015 _ CNN _ agegendestruction . pdf)。我们在这里使用的深度学习的年龄检测器模型是由Levi和Hassner在2015年的出版物《使用卷积神经网络进行年龄和性别分类》(https://talhassner.github.io/home/publication/2015_CVPR)中构建和训练的。

本文作者提出了一个类似AlexNet的简单系统,该系统一共学习了八个年龄段:10-224-638-12415-20525-32638-43748-53860-100。你可能会注意到这些年龄组是不连续的,这是有意的。因为用于训练模型的Adiance数据集(https://talhassner . github . io/home/projects/Adiance/Adiance-data . html # age gender)定义了年龄组(我们将在下一节介绍为什么要这样做)。

在本文中,我们将使用一个预先训练的年龄检测器模型。但是如果你有兴趣从零开始学习如何训练它,请一定要阅读《用Python进行计算机视觉深度学习》(https://www . pyimagesearch . com/deep-learning-computer-vision-python-book/),在那里我会向你展示如何训练。为什么我们不把年龄预测看成一个回归问题?图3:深度学习的年龄预测可以归为回归或分类问题。

你会注意到上面我们把年龄离散化为“不同的区间”,所以我们把年龄预测看成一个分类问题。为什么我们不把它看成一个回归问题(我们在房价预测教程中使用的方法:https://www . pyimagesearch . com/2019/01/28/Keras-regression-and-CNNs/)?从技术上讲,年龄预测没有理由不能被视为一项回归任务。甚至有一些模型可以通过回归来实现。问题是年龄预测本质上是主观的,仅仅基于外表。

一个50多岁的人一生中从未抽过烟。他出门的时候总是涂防晒霜,每天护理皮肤。而一个三十多岁的人一天抽很多烟,不涂防晒霜从事体力劳动,没有适当的护肤。这个五十岁的男人很可能看起来比这个三十岁的男人年轻。而且别忘了,基因是衰老最重要的驱动因素。

例如,看看下面这张马修派瑞(在电视情景喜剧《老友记》中饰演钱德勒宾)的照片,并与詹妮弗安妮斯顿(饰演瑞秋格林)的照片进行比较:你能猜到马修派瑞(50岁)实际上比詹妮弗安妮斯顿(51岁)小一岁吗?除非你事先了解这些演员,否则我不会相信。但另一方面,你能猜到这些演员的年龄在48-53岁吗?我愿意打赌,你可能有这个能力。

虽然人类天生不擅长预测年龄的准确值,但我们其实擅长预测年龄。当然,这是个例。詹妮弗安妮斯顿的基因近乎完美,加上优秀的整形医生,她看起来很年轻。但这证实了我的观点,人们故意隐瞒自己的年龄。而且,如果人类很难准确预测一个人的年龄,那么机器当然也会同样困难。

一旦你把年龄预测当成一个回归问题,一个模型要准确预测人的图像中的年龄值是极其困难的。但是,如果您将其视为一个分类问题,并为模型定义年龄组,我们的年龄预测模型将更容易训练,并且通常比基于回归的预测提供更高的准确性。

简而言之,年龄预测作为一个分类问题,可以大大“缓解”问题,更容易解决——。通常我们不需要一个人的确切年龄;粗略估计就够了。项目结构请确保从本文的“下载”部分获得代码、模型和图片。提取文件后,您的项目将如下所示:前两个目录由年龄预测器和人脸检测器组成。这两个深度学习模型都是基于Caffe的。

我提供了三张测试图片用于年龄预测;也可以添加自己的图片。在本教程的剩余部分,我们将讨论这两个Python脚本:detect_age.py:图片年龄预测Detect _ age _ video.py:视频年龄预测这些脚本将检测图片/帧中的人脸,然后使用OpenCV预测其年龄。运行我们的OpenCV图像年龄检测器让我们开始使用OpenCV在静态图像中进行年龄检测。

在您的目录中打开detect_age.py文件,让我们开始:要启动我们的年龄检测器脚本,让我们首先导入NumPy和OpenCV。我建议检查我的pip安装opencv教程(https://www.pyimagesearch.com/2018/09/19/pip-install-opencv/)来配置您的系统。另外,我们需要导入Python内置的os模块,可以添加模型所需的路径。

最后,我们导入argparse解析命令行参数(https://www . pyimagesearch . com/2018/03/12/python-arg parse-command-line-arguments/)。我们的脚本需要四个命令行参数:-图片:为年龄检测提供输入图像的路径-人脸:为预训练的人脸检测器模型提供路径-年龄:预训练的年龄检测器模型-置信度:最小概率阈值,从而过滤掉低置信度检测。

如上所述,我们的年龄检测器是一个分类器,它可以根据预先定义的年龄段,通过人脸的ROI来预测一个人的年龄——。我们不会把它当作一个回归问题。现在我们来定义一下这些年龄段的桶:我们的年龄是在预先训练好的年龄检测器的桶(即类别标签)中定义的。我们将使用这个列表和相关索引来获取年龄组,以便对输出图像进行注释。

在导入、设置命令行参数和年龄组之后,我们现在可以加载两个预训练的模型:这里,我们加载两个模型:我们的人脸检测器可以找到并定位图片中的人脸(第25-28行),年龄分类器确定特定人脸的年龄范围(第32-34行)。这些模型都是使用Caffe框架训练的。我在PyImageSearch Gurus课程(https://www . PyImageSearch . com/PyImageSearch-Gurus/)中介绍了如何训练Caffe分类器。

现在我们已经完成了所有的初始化,让我们从磁盘加载图像并检测面部的ROI:37-40行加载并预处理我们的输入图像。我们使用OpenCV的blobFromImage方法3354。请阅读我的教程(https://www . pyimagesearch . com/2017/11/06/deep-learning-open CVS-blob from image-works/)中关于blobFromImage的更多信息。为了检测图片中的人脸,我们通过CNN发送blob,得到检测列表。现在让我们循环检测面部ROI:

当我们循环检测时,我们清除低置信度的面部(第51-55行)。对于满足最低置信度标准的人脸,我们提取它们的ROI坐标(第58-63行)。现在,我们在只包含一张脸的图像上有了一点点进步。在第64-66行,我们基于这个ROI创建了一个blob(即一个faceBlob)。现在,我们将确定年龄:

我们使用面部斑点来预测年龄(第70-74行),从而获得年龄组和年龄的置信度。我们使用这些数据点和面部ROI的坐标来注释原始输入的图片(第77-86行)并显示结果(第89和90行)。在下一节中,我们将分析结果。OpenCV年龄识别的结果让我们运行OpenCV年龄检测器。首先,从本教程的“下载”部分下载源代码、预先训练的年龄检测器模型和样本图像。

从那里打开一个终端,然后执行以下命令:在这里,你可以看到我们的OpenCV年龄检测器以57.51%的置信度预测我的年龄为25-32岁。其实年龄探测器是对的(拍这张照片的时候我30岁)。我们再举一个例子。这是著名演员尼尔帕特里克哈里斯小时候的照片:我们的年龄预测值又正确了。拍这张照片的时候,纳特帕特里克哈里斯真的是看着8-12岁年龄段的某个年龄。

我们试试另一张图;这张照片是塞缪尔L杰克逊,我最喜欢的演员之一:图7:通过使用OpenCV的深度学习进行年龄预测并不总是准确的,塞缪尔L杰克逊的照片证明了这一点。年龄预测只是一个软件,对人类来说是主观的。这里,我们的OpenCV年龄检测器有一个错误。塞缪尔L杰克逊大约71岁,这使得我们的年龄预测大约18岁。

换句话说,光看照片——,杰克逊先生看起来有71岁吗?我猜大概50到60岁。至少对我来说,他看起来不像70多岁的人。但这恰恰印证了我在上一篇文章中提出的观点:视觉预测年龄的过程非常艰难。当计算机或人试图猜测某人的年龄时,我认为这是主观的。为了评价年龄检测器,不能靠人的实际年龄来评价。相反,您需要衡量预测年龄和感知年龄之间的准确性。

运行我们的OpenCV实时视频年龄检测器现在我们可以在静态图像中实现年龄检测,但是实时视频可以吗?我们能做到吗?你应该猜到我们可以。我们的视频脚本与图像脚本非常相似。不同的是,我们需要设置视频流,并在每一帧上循环进行年龄检测。本文将重点介绍视频功能,请根据需要参考上述流程。

要了解如何识别视频中的年龄,我们先来看看detect _ age _ video.py,我们需要导入三个新模块:(1)VideoStream (2)imutils (3)time。这些进口允许我们设置视频和使用网络摄像头功能。我决定定义一个快捷函数来获取帧、定位人脸和预测年龄。函数通过检测和逻辑预测使我们的帧处理周期不那么庞大(你也可以把这个函数放在一个单独的文件里)。现在让我们进入这个程序:

我们的detect_and_predict_age辅助函数接受以下参数:frame:通过网络摄像头获取的单帧视频;faceNet:一个初始化的深度学习人脸检测器;ageNet:一个初始化的深度学习年龄分类器;minConf:一个过滤掉较差人脸识别的置信度阈值。这里的参数类似于我们的图片年龄检测器脚本的命令行参数。我们的AGE_BUCKETS再次被定义(第12行和第13行)。然后,我们定义一个空列表来存储面部位置和年龄检测的结果。

第20-26行用于人脸检测。接下来,我们将处理每个检测:请看第29-43行,——。它们被循环检测以确保高置信度,然后提取面部ROI。第46-47行是新的——。基于以下两个原因,我们需要保证视频中的人脸ROI足够大:首先,我们需要过滤掉帧中检测到的假阳性人脸。其次,年龄分类的结果对于远离摄像头的人脸(也就是脸小)并不准确。

为了完成我们的辅助功能,我们将识别年龄并返回结果:在这里,我们预测人脸的年龄并提取年龄和年龄置信度(第56-60行)。第65-68行将面部定位和年龄预测存储在字典中。循环检测的最后一步是将字典放到结果列表中(第69行)。如果所有的测试都已经完成并获得了结果,那么我们将把结果返回给调用者。

定义了辅助函数之后,现在我们可以继续处理视频了。但是我们需要先定义命令行参数:我们的脚本需要三个命令行参数:- face:预训练人脸检测器模型的目录的路径- age:预训练年龄检测器模型的目录- confidence:最小概率阈值,以便过滤掉低置信度检测。在这里,我们将加载模型并初始化视频:

第86-89行加载并初始化我们的人脸检测器,而第93-95行加载年龄检测器。然后,我们使用VideoStream类初始化网络摄像头(第99行和第100行)。在网络摄像头准备好之后,我们将开始处理帧:在上面的循环中,我们:获取帧并将其调整到已知的宽度(第106和107行);将帧通过我们的detect_and_predict_age便利函数,从而(1)检测人脸;(2)确定年龄(第111行和第112行);并将结果标注在框架上(。

显示和捕获键盘输入(第127和128行)。如果您键入q,那么退出并清除它(第131-136行)。在下一节中,我们将启动年龄检测器,看看它是否有效!使用OpenCV进行实时年龄检测的结果现在,让我们将OpenCV年龄检测器应用于实时视频。确保您已经从本教程的下载部分下载了源代码和预先训练的年龄检测器。从那里打开一个终端,输入以下命令:

在这里,你可以看到OpenCV年龄检测器准确预测我的年龄范围为25-32岁(写作时,我还是31岁)。如何提高年龄预测的结果?Levi和Hassner训练的年龄预测模型的一个问题是,它严重偏向25-32岁年龄段,正如他们原始版本中的这个混淆矩阵所示(https://talhassner.github.io/home/projects/CNN _年龄性别/CVPR2015 _ CNN _年龄性别. pdf):

图8:Levi和Hassner的深度学习年龄检测模型严重偏向25-32岁年龄段。为了在您的模型中解决此问题,请考虑收集更多的训练数据,使用类权重、数据扩充和正则化技术。(图片来源https://talhassner.github.io/home/projects/cnn_agegender/CVPR2015_CNN_AgeGenderEstimation.pdf)

不幸的是,这意味着我们的模型预测的25-32岁结果可能实际上属于其他的年龄段——我在分析本教程的结果以及我自己的年龄预测中也遇到了几次这样的情况。

您可以通过以下方法消除这种偏差:

1 收集其他年龄段的额外训练数据以帮助平衡数据集

2 使用类权重来处理类失衡的问题

3 注意数据扩充

4 训练模型时使用正则化

其次,年龄预测结果可以通过使用人脸对齐(https://www.pyimagesearch.com/2017/05/22/face-alignment-with-opencv-and-python/)来改善。

人脸对齐功能会识别人脸的几何结构,然后尝试使用平移,缩放和旋转获得人脸的规范化。

在许多情况下(但并非总是如此),人脸对齐可以改善面部应用的效果,包括面部识别,年龄预测等。

为简单起见,我们在本教程中没有使用人脸对齐功能,但是您可以按照这个教程(https://www.pyimagesearch.com/2017/05/22/face-alignment-with-opencv-and-python/)学习有关人脸对齐的更多信息,然后将其应用于自己的年龄预测程序中。

性别预测呢?

我特意选择不在本教程中介绍性别预测。

使用计算机视觉和深度学习来识别一个人的性别似乎是一个有趣的分类问题,但实际上这是一个道德问题。

某人在视觉上看上去怎样,穿着什么或如何表现,这些都并不意味着他们可能是某种(或其他)性别。

试图将性别划分为两类的软件只会把我们束缚在对于性别的过时观念里。因此,我鼓励您尽可能不要在自己的程序中使用性别识别。

如果必须进行性别识别,请确保对自己负责,并确保您不去创建使他人遵循性别偏见的应用程序(例如根据感知到的性别去定义用户体验)。

性别识别几乎没有价值,而且它引起的问题比它解决的问题还要多。请尽可能避免它。

总结

在本教程中,您学习了如何使用OpenCV通过深度学习进行年龄识别。

为此,我们利用了Levi和Hassner在2015年出版的《使用卷积神经网络进行年龄和性别分类》 中的预训练模型。该模型使我们能够以相当高的准确度去预测八个不同的年龄段;但是,我们必须认识到年龄预测是一个很有挑战性的问题。

有很多因素可以决定一个人的视觉年龄,包括他们的生活方式,工作,吸烟习惯,最重要的是基因。其次,请记住,人们试图掩饰自己的年龄——如果人类准确地预测某人的年龄有困难的话,那么机器学习模型同样会有困难。

因此,您必须根据感知年龄(而非实际年龄)去评估所有的年龄预测结果。在您自己的计算机视觉项目中进行年龄识别时,请记住这一点。

黄飞

以上知识分享希望能够帮助到大家!