在本文中,将探讨如何利用深度学习技术中的卷积神经网络(CNN)来估计图像中人物的年龄。这是系列文章的第二篇,将讨论图像数据集的选择和获取。数据集是解决任何图像分类问题,包括年龄估计问题的关键组成部分。将使用这些数据来训练CNN,以区分包含人脸的图像,并将它们分类到不同的年龄组中,如儿童、青少年、成年人等。此外,这些数据还将用于评估CNN模型的准确性,即模型如何从图片中准确预测人物的年龄。
为了估计人们的年龄,需要包含人脸的图像。同时,必须知道每张图像中人物的年龄。在深度学习术语中,图像需要用人物的年龄(以年为单位)进行“标记”。
需要多少图片这个问题很难精确回答。数量取决于正在解决的问题和设定的目标。深度学习研究人员表示,解决分类问题至少需要每个类别1000个样本。CNN成功训练所需的最小数据样本数量源于过拟合问题。如果数据集不足以训练CNN,模型将无法泛化信息。因此,CNN模型在处理训练数据时可能非常精确,但在处理测试数据时可能会给出糟糕的结果。
正如在系列的中提到的,将年龄估计视为一个分类问题。因此,需要将整个年龄范围分成几个年龄组,然后将一个人分类到这些组中的一个。为了实际应用,使用以下年龄组:
有十个组(类别),至少需要10,000张图像来训练CNN。还需要额外的图像来测试训练后CNN的质量。通常,测试需要10-20%的训练数据。因此,数据集中至少需要11-12,000张图像来训练和测试CNN。
不要忘记:不仅图像的总数很重要,样本分布也同样重要。理想的数据集包括每个类别中相同数量的样本,以避免类别不平衡问题。另一个重要方面是:每个年龄组的图像子集必须包括各种条件下的样本:微笑和严肃的面孔;戴眼镜和不戴眼镜的人;男性和女性等。这将使CNN能够从图像中提取各种特征,并只选择那些有助于估计年龄的特征。
在决定需要什么数据之后,是时候获取图像了。幸运的是,有许多开放的人脸数据集,可以用它们来实现目的。快速的互联网搜索可以找到几个带有年龄标签的人脸数据集:
将使用UTKFace数据集,它包含适当对齐和裁剪的人脸图像,每张图像只有一个人脸。如所见,每个文件名包含三个前缀数字。第一个数字是人物的年龄(以年为单位),第二个是性别标签,最后一个是种族标签。
为了方便起见,让在工作计算机上按照以下目录结构组织数据集:
C:\Faces
C:\Faces\Results
C:\Faces\Testing
C:\Faces\Training
C:\Faces\UTKFace
UTKFace文件夹包含UTKFace数据集中的原始图像,已移除年龄超过100岁的图像。现在需要将原始数据集分成训练和测试部分。以下是一个简单的Python类,用于分割数据:
import os
from shutil import copyfile
class DataSplitter:
def __init__(self, part):
self.part = part
def split(self, folder, train, test):
filenames = os.listdir(folder)
for (i, fname) in enumerate(filenames):
src = os.path.join(folder, fname)
if (i % self.part) == 0:
dst = os.path.join(test, fname)
else:
dst = os.path.join(train, fname)
copyfile(src, dst)
传递给类构造函数的part
参数是原始数据中将用于测试的部分。folder
参数是原始数据集目录的路径,而train
和test
参数分别代表训练和测试数据集目录的路径。执行以下Python代码将分割数据集:
ds = DataSplitter(10)
ds.split(r"C:\Faces\UTKFace", r"C:\Faces\Training", r"C:\Faces\Testing")
原始数据以1:9的比例分割。也就是说,每第十张原始图像将进入测试数据集,其余的九张将保留在训练集中。