马春杰杰博客
致力于深度学习经验分享!

[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)

文章目录
[隐藏]

在本教程中,我们将讨论应用于面部的深度学习的有趣应用。我们将估计年龄并从单个图像中找出该人的性别。该模型由Gil Levi和Tal Hassner训练。我们将简要讨论本文的主要思想,并提供有关如何在OpenCV中使用该模型的分步说明。

1.使用CNN的性别和年龄分类

作者使用了一种非常简单的卷积神经网络架构,类似于CaffeNet和AlexNet。该网络使用3个卷积层,2个完全连接的层和最终的输出层。层的细节如下。
Conv1:第一个卷积层有96个内核大小为7的节点。
Conv2:第二个conv层有256个节点,内核大小为5。
Conv3:第三个转换层有384个节点,内核大小为3。

两个完全连接的层各有512个节点。
他们使用Adience数据集来训练模型。

1.1 性别预测

他们将性别预测定为分类问题。性别预测网络中的输出层是softmax类型,其中2个节点指示两个类“男性”和“女性”。

1.2 年龄预测

理想情况下,年龄预测应该作为回归问题来处理,因为我们期望将实数作为输出。但是,使用回归准确估计年龄具有挑战性。甚至人类也无法根据一个人的情况准确预测年龄。但是,我们知道他们是20岁还是30多岁。由于这个原因,将这个问题构建为一个分类问题是明智的,我们试图估计这个人所处的年龄组。例如,0-2范围内的年龄是单个类别,4-6是另一个类别上课等。

Adience数据集有8个类别,分为以下年龄组[(0 – 2),(4 – 6),(8 – 12),(15 – 20),(25 – 32),(38 – 43),( 48 – 53),(60 – 100)]。因此,年龄预测网络在最终softmax层中具有8个节点,指示所述年龄范围。
应该记住,单个图像的年龄预测不是一个很容易解决的问题,因为感知年龄取决于很多因素,同一年龄的人在世界各地可能看起来很不一样。此外,人们非常努力地隐藏自己的真实年龄!
例如,你能猜出这两位知名人士的年龄吗?
[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)

Narendra Modi是68岁,Ajit Doval是74岁!想象一下机器正确预测其年龄有多难。

2.代码教程

代码可以分为四个部分:

  1. 检测面孔
  2. 检测性别
  3. 检测年龄
  4. 显示输出

注意:请下载未随代码一起提供的模型权重文件(性别,年龄)。下载文件并将其与本文提供的其他代码文件一起保存。

下载代码后,您可以使用提供的示例图像或使用网络摄像头运行代码。

最终代码在文末!

2.1检测脸部

我们将使用DNN人脸检测器进行人脸检测。该型号仅为2.7MB,即使在CPU上也非常快。关于脸部检测装置的更多细节可以在我们的博客上找到的人脸检测。使用函数getFaceBox完成面部检测,如下所示。

2.2 预测性别

我们将性别网络加载到内存中,并通过网络传递检测到的面部。前向传递给出了两个类的概率或置信度。我们取两个输出的最大值并将其用作最终的性别预测。

2.3 预测年龄

我们加载年龄网络并使用正向传递来获得输出。由于网络架构类似于性别网络,我们可以从所有输出中获取最大值以获得预测年龄组。

2.4 显示输出

我们将在输入图像上显示网络输出,并使用imshow功能显示它们。

[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)

[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)

[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)

3.结果

我们在上面看到,网络能够将性别和年龄预测到高水平的准确性。接下来,我们想用这个模型做一些有趣的事情。许多演员都在电影中描绘了异性的角色。

我们想要检查一下AI在这些角色,以及他们是否能够欺骗AI。

我们使用了本文中的图像,这些图像显示了他们的实际照片以及他们改变性别的电影中的照片。我们来看一下。

[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)

[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)

除了Elle Fanning之外,其他所有人都能够用异性来愚弄人工智能。而且,仅从图像中预测名人年龄是非常困难的。

最后,让我们看看我们的模型预测我们在帖子开头的两个例子。

[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)

4. 观察

尽管性别预测网络表现良好,但年龄预测网络未达到我们的预期。我们试图在论文中找到答案,并为年龄预测模型找到以下混淆矩阵。

[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)

可以从上表中进行以下观察:

预测年龄组0-2,4-6,8-13和25-32具有相对高的准确度。(见对角线元素)

输出严重偏向25-32岁年龄组(参见属于25-32岁年龄组的行)。这意味着网络很容易在15到43岁之间混淆。因此,即使实际年龄在15-20或38-43之间,预测年龄很可能是25- 32。从结果部分也可以看出这一点。

除此之外,我们观察到如果我们在检测到的面部周围使用填充,模型的准确性会提高。这可能是由于以下事实:训练时的输入是标准面部图像,而不是我们在面部检测后得到的紧密裁剪的面部。

我们还在进行预测之前分析了面部对齐的使用,并发现某些示例的预测得到了改善,但与此同时,对某些人来说情况变得更糟。如果您主要使用非正面面部,那么使用对齐可能是个好主意。

5. 结论

总的来说,我认为模型的准确性是不错的,但可以通过使用更多数据,数据增强和更好的网络架构进一步改进。

如果有足够的数据可用,也可以尝试使用回归模型而不是年龄预测分类。

6. 参考文献

下载链接:

温馨提示: 此处内容需要 评论本文刷新本页 才能查看!

如果你对这篇文章有什么疑问或建议,欢迎下面留言提出,我看到会立刻回复!

打赏
未经允许不得转载:马春杰杰 » [mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)

留个评论吧~ 11 评论前登陆可免验证码!

私密评论
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址(选填,便于回访^_^)
  1. #10

    看看代码

    1 2年前 (2022-06-01) 来自天朝的朋友 谷歌浏览器 Windows 10 回复
  2. #9

    可以借鉴

    1 3年前 (2021-01-03) 来自天朝的朋友 谷歌浏览器 Windows 10 回复
  3. #8

    不错的!

    suka 3年前 (2020-11-28) 来自天朝的朋友 谷歌浏览器 Windows 10 回复
  4. #7

    net.forward()出来的结果怎么解析,看到有相关代码,前来膜拜

    situpass 4年前 (2020-08-06) 来自天朝的朋友 谷歌浏览器 Windows 10 回复
  5. #6

    看文章内模型的表现很不错,但是都是外国人,不知道用于国内老年人的年龄预测表现如何?

    yellow 4年前 (2020-08-05) 来自天朝的朋友 谷歌浏览器 Windows 10 回复
  6. #5

    很棒

    gcyBruce 4年前 (2020-04-08) Australia Safari浏览器 Mac OS X 10_15_4 回复
  7. #4

    good paper 好文章

    SS 4年前 (2019-12-22) Taiwan; Republic of China (ROC) 谷歌浏览器 Windows 10 回复
  8. #3

    帮忙

    hhh 4年前 (2019-11-22) Hong Kong 谷歌浏览器 Windows 10 回复
  9. #2

    看文章内模型的表现很不错,但是都是外国人,不知道用于国内老年人的年龄预测表现如何?

    LoryXu 5年前 (2019-09-20) Hong Kong 谷歌浏览器 Windows 10 回复
  10. #1

    学习学习

    1051989637@qq.com 5年前 (2019-06-02) 来自天朝的朋友 谷歌浏览器 Windows 10 回复

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

忘记密码 ?

切换登录

注册