TAO v5.5.0

多任务图像分类

多任务分类需要一个图像目录和两个 CSV 文件,分别用于训练标签和验证标签。图像目录应包含用于训练和验证的所有图像(但可以包含其他图像)。只有训练 CSV 文件中指定的图像将用于训练,验证也是如此。

数据结构应如下所示

复制
已复制!
            

|--dataset_root: |--images |--1.jpg |--2.jpg |--3.jpg |--4.jpg |--5.jpg |--6.jpg |--train.csv |--val.csv

训练和验证 CSV 文件包含训练和验证图像的标签。两个 CSV 文件应具有相同的格式:CSV 的第一列必须是 fname,代表图像的文件名。如果您有 N 个任务,则需要额外的 N 列,每列的任务名称作为列名。对于每个图像(CSV 中的行条目),每个任务单元格必须有且只有一个标签。以下是包含 3 个分类任务(颜色、类型和尺寸)的 train.csv 示例

fname 颜色 类型 尺寸
1.jpg 蓝色 1
2.jpg 红色 1
3.jpg 红色 0

注意:目前,多任务图像分类仅支持 RGB 训练。训练后的模型将始终具有 3 个输入通道。对于灰度图像的推理,用户应将图像作为 RGB 加载,并在所有通道中使用相同的值。这也是训练脚本处理灰度训练图像的方式。

以下是多任务分类的规范文件示例

复制
已复制!
            

random_seed: 42 model_config { arch: "resnet" n_layers: 101 use_batch_norm: True use_bias: False all_projections: False use_pooling: True use_imagenet_head: True resize_interpolation_method: BICUBIC input_image_size: "3,224,224" } training_config { batch_size_per_gpu: 16 checkpoint_interval: 10 num_epochs: 80 enable_qat: false learning_rate { soft_start_annealing_schedule { min_learning_rate: 5e-5 max_learning_rate: 2e-2 soft_start: 0.15 annealing: 0.8 } } regularizer { type: L1 weight: 3e-5 } optimizer { adam { epsilon: 1e-7 beta1: 0.9 beta2: 0.999 amsgrad: false } } pretrain_model_path: "EXPERIMENT_DIR/resnet_101.hdf5" } dataset_config { image_directory_path: "EXPERIMENT_DIR/data/images" train_csv_path: "EXPERIMENT_DIR/data/train.csv" val_csv_path: "EXPERIMENT_DIR/data/val.csv" }

模型配置

下表描述了 model_config 中的可配置参数。

参数 数据类型 默认值 描述 支持的值
all_projections bool False 对于具有快捷连接的模板,此参数定义是否应使用 1x1 投影层实例化所有快捷方式,而不管输入和输出之间是否存在步幅变化。 TrueFalse(仅在 ResNet 模板中使用)
arch string resnet 这定义了用于训练的骨干特征提取器的架构。
  • resnet
  • vgg
  • mobilenet_v1
  • mobilenet_v2
  • googlenet
  • darknet
  • cspdarknet
  • squeezenet
  • efficientnet_b0
n_layers int 18 可扩展模板的特征提取器的深度。
  • resnets: 10, 18, 34, 50, 101
  • vgg: 16, 19
  • darknet / cspdarknet: 19, 53
use_pooling 布尔值 False 选择在使用步幅卷积或 MaxPooling 进行下采样之间。当 True 时,MaxPooling 用于下采样,但是对于对象检测网络,NVIDIA 建议将其设置为 False 并使用步幅卷积。 TrueFalse
use_batch_norm 布尔值 False 用于使用批归一化层的布尔变量。 TrueFalse
freeze_blocks float(重复) 此参数定义可以从实例化的特征提取器模板中冻结哪些块,并且对于不同的特征提取器模板是不同的。
  • ResNet 系列:对于 ResNet 系列,可用于冻结的块 ID 是 {0, 1, 2, 3}(包括)的任何子集
  • VGG 系列:对于 VGG 系列,可用于冻结的块 ID 是 {1, 2, 3, 4, 5}(包括)的任何子集
  • MobileNet V1:对于 MobileNet V1,可用于冻结的块 ID 是 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}(包括)的任何子集
  • MobileNet V2:对于 MobileNet V2,可用于冻结的块 ID 是 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}(包括)的任何子集
  • GoogLeNet:对于 GoogLeNet,可用于冻结的块 ID 是 {0, 1, 2, 3, 4, 5, 6, 7}(包括)的任何子集
  • DarkNet:对于 DarkNet,有效的块 ID 是 {0, 1, 2, 3, 4, 5}(包括)的任何子集
  • EfficientNet B0:对于 EfficientNet,有效的块 ID 是 {0, 1, 2, 3, 4, 5, 6, 7}(包括)的任何子集
freeze_bn 布尔值 False 您可以选择在模型训练期间冻结批归一化层。 TrueFalse
input_image_size 字符串 "3,224,224" 模型输入层的维度。数据集中的图像将在馈送到模型进行训练时由数据加载器调整为此形状。 3,X,Y,其中 X,Y >=16X,Y 是整数。
resize_interpolation_method 枚举 BILEANER 用于调整输入图像大小的插值方法。 BILINEAR, BICUBIC
use_imagenet_head 布尔值 False 是否使用与 ImageNet 原始实现中相同的头部层。将此设置为 True 以重现文献中 ImageNet 上的准确率。如果设置为 False,则头部将使用 Dense 层,这可能与文献不同。 TrueFalse
dropout float 0.0 模型中 Dropout 层的 dropout 率。这仅对 VGG 和 SqueezeNet 有效。 区间 [0, 1) 中的浮点数
batch_norm_config proto 消息 BatchNormalization 层的参数。
activation proto 消息 模型中激活函数的参数。

BatchNormalization 参数

参数 batch_norm_config 定义模型中 BatchNormalization 层的参数(动量和 epsilon)。

参数 数据类型 默认值 描述 支持的值
momentum float 0.9 BatchNormalization 层的动量。 区间 (0, 1) 中的浮点数,通常接近 1.0。
epsilon float 1e-5 避免零除的 epsilon。 接近 0.0 的浮点数。

激活函数

参数 activation 定义模型中激活函数的参数。

参数 数据类型 默认值 描述 支持的值
activation_type 字符串 激活函数的类型。 仅支持 reluswish

训练配置

训练配置 (training_config) 定义训练、评估和推理所需的参数。详细信息总结在下表中。

字段 描述 数据类型和约束 推荐/典型值
batch_size_per_gpu 每个 GPU 的批大小;有效批大小为 batch_size_per_gpu * num_gpus 无符号整数,正数
checkpoint_interval 每个模型检查点/验证的训练 epoch 数 无符号整数,正数 10
num_epochs 训练网络的 epoch 数 无符号整数,正数。
enable_qat 启用/禁用量化感知训练的标志 布尔值
learning_rate 此参数支持一个 soft_start_annealing_schedulesoft_start_cosine_annealing_schedule,具有以下嵌套参数
  1. min_learning_rate:整个实验期间的最小学习率
  2. max_learning_rate:整个实验期间的最大学习率
  3. soft_start:预热前的时间(表示为 0 到 1 之间进度的百分比)
  4. annealing:(仅适用于 soft_start_annealing_schedule)开始退火学习率的时间
消息类型
regularizer 此参数配置训练时使用的正则化器,并包含以下嵌套参数
  1. type:要使用的正则化器的类型。NVIDIA 支持 NO_REG、L1 或 L2。
  2. weight:正则化器权重的浮点值
消息类型 L1(注意:NVIDIA 建议在剪枝前训练网络时使用 L1 正则化器,因为 L1 正则化使网络权重更易于剪枝。)
optimizer 优化器可以是 adamsgdrmsprop。每种类型都有以下参数
  1. adam:epsilon、beta1、beta2、amsgrad
  2. sgd:momentum、nesterov
  3. rmsprop:rho、momentum、epsilon、centered

优化器参数与 Keras 中的参数相同。

消息类型
pretrain_model_path 预训练模型的路径(如果有)。最多可以存在一个 pretrain_model_pathresume_model_pathpruned_model_path 字符串
resume_model_path 要恢复训练的 TAO 检查点模型的路径(如果有)。最多可以存在一个 pretrain_model_pathresume_model_pathpruned_model_path 字符串
pruned_model_path 用于重新训练的 TAO 剪枝模型的路径(如果有)。最多可以存在一个 pretrain_model_pathresume_model_pathpruned_model_path 字符串
注意

学习率会根据训练期间使用的 GPU 数量自动缩放,或者有效学习率为 learning_rate * n_gpu

数据集配置

参数 数据类型 描述
image_directory_path string 图像目录的路径
train_csv_path string 训练 CSV 文件的路径
val_csv_path string 验证 CSV 文件的路径

使用 tao model multitask_classification train 命令来调整预训练模型

复制
已复制!
            

tao model multitask_classification train -e <spec file> -k <encoding key> -r <result directory> [--gpus <num GPUs>] [--gpu_index <gpu_index>] [--use_amp] [--log_file <log_file_path>] [-h]

必需参数

  • -r, --results_dir:实验输出应写入的文件夹路径。

  • -k, --key:用户特定的编码密钥,用于保存或加载 .tlt 模型。

  • -e, --experiment_spec_file:实验规范文件的路径。

可选参数

  • --gpus:用于训练和启动进程的 GPU 数量。默认值为 1

  • --gpu_index:用于运行训练的 GPU 索引。当机器安装了多个 GPU 时,我们可以指定用于运行训练的 GPU 索引。

  • --use_amp:启用 AMP 训练的标志。

  • --log_file:日志文件的路径。默认为 stdout

  • -h, --help:打印帮助消息。

注意

有关更多详细信息,请参阅 多任务分类的规范文件 部分。

以下是使用 tao model multitask_classification train 命令的示例

复制
已复制!
            

tao model multitask_classification train -e /workspace/tlt_drive/spec/spec.cfg -r /workspace/output -k $YOUR_KEY

在模型经过训练后,使用实验配置文件,并按照训练模型的步骤操作,下一步是在测试集上评估此模型,以衡量模型的准确性。TAO 包括 tao model multitask_classification evaluate 命令来执行此操作。

multitask_classification 应用程序计算每个任务的评估损失和准确率作为指标。

训练完成后,模型将存储在您选择的输出目录 $OUTPUT_DIR 中。使用 tao model multitask_classification evaluate 命令评估模型

复制
已复制!
            

tao model multitask_classification evaluate -e <experiment_spec_file> -k <key> -m <model> [--gpu_index <gpu_index>] [--log_file <log_file>] [-h]

必需参数

  • -e, --experiment_spec_file:实验规范文件的路径。

  • -k, --key:提供加密密钥以解密模型。

  • -m, --model:提供训练模型的路径。

可选参数

  • -h, --help:显示此帮助消息并退出。

  • --gpu_index:用于运行评估的 GPU 索引。当机器安装了多个 GPU 时,我们可以指定用于运行训练的 GPU 索引。

  • --log_file:日志文件的路径。默认为 stdout

在标记数据集上推理模型可以提供混淆矩阵,您可以从中查看模型在哪里犯错。

TAO 提供了一个命令,可以轻松地为所有任务生成混淆矩阵

复制
已复制!
            

tao model multitask_classification confmat -i <img_root> -l <target_csv> -k <key> -m <model> [--gpu_index <gpu_index>] [--log_file <log_file>] [-h]

必需参数

  • -i, --img_root:图像目录的路径。

  • -l, --target_csv:真实标签 CSV 文件的路径。

  • -k, --key:提供加密密钥以解密模型。

  • -m, --model:提供训练模型的路径。

可选参数

  • -h, --help:显示此帮助消息并退出。

  • --gpu_index:用于运行 confmat 的 GPU 索引。当机器安装了多个 GPU 时,我们可以指定用于运行训练的 GPU 索引。

  • --log_file:日志文件的路径。默认为 stdout

tao model multitask_classification inference 命令在指定的图像上运行推理。

在 TAO 上训练的多任务分类模型上执行 tao model multitask_classification inference

复制
已复制!
            

tao model multitask_classification inference -m <model> -i <image> -k <key> -cm <classmap> [--gpu_index <gpu_index>] [--log_file <log_file>] [-h]

以下是 tao model multitask_classification inference 工具的参数

必需参数

  • -m, --model:预训练模型(TAO 模型)的路径。

  • -i, --image:用于推理的单个图像文件。

  • -k, --key:加载模型的密钥。

  • -cm, --class_mapjson 文件,指定每个任务的类索引和标签映射。

可选参数

  • -h, --help:显示此帮助消息并退出。

  • --gpu_index:用于运行推理的 GPU 索引。当机器安装了多个 GPU 时,我们可以指定用于运行训练的 GPU 索引。

  • --log_file:日志文件的路径。默认为 stdout

注意

需要一个类映射 (-cm),它应该是您训练过程的副产品 (class_mapping.json)。

剪枝从模型中删除参数,以减小模型大小,而不会使用 tao model multitask_classification prune 命令损害模型本身的完整性。

tao model multitask_classification prune 命令包括以下参数

复制
已复制!
            

tao model multitask_classification prune -m <model> -o <output_file> -k <key> [-n <normalizer> [-eq <equalization_criterion>] [-pg <pruning_granularity>] [-pth <pruning threshold>] [-nf <min_num_filters>] [-el <excluded_list>] [--gpu_index <gpu_index>] [--log_file <log_file>] [-h]

必需参数

  • -m, --model:预训练模型的路径

  • -o, --output_file:输出检查点的路径

  • -k, --key:加载 .tlt 模型的密钥

可选参数

  • -h, --help:显示此帮助消息并退出。

  • -n, –normalizermax 通过将每个范数除以层内的最大范数进行归一化;L2 通过除以包含所有内核范数的向量的 L2 范数进行归一化。(默认值:max

  • -eq, --equalization_criterion:均衡元素级运算层或深度卷积层输入统计信息的标准。此参数对于 ResNet 和 MobileNet 非常有用。选项包括 arithmetic_meangeometric_meanunionintersection。(默认值:union

  • -pg, -pruning_granularity:一次删除的过滤器数量(默认值:8

  • -pth:用于比较归一化范数的阈值(默认值:0.1

  • -nf, --min_num_filters:每层要保留的最小过滤器数量(默认值:16

  • -el, --excluded_layers:excluded_layers 列表。示例:-i item1 item2(默认值:[]

  • --gpu_index:用于运行剪枝的 GPU 索引。当机器安装了多个 GPU 时,我们可以指定用于运行训练的 GPU 索引。

  • --log_file:日志文件的路径。默认为 stdout。

剪枝后,模型需要重新训练。有关更多详细信息,请参阅 重新训练剪枝模型

模型剪枝后,准确率可能会略有下降。发生这种情况是因为某些先前有用的权重可能已被删除。为了重新获得准确率,NVIDIA 建议您在同一数据集上重新训练此剪枝模型。为此,请使用 训练模型 中记录的 tao model multitask_classification train 命令,并更新规范文件,将新剪枝的模型指向预训练模型文件。

建议用户在 training_config 中关闭分类的正则化器,以在重新训练剪枝模型时恢复准确率。您可以通过将正则化器类型设置为 NO_REG 来执行此操作。所有其他参数都可以从之前的训练中保留在规范文件中。

导出模型将训练过程与推理分离,并允许在 TAO 环境之外转换为 TensorRT 引擎。TensorRT 引擎特定于每个硬件配置,应为每个唯一的推理环境生成。导出的模型可以在训练和部署硬件之间通用使用。导出的模型格式称为 .etlt.etlt 模型格式与 .tlt 类似,也是一种加密模型格式,与导出它的 .tlt 模型具有相同的密钥。部署此模型时需要此密钥。

导出模型

以下是 tao model multitask_classification export 命令的示例

复制
已复制!
            

tao model multitask_classification export -m <path to the .tlt model file generated by training> -k <key> -cm <classmap> [-o <path to output file>] [--gpu_index <gpu_index>] [--log_file <log_file_path>]

必需参数

  • -m, --model:要导出的 .tlt 模型文件的路径。

  • -k, --key:用于保存 .tlt 模型文件的密钥。

  • -cm, --class_mapjson 文件,指定每个任务的类索引和标签映射。

注意

需要一个类映射 (-cm),它应该是您训练过程的副产品 (class_mapping.json)。

可选参数

  • -o, --output_file:保存导出模型的路径。默认值为 ./<input_file>.etlt

  • --gpu_index:用于导出模型的(离散)GPU 的索引。如果机器安装了多个 GPU,我们可以指定 GPU 索引来运行导出。请注意,导出只能在单个 GPU 上运行。

  • --log_file:日志文件的路径。默认为 stdout

  • -v, --verbose:详细日志。

有关 TensorRT 引擎生成、验证和 int8 校准,请参阅 TAO Deploy 文档

有关使用 DeepStream 部署分类模型的更多信息,请参阅 集成多任务图像分类模型 页面。

上一页 图像分类 (TF1)
下一页 对象检测
© 版权所有 2024, NVIDIA。 上次更新时间:2024 年 10 月 15 日。