面部 Landmark 估计
面部 landmark 估计器网络旨在预测给定输入人脸图像的 landmark(关键点)的 (x,y) 位置。FPENet(Fiducial Points Estimator Network,特征点估计器网络)通常与人脸检测器结合使用,其输出通常用于人脸对齐、头部姿态估计、情感检测、眨眼检测、注视估计等。除了面部 landmark,关键点估计器还可用于预测通用应用程序的关键点。
FPENet 应用程序要求数据采用特定的 json 格式,以便转换为 TFRecords。为此,该工具需要一个配置文件作为输入。配置文件详细信息和示例用法包含在以下章节中。
ground truth 数据集是通过人工标注员标注 ground-truth 面部关键点创建的。如果您希望使用自己的数据集重新训练,请遵循以下指南。
按照正确的顺序尽可能准确地标注关键点。人工标注员应能够放大面部区域以正确定位关键点。
对于不易区分的关键点(如下巴或鼻子),应由人工标注员做出最佳估计。有些关键点很容易区分,例如嘴角或眼角。
如果关键点由于外部物体或极端头部姿态角度而不可见,则将关键点标注为“遮挡”。当关键点在图像中但不可见时,则认为该关键点被遮挡。
为了减少多个人工标注员之间标注的差异,应在所有标注员之间使用相同的关键点顺序和说明。可以使用独立的标注员来测试标注 landmark 的质量和潜在的更正。
可以使用 Sloth 和 Label Studio 工具进行标注。
数据集格式在标注数据格式章节中描述。
数据集转换器的配置文件
下面显示了一个示例数据集配置文件。
sets: [dataset1, dataset2]
gt_path: 'GT'
save_path: 'models/tfrecords'
gt_root_path: '/workspace/tao-experiments/data/'
save_root_path: '/workspace/tao-experiments/'
image_root_path: '/workspace/tao-experiments/'
tfrecord_folder: 'FpeTfRecords'
tfrecord_name: 'data.tfrecords'
num_keypoints: 80
bbox_enlarge_ratio: 1.0
参数 |
数据类型 |
描述 |
默认值 |
支持的值 |
---|---|---|---|---|
sets |
list | 要提取的 Set ID 列表。示例 - [set1, set2, set3]。 | – | – |
gt_path |
string | Ground truth json 路径。 | – | – |
save_path |
string | TF Records 的保存路径。 | – | – |
gt_root_path |
string | Ground truth json 的根路径(如果有)。此路径在读取 json 时预先添加到 gt_path。 | – | – |
save_root_path |
string | 用于保存 tfrecords 数据的根路径(如果有)。此路径预先添加到每个 set 的 save_path。 | – | – |
image_root_path |
string | 图像的根路径(如果有)。此路径将预先添加到 json 中的图像路径。 | – | – |
tfrecord_folder |
string | 要生成的 TF record 文件夹名称。如果此文件夹不存在,则会创建它。 | – | – |
tfrecord_name |
string | 要生成的 TF record 文件名。 | – | – |
num_keypoints |
int | 关键点数量。 | – | >0 |
bbox_enlarge_ratio |
float | 用于放大人脸 bounding box 的比例。 | – | – |
数据集转换器工具的示例用法
tao model fpenet dataset_convert -e dataset_config.yaml
为了对 FPENet 进行训练、评估和推理,需要配置几个组件,每个组件都有自己的参数。FPENet 实验的命令共享相同的配置文件。
规范文件配置了这些组件
训练器
模型
损失
数据加载器
优化器
训练器配置
训练器配置包含用于运行 FPENet 应用程序的一些常用参数,并且还包含其他配置:模型、损失、数据加载器和优化器。
__class_name__: FpeNetTrainer
checkpoint_dir: /workspace/tlt-expertiments/fpenet/
checkpoint_n_epoch: 1
enable_visualization: true
log_every_n_secs: 10
num_epoch: 20
num_keypoints: 80
random_seed: 35
visualize_num_images: 3
model:
...
loss:
...
optimizer:
...
dataloader:
...
参数 |
数据类型 |
描述 |
默认值 |
支持的值 |
---|---|---|---|---|
checkpoint_dir |
string | 用于保存/加载模型检查点的目录。 | 无 | – |
checkpoint_n_epoch |
int | 保存检查点的 epoch 数量。 | 1 | 1 到 num_epoch |
enable_visualization |
boolean | 在 TensorBoard 中启用可视化。 | True | True/False |
log_every_n_secs |
int | 以秒为单位的日志记录频率。 | 60 | – |
num_epoch |
int | 要训练的总 epoch 数量。 | 40 | – |
num_keypoints |
int | 关键点数量。 | 80 | > 0 |
random_seed |
int | 用于初始化的随机种子。 | 42 | – |
visualize_num_images |
int | 每个 epoch 要可视化的图像数量。 | 3 | – |
model | 模型配置。 | – | – | |
loss | 损失配置。 | – | – | |
optimizer | 优化器配置。 | – | – | |
dataloader | 数据加载器配置。 | – | – |
模型配置
提供模型相关参数的配置部分。
下面显示了一个示例模型配置。
model:
__class_name__: FpeNetBaseModel
model_parameters:
beta: 0.01
pretrained_model_path: /workspace/tao-experiments/pretrained_models/public/model.tlt
regularizer_type: l2
regularizer_weight: 1.0e-05
type: FpeNet_public
参数 | 数据类型 | 描述 | 默认值 | 支持的值 |
pretrained_model_path |
string | 要从中加载权重的预训练模型路径。 | 无 | – |
regularizer_type |
string | 权重正则化器的类型。 | – | “l1”、“l2” |
regulaizer_weight |
float | 正则化器的权重。 | – | – |
type |
string | 模型类型。 | – | “FpeNet_public”、“FpeNet_release” |
损失配置
提供损失相关参数的配置部分。
下面显示了一个示例损失配置。
loss:
__class_name__: FpeLoss
kpts_coeff: 0.01
loss_type: square_euclidean
mask_occ: true
weights_dict: null
elt_loss_info:
elt_alpha: 0.5
enable_elt_loss: true
modulus_spatial_augmentation:
hflip_probability: 0.0
rotate_rad_max: 0.35
translate_max_x: 10
translate_max_y: 10
zoom_max: 1.2
zoom_min: 0.8
参数 |
数据类型 |
描述 |
默认值 |
支持的值 |
---|---|---|---|---|
kpts_coeff |
float | 损失乘以的系数。 | 0.01 | – |
loss_type |
string | 要使用的损失类型。 | “l1” | “l1”、“square_euclidean”、“wing_loss” |
mask_occ |
boolean | 如果为 True,将屏蔽所有遮挡点。 | False | – |
weights_dict |
dictionary | 包含“眼睛”、“嘴巴”和“面部”其余部分的权重。这些字典键必须存在,并且元素总和必须为 1 | 无 | – |
elt_loss_info |
elt 损失配置 | 有关 ELT 损失的字典。 | – |
参数 weights_dict
仅支持 68、80 或 104 个面部 landmark。
FpeNet 使用的 ELT 损失配置。
定义于 - “Improving Landmark Localization with Semi-Supervised Learning” CVPR’2018
参数 |
数据类型 |
描述 |
默认值 |
支持的值 |
---|---|---|---|---|
elt_alpha |
float | ELT 损失的权重。 | 无 | – |
enable_elt_loss |
boolean | 启用 ELT 损失的标志。 | 无 | True/False |
modulus_spatial_augmentation | dictionary | 空间增强配置参数。hflip_probability:水平翻转的概率。rotate_rad_max:最大旋转弧度。translate_max_x:x 方向的最大像素平移。translate_max_y:y 方向的最大像素平移。zoom_max:最大缩放比率。zoom_min:最小缩放比率。 | hflip_probability: 0.0 rotate_rad_max: 0.0 translate_max_x: 0.0 translate_max_y: 0.0 zoom_max: 1.0 zoom_min: 1.0 | hflip_proability: 0.0 - 1.0 rotate_rad_max: - translate_max_x: 0 - 图像尺寸 translate_max_y: 0 - 图像尺寸 zoom_max: - zoom_min: - |
当将 FPENet 用于通用应用程序时,参数 hflip_probability
应设置为 0.0。
数据加载器配置
提供数据相关参数的配置部分。
下面显示了一个示例数据加载器配置。
dataloader:
__class_name__: FpeNetDataloader
augmentation_info:
augmentation_resize_probability: 0.5
augmentation_resize_scale: 1.6
enable_occlusion_augmentation: true
enable_online_augmentation: true
enable_resize_augmentation: true
gamma_augmentation:
gamma_max: 1.6
gamma_min: 0.6
gamma_probability: 0.1
gamma_type: uniform
modulus_spatial_augmentation:
hflip_probability: 0.25
rotate_rad_max: 0.35
translate_max_x: 10
translate_max_y: 10
zoom_max: 1.2
zoom_min: 0.8
patch_probability: 0.5
size_to_image_ratio: 0.5
mask_augmentation_patch: true
batch_size: 64
dataset_info:
image_extension: png
no_occlusion_masking_sets: s578-usercalibration-incar-0 s578-usercalibration-incar-1
root_path: /workspace/tao-experiments/
tfrecord_folder_name: FpeTfRecords
tfrecords_directory_path: /workspace/tao-experiments/models/tfrecords
tfrecords_set_id_train: s578-usercalibration-incar-0
tfrecords_set_id_val: s578-usercalibration-incar-0
tfrecord_file_name: data.tfrecords
image_info:
image:
channel: 1
height: 80
width: 80
kpiset_info:
tfrecords_set_id_kpi: s578-usercalibration-incar-1
num_keypoints: 80
参数 |
数据类型 |
描述 |
默认值 |
---|---|---|---|
batch_size |
int | 训练/评估的批次大小 | – |
|
数据集 proto 配置 |
有关输入数据集的信息 * image_extension (string):图像扩展名。目前,FPENet 仅支持 |
– |
|
image_info proto 配置 |
有关输入图像的信息 * channel (int):通道数。选项包括 1(灰度图像)和 3(RGB 图像)。 |
– |
|
kpiset_info proto 配置 |
用于 KPI 评估的信息 * tfrecords_set_id_kpi (string):数据集的空格分隔名称 |
– |
num_keypoints |
int | 关键点的数量 | – |
|
augmentation proto 配置 |
有关增强配置的信息 * enable_resize_augmentation (boolean):启用调整大小增强的标志 * gamma_max (float):Gamma 均匀分布的最大值 * modulus_spatial_augmentation * hflip_probability (float):水平翻转的概率。当将 FPENet 用于通用应用程序时,应将其设置为 0.0。 * patch_probability (float):添加遮挡增强的概率 |
– |
优化器配置
提供优化器相关参数的配置部分。可以在配置文件的优化器部分下配置优化器。
下面显示了一个示例优化器配置。
optimizer:
__class_name__: AdamOptimizer
beta1: 0.9
beta2: 0.999
epsilon: 1.0e-08
learning_rate_schedule:
__class_name__: SoftstartAnnealingLearningRateSchedule
annealing: 0.5
base_learning_rate: 0.0005
last_step: 1000000
min_learning_rate: 1.0e-07
soft_start: 0.3
参数 | 数据类型 | 描述 | 默认值 | 支持的值 |
optimizer | optimizer proto 配置 | 此参数定义要用于训练的优化器,以及配置它的参数,即
|
epsilon - NA beta1 - 0.0 - 1.0 beta2 - 0.0 - 1.0 | |
学习率 | 学习率调度器 proto | 此参数配置训练器的学习率调度。目前,FPENet 仅支持 softstart 退火学习率调度,可以使用以下参数进行配置
|
soft_start _annealing _schedule | soft_start - 0.0 - 1.0 annealing - 0.0 - 1.0 minimum_learning_rate - 0.0 - 1.0 maximum_learning_rate - 0.0 - 1.0 |
soft-start 退火学习率调度 - 当学习率绘制为训练进度 (0.0, 1.0) 的函数时,会得到以下曲线。

在上图中,soft start 设置为 0.3,退火设置为 0.7,最小学习率为 5e-6,最大学习率或 base_lr 为 5e-4。
完整示例实验规范文件
__class_name__: FpeNetTrainer
checkpoint_dir: /workspace/tlt-expertiments/fpenet/
checkpoint_n_epoch: 1
dataloader:
__class_name__: FpeNetDataloader
augmentation_info:
augmentation_resize_probability: 0.5
augmentation_resize_scale: 1.6
enable_occlusion_augmentation: true
enable_online_augmentation: true
enable_resize_augmentation: true
gamma_augmentation:
gamma_max: 1.6
gamma_min: 0.6
gamma_probability: 0.1
gamma_type: uniform
modulus_spatial_augmentation:
hflip_probability: 0.25
rotate_rad_max: 0.35
translate_max_x: 10
translate_max_y: 10
zoom_max: 1.2
zoom_min: 0.8
patch_probability: 0.5
size_to_image_ratio: 0.5
mask_augmentation_patch: true
batch_size: 64
dataset_info:
image_extension: png
no_occlusion_masking_sets: s578-usercalibration-incar-0 s578-usercalibration-incar-1
root_path: /workspace/tao-experiments/
test_file_name: data.tfrecords
tfrecord_folder_name: FpeTfRecords
tfrecords_directory_path: /workspace/tao-experiments/models/tfrecords
tfrecords_set_id_train: s578-usercalibration-incar-0
tfrecords_set_id_val: s578-usercalibration-incar-0
tfrecord_file_name: data.tfrecords
use_extra_dataset: false
image_info:
image:
channel: 1
height: 80
width: 80
kpiset_info:
tfrecords_set_id_kpi: s578-usercalibration-incar-1
num_keypoints: 80
enable_visualization: true
hooks: null
infrequent_summary_every_n_steps: 0
log_every_n_secs: 10
loss:
__class_name__: FpeLoss
kpts_coeff: 0.01
loss_type: square_euclidean
mask_occ: true
weights_dict: null
elt_loss_info:
elt_alpha: 0.5
enable_elt_loss: true
modulus_spatial_augmentation:
hflip_probability: 0.0
rotate_rad_max: 0.35
translate_max_x: 10
translate_max_y: 10
zoom_max: 1.2
zoom_min: 0.8
model:
__class_name__: FpeNetBaseModel
model_parameters:
beta: 0.01
dropout_rate: 0.5
freeze_Convlayer: null
pretrained_model_path: /workspace/tao-experiments/pretrained_models/public/model.tlt
regularizer_type: l2
regularizer_weight: 1.0e-05
train_fpe_model: true
type: FpeNet_public
use_less_face_layers: false
use_upsampling_layer: false
visualization_parameters: null
num_epoch: 20
num_keypoints: 80
optimizer:
__class_name__: AdamOptimizer
beta1: 0.9
beta2: 0.999
epsilon: 1.0e-08
learning_rate_schedule:
__class_name__: SoftstartAnnealingLearningRateSchedule
annealing: 0.5
base_learning_rate: 0.0005
last_step: 1000000
min_learning_rate: 1.0e-07
soft_start: 0.3
random_seed: 35
visualize_num_images: 3
用于使用指定参数训练模型的实用工具。
输入:(80, 80, 1)图像
输出:(N, 2)关键点位置。(N, 1)关键点置信度。N 是关键点的数量。
训练工具的示例用法
tao model fpenet train -e <Experiment_Spec_File.yaml> -r <Results Folder> -k <Encode Key>
-e
:实验规范文件路径。-r
:用于保存模型的结果文件夹目录。-k
:用于模型保存/加载的加密密钥。
用于在测试数据上评估训练模型并生成 KPI 信息的实用工具。
该指标是区域关键点像素误差。区域关键点像素误差是像素位置预测与 ground truth 相比的平均欧几里得误差。我们对每个面部区域(眼睛、嘴巴、下巴等)的误差进行分桶和平均。
评估工具的示例用法
tao model fpenet evaluate -m <Results Folder> -k <Encode Key>
-m
:训练模型文件夹的路径。-e
:实验规范文件名(如果与 “experiment_spec.yam” 不同)。-k
:用于模型加载的加密密钥。
用于使用训练模型在示例图像中运行推理的实用工具。该实用工具输入带有 ground truth 人脸 bounding box 信息的图像,并生成每个图像的预测列表。
[
{
"filename": "image1.png",
"annotations": [
{
"face_tight_bboxx": 415.10368330073106,
"face_tight_bboxy": 243.97163120567382,
"tool-version": "1.0",
"face_tight_bboxwidth": 320.35730960707053,
"face_tight_bboxheight": 329.25550579091134,
"class": "FaceBbox"
}
],
"class": "image"
},
{
"filename": "image2.png",
"annotations": [
{
"face_tight_bboxx": 414.44551830055445,
"face_tight_bboxy": 243.935820979011,
"tool-version": "1.0",
"face_tight_bboxwidth": 321.0993074943171,
"face_tight_bboxheight": 340.87266938197325,
"class": "FaceBbox"
}
],
"class": "image"
}
]
推理工具的示例用法
tao model fpenet inference -e <Experiment Spec File> -i <Json File With Images> -m <Trained TAO Model Path> -k <Encode Key> -o <Output Folder> -r <Images Root Directory>
-e
:实验规范文件路径。-i
:带有推理图像路径和人脸 bounding box 信息的 json 文件路径。-m
:要用于推理图像的训练模型路径。模型可以是.tlt
或.engine
格式。-k
:用于模型加载的加密密钥。-o
:用于保存输出图像和预测的目录。-r
:推理 json 中图像路径的父目录(如果有)。
TAO 提供了一个实用工具,用于将训练模型导出为加密的 onnx 格式或 TensorRT 可部署引擎格式。
export
子任务可以选择性地生成 TensorRT INT8 引擎校准的校准缓存。
导出模型将训练过程与部署过程分离,并允许在 TAO 环境之外转换为 TensorRT 引擎。TensorRT 引擎特定于每个硬件配置,应为每个唯一的推理环境生成。这可以互换地称为 .trt
或 .engine
文件。相同的导出 TAO 模型可以通用地用于训练和部署硬件。这称为 .etlt
文件或加密的 TAO 文件。在模型导出期间,TAO 模型使用私钥加密,当您部署此模型进行推理时,需要该私钥。
INT8 模式概述
TensorRT 引擎可以在 INT8 模式下生成,以较低的精度运行,从而提高性能。此过程需要一个缓存文件,其中包含张量的比例因子,以帮助对抗由于低精度算术可能产生的量化误差。当 export
在 --data_type
标志设置为 int8
的情况下运行时,将生成校准缓存。预生成校准信息并缓存它消除了在推理机器上校准模型的需要。移动校准缓存通常比移动校准张量文件更方便,因为它是一个小得多的文件,可以与导出的模型一起移动。使用校准缓存还可以加快引擎创建速度,因为构建缓存可能需要几分钟才能生成,具体取决于张量文件的大小和模型本身。
导出工具可以通过摄取训练数据的采样子集来生成 INT8 校准缓存。您需要创建一个随机图像的子采样目录,以最好地代表您的测试数据集。我们建议至少使用 10-20% 的训练数据。校准期间提供的数据越多,int8 推理就越接近 fp32 推理。示例笔记本中提供了一个辅助脚本,用于从给定的训练数据中选择子集数据。
根据 INT8 模型的评估结果,您可能需要调整采样图像的数量或选择的图像种类,以更好地代表测试数据集。您还可以使用来自测试数据集的一部分数据进行校准,以提高结果。
FP16/FP32 模型
如果您需要在 INT8 精度下运行推理,则 calibration.bin
才是必需的。对于基于 FP16/FP32 的推理,导出步骤要简单得多。所有需要做的就是提供来自 train
步骤的模型到 export
,以将其转换为加密的 TAO 模型。

导出工具的示例用法
tao model fpenet export -m <Trained TAO Model Path> -k <Encode Key> -o <Output file .etlt>
-m
:要导出的训练模型的路径-k
:用于模型加载的加密密钥-o
:输出.etlt
文件的路径(否则.etlt
将附加到模型路径)-t
:onnx 转换的目标 opset 值。默认值为 10--cal_data_file
:校准数据文件 (.tensorfile
) 的路径--cal_image_dir
校准图像样本目录的路径--cal_cache_file
校准文件 (.bin) 的路径--data_type
:TensorRT 导出的数据类型。选项为fp32
和int8
。--batches
:每个批次的图像数量。默认值为 1。--max_batch_size
:TensorRT 引擎构建器的最大批次大小。默认值为 1。--max_workspace_size
:要为 TensorRT 引擎构建器设置的最大工作区大小--batch_size
:要校准的批次数量。默认值为 1。--engine_file
:导出 TRT 引擎的路径。如果指定,则生成引擎文件。--input_dims
:输入维度,格式为通道优先 (CHW) 或通道最后 (HWC),以逗号分隔的整数值表示。默认值为 1,80,80。--backend
:要导出到的模型类型。
INT8 导出模式必需参数
--cal_image_dir
:预处理并用于校准的图像目录。--cal_data_file
:使用cal_image_dir
中的图像生成的张量文件,用于校准引擎。如果此文件已存在,则直接使用它来校准引擎。INT8 张量文件是一个二进制文件,其中包含预处理的训练样本。
--cal_image_dir
参数应用必要的预处理,以在 --cal_data_file
参数中提到的路径生成张量文件,该张量文件反过来用于校准。张量文件中生成的批次数量从设置为 --batches
参数的值获得,batch_size
从设置为 --batch_size
参数的值获得。确保在 --cal_image_dir
中提到的目录中至少有 batch_size * batches
张图像。有效图像扩展名为 .jpg
、.jpeg
和 .png
。
INT8 导出可选参数
--cal_cache_file
:用于保存校准缓存文件的路径。默认值为./cal.bin
。如果此文件已存在,则跳过校准步骤。--batches
:用于校准和推理测试的批次数量。默认值为 10。--batch_size
:用于校准的批次大小。默认值为 1。--max_batch_size
:TensorRT 引擎的最大批次大小。默认值为 1。--max_workspace_size
:TensorRT 引擎的最大工作区大小。默认值为2 * (1 << 30)
。--experiment_spec
:用于训练的 experiment_spec。此参数用于获取预处理用于校准的数据的参数。--engine_file
:序列化的 TensorRT 引擎文件的路径。请注意,此文件特定于硬件,并且不能在 GPU 之间通用。使用此参数可在主机上使用 TensorRT 快速测试模型的准确性。由于 TensorRT 引擎文件特定于硬件,因此除非部署 GPU 与训练 GPU 相同,否则您无法将此引擎文件用于部署。
有关使用 trtexec
命令生成 TensorRT 引擎的说明,请参阅 面部 Landmark 估计的 trtexec 指南。
部署到 DeepStream
通过 NGC 提供的 FPENet 预训练模型在 DeepStream 6.0 中默认可用。
有关更多详细信息,请参阅 FPENet 的 DeepStream TAO 集成。