FaceAge 深度学习流程包括两个阶段:面部定位和提取阶段,以及带有输出线性回归器的特征嵌入阶段,可提供生物年龄的连续估计。
第一阶段通过在照片中定位人脸并在其周围定义一个边界框来预处理输入数据。然后对图像进行裁剪、调整大小,并在所有 RGB 通道上对像素值进行标准归一化。人脸提取是使用由 Zhang 等人实现的多任务级联 CNN (MTCNN)完成的 (IEEE Signal Processing Letters 23, 1499–1503, 2016)。提取网络由三个子网络组成,即提议网络 ( P-net
),它创建一组初始边界框候选集,其中相似的框被合并,然后R-net
使用边界框回归和人脸关键点定位进一步细化 (),然后第三阶段 ( O-net
) 更严格地使用人脸关键点来优化最终边界框,实现了 95% 的引用测试准确率。有关更多详细信息,请参阅项目存储库。
流程的第二阶段将提取出的人脸图像输入卷积神经网络 (CNN),该网络对图像特征进行编码,通过回归计算得出连续的 FaceAge 预测值作为输出。该模型(其预训练权重将在发布后公布)采用一种Inception-ResNet v1
架构,其层级将高阶人脸特征逐步嵌入到低维表示中,从而产生 128 维的人脸嵌入,然后将其输入到线性回归层,生成连续的生物年龄估计值作为最终输出。原始Inception-ResNet v1
CNN 权重由 Sandberg 针对人脸识别问题进行了预训练,在Local Faces in the Wild
数据库上的测试准确率高达 98% (详情请参阅项目代码库)。
该网络适用于生物年龄估计,方法是移除输出分类层,代之以密集连接层,为具有线性激活函数的全连接输出层提供回归函数。然后,Inception-ResNet v1
除了全连接的输出层之外,还应用迁移学习来调整 426 层中的最后 281 层(Inception Block B1 及以后)的权重,使用来自数据库的 N = 56,304 张带有年龄标记的人脸图像的增强和随机重新平衡的训练数据集IMDb-Wiki
(参见增强和重新平衡)。从 60 岁及以后带有年龄标记的照片是手动挑选的,以确保图像质量控制并减少该临床相关年龄组的噪声标签造成的错误(参见手动质量保证)。以下 CONSORT 样式图表显示了如何构建训练数据集:
Keras
训练在配备后端的配对 GPU 上进行Tensorflow
,采用带动量反向传播的随机梯度下降法,最小化平均绝对误差 (MAE),批次大小为 256,采用批次归一化,使用 Dropout 进行正则化,初始学习率为 0.001,并在错误率达到平台期时逐步降低学习率。模型开发集采用随机划分法细分为 90% 训练集和 10% 测试集。源代码描述可在专用 README 文件中找到。
对于经过手动整理和质量保证的年龄范围,模型性能良好(MAE = 4.09 岁)。总体而言,整个数据集的 MAE = 5.87 岁。这被认为是可以接受的,因为其目的是更好地拟合 60 岁或以上的人群,因为这些人群与肿瘤学人群具有最高的临床相关性,但代价是无法拟合 40 岁以下的年轻年龄范围。因此,我们承认,属于较低年龄标签的图像包含更高的异质性、更差的图像质量以及一些噪声或错误标签。尽管如此,对于 40 岁以上的人群,平均年龄差异约为零,表明在这个具有临床相关性的年龄范围内不存在年龄偏差。
可在此处找到基于UTK
数据库的独立精选数据集的示例模型验证。用户可以通过笔记本重现稿件“扩展数据”部分中的部分图表。
在临床癌症人群研究中实施的 FaceAge 模型并未对模型参数进行微调。取消微调的原因有很多,但最重要的是,我们发现在进行微调时引入了年龄偏差和过拟合。虽然经过微调的 FaceAge 模型能够非常准确地预测健康对照测试样本人群的实际年龄,且 MAE 通常小于 3 岁,但当将经过微调的模型应用于临床数据集时,其预测患者预后的预测能力通常会比未经过微调的模型有所下降:
因此,尽管基础模型比微调模型“噪声更大”(即在估计年龄范围内具有更大的离散度),但最好使用非微调模型进行生物学年龄估计和结果预测。研究发现,个体间较大的离散度与队列中患者之间的相对生存结果相关,从而与生物学年龄相关,而微调会削弱或消除这种相关的预后成分,这可能部分是由于对微调队列较小样本量的过度拟合。微调数据集的特性也引入了偏差,例如,当人们估计表观年龄时,他们往往会低估老年人的年龄——恰好处于与临床肿瘤学人群相关的年龄范围内——并且这种偏差会随着年龄的增长而变得更加明显:
值得注意的是,虽然我们没有为了避免过度拟合和引入年龄相关偏差而对本研究的模型进行微调,但这并不妨碍我们在模型的未来迭代中进行微调,前提是我们可以减轻微调对临床预测的负面影响。这是我们团队正在积极研究的领域。
原始代码是在 Ubuntu 18.04 上使用 Python 3.6.5、Tensorflow-gpu 1.8.0 和 CUDA 9.1.85 开发和测试的。此外,还使用文件中描述的环境environment-gpu.yaml
(Ubuntu 18.04 上的 Python 3.6.13、CUDA 11.3.1 和 libcudnn 8.2.1)、中描述的环境environment-cpu.yaml
(即相同的软件包,但不包含 GPU 加速)以及可免费访问的 Google Colab 笔记本(Ubuntu 18.04 上的 Python 3.7.12、CUDA 11.1 和 libcudnn 7.6.5)测试了该流水线的在线版本。我们建议在最新环境中运行该流水线,以避免库的已知问题MTCNN
。统计分析是在 RStudio 环境(版本 1.4.1106)中使用 R(版本 3.6.3)进行的。
为了使代码按预期运行,应安装其中一个环境文件下的所有软件包。为了不破坏之前的安装并确保完全兼容,强烈建议创建一个 Conda 环境来运行 FaceAge 流水线。以下是使用 Conda 和提供的 YAML 环境文件之一进行设置的两个示例。
GPU 加速可以显著加快 FaceAge 估计的速度。如果您的机器配备了支持 CUDA 计算功能的 GPU,您可以设置运行以下命令的 Conda 环境:
# set-up Conda faceage-test environment
conda env create --file environment-gpu.yaml
# activate the conda environment
conda activate faceage-gpu
此时,(faceage-gpu)
应该会显示在每行 bash 的开头。此外,该命令which python
应该返回类似于 的路径$PATH_TO_CONDA_FOLDER/faceage-gpu/bin/python
。您可以通过生成一个python
shell(在激活 Conda 环境后)并运行以下命令来检查您的 GPU 是否被环境正确识别(从而确保 GPU 加速可用):
import tensorflow as tf
tf.config.list_physical_devices('GPU')
如果设置成功,您应该会得到类似以下内容的输出:
>>> tensorflow.config.list_physical_devices('GPU')
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
现在一切都已准备就绪,可以通过 FaceAge 管道处理数据了。
可以通过运行以下命令停用虚拟环境:
conda deactivate
无需 GPU 加速即可运行 FaceAge 流水线,但这可能会显著增加处理时间。如果您的计算机未配备支持 CUDA 计算功能的 GPU,您可以设置运行以下命令的 Conda 环境:
# set-up Conda faceage-test environment
conda env create --file environment-cpu.yaml
# activate the conda environment
conda activate faceage-cpu
此时,(faceage-cpu)
应该会显示在每行 bash 的开头。此外,该命令which python
应该返回类似于 的路径$PATH_TO_CONDA_FOLDER/faceage-cpu/bin/python
。现在一切就绪,FaceAge 管道可以开始处理数据了。
可以通过运行以下命令停用虚拟环境:
conda deactivate
地址:
github: https://github.com/AIM-Harvard/FaceAge