使用预训练的卷积神经网络进行年龄估计

本文将解释如何使用这个预训练的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将注释的图像保存到文件中。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485