本文将解释如何使用这个预训练的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
类构造函数接收两个参数:
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将注释的图像保存到文件中。