65.9K
CodeProject 正在变化。 阅读更多。
Home

深度学习年龄估计:使用 CNN 预测年龄

2020 年 7 月 24 日

CPOL

3分钟阅读

viewsIcon

14243

downloadIcon

279

在本文中,我们将解释如何使用预训练的 CNN 来估计图像中人物的年龄。

在本系列文章中,我们将向您展示如何使用深度神经网络 (DNN) 从图像中估计一个人的年龄。

在上一篇文章中,我们训练了用于年龄估计的 CNN。我们在测试数据集上达到了 56% 的准确率。这意味着我们的模型在超过一半的情况下可以正确预测一个人的年龄组。在本文中——本系列文章的最后一篇——我们将解释如何使用预训练的 CNN 来估计图像中人物的年龄。

将预训练的 CNN 加载到内存

要将预训练的 CNN 从磁盘加载到内存,您可以使用以下 Python 代码

from keras.models import load_model
netname = r"C:\Faces\age_class_net_16_256.cnn"
trained_net = load_model(netname)

现在我们的 CNN 已经实例化并准备好用于年龄估计。我们需要获取图像,以与我们进行训练时相同的方式对其进行预处理,并将数据馈送到模型。以下 Python 类实现了估计算法

import numpy as np
from keras.preprocessing.image import img_to_array

class AgeEstimator:
    def __init__(self, converters, net):
        self.converters = converters
        self.net = net
        
    def estimate(self, image):
        for (i, converter) in enumerate(self.converters):
            image = converter.convert(image)	
        array = img_to_array(image, data_format="channels_last")
        
        arrays = []
        arrays.append(array)
        data = np.array(arrays).astype("float")/255.0 
        
        prob =  self.net.predict(data)
        classes = prob.argmax(axis=1)
        class_num = classes[0]
        
        return class_num

类构造函数接收两个参数

  • converters – 用于图像预处理的转换器实例列表(与我们用于网络训练的相同转换器)
  • net – 预训练的 CNN

estimate 方法有一个参数,该参数引用图像数据。此方法将所有转换应用于图像数据,将图像转换为特殊的数组格式,并将值缩放到单位范围 [0.0, 1.0]。

转换后,我们调用 predict 方法。请注意,它接收一个数据数组。并且它返回的也是一个数组,其中每个元素都是概率的数组。然后我们使用 argmax 函数来获取具有最高概率的年龄组。

运行年龄估计

现在我们可以创建类的实例,获取图像,并估计人物的年龄

import cv2
import os
 
rc = ResizeConverter(128, 128)
gc = GrayConverter()
estimator = AgeEstimator([rc, gc], trained_net)
 
dataFolder = r"C:\Faces\Testing"
imageName = r"25_0_1_20170116002835308.jpg.chip.jpg"
imageFile = os.path.join(dataFolder, imageName)
image = cv2.imread(imageFile)
 
ageGroup = estimator.estimate(image)

在这里,我们使用 OpenCV cv2.imread 方法从文件中获取图像。然后我们调用 estimate 方法并获取预测的年龄组编号 ageGroup。了解年龄组编号和年龄组范围后,我们可以将该组的范围分配给图像中的人物。

以下代码允许我们用年龄组标记图像并将其保存到文件

ageranges = [1, 6, 11, 16, 19, 22, 31, 45, 61, 81, 101]
resultFolder = r"C:\Faces\Results"
cv2.putText(image, "["+str(ageranges[ageGroup])+"-"+str(ageranges[ageGroup+1]-1)+"]",
            (4, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 255, 255), 2, cv2.LINE_AA)
resultFile = os.path.join(resultFolder, imageName)
cv2.imwrite(resultFile, image)

我们使用 cv2.putText 方法在图像上绘制文本,然后使用 cv2.imwrite 将注释后的图像保存到文件。

以下是一些带有年龄组注释的图像示例

请注意,您可以从各种来源获取用于估计函数的图像:文件、IP 摄像头、全局或本地网络、移动设备等。然后可以将估计的年龄用于评估零售客户的人口统计信息或其他统计数据。

总结

在本系列文章中,我们讨论了使用现代 DL 算法进行年龄估计所需的全部步骤:选择训练/测试数据集、设计和实现 CNN、模型训练以及由预训练 CNN 模型进行实际估计。我们希望这很有用。祝您在自己的 DL 探索中一切顺利!

© . All rights reserved.