TAO v5.5.0

面部 Landmark 估计

面部 landmark 估计器网络旨在预测给定输入人脸图像的 landmark(关键点)的 (x,y) 位置。FPENet(Fiducial Points Estimator Network,特征点估计器网络)通常与人脸检测器结合使用,其输出通常用于人脸对齐、头部姿态估计、情感检测、眨眼检测、注视估计等。除了面部 landmark,关键点估计器还可用于预测通用应用程序的关键点。

FPENet 应用程序要求数据采用特定的 json 格式,以便转换为 TFRecords。为此,该工具需要一个配置文件作为输入。配置文件详细信息和示例用法包含在以下章节中。

ground truth 数据集是通过人工标注员标注 ground-truth 面部关键点创建的。如果您希望使用自己的数据集重新训练,请遵循以下指南。

  • 按照正确的顺序尽可能准确地标注关键点。人工标注员应能够放大面部区域以正确定位关键点。

  • 对于不易区分的关键点(如下巴或鼻子),应由人工标注员做出最佳估计。有些关键点很容易区分,例如嘴角或眼角。

  • 如果关键点由于外部物体或极端头部姿态角度而不可见,则将关键点标注为“遮挡”。当关键点在图像中但不可见时,则认为该关键点被遮挡。

  • 为了减少多个人工标注员之间标注的差异,应在所有标注员之间使用相同的关键点顺序和说明。可以使用独立的标注员来测试标注 landmark 的质量和潜在的更正。

可以使用 SlothLabel 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 训练/评估的批次大小

dataset_info

数据集 proto 配置

有关输入数据集的信息

* image_extension (string):图像扩展名。目前,FPENet 仅支持 .png 扩展名。
* no_occlusion_masking_sets (string):不应使用遮挡屏蔽的数据集的空格分隔名称。
* root_path (string):要附加到图像路径的根路径
* tfrecord_folder_name (string):每个数据集内 tfrecords 的文件夹名称
* tfrecords_directory_path (string):每个数据集的 tfrecords 路径
* tfrecords_set_id_train (string):用于训练的数据集的空格分隔名称
* tfrecords_set_id_val (string):用于验证的数据集的空格分隔名称
* tfrecord_file_name (string):tfrecord 文件的文件名

image_info

image_info proto 配置

有关输入图像的信息

* channel (int):通道数。选项包括 1(灰度图像)和 3(RGB 图像)。
* height (int):图像高度(像素)
* width (int):图像宽度(像素)

kpiset_info

kpiset_info proto 配置

用于 KPI 评估的信息

* tfrecords_set_id_kpi (string):数据集的空格分隔名称

num_keypoints int 关键点的数量

augmentation_info

augmentation proto 配置

有关增强配置的信息

* enable_resize_augmentation (boolean):启用调整大小增强的标志
* augmentation_resize_probability (float):应用图像调整大小增强的概率
* augmentation_resize_scale (float):调整大小增强时,图像调整大小的最大比例。放大后,图像将缩小到原始图像大小。
* enable_occlusion_augmentation (boolean):启用遮挡增强的标志
* enable_online_augmentation (boolean):启用增强的标志。如果此值为 False,则所有增强都将关闭。
* gamma_augmentation:Gamma 增强参数。

* gamma_max (float):Gamma 均匀分布的最大值
* gamma_min (float):Gamma 均匀分布的最小值
* gamma_probability (float):发生 Gamma 校正的概率
* gamma_type (string):Gamma 的随机采样类型 [‘normal’, ‘uniform’]

* modulus_spatial_augmentation

* hflip_probability (float):水平翻转的概率。当将 FPENet 用于通用应用程序时,应将其设置为 0.0。
* rotate_rad_max (float):最大旋转弧度
* translate_max_x (int):x 方向的最大像素平移
* translate_max_y (int):y 方向的最大像素平移
* zoom_max (float):最大缩放比率
* zoom_min (float):最小缩放比率

* patch_probability (float):添加遮挡增强的概率
* size_to_image_ratio (float):遮挡的最大比例
* mask_augmentation_patch (boolean):启用遮挡 patch 的关键点屏蔽的标志

优化器配置

提供优化器相关参数的配置部分。可以在配置文件的优化器部分下配置优化器。

下面显示了一个示例优化器配置。

复制
已复制!
            

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 (float):一个非常小的数字,用于防止实现中出现任何被零除的情况
  • beta1 (float)
  • beta2 (float)
epsilon - NA beta1 - 0.0 - 1.0 beta2 - 0.0 - 1.0
学习率 学习率调度器 proto 此参数配置训练器的学习率调度。目前,FPENet 仅支持 softstart 退火学习率调度,可以使用以下参数进行配置
  • soft_start (float):定义将学习率从最小学习率提升到最大学习率的时间
  • annealing (float):定义将学习率从最大学习率冷却到最小学习率的时间
  • minimum_learning_rate(float):学习率调度中的最小学习率。
  • maximum_learning_rate(float):学习率调度中的最大学习率。
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) 的函数时,会得到以下曲线。

learning_rate.png

在上图中,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 模型。

fp16_fp32_export.png

导出工具的示例用法

复制
已复制!
            

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 导出的数据类型。选项为 fp32int8

  • --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 集成

上一篇 面部 Landmark 估计
下一篇 注视估计
© 版权所有 2024,NVIDIA。 上次更新时间:2024 年 10 月 15 日。