图像分类 (TF2)
以下是分类规范文件的示例。它有七个主要组成部分——dataset、model、train、evaluate、inference、prune 和 export——以及加密密钥 (encryption_key) 和结果目录 (results_dir) 的参数。
            
            results_dir: '/workspace/results_dir'
encryption_key: 'nvidia_tlt'
num_gpus: 1
gpu_ids: [0]
dataset:
  train_dataset_path: "/workspace/tao-experiments/data/split/train"
  val_dataset_path: "/workspace/tao-experiments/data/split/val"
  preprocess_mode: 'torch'
  num_classes: 20
  augmentation:
    enable_color_augmentation: True
    enable_center_crop: True
train:
  qat: False
  checkpoint_interval: 1
  checkpoint: '/path/to/model.tlt'
  batch_size_per_gpu: 64
  num_epochs: 80
  optim_config:
    optimizer: 'sgd'
  lr_config:
    scheduler: 'cosine'
    learning_rate: 0.05
    soft_start: 0.05
  reg_config:
    type: 'L2'
    scope: ['conv2d', 'dense']
    weight_decay: 0.00005
model:
  backbone: 'efficientnet-b0'
  input_width: 224
  input_height: 224
  input_channels: 3
  input_image_depth: 8
evaluate:
  dataset_path: '/workspace/tao-experiments/data/split/test'
  checkpoint: 'EVALMODEL'
  top_k: 3
  batch_size: 256
  n_workers: 8
inference:
  checkpoint: 'EVALMODEL'
  image_dir: '/workspace/tao-experiments/data/split/test/aeroplane'
  classmap: 'RESULTSDIR/classmap.json'
export:
  checkpoint: 'EVALMODEL'
  onnx_file: 'EXPORTDIR/efficientnet-b0.onnx'
  data_type: 'fp32'
    
规范文件的格式为 YAML。下表总结了规范文件的顶层结构
| 字段 | 描述 | 
| dataset | 与数据源和数据加载器相关的配置 | 
| model | 与模型构建相关的配置 | 
| train | 与训练过程相关的配置 | 
| evaluate | 与独立评估过程相关的配置 | 
| prune | 用于剪枝训练模型的配置 | 
| inference | 用于运行模型推理的配置 | 
| export | 用于导出训练模型的配置 | 
| encryption_key | 全局加密密钥 | 
| results_dir | 保存实验结果和状态日志的目录 | 
模型配置
下表描述了 model 配置中的参数。
| 参数 | 数据类型 | 典型值 | 描述 | 支持的值 | 
| backbone | 字符串 | efficientnet-b0 | 这定义了用于训练的骨干特征提取器的架构。 | efficientnet-b0 到 efficientnet-b5 | 
| use_pooling | 布尔值 | False | 在下采样时,选择使用步幅卷积或 MaxPooling。当 True 时,使用 MaxPooling 进行下采样;但是,对于对象检测网络,NVIDIA 建议将其设置为 False 并使用步幅卷积。 | True 或 False | 
| use_batch_norm | 布尔值 | False | 用于决定是否使用批归一化层的布尔变量。 | True 或 False | 
| freeze_blocks | 列表 | – | 此参数定义可以从实例化的特征提取器模板中冻结哪些块,并且对于不同的特征提取器模板是不同的。 | 
 | 
| freeze_bn | 布尔值 | False | 您可以选择在模型训练期间冻结批归一化层。 | True 或 False | 
| resize_interpolation_method | 字符串 | 双线性 | 用于调整输入图像大小的插值方法。 | bilinear 或 bicubic | 
| retain_head | 布尔值 | False | 常规 TAO 模型:是否使用原始 ImageNet 实现中的头部层。将此设置为 True 以重现文献中 ImageNet 上的精度。如果设置为 False,则头部将使用 Dense 层,这可能与文献中的不同。BYOM 模型:是否使用原始 ONNX 模型中的头部层。将此设置为 True 以重现原始数据集上的精度。如果设置为 False,则头部将使用 Dense 层,这可能与原始实现不同。 | True 或 False | 
| dropout | 浮点数 | 0.0 | 模型中 Dropout 层的 Dropout 率。这仅对 VGG 和 SqueezeNet 有效。 | 区间 [0, 1) 中的浮点数 | 
| byom_model | 字符串 | – | BYOM 模型在 .tltb格式中的 UNIX 格式路径。 | UNIX 格式路径。 | 
| input_width | 整数 | – | 输入宽度 | 无符号整数 | 
| input_height | 整数 | – | 输入高度 | 无符号整数 | 
| input_channels | 整数 | – | 输入通道数 | 无符号整数(1 或 3) | 
数据集配置
下表描述了 data 配置中的参数。
| 参数 | 数据类型 | 默认值 | 描述 | 支持的值 | 
| val_dataset_path | 字符串 | 验证数据集的根目录的 UNIX 格式路径。 | UNIX 格式路径。 | |
| train_dataset_path | 字符串 | 训练数据集的根目录的 UNIX 格式路径。 | UNIX 格式路径。 | |
| image_mean | 列表 | BGR 顺序的图像均值列表。仅当 preprocess_mode 为 caffe时适用。 | – | |
| preprocess_mode | 字符串 | 'torch' | 输入图像预处理的模式。默认为“caffe”。 | “caffe”、“torch”、“tf” | 
| num_classes | 整数 | 类别数。 | ||
| augmentation | 增强配置 | 增强参数的配置。 | 
下表描述了 dataset.augmentation 配置中的参数。
| 参数 | 数据类型 | 默认值 | 描述 | 支持的值 | 
| enable_random_crop | 布尔值 | True | 用于在训练期间启用随机裁剪的标志。 | True 或 False | 
| enable_center_crop | 布尔值 | True | 用于在验证期间启用中心裁剪的标志。 | True 或 False | 
| enable_color_augmentation | 布尔值 | True | 用于在训练期间启用颜色增强的标志。 | True 或 False | 
| disable_horizontal_flip | 布尔值 | False | 用于禁用水平翻转的标志。 | True 或 False | 
| mixup_alpha | 浮点数 | 0.2 | 用于 mixup 增强的因子。 | 在区间 (0, 1) 中 | 
推理配置
下表定义了用于评估分类模型的可配置参数。
| 参数 | 数据类型 | 典型值 | 描述 | 支持的值 | 
| image_dir | 字符串 | 包含输入图像的目录的 UNIX 格式路径 | UNIX 格式路径。 | |
| checkpoint | 字符串 | 要评估的模型文件的根目录的 UNIX 格式路径 | UNIX 格式路径。 | |
| classmmap | 字符串 | 训练过程生成的类别映射 | ||
| results_dir | 字符串 | 将保存推理日志和结果的目录 | UNIX 格式路径。 | 
评估配置
下表定义了用于评估分类模型的可配置参数。
| 参数 | 数据类型 | 典型值 | 描述 | 支持的值 | 
| dataset_path | 字符串 | 评估数据集的根目录的 UNIX 格式路径 | UNIX 格式路径。 | |
| checkpoint | 字符串 | 要评估的模型文件的根目录的 UNIX 格式路径 | UNIX 格式路径。 | |
| top_k | 整数 | 5 | 计算 Top-K 分类类别准确率指标时要查看的元素数量 | 1, 3, 5 | 
| batch_size | 整数 | 256 | 评估模型时每个批次的图像数量 | >1(受 GPU 内存中可以容纳的图像数量限制) | 
| n_workers | 整数 | 8 | 评估数据加载器中提取图像批次的工作进程数 | >1 | 
| results_dir | 字符串 | 将保存评估日志的目录 | UNIX 格式路径。 | 
训练配置
本节定义了分类模型训练器的可配置参数。
| 参数 | 数据类型 | 默认值 | 描述 | 支持的值 | 
| checkpoint | 字符串 | 包含用于初始化模型的预训练权重的模型文件的 UNIX 格式路径。 | UNIX 格式路径。 | |
| batch_size_per_gpu | 整数 | 32 | 每个 GPU 每个批次的图像数量 | >1 | 
| num_epochs | 整数 | 120 | 运行实验的总 epoch 数 | >1 | 
| checkpoint_interval | 整数 | 1 | 保存检查点的频率 | >1 | 
| n_workers | 整数 | 10 | 训练/验证数据加载器中提取图像批次的工作进程数 | >1 | 
| random_seed | 整数 | – | 用于训练的随机种子 | – | 
| label_smoothing | 浮点数 | 0.1 | 用于标签平滑的因子 | 在区间 (0, 1) 中 | 
| lr_config | 学习率配置 | – | 学习率调度器的参数 | – | 
| reg_config | 正则化器配置 | – | 正则化器的参数 | – | 
| optim_config | 优化器配置 | – | 用于训练的优化器。支持的值为 sgd、adam或rmsprop | – | 
| bn_config | BatchNorm 配置 | – | 批归一化层 | – | 
| results_dir | 字符串 | – | 将保存训练日志的目录 | UNIX 格式路径。 | 
学习率调度器
参数 lr_config 定义了学习率调度器的参数。学习率调度器可以是 step、soft_anneal 或 cosine。
Step
参数 step 定义了步进学习率调度器。
| 参数 | 数据类型 | 典型值 | 描述 | 支持的值 | 
| learning_rate | 浮点数 | – | 基础(最大)学习率值。 | 正值,通常在区间 (0, 1) 中。 | 
| step_size | 整数 | – | 学习率将降低的进度(占整个训练持续时间的百分比)。 | 小于 100。 | 
| gamma | 浮点数 | – | 用于降低学习率的乘法因子。 | 在区间 (0, 1) 中。 | 
学习率会根据训练期间使用的 GPU 数量自动缩放,或者有效学习率为 learning_rate * n_gpu。
软退火
参数 soft_anneal 定义了软退火学习率调度器。
| 参数 | 数据类型 | 典型值 | 描述 | 支持的值 | 
| learning_rate | 浮点数 | – | 基础(最大)学习率值。 | 正值,通常在区间 (0, 1) 中。 | 
| soft_start | 浮点数 | – | 学习率达到基础学习率的进度。 | 在区间 (0, 1) 中。 | 
| annealing_divider | 浮点数 | – | 学习率将按其缩小的除数。 | 大于 1.0。 | 
| annealing_points | 重复浮点数 | – | 学习率将降低的进度点。 | 浮点数列表。每个值都将在区间 (0, 1) 中。 | 
Cosine
参数 cosine 定义了余弦学习率调度器。
| 参数 | 数据类型 | 典型值 | 描述 | 支持的值 | 
| learning_rate | 浮点数 | – | 基础(最大)学习率。 | 通常小于 1.0 | 
| min_lr_ratio | 浮点数 | – | 最小学习率与基础学习率的比率。 | 小于 1.0 | 
| soft_start | 浮点数 | – | 学习率达到基础学习率的进度。 | 在区间 (0, 1) 中。 | 
 
优化器配置
支持三种类型的优化器:Adam、SGD 和 RMSProp。规范文件中应仅使用 optimizer 指定一种类型
下表总结了 Adam 优化器参数。
| 参数 | 描述 | 数据类型和约束 | 默认/建议值 | 
| lr | 学习率。此参数被学习率调度器覆盖,因此无用。 | 浮点数 | 0.01 | 
| beta_1 | 模型参数均值的动量 | 浮点数 | 0.9 | 
| beta_2 | 模型参数方差的动量 | 浮点数 | 0.999 | 
| decay | 学习率的衰减因子。此参数无用。 | 浮点数 | 0.0 | 
| epsilon | 用于数值稳定性的一个小常数 | 浮点数 | 1e-7 | 
下表总结了 SGD 优化器参数。
| 参数 | 描述 | 数据类型和约束 | 默认/建议值 | 
| lr | 学习率。此参数被学习率调度器覆盖,因此无用。 | 浮点数 | 0.01 | 
| momentum | SGD 的动量 | 浮点数 | 0.9 | 
| decay | 学习率的衰减因子。此参数无用,因为它被学习率调度器覆盖。 | 浮点数 | 0.0 | 
| nesterov | 用于为 SGD 启用 Nesterov 动量的标志 | 布尔值 | False | 
下表总结了 RMSProp 优化器参数。
| 参数 | 描述 | 数据类型和约束 | 默认/建议值 | 
| lr | 学习率。此参数被学习率调度器覆盖,因此无用。 | 浮点数 | 0.01 | 
BatchNorm 配置
| 参数 | 描述 | 数据类型和约束 | 默认/建议值 | 
| momentum | 移动平均的动量 | 浮点数 | 0.9 | 
| epsilon | 添加到方差以避免除以零的小浮点数 | 浮点数 | 1e-5 | 
剪枝配置
prune 配置定义了训练模型的剪枝过程。下表总结了详细描述。
| 字段 | 描述 | 数据类型和约束 | 推荐/典型值 | 
| normalizer | 归一化方法。指定 max以通过将每个范数除以层内的最大范数进行归一化,或指定L2以通过除以包含所有内核范数的向量的 L2 范数进行归一化 | 字符串 | max | 
| equalization_criterion | 用于均衡元素级运算层或深度卷积层输入统计信息的标准。选项为 arithmetic_mean、geometric_mean、``union`` 和intersection。 | 字符串 | union | 
| granularity | 一次要删除的过滤器数量 | 整数 | 8 | 
| threshold | 剪枝阈值 | 浮点数 | – | 
| min_num_filters | 每层要保留的最小过滤器数量。默认值:16 | 整数 | 16 | 
| excluded_layers | 要从剪枝中排除的层列表 | 列表 | – | 
| checkpoint | 要剪枝的 .tlt模型的路径 | 字符串 | – | 
| results_dir | 将保存剪枝日志和剪枝模型的目录 | 字符串 | – | 
导出配置
export 配置包含将 .tlt 模型导出到 .onnx 模型的参数,该模型可用于部署。
| 字段 | 描述 | 数据类型和约束 | 推荐/典型值 | 
| checkpoint | 要导出的 .tlt模型文件的路径 | 字符串 | – | 
| onnx_file | 保存导出的 .onnx模型的路径 | 字符串 | – | 
| results_dir | 将保存导出日志的目录 | 字符串 | – | 
使用 tao model classification_tf2 train 命令微调预训练模型
            
            tao model classification_tf2 train [-h] -e <spec file>
                             [results_dir=<global_results_dir>]
                             [model.<model_option>=<model_option_value>]
                             [dataset.<dataset_option>=<dataset_option_value>]
                             [train.<train_option>=<train_option_value>]
                             [num_gpus=<num GPUs>]
                             [gpu_ids=<gpu_index>]
    
必需参数
- -e, --experiment_spec_file:实验规范文件的路径。
可选参数
- model.<model_option>:模型选项。
- dataset.<dataset_option>:数据集选项。
- train.<train_option>:训练选项。
- num_gpus:用于训练和启动进程的 GPU 数量。默认值为 1。
- gpu_ids:用于运行训练的 GPU 索引。当机器安装了多个 GPU 时,我们可以指定用于运行训练的 GPU 索引。
- -h, --help:打印帮助消息。
有关更多详细信息,请参阅分类规范文件部分。
输入要求
- 输入大小:3 * 高 * 宽(宽、高 >= 32) 
- 输入格式:JPG、JPEG、PNG 
分类输入图像无需手动调整大小。输入数据加载器会自动将图像调整为 input size。
示例用法
以下是使用 tao model classification_tf2 train 命令的示例
            
            tao model classification_tf2 train -e /workspace/spec.yaml num_gpus=2
    
在模型经过训练后,使用实验配置文件,并按照训练模型的步骤操作,下一步是在测试集上评估此模型,以衡量模型的准确性。
分类应用程序计算评估损失、Top-k 准确率、精确率和召回率作为指标。使用 tao model classification_tf2 evaluate 命令评估模型
            
            tao model classification_tf2 evaluate [-h] -e <experiment_spec_file>
                             evaluate.checkpoint=<model to be evaluated>
                             [evaluate.<evaluate_option>=<evaluate_option_value>]
                             [gpu_ids=<gpu_index>]
    
必需参数
- -e, --experiment_spec_file:实验规范文件的路径。
- evaluate.checkpoint:要评估的- .pth模型。
可选参数
- -h, --help:显示此帮助消息并退出。
- gpu_ids:用于运行评估的 GPU 索引。仅支持 1 个 GPU。
- evaluate.<evaluate_option>:评估选项。
如果您按照训练分类模型中的示例操作,请运行评估
            
            tao model classification_tf2 evaluate -e classification_spec.yaml
    
TAO 评估分类并生成以下指标
- 损失 
- Top-K 准确率 
- 精确率 (P):TP / (TP + FP) 
- 召回率 (R):TP / (TP + FN) 
- 混淆矩阵 
tao model classification_tf2 inference 命令在一组指定的输入图像上运行推理。对于分类,tao model classification_tf2 inference 通过命令行为单个图像或包含图像路径以及多个图像的相应标签的 csv 文件提供类别标签输出。还可以启用 TensorRT Python 推理。
在 TAO 上训练的分类模型上执行 tao model classification_tf2 inference。
            
            tao model classification_tf2 inference [-h] -e <experiment_spec_file>
                             inference.checkpoint=<model to be inferenced>
                             [inference.<inference_option>=<inference_option_value>]
                             [gpu_ids=<gpu_index>]
    
以下是 tao model classification_tf2 inference 工具的参数
必需参数
- -e, --experiment_spec_file:实验规范文件的路径。
- inference.checkpoint:要推理的- .pth模型。
可选参数
- -h, --help:显示此帮助消息并退出。
- gpu_ids:用于运行推理的 GPU 索引。仅支持 1 个 GPU。
- inference.<inference_option>:推理选项。
剪枝从模型中移除参数,以减小模型大小,同时使用 tao model classification_tf2 prune 命令,而不损害模型本身的完整性。
tao model classification_tf2 prune 命令包含以下参数
            
            tao model classification_tf2 prune [-h] -e <experiment_spec_file>
                             prune.checkpoint=<model to be pruned>
                             [prune.<prune_option>=<prune_option_value>]
    
必需参数
- -e, --experiment_spec_file:实验规范文件的路径。
- prune.checkpoint:要剪枝的- .pth模型。
可选参数
- -h, --help:显示此帮助消息并退出。
- gpu_ids:用于运行剪枝的 GPU 索引。仅支持 1 个 GPU。
- prune.<prune_option>:剪枝选项。
剪枝后,需要重新训练模型。有关更多详细信息,请参阅重新训练剪枝模型。
使用剪枝命令
以下是使用 tao model classification_tf2 prune 命令的示例
            
            tao model classification_tf2 prune -e /workspace/spec.yaml
    
模型剪枝后,准确率可能会略有下降。发生这种情况是因为某些以前有用的权重可能已被移除。为了重新获得准确率,NVIDIA 建议您在同一数据集上重新训练此剪枝模型。为此,请使用 训练模型中记录的 tao model classification_tf2 train 命令,并使用更新后的规范文件,该文件指向新剪枝的模型作为预训练模型文件。
建议用户在分类的 train 配置中关闭正则化器,以在重新训练剪枝模型时恢复准确率。您可以通过将正则化器 type 设置为 NO_REG 来执行此操作。所有其他参数都可以从之前的训练中保留在规范文件中。
导出模型将训练过程与推理分离,并允许在 TAO 环境之外转换为 TensorRT 引擎。TensorRT 引擎特定于每个硬件配置,应为每个唯一的推理环境生成。导出的模型可以在训练和部署硬件上通用使用。
以下是 tao model classification_tf2 export 命令的示例
            
            tao model classification_tf2 export [-h] -e <experiment_spec_file>
                             export.checkpoint=<model to export>
                             export.onnx_file=<onnx path>
                             [export.<export_option>=<export_option_value>]
                             [gpu_ids=<gpu_index>]
    
必需参数
- -e, --experiment_spec:规范文件的路径。
- export.checkpoint:要导出的- .pth模型。
- export.onnx_file:保存- .etlt或- .onnx模型的路径。
可选参数
- gpu_ids:用于导出模型的(离散)GPU 的索引。如果机器安装了多个 GPU,我们可以指定 GPU 索引来运行导出。请注意,导出只能在单个 GPU 上运行。
- export.<export_option>:导出选项。
示例用法
以下是示例命令。
            
            tao model classification_tf2 export -e /workspace/spec.yaml
    
对于 TensorRT 引擎生成、验证和 int8 校准,请参阅 TAO 部署文档。
有关使用 DeepStream 部署分类模型的更多信息,请参阅集成分类 (TF1/TF2/PyTorch) 模型页面。