人体姿态估计
BodyPoseNet 是 NVIDIA 开发的多人人体姿态估计网络,包含在 TAO 中。它的目标是预测给定输入图像中每个人的骨骼,骨骼由关键点以及它们之间的连接组成。BodyPoseNet 遵循单次、自下而上的方法,因此无需人员检测器。姿态/骨骼输出通常用作活动/手势识别、跌倒检测和姿势分析等应用程序的输入。
BodyPoseNet 支持以下子任务
dataset_convert(数据集转换)
train(训练)
evaluate(评估)
inference(推理)
prune(剪枝)
export(导出)
这些任务可以使用以下命令行约定从 TAO Launcher(TAO 启动器)调用
tao model bpnet <sub_task> <args_per_subtask>
其中 args_per_subtask
是给定子任务所需的命令行参数。以下详细解释了每个子任务。
TAO 中的 BodyPoseNet 应用程序期望训练和评估的数据采用 COCO 格式。
有关 COCO 数据格式的更多信息,请参阅数据注释格式页面。
Sloth 和 Label Studio 工具可用于标注。
BodyPoseNet 应用程序需要将特定 JSON 格式的数据使用 dataset_convert 工具转换为 TFRecords 格式,该工具需要一个配置文件作为输入。以下各节包含配置文件的详细信息和示例用法。
dataset_convert
工具接收定义的 JSON 数据格式,并将其转换为 BpNet 模型摄取的 TFRecords 格式。有关示例用法,请参阅以下各节。
为数据集转换器创建配置文件
dataset_convert 工具提供多个可配置参数。这些参数封装在 spec 文件中,该文件定义了将数据从 COCO 格式转换为 BodyPoseNet 训练器可以摄取的 TFRecords 格式所需的数据集结构。运行 BpNet 的任何 dataset_convert、train、evaluate 或 inference 命令都需要此 spec 文件。
下面显示了一个示例数据集配置文件。
{
"dataset": "coco",
"root_directory_path": "/workspace/tao-experiments/bpnet/data",
"train_data": {
"images_root_dir_path": "train2017",
"mask_root_dir_path": "train_mask2017",
"annotation_root_dir_path": "annotations/person_keypoints_train2017.json"
},
"test_data": {
"images_root_dir_path": "val2017",
"mask_root_dir_path": "val_mask2017",
"annotation_root_dir_path": "annotations/person_keypoints_val2017.json"
},
"duplicate_data_with_each_person_as_center": true,
"categories": [
{
"supercategory": "person",
"id": 1,
"name": "person",
"num_joints": 17,
"keypoints": [
"nose","left_eye","right_eye","left_ear","right_ear",
"left_shoulder","right_shoulder","left_elbow","right_elbow",
"left_wrist","right_wrist","left_hip","right_hip",
"left_knee","right_knee","left_ankle","right_ankle"
],
"skeleton": [
[16,14],[14,12],[17,15],[15,13],[12,13],[6,12],[7,13],[6,7],
[6,8],[7,9],[8,10],[9,11],[2,3],[1,2],[1,3],[2,4],[3,5],[4,6],[5,7]
],
"skeleton_edge_names": [
["left_ankle", "left_knee"], ["left_knee", "left_hip"], ["right_ankle", "right_knee"],
["right_knee", "right_hip"], ["left_hip", "right_hip"], ["left_shoulder", "left_hip"],
["right_shoulder", "right_hip"], ["left_shoulder", "right_shoulder"], ["left_shoulder", "left_elbow"],
["right_shoulder", "right_elbow"], ["left_elbow", "left_wrist"], ["right_elbow", "right_wrist"],
["left_eye","right_eye"], ["nose","left_eye"], ["nose","right_eye"],
["left_eye","left_ear"], ["right_eye","right_ear"], ["left_ear", "left_shoulder"],
["right_ear", "right_shoulder"]
]
}
],
"visibility_flags": {
"value": {
"visible": 2,
"occluded": 1,
"not_labeled": 0
},
"mapping": {
"visible": "visible",
"occluded": "occluded",
"not_labeled": "not_labeled"
}
},
"data_filtering_params": {
"min_acceptable_height": 32,
"min_acceptable_width": 32,
"min_acceptable_kpts": 5,
"min_acceptable_interperson_dist_ratio": 0.3
}
}
参数 |
数据类型 |
描述 |
默认值 |
---|---|---|---|
dataset(数据集) |
string(字符串) | 数据集的名称(在其他地方也需要用到) | coco |
root_directory_path(根目录路径) |
string(字符串) | 根目录的路径,数据路径相对于该路径存储 | – |
images_root_dir_path(图像根目录路径) |
string(字符串) | 图像目录相对于root_directory_path的路径 | – |
mask_root_dir_path(掩码根目录路径) |
string(字符串) | 目录相对于root_directory_path的路径,掩码将保存在该目录中 | – |
annotation_root_dir_path(注释根目录路径) |
string(字符串) | 注释文件相对于root_directory_path的路径 | – |
duplicate_data_with_each_person_as_center(以每个人为中心复制数据) |
boolean(布尔值) | 一个标志,指定是否将每个图像复制 N 次,其中 N 是图像中满足 data_filtering_params 中指定的条件的人数。在数据增强期间,图像以这 N 个人中的每个人为中心。 |
True(真) |
categories(类别) |
dict(字典) | 此配置描述了给定数据集中的关键点约定/格式。它遵循类似于 COCO 类别部分的约定。
|
– |
visibility_flags:value(可见性标志:值) |
dict(字典) | 可见性标志索引对应关系。类别和使用的标志索引可能因数据集而异(例如,visible(可见)、occluded(遮挡)、annotatable(可注释)、truncated(截断)、not_labeled(未标记))。这指示数据集中关键点可见性的标注约定。类别名称可以采用任何值,只要它们映射到 mapping 部分中内部定义的类别即可。 | – |
visibility_flags:mapping(可见性标志:映射) |
dict(字典) | 数据集可见性标志约定到 BodyPoseNet 训练约定的映射。BodyPoseNet 公开三个类别(visible(可见)、occluded(遮挡)和 not_labeled(未标记))。数据集中的所有类别都需要映射到这三个类别;您需要确定这三者中最接近的匹配项,如以下示例所示
在当前的训练管道中,occluded 和 visible 的处理方式相同,而标记为 not_labeled 的关键点将被忽略。如果您希望网络不预测 occluded 关键点,则将 occluded 关键点映射到 not_labeled。 |
– |
data_filtering_params(数据过滤参数) |
dict(字典) | 用于过滤训练数据的参数(此部分仅在启用 duplicate_data_with_each_person_as_center 时适用)。这些参数用于过滤掉图像中将围绕其中心化图像的候选人。
|
– |
spec 文件中的 test_data 字段是必要的。如果您不想使用 test_data,您可以重用 train_data 条目作为虚拟输入,并且无需在 test 模式下运行 dataset_convert 工具。
tao model bpnet dataset_convert -d <path/to/dataset_spec>
-o <path_to_output_tfrecords>
-m <'train'/'test'>
--generate_masks
以下是将 COCO 训练的数据集转换为 TFRecords 的数据集转换器工具的示例用法
tao model bpnet dataset_convert -d /workspace/examples/bpnet/data_pose_config/coco_spec.json
-o /workspace/tao-experiments/bpnet/data/train
-m 'train'
--generate_masks
必需参数
-d, --dataset_spec
:JSON 数据集 spec 的路径,其中包含导出.tfrecords
的配置。-o, --output_filename
:输出文件名。请注意,这将附加-fold-<num>-of-<total>
可选参数
-h, --help
:显示帮助消息。-m, --mode
:这对应于 spec 中的 train_data 和 test_data 字段。默认值为train
。--check_files
:检查文件(包括图像和掩码)是否存在于给定的根数据目录中。--generate_masks
:生成并保存未标记人员区域的掩码。这用于训练。
要执行 BodyPoseNet 的训练,需要配置多个组件,每个组件都有自己的参数。
BodyPoseNet 训练配置的规范文件配置了训练管道的这些组件
Trainer(训练器)
Dataloader(数据加载器)
Augmentation(数据增强)
Label Processor(标签处理器)
Model(模型)
Optimizer(优化器)
Loss(损失)
Trainer(训练器)
以下是配置 BpNet 训练器的参数示例列表。
__class_name__: BpNetTrainer
checkpoint_dir: /workspace/tao-experiments/bpnet/models/exp_m1_unpruned
log_every_n_secs: 30
checkpoint_n_epoch: 5
num_epoch: 100
summary_every_n_steps: 20
infrequent_summary_every_n_steps: 0
validation_every_n_epoch: 5
max_ckpt_to_keep: 100
random_seed: 42
pretrained_weights: null
load_graph: False
finetuning_config:
is_finetune_exp: False
checkpoint_path: null
ckpt_epoch_num: 0
use_stagewise_lr_multipliers: True
dataloader:
...
augmentation_config:
...
label_processor_config:
...
model:
...
optimizer:
...
loss:
...
下表描述了 trainer
参数
参数 |
数据类型 |
描述 |
默认值 |
---|---|---|---|
checkpoint_dir(检查点目录) |
string(字符串) | 用于保存/加载模型检查点的目录 | None(无) |
checkpoint_n_epoch(检查点间隔周期数) |
int(整数) | 保存检查点的频率 | 5 |
log_every_n_secs(日志记录间隔秒数) |
int(整数) | 日志记录频率(以秒为单位) | 30 |
num_epoch(周期总数) |
int(整数) | 要训练的总周期数 | 100 |
summary_every_n_steps(摘要记录间隔步数) |
int(整数) | 在 tf.summary 中记录摘要的频率 | 20 |
max_ckpt_to_keep(最大保留检查点数) |
int(整数) | 要保留的最大检查点数 | 100 |
pretrained_weights(预训练权重) |
string(字符串) | 预训练权重的绝对路径 | None(无) |
load_graph(加载图) |
boolean(布尔值) | 一个标志,用于确定是从预训练模型文件加载图,还是仅加载权重。对于剪枝模型,请将此参数设置为 True。剪枝会修改原始图,因此需要导入剪枝后的模型图和权重。
|
False(假) |
use_stagewise_lr_multipliers(使用分阶段学习率乘数) |
boolean(布尔值) | 如果此参数为 true,则骨干网络 (2x) 和细化阶段 (4x) 将使用不同的学习率乘数。 | False(假) |
finetuning_config(微调配置) |
此参数指定特定模型配置的微调
|
||
model(模型) |
模型配置 | – | |
loss(损失) |
模型损失配置 | – | |
optimizer(优化器) |
优化器配置 | – | |
dataloader(数据加载器) |
数据加载器配置 | – |
BodyPoseNet 管道默认支持从最新的检查点恢复。这不需要使用
finetuning_config
。目前,BodyPoseNet 中不支持验证管道,因此可以忽略
validation_every_n_epoch
和其他与验证相关的参数。
Model(模型)
可以使用 spec 文件中的 model
选项构建/配置 BodyPoseNet 模型。
以下是使用预训练权重实例化 bodyposenet 模型的模型配置示例。
pretrained_weights: /workspace/tao-experiments/bpnet/pretrained_model/tlt_bodyposenet_vtrainable_v1.0/model.tlt
load_graph: False
model:
__class_name__: BpNetLiteModel
backbone_attributes:
architecture: vgg
mtype: default
use_bias: False
stages: 3
heat_channels: 19
paf_channels: 38
use_self_attention: False
data_format: channels_last
use_bias: True
regularization_type: l1
kernel_regularization_factor: 5.0e-4
bias_regularization_factor: 0.0
kernel_initializer: random_normal
下表描述了 trainer
参数
参数 |
数据类型 |
默认值 |
描述 |
支持的值 |
---|---|---|---|---|
__class_name__ |
string(字符串) | BpNetLiteModel | 用于构建模型的类模块 | [BpNetLiteModel] |
backbone_attributes(骨干网络属性) |
dict(字典) | – | 模型的骨干网络属性
|
|
stages(阶段) |
int(整数) | 3 | 网络中姿态估计的总阶段数(细化阶段 + 1) | [2, 6] |
heat_channels(热图通道数) |
int(整数) | 19 | 热图通道数。这相当于目标关键点数(在 pose_config 中定义)+ 1(用于背景) | 19 |
paf_channels(部件亲和力场通道数) |
int(整数) | 38 | 部件亲和力场通道数。这相当于目标骨骼连接数 * 2(在 pose_config 中定义) | 38 |
use_self_attention(使用自注意力机制) |
boolean(布尔值) | False(假) | 指定是否在模型中使用自注意力模块。 | True 或 False |
data_format(数据格式) |
string(字符串) | channels_last | 要使用的数据格式 | channels_last |
use_bias(使用偏置) |
boolean(布尔值) | True(真) | 指定是否在模型的其余部分(骨干网络除外)中使用偏置。 | True 或 False |
regularization_type(正则化类型) |
string(字符串) | l1 | 训练期间使用的正则化器类型 | [l1, l2, l1_l2] |
kernel_regularization_factor(内核正则化因子) |
float(浮点数) | 5.0e-4 | 训练期间用于内核权重的正则化器权重 | – |
bias_regularization_factor(偏置正则化因子) |
float(浮点数) | 0.0 | 训练期间用于偏置权重的正则化器权重 | – |
kernel_initializer(内核初始化器) |
string(字符串) | random_normal | 用于初始化内核权重的内核初始化器类型 | random_normal |
我们建议在剪枝前训练网络时使用 L1 正则化器,因为 L1 正则化使剪枝网络权重更容易。剪枝后,当重新训练网络时,我们建议通过将 kernel_regularization_factor
设置为 0.0 来关闭正则化。
Loss(损失)
本节介绍如何配置成本函数以选择损失类型。
loss:
__class_name__: BpNetLoss
下表描述了用于配置 loss
的参数
参数 |
数据类型 |
默认值 |
描述 |
支持的值 |
---|---|---|---|---|
__class_name__ |
string(字符串) | BpNetLoss | 用于构建成本函数的类模块 | BpNetLoss |
Optimizer(优化器)
本节介绍如何配置优化器和学习率计划
optimizer:
__class_name__: WeightedMomentumOptimizer
learning_rate_schedule:
__class_name__: SoftstartAnnealingLearningRateSchedule
soft_start: 0.05
annealing: 0.5
base_learning_rate: 2.e-5
min_learning_rate: 8.e-08
last_step: null
grad_weights_dict: null
weight_default_value: 1.0
momentum: 0.9
use_nesterov: False
下表描述了用于配置 optimizer
的参数
参数 |
数据类型 |
默认值 |
描述 |
---|---|---|---|
__class_name__ |
string(字符串) | WeightedMomentumOptimizer | 用于构建优化器的类模块。 |
learning_rate_schedule(学习率计划) |
learning_rate_schedule 配置 | soft start annealing schedule(软启动退火计划) | 配置训练器的学习率计划。可以使用以下参数进行配置
|
grad_weights_dict(梯度权重字典) |
dict(字典) | None(无) | 用于梯度更新的逐层学习率乘数。需要从层名称到学习率乘数的映射。 |
weight_default_value(权重默认值) |
float(浮点数) | 1.0 | 要使用的默认学习率乘数 |
momentum(动量) |
float(浮点数) | 0.9 | 动量因子。当动量设置为 0 时,该方法将回退到梯度下降优化器。 |
use_nesterov(使用 Nesterov 动量) |
boolean(布尔值) | False(假) | 指定是否使用 Nesterov 动量。 |
BodyPoseNet 当前支持 soft_start 退火学习率计划。当学习率绘制为训练进度 (0.0, 1.0) 的函数时,结果曲线如下

在此实验中,soft_start 设置为 0.05,退火设置为 0.5,最小学习率为 8e-8,最大学习率或 base_learning_rate 为 2e-5。
默认 base_learning_rate
是为单 GPU 训练设置的。如果您想使用多 GPU 训练,您可能需要修改 learning_rate
以获得与 1 GPU 训练相似的准确率。在大多数情况下,将学习率按 $NUM_GPUS 的因子放大将是一个好的开始。例如,如果您使用 2 个 GPU,请使用 1 GPU 设置中使用的 2 * base_learning_rate
,如果您使用 4 个 GPU,请使用 1 GPU 设置中使用的 4 * base_learning_rate
。
Dataloader(数据加载器)
本节帮助您配置数据加载器,如下所示
定义您要训练的数据路径
图像配置
要使用的目标姿态配置
归一化配置
数据增强配置,这将在下一节中展开
标签处理器或真值生成器配置,这将在下一节中展开
dataloader:
__class_name__: BpNetDataloader
batch_size: 10
shuffle_buffer_size: 20000
image_config:
image_dims:
height: 256
width: 256
channels: 3
image_encoding: jpg
pose_config:
__class_name__: BpNetPoseConfig
target_shape: [32, 32]
pose_config_path: /workspace/examples/bpnet/model_pose_config/bpnet_18joints.json
dataset_config:
root_data_path: /workspace/tao-experiments/bpnet/data/
train_records_folder_path: /workspace/tao-experiments/bpnet/data
train_records_path: [train-fold-000-of-001]
val_records_folder_path: /workspace/tao-experiments/bpnet/data
val_records_path: [val-fold-000-of-001]
dataset_specs:
coco: /workspace/examples/bpnet/data_pose_config/coco_spec.json
normalization_params:
image_scale: [256.0, 256.0, 256.0]
image_offset: [0.5, 0.5, 0.5]
mask_scale: [255.0]
mask_offset: [0.0]
augmentation_config:
...
label_processor_config:
...
下表描述了 dataloader
参数
参数 |
数据类型 |
描述 |
默认值 |
---|---|---|---|
__class_name__ |
string(字符串) | 用于构建数据加载器的类模块 | BpNetDataloader |
batch_size(批次大小) |
int(整数) | 训练/评估的批次大小 | 10 |
shuffle_buffer_size(洗牌缓冲区大小) |
int(整数) | 用于洗牌和重复数据集的缓冲区大小 | 20000 |
image_config(图像配置) |
dict(字典) | 输入图像配置
|
|
pose_config(姿态配置) |
dict(字典) | 要使用的姿态配置
|
|
dataset_config(数据集配置) |
dict(字典) | 数据集和 tfrecord 路径配置。
|
– |
normalization_params(归一化参数) |
dict(字典) | 用于训练的数据中心化和归一化参数。操作如下:(data / scale) - offset。
|
|
augmentation_config(数据增强配置) |
数据增强配置 | – | |
label_processor_config(标签处理器配置) |
标签处理器或真值生成器配置 | – |
target_shape
取决于输入形状。这可以根据模型步幅计算。在默认设置中,模型步幅为 8。dataset_spec 中的掩码和图像数据目录相对于此
root_data_path
。此处
dataset
应对应于相应 dataset_spec 中的dataset
字段。目前,BodyPoseNet 仅支持
pose_config_path
中给定的默认骨骼配置。推理管道目前不支持自定义骨骼配置。
数据增强模块
数据增强模块提供一些基本的即时数据增强选项。以下是 augmentation_config
元素的示例
augmentation_config:
__class_name__: AugmentationConfig
spatial_augmentation_mode: person_centric
spatial_aug_params:
flip_lr_prob: 0.5
flip_tb_prob: 0.0
rotate_deg_max: 40.0
rotate_deg_min: -40.0
zoom_prob: 0.0
zoom_ratio_min: 1.0
zoom_ratio_max: 1.0
translate_max_x: 40.0
translate_min_x: -40.0
translate_max_y: 40.0
translate_min_y: -40.0
use_translate_ratio: False
translate_ratio_max: 0.2
translate_ratio_min: -0.2
target_person_scale: 0.6
identity_spatial_aug_params: null
参数 |
数据类型 |
描述 |
默认值 |
---|---|---|---|
__class_name__ |
string(字符串) | 有关数据增强配置的信息 | – |
spatial_augmentation_mode(空间数据增强模式) |
string(字符串) | 应用于图像的数据增强模式。有三种模式可用
|
person_centric |
spatial_aug_params(空间数据增强参数) |
dict(字典) | 用于随机空间变换的数据增强参数 | – |
identity_spatial_aug_params(恒等空间数据增强参数) |
dict(字典) | 用于固定空间变换的数据增强参数。目前,BodyPoseNet 管道不支持此功能。 | None(无) |
当为此模式编译训练数据时,每个图像和真值都会复制 N 次,其中第一个注释每次都不同。这确保了数据增强以这 N 个人中的每个人为中心。此处,N 是图像中满足某些尺寸标准的人数 (data_filtering_params)。此模式与 dataset_spec 中启用的 duplicate_data_with_each_person_as_center
结合使用。这确保了每个选定的人在复制的数据中都是一次感兴趣的人。
spatial_aug_params
:此模块支持基本的空间数据增强,例如翻转、缩放、旋转和平移,这些都可以配置。
参数 |
数据类型 |
描述 |
默认值 |
---|---|---|---|
flip_lr_prob(左右翻转概率) |
float(浮点数) | 水平翻转输入图像的概率 | 0.5 |
flip_tb_prob(上下翻转概率) |
float(浮点数) | 垂直翻转输入图像的概率 | 0.0 |
rotate_deg_max(最大旋转角度) |
float(浮点数) | 应用于图像和训练标签的最大旋转角度(以度为单位) | 40 |
rotate_deg_min(最小旋转角度) |
float(浮点数) | 应用于图像和训练标签的最小旋转角度(以度为单位) | -40 |
zoom_prob(缩放概率) |
float(浮点数) | 应用缩放变换的概率 | 0.0 |
zoom_ratio_min(最小缩放比例) |
float(浮点数) | 图像的最小放大比例 | 1.0 |
zoom_ratio_max(最大缩放比例) |
float(浮点数) | 图像的最大放大比例 | 1.0 |
translate_max_x(最大 x 轴平移) |
float(浮点数) | 沿 x 轴 应用于图像和训练标签的最大平移量 | 40 |
translate_min_x(最小 x 轴平移) |
float(浮点数) | 沿 x 轴 应用于图像和训练标签的最小平移量 | -40 |
translate_max_y(最大 y 轴平移) |
float(浮点数) | 沿 y 轴 应用于图像和训练标签的最大平移量 | 40 |
translate_min_y(最小 y 轴平移) |
float(浮点数) | 沿 y 轴 应用于图像和训练标签的最小平移量 | -40 |
use_translate_ratio(使用平移比率) |
boolean(布尔值) | 指定是使用平移比率还是绝对平移值 | False(假) |
translate_ratio_max(最大平移比率) |
float(浮点数) | 沿 x 轴 或 y 轴 应用于图像和训练标签的最大平移比率(相对于图像尺寸) | 0.2 |
translate_ratio_min(最小平移比率) |
float(浮点数) | 沿 x 轴 或 y 轴 应用于图像和训练标签的最小平移比率(相对于图像尺寸) | -0.2 |
target_person_scale(目标人物比例) |
float(浮点数) | 图像被缩放,使得图像中感兴趣的人物的比例相对于图像高度调整为 target_person_scale。这在使用 person_centric 数据增强模式时适用。 |
0.6 |
缩放比率为 1.0 不会影响图像,而高于 1 的值将导致“缩小”(图像变得比画布小),而低于 1.0 的值则相反。
如果
rotate_deg_min
为 null,则旋转范围定义在 [ -rotate_rad_max, rotate_rad_max ] 之间。
标签处理器模块
标签处理器模块提供更改真值特征图生成所需的参数。以下是 label_processor_config
元素的示例
label_processor_config:
paf_gaussian_sigma: 0.03
heatmap_gaussian_sigma: 7.0
paf_ortho_dist_thresh: 1.0
参数 |
数据类型 |
描述 |
默认值 |
---|---|---|---|
paf_gaussian_sigma(PAF 高斯西格玛) |
float(浮点数) | 用于向量场高斯加权的 sigma 值 | 0.03 |
heatmap_gaussian_sigma(热图高斯西格玛) |
float(浮点数) | 用于热图高斯加权的 sigma 值 | 7.0 |
paf_ortho_dist_thresh(PAF 正交距离阈值) |
float(浮点数) | 部件亲和力场的正交距离阈值。请注意,这将乘以步幅。 | 1.0 |
按照生成 TFRecords 和掩码中的步骤创建 TAO 训练可摄取的 TFRecords,并设置 train_spec 后,您现在可以开始训练人体姿态估计网络。
以下命令概述了 BodyPoseNet 训练命令
tao model bpnet train -e <path/to/train_spec>
-r <path/to/result directory>
-k <key>
--gpus <num_gpus>
必需参数
-e, --experiment_spec_file
:train_spec 文件的路径。该路径可以是绝对路径,也可以是相对于工作目录的路径。-r, --results_dir
:文件夹的路径,实验输出(包括检查点、日志等)应写入到该文件夹。-k, –key
:用户特定的编码密钥,用于保存或加载.tlt
模型。
可选参数
-h, --help
:打印帮助消息。-l, --log_level
:设置日志记录级别。--gpus
:用于训练的 GPU 数量和启动的进程数。默认值为 1。--gpu_index
:用于训练的 GPU 索引。GPU 的引用方式与./deviceQuery
CUDA 示例中提到的索引相同。
BodyPoseNet 支持从中间检查点恢复训练。当先前运行的训练实验过早停止时,您可以通过简单地使用与之前相同的命令行参数重新运行 BodyPoseNet 训练命令,从最后一个检查点重新开始训练。BodyPoseNet 的训练器会在结果目录中找到最后保存的检查点,并从那里恢复训练。检查点保存的间隔由 train_spec
中的 checkpoint_interval 参数定义。
要对 BodyPoseNet 执行评估和推理,您需要在推理规范文件中配置多个组件,每个组件都有自己的参数。
以下是配置 BpNet 推理规范以进行评估和推理的参数示例列表。
model_path: /workspace/tao-experiments/bpnet/models/exp_m1_unpruned/bpnet_model.tlt
train_spec: /workspace/examples/bpnet/specs/bpnet_train_m1_coco.yaml
input_shape: [368, 368]
# choose from: {pad_image_input, adjust_network_input, None}
keep_aspect_ratio_mode: adjust_network_input
output_stage_to_use: null
output_upsampling_factor: [8, 8]
heatmap_threshold: 0.1
paf_threshold: 0.05
multi_scale_inference: False
scales: [0.5, 1.0, 1.5, 2.0]
参数 |
数据类型 |
描述 |
默认值 |
---|---|---|---|
model_path(模型路径) |
string(字符串) | 用于保存/加载模型检查点的模型目录的路径 | – |
train_spec(训练规范) |
string(字符串) | 用于训练要评估的模型的 train_spec 文件的路径 | – |
input_shape(输入形状) |
list(列表) | 推理的网络输入的高度和宽度(按此顺序)(可以与训练输入形状不同) | [368, 368] |
keep_aspect_ratio_mode(保持纵横比模式) |
string(字符串) | 纵横比模式。可用模式如下所述
|
adjust_network_input |
output_stage_to_use(要使用的输出阶段) |
int(整数) | 要使用的输出细化阶段。可能存在多个输出细化阶段,如 train_spec 中指定。如果为 null,则使用最终输出阶段。这通常也具有最佳准确率。 | null |
output_upsampling_factor(输出上采样因子) |
list(列表) | 后处理之前特征图(热图和部件亲和力图)的输出上采样因子。 | [8, 8] |
heatmap_threshold(热图阈值) |
float(浮点数) | 用于关键点非极大值抑制的热图阈值。 | 0.1 |
paf_threshold(PAF 阈值) |
float(浮点数) | 用于抑制连接的部件亲和力分数阈值。 | 0.05 |
multi_scale_inference(多尺度推理) |
boolean(布尔值) | 切换多尺度细化。如果启用,则在提供的 scales(尺度) 上推断图像,并对输出特征图进行平均。 | False(假) |
scales(尺度) |
list(列表) | 用于多尺度细化的尺度。 | [0.5, 1.0, 1.5, 2.0] |
BpNet 的 inference
任务可用于可视化姿态预测。下面显示了此任务的命令示例
tao model bpnet inference --inference_spec <path/to/inference_spec>
--model_filename <path/to/model_filename>
--input_type <image/dir/json>
--input <path/to/input>
--results_dir <results directory>
--dump_visualizations
-k $KEY
tao model bpnet inference --inference_spec $SPECS_DIR/infer_spec.yaml \
--model_filename $USER_EXPERIMENT_DIR/models/exp_m1_unpruned/$MODEL_CHECKPOINT \
--input_type json \
--input $USER_EXPERIMENT_DIR/data/viz_example_data.json \
--results_dir $USER_EXPERIMENT_DIR/results/exp_m1_unpruned/infer_default \
--dump_visualizations \
-k $KEY
必需参数
-i, --inference_spec
:推理规范文件的路径-k, --key
:用于加载模型的密钥。对于加密的.tlt
模型,这是必需参数,但对于 TRT .engine 是可选的。--results_dir
:文件夹的路径,实验输出应写入到该文件夹--input_type
:输入类型,可以是image
、dir
或json
--input
:要运行推理的输入的绝对路径或相对路径
可选参数
-h, --help
:打印帮助消息。-l, --log_level
:设置日志记录级别。-m, --model_filename
:用于推理的模型文件的路径。指定后,此路径将覆盖推理规范文件中的model_path
。--image_root_path
:图像的根目录路径。如果指定,则假定图像路径是相对于此路径的。如果input_type
为 json,则此项相关。--dump_visualizations
:如果启用,则将带有推理可视化的图像保存到 results/images_annotated 目录。
推理工具生成两个输出
逐帧关键点标签,位于
<results_dir>/detection.json
中。带有渲染的关键点结果的图像,保存在
<results_dir>/images_annotated
中(当--dump_visualizations
启用时)
由于 BodyPoseNet 是全卷积神经网络,因此可以在与训练分辨率不同的推理分辨率下推断模型。如果网络输入尺寸与训练分辨率不同,则会覆盖网络输入尺寸以在此分辨率下运行推理。当在与训练 非常不同 的分辨率下运行推理时,准确率可能会有所下降。
在 BodyPoseNet 模型上执行 evaluate
。
请注意,您必须首先按照预处理数据集部分中列出的步骤为该测试集创建 TFRecords。
tao model bpnet evaluate [-h] -i <inference_spec>
-d <dataset_spec>
-m <model_file>
-r <results directory>
-k <key>
必需参数
-i, --inference_spec
:用于设置评估实验的推理规范文件。-k, --key
:用于加载模型的密钥。对于加密的 .tlt 模型,这是必需参数,但对于 TRT .engine 是可选的。-d, --dataset_spec
:要对其运行评估的 datset_spec 的路径。模型在 dataset_spec 中指定的 test_data 上进行评估。-r, --results_dir
:文件夹的路径,实验输出应写入到该文件夹。
可选参数
-h, --help
:打印帮助消息。-l, --log_level
:设置日志记录级别。-m, --model_filename
:用于评估的模型文件的路径。指定后,此路径将覆盖推理规范文件中的model_path
。
剪枝从模型中删除参数,以减小模型大小,同时使用 prune
命令而不损害模型的完整性。
prune
任务包括以下参数
tao model bpnet prune -m <pretrained_model>
-o <output_file>
-k <key>
[-n <normalizer>]
[-eq <equalization_criterion>]
[-pg <pruning_granularity>]
[-pth <pruning threshold>]
[-nf <min_num_filters>]
[-el [<excluded_list>]
必需参数
-m, --model
:用于剪枝的预训练模型的路径-o, --output_file
:输出剪枝模型的路径-k, --key
:用于加载 .tlt 模型的密钥
可选参数
-h, --help
:打印帮助消息。-n, –normalizer
:指定max
以通过将每个范数除以层内的最大范数来进行归一化;指定L2
以通过除以包含所有内核范数的向量的 L2 范数来进行归一化。默认值为max
。-eq, --equalization_criterion
:均衡元素级操作层或深度方向卷积层的输入的统计信息的标准。此参数对于 resnet 和 mobilenet 非常有用。选项包括arithmetic_mean
、geometric_mean
、union
和intersection
(默认值:union
)。-pg, -pruning_granularity
:一次删除的过滤器数量(默认值:8)-pth
:用于比较归一化范数的阈值(默认值:0.1)-nf, --min_num_filters
: 每层要保留的最小滤波器数量 (默认值: 16)-el, --excluded_layers
: 排除图层的列表 (例如-i item1 item2
) (默认值: [])
剪枝后,模型需要重新训练。 有关更多详细信息,请参阅重新训练剪枝模型。
使用剪枝命令
以下是使用 prune
任务的示例
tao model bpnet prune -m /workspace/tao-experiments/bpnet/models/exp_m1_unpruned/bpnet_model.tlt
-o /workspace/tao-experiments/bpnet/models/exp_m1_pruned/bpnet_model.pruned-0.2.tlt
-eq union
-pth 0.2
-k $KEY
模型剪枝后,精度可能会略有下降,因为一些以前有用的权重可能已被移除。 为了恢复精度,我们建议使用 train
任务,在相同的数据集上重新训练此剪枝模型,如训练模型部分中所述,并使用更新的 spec 文件,将新剪枝的模型指定为预训练模型文件。 所有其他参数可以从之前的训练中保留在 spec 文件中。
要加载剪枝模型,请在 train_spec
中将 load_graph
标志设置为 true
。
默认情况下,当 load_graph
设置为 true 时,正则化将被禁用。
TAO 中的 BodyPoseNet 模型应用程序包含一个 export
子任务,用于导出和准备经过训练的 BodyPoseNet 模型,以进行验证和部署。export
子任务可以选择性地生成 TensorRT INT8 引擎校准的校准缓存。
导出模型将训练过程与部署分离,并允许在 TAO 环境之外转换为 TensorRT 引擎。 TensorRT 引擎特定于每个硬件配置,应为每个唯一的推理环境生成。 这可以互换地称为 .trt
或 .engine
文件。 同一个导出的 TAO 模型可以在训练和部署硬件之间通用。 这称为 .etlt
文件或加密的 TAO 文件。 在模型导出期间,TAO 模型使用私钥加密,当您部署此模型进行推理时,需要该私钥。
选择部署的网络输入分辨率
模型的网络输入分辨率是决定自下而上方法精度的主要因素之一。 自下而上的方法必须一次性输入整个图像,从而导致每个人物的分辨率较小。 因此,更高的输入分辨率将产生更好的精度,尤其是在小规模和中等规模的人物(相对于图像比例)上。 另请注意,随着输入分辨率的提高,CNN 的运行时也会更高。 因此,应根据目标用例的精度和运行时要求来决定精度/运行时的权衡。
所需网络的高度
您需要根据目标用例以及计算或延迟约束选择最适合的分辨率。 如果您的应用涉及为一个或多个人物进行姿势估计,并且这些人靠近相机,以至于人物的比例相对较大,那么您可以选择较小的网络输入分辨率。 然而,如果您的目标是用在人物相对比例较小的情况下,例如拥挤的场景,您可能需要选择更高的网络输入分辨率。 例如,如果您的应用程序中人物的高度约为图像的 25%,则最终调整大小的高度将如下所示
网络高度为 224 时为 56 像素
网络高度为 288 时为 72 像素
网络高度为 320 时为 80 像素
高度为 320 的网络具有最大的人物分辨率,因此会更准确。
所需网络的宽度
一旦您确定了网络的高度,就可以根据部署时使用的输入数据的宽高比来决定宽度。 或者您也可以遵循最接近宽高比的标准 32/64 倍数。
不同分辨率的精度/运行时变化图示
请注意,这些是默认架构和 train_spec 的近似运行时/精度。 对架构或参数的任何更改都会产生不同的结果。 这主要是为了更好地了解哪种分辨率适合您的需求。 提供的运行时是针对 CNN 的
输入分辨率 |
精度 |
运行时 (GeForce RTX 2080) |
运行时 (Jetson AGX) |
---|---|---|---|
320x448 | FP16 | 3.13 毫秒 | 18.8 毫秒 |
288x384 | FP16 | 2.58 毫秒 | 12.8 毫秒 |
224x320 | FP16 | 2.27 毫秒 | 10.1 毫秒 |
320x448 | INT8 | 1.80 毫秒 | 8.90 毫秒 |
288x384 | INT8 | 1.56 毫秒 | 6.38 毫秒 |
224x320 | INT8 | 1.33 毫秒 | 5.07 毫秒 |
当从 224x320 变为 288x384 时,您可以期望看到 area=medium 类别的 mAP 增加 7-10%,而当您变为 320x448 时,mAP 会额外增加 7-10%。 area=large 的精度在这些分辨率下几乎保持不变,因此如果这是您需要的,您可以坚持使用较低的分辨率。 按照 COCO 关键点评估,中等区域定义为人物占据的面积小于 36^2 到 96^2 之间的面积。 高于此面积的任何内容都归类为大型。
高度和宽度应为 8 的倍数。 最好是 16/32/64 的倍数
INT8 模式概述
TensorRT 引擎可以在 INT8 模式下生成,以较低的精度运行,从而提高性能。 此过程需要一个缓存文件,其中包含张量的比例因子,以帮助对抗由于低精度算术可能引起的量化误差。 当 export
与设置为 int8
的 --data_type
标志一起运行时,将使用校准张量文件生成校准缓存。 预先生成校准信息并缓存它,无需在推理机器上校准模型。 移动校准缓存通常比移动校准张量文件方便得多,因为它是一个小得多的文件,可以与导出的模型一起移动。 使用校准缓存还可以加快引擎创建速度,因为构建缓存可能需要几分钟才能生成,具体取决于张量文件的大小和模型本身。
导出工具可以通过摄取训练数据的采样子集来生成 INT8 校准缓存。 您需要创建一个随机图像的子采样目录,以最好地代表您的测试数据集。 我们建议使用至少 10-20% 的训练数据。 校准期间提供的数据越多,int8 推理就越接近 fp32 推理。 示例笔记本中提供了一个辅助脚本,用于根据多个标准(例如图像中最少的人物数量、每个人物最少的关键点数量等)从给定的训练数据中选择子集数据。
根据 INT8 模型的评估结果,您可能需要调整采样图像的数量或选择的图像类型,以更好地代表测试数据集。 您还可以使用来自测试数据集的一部分数据进行校准,以提高结果。
FP16/FP32 模型
如果您需要在 INT8 精度下运行推理,则仅需要 calibration.bin
。 对于基于 FP16/FP32 的推理,导出步骤要简单得多。 所需的只是从 train
步骤向 export
提供模型,以将其转换为加密的 TAO 模型。

导出 BodyPoseNet 模型
以下是 export
命令的命令行参数
tao model bpnet export [-h] -m <path to the .tlt model file generated by tao train>
-k <key>
[-o <path to output file>]
[--cal_data_file <path to tensor file>]
[--cal_image_dir <path to the directory images to calibrate the model]
[--cal_cache_file <path to output calibration file>]
[--data_type <Data type for the TensorRT backend during export>]
[--batches <Number of batches to calibrate over>]
[--max_batch_size <maximum trt batch size>]
[--max_workspace_size <maximum workspace size]
[--batch_size <batch size to TensorRT engine>]
[--experiment_spec <path to experiment spec file>]
[--engine_file <path to the TensorRT engine file>]
[--verbose Verbosity of the logger]
[--input_dims Input dimensions to use for network]
[--backend Intermediate model type to export to]
[--force_ptq Flag to force PTQ]
必需参数
-m, --model
: 要使用export
导出的.tlt
模型文件的路径-k, --key
: 用于保存.tlt
模型文件的密钥-t, --backend
: 用于转换为.etlt
模型文件的后端类型。
目前,仅支持 tfonnx
作为 backend。 请不要使用 onnx
或 uff
。
可选参数
-o, --output_file
: 保存导出模型的路径。 默认路径为<input_file>.etlt
。--e, -experiment_spec
: 用于训练的 experiment_spec。--data_type
: 期望的引擎数据类型。 选项为fp32
、fp16
和int8
。 校准缓存将在int8
模式下生成。 默认值为fp32
。 如果使用int8
模式,则需要以下 INT8 参数。-s, --strict_type_constraints
: 一个布尔标志,指示在构建 TensorRT 引擎时是否应用 TensorRTstrict_type_constraints
。 请注意,这仅适用于应用int8
模式的严格类型。
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 相同,否则您不能将此引擎文件用于部署。--force_ptq
: 一个布尔标志,用于强制对导出的.etlt
模型进行训练后量化。
导出子任务的示例用法
以下是在 INT8 模式下导出 BodyPoseNet 模型的示例命令。 此命令显示了 --cal_image_dir
选项用于 BodyPoseNet 模型校准的用法。
# Export `.etlt` model, Calibrate model and Convert to TensorRT engine (INT8).
tao model bpnet export
-m /workspace/tao-experiments/bpnet/models/exp_m1_retrain/bpnet_model.tlt
-o /workspace/tao-experiments/bpnet/models/exp_m1_final/bpnet_model.etlt
-k $KEY
-d $IN_HEIGHT,$IN_WIDTH,$IN_CHANNELS
-e $SPECS_DIR/bpnet_retrain_m1_coco.txt
-t tfonnx
--data_type int8
--cal_image_dir /workspace/tao-experiments/bpnet/data/train2017/
--cal_cache_file /workspace/tao-experiments/bpnet/models/exp_m1_final/calibration.$IN_HEIGHT.$IN_WIDTH.bin
--cal_data_file /workspace/tao-experiments/bpnet/models/exp_m1_final/coco.$IN_HEIGHT.$IN_WIDTH.tensorfile
--batch_size 1
--batches 5000
--max_batch_size 1
--data_format channels_last
--engine_file /workspace/tao-experiments/bpnet/models/exp_m1_final/bpnet_model.$IN_HEIGHT.$IN_WIDTH.int8.engine
以下是在 INT8 模式下导出 BodyPoseNet 模型的示例命令
# Export `.etlt` model and Convert to TensorRT engine (FP16).
tao model bpnet export
-m /workspace/tao-experiments/bpnet/models/exp_m1_retrain/bpnet_model.tlt
-o /workspace/tao-experiments/bpnet/models/exp_m1_final/bpnet_model.etlt
-k $KEY
-d $IN_HEIGHT,$IN_WIDTH,$IN_CHANNELS
-e $SPECS_DIR/bpnet_retrain_m1_coco.txt
-t tfonnx
--data_type fp16
--batch_size 1
--max_batch_size 1
--data_format channels_last
--engine_file /workspace/tao-experiments/bpnet/models/exp_m1_final/bpnet_model.$IN_HEIGHT.$IN_WIDTH.fp16.engine
评估导出的 TRT 模型
评估导出的 TRT .engine
与评估 .tlt
类似。
按照创建推理规范文件部分中的说明创建 infer_spec 文件。 请注意,导出的 TRT 模型不支持 keep_aspect_ratio_mode
中的 adjust_network_input
模式,因此应使用 pad_image_input
(严格模式)代替。 按照评估模型部分中的说明评估 TRT 模型。
您也可以在严格模式下运行 .tlt 模型的评估,以便与 INT8/FP16/FP32 模型的精度进行比较,以了解精度是否下降。 与此步骤中的 .tlt 模型相比,FP16/FP32 模型的精度应几乎没有或没有下降。 INT8 模型的精度应与 .tlt
模型相似(或在 2-3% mAP 范围内可比)。
如果 INT8 模型的精度与相应的 FP16 版本相比似乎显着降低,则可能是由以下原因引起的
用于校准模型的校准张量文件中的数据不足。
训练数据不能完全代表您的测试图像,并且校准可能不正确。 因此,您可以重新生成具有更多批次训练数据的校准张量文件并重新校准模型,或者添加来自测试集的一部分数据。
此评估主要用作导出 TRT (INT8/FP16) 模型的健全性检查。 这是在严格模式下完成的,因此不能反映模型的真实精度,因为输入宽高比与测试集中图像的宽高比可能相差很大。 对于像 COCO 这样的数据集,可能存在各种分辨率的图像集合。 在这里,您保留严格的输入分辨率并将图像填充以重新训练宽高比。 因此,此处的精度可能会根据您选择的宽高比和网络分辨率而有所不同。
导出可部署的 BodyPoseNet 模型
一旦验证了 INT8/FP16/FP32 模型,您需要重新导出模型,以便可以在 Deepstream 等推理平台上运行。 您将使用与导出模型部分中相同的指南,但您需要将 --sdk_compatible_model
标志添加到导出命令中,这将向模型添加一些不可训练的后处理层,以实现与推理管道的兼容性。 您应该重复使用在上一步中生成的校准张量文件 (--cal_data_file
) 以保持一致性,但您需要重新生成 cal_cache_file
和 .etlt
模型。
以下是在 INT8 模式下导出 BodyPoseNet 模型的示例命令(与上一节类似),该模型可以部署在推理管道中。
tao model bpnet export
-m /workspace/tao-experiments/bpnet/models/exp_m1_retrain/bpnet_model.tlt
-o /workspace/tao-experiments/bpnet/models/exp_m1_final/bpnet_model.deploy.etlt
-k $KEY
-d $IN_HEIGHT,$IN_WIDTH,$IN_CHANNELS
-e $SPECS_DIR/bpnet_retrain_m1_coco.txt
-t tfonnx
--data_type int8
--cal_image_dir /workspace/tao-experiments/bpnet/data/train2017/
--cal_cache_file /workspace/tao-experiments/bpnet/models/exp_m1_final/calibration.$IN_HEIGHT.$IN_WIDTH.deploy.bin
--cal_data_file /workspace/tao-experiments/bpnet/models/exp_m1_final/coco.$IN_HEIGHT.$IN_WIDTH.tensorfile
--batch_size 1
--batches 5000
--max_batch_size 1
--data_format channels_last
--engine_file /workspace/tao-experiments/bpnet/models/exp_m1_final/bpnet_model.$IN_HEIGHT.$IN_WIDTH.int8.deploy.engine
--sdk_compatible_model
以上导出的模型不适用于 bpnet inference
/evaluate
工具。 这仅用于部署。 对于推理和评估,请使用不带 --sdk_compatible_model
导出的 TRT 模型。
有关使用 trtexec
命令生成 TensorRT 引擎的说明,请参阅BodyposeNet 的 trtexec 指南。
部署到 DeepStream
通过 NGC 提供的 BodyPoseNet 预训练模型默认情况下可用于 DeepStream 6.0。
有关更多详细信息,请参阅BodyPoseNet 的 DeepStream TAO 集成。