TAO v5.5.0

图像分类 (TF1)

有关图像分类数据格式的更多信息,请参阅数据标注格式页面。

以下是模型分类的规范文件示例

复制
已复制!
            

model_config { # Model Architecture can be chosen from: # ['resnet', 'vgg', 'googlenet', 'alexnet'] arch: "resnet" # for resnet --> n_layers can be [10, 18, 50] # for vgg --> n_layers can be [16, 19] n_layers: 101 use_batch_norm: True use_bias: False all_projections: False use_pooling: True retain_head: True resize_interpolation_method: BICUBIC # if you want to use the pretrained model, # image size should be "3,224,224" # otherwise, it can be "3, X, Y", where X,Y >= 16 input_image_size: "3,224,224" } train_config { train_dataset_path: "/path/to/your/train/data" val_dataset_path: "/path/to/your/val/data" pretrained_model_path: "/path/to/your/pretrained/model" # Only ['sgd', 'adam'] are supported for optimizer optimizer { sgd { lr: 0.01 decay: 0.0 momentum: 0.9 nesterov: False } } batch_size_per_gpu: 50 n_epochs: 150 # Number of CPU cores for loading data n_workers: 16 # regularizer reg_config { # regularizer type can be "L1", "L2" or "None". type: "L2" # if the type is not "None", # scope can be either "Conv2D" or "Dense" or both. scope: "Conv2D,Dense" # 0 < weight decay < 1 weight_decay: 0.000015 } # learning_rate lr_config { cosine { learning_rate: 0.04 soft_start: 0.0 } } enable_random_crop: True enable_center_crop: True enable_color_augmentation: True mixup_alpha: 0.2 label_smoothing: 0.1 preprocess_mode: "caffe" image_mean { key: 'b' value: 103.9 } image_mean { key: 'g' value: 116.8 } image_mean { key: 'r' value: 123.7 } } eval_config { eval_dataset_path: "/path/to/your/test/data" model_path: "/workspace/tao-experiments/classification/weights/resnet_080.tlt" top_k: 3 batch_size: 256 n_workers: 8 enable_center_crop: True }

分类实验规范由三个主要组件组成

  • model_config

  • eval_config

  • train_config

模型配置

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

参数 数据类型 典型值 描述 支持的值

all_projections

布尔值

False

对于具有快捷连接的模板,此参数定义是否应使用 1x1 实例化所有快捷方式
投影层,而不管输入和输出之间是否存在步幅变化。

TrueFalse(仅在 ResNet 模板中使用)

arch

字符串

resnet

这定义了用于训练的骨干特征提取器的架构。

* resnet
* vgg
* mobilenet_v1
* mobilenet_v2
* googlenet
* darknet
* cspdarknet
* efficientnet_b0
* efficientnet_b1
* cspdarknet_tiny

n_layers

整数

18

可扩展模板的特征提取器的深度。

* resnets:10、18、34、50、101
* vgg:16、19
* darknet:19、53
* cspdarknet:19、53

use_pooling

布尔值

False

在下采样时,选择使用步幅卷积还是 MaxPooling。当 True 时,MaxPooling 用于下采样,但是
对于对象检测网络,NVIDIA 建议将其设置为 False 并使用步幅卷积。

TrueFalse

use_batch_norm 布尔值 False 布尔变量,用于指示是否使用批归一化层。 TrueFalse

freeze_blocks

浮点数
(重复)

此参数定义可以从实例化的特征提取器模板中冻结哪些块,并且对于不同的
特征提取器模板,此参数有所不同。

* 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}(含)的任何子集
* CSPDarkNet:对于 CSPDarkNet,有效的块 ID 是 {0, 1, 2, 3, 4, 5}(含)的任何子集
* EfficientNet B0/B1:对于 EfficientNet,有效的块 ID 是 {0, 1, 2, 3, 4, 5, 6, 7}(含)的任何子集
* CSPDarkNet-tiny:对于 CSPDarkNet-tiny,有效的块 ID 是 {0, 1, 2, 3, 4, 5}(含)的任何子集

freeze_bn

布尔值

False

您可以选择在训练期间冻结模型中的批
归一化层。

TrueFalse

input_image_size

字符串

"3,224,224"

模型的输入层维度。数据集中的图像将在数据加载器中调整为此形状
,然后馈送到模型进行训练。

C,X,Y,其中 C=1C=3,且 X,Y >=16X,Y 为整数。

resize_interpolation_method 枚举 BILEANER 用于调整输入图像大小的插值方法。 BILINEAR,BICUBIC

retain_head

布尔值

False

是否使用与 ImageNet 原始实现中相同的标头层。将此项设置为 True 以重现
文献中 ImageNet 上的准确率。如果设置为 False,则标头将使用 Dense 层,这可能与文献不同。

TrueFalse

dropout 浮点数 0.0 模型中 Dropout 层的 Dropout 率。这仅对 VGG 和 SqueezeNet 有效。 区间 [0, 1) 中的浮点数
batch_norm_config proto 消息 BatchNormalization 层的参数。
activation proto 消息 模型中激活函数的参数。

BatchNormalization 参数

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

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

激活函数

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

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

Eval Config

下表定义了评估分类模型的可配置参数。

参数 数据类型 典型值 描述 支持的值
eval_dataset_path 字符串 评估数据集根目录的 UNIX 格式路径。 UNIX 格式路径。
model_path 字符串 您要评估的模型文件根目录的 UNIX 格式路径。 UNIX 格式路径。
top_k 整数 5 计算 Top-K 分类类别准确率指标时要查看的元素数量。 1, 3, 5
batch_size 整数 256 评估模型时每个批次的图像数量。 >1(受 GPU 内存中可容纳的图像数量限制)
n_workers 整数 8 评估数据加载器中提取图像批次的工作进程数。 >1
enable_center_crop 布尔值 True 是否为输入图像启用中心裁剪。通常,此参数设置为 True 以获得更好的准确率。 TrueFalse

Training Config

本节定义了分类模型训练器的可配置参数。

参数 数据类型 默认 描述 支持的值
val_dataset_path 字符串 验证数据集根目录的 UNIX 格式路径。 UNIX 格式路径。
train_dataset_path 字符串 训练数据集根目录的 UNIX 格式路径。 UNIX 格式路径。
pretrained_model_path 字符串 包含预训练权重的模型文件的 UNIX 格式路径,用于从中初始化模型。 UNIX 格式路径。
batch_size_per_gpu 整数 32 此参数定义每个 GPU 每个批次的图像数量。 >1
n_epochs 整数 120 此参数定义运行实验的总 epoch 数。
n_workers 整数 10 训练/验证数据加载器中提取图像批次的工作进程数。 >1
lr_config proto 消息 学习率调度器的参数。
reg_config proto 消息 正则化器的参数。
optimizer proto 消息 此参数定义要用于训练的优化器。可以从 sgdadamrmsprop 中选择
random_seed 整数 训练的随机种子。
enable_random_crop 布尔值 True 用于在训练期间启用随机裁剪的标志。 TrueFalse
enable_center_crop 布尔值 True 用于在验证期间启用中心裁剪的标志。 TrueFalse
enable_color_augmentation 布尔值 True 用于在训练期间启用颜色增强的标志。 TrueFalse
disable_horizontal_flip 布尔值 False 用于禁用水平翻转的标志。 TrueFalse
label_smoothing 浮点数 0.1 用于标签平滑的因子。 在区间 (0, 1) 中
mixup_alpha 浮点数 0.2 用于 mixup 增强的因子。 在区间 (0, 1) 中
preprocess_mode 字符串 'caffe' 输入图像预处理的模式。默认为“caffe”。 “caffe”、“torch”、“tf”
model_parallelism 重复浮点数 用于指示如何在多个 GPU 上拆分模型以实现模型并行性的分数列表。
image_mean 字典 ‘b’:103.939 ‘g’:116.779 ‘r’:123.68 用于指定图像均值的键/值对。仅当 preprocess_mode 为 caffe 时适用。如果省略,则 ImageNet 均值将用于图像预处理。如果设置,则根据 output_channel,必须配置“r/g/b”或“l”键/值对。

学习率调度器

参数 lr_config 定义学习率调度器的参数。学习率调度器可以是 stepsoft_annealcosine

Step

参数 step 定义步进学习率调度器。

参数 数据类型 典型值 描述 支持的值
learning_rate 浮点数 基本(最大)学习率值。 正数,通常在区间 (0, 1) 中。
step_size 整数 学习率将降低后的进度(占整个训练持续时间的百分比)。 小于 100。
gamma 浮点数 用于降低学习率的乘法因子。 在区间 (0, 1) 中。
注意

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

Soft Annealing

参数 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) 中。
learning_rate_schedules.png

优化器

支持三种类型的优化器:Adam、SGD 和 RMSProp。规范文件中应仅指定一种类型。无论选择哪种类型,它都将包装在 optimizer proto 中,如下例所示

复制
已复制!
            

optimizer { sgd { lr: 0.01 decay: 0.0 momentum: 0.9 nesterov: False } }

下表总结了 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

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

复制
已复制!
            

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

必需参数

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

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

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

可选参数

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

  • --num_processes, -np:要为训练生成的进程数。默认值为 -1(等于 --gpus,用于数据并行性用例)。在模型并行性的情况下,应根据实际情况显式将此参数设置为 1 或更大。将 --gpus 设置为大于 1,并将 --num_processes 设置为 1 对应于模型并行性用例;而将 --gpusnum_processes 都设置为大于 1 对应于启用模型并行性和数据并行性的情况。例如,--gpus=4--num_processes=2 表示将生成 2 个 Horovod 进程,并且每个进程将占用 2 个 GPU 用于模型并行性。

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

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

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

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

注意

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

输入要求

  • 输入大小:3 * H * W (W, H >= 32)

  • 输入格式:JPG、JPEG、PNG

注意

分类输入图像不需要手动调整大小。输入数据加载器会自动将图像调整为 输入大小

使用示例

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

复制
已复制!
            

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

模型并行性

图像分类支持模型并行性。模型并行性是一种将整个模型拆分到多个 GPU 上的技术,每个 GPU 将保存模型的一部分。模型按层拆分。例如,如果模型有 100 层,那么我们可以将第 0-49 层放在 GPU 0 上,将第 50-99 层放在 GPU 1 上。当模型非常庞大,即使批次大小为 1 也无法容纳在单个 GPU 中时,模型并行性将非常有用。如果我们想增加 BatchNormalization 层看到的批次大小,从而可能提高准确率,模型并行性也很有用。可以通过在 training_config 中设置 model_parallelism 来启用此功能。例如,

复制
已复制!
            

model_parallelism: 0.3 model_parallelism: 0.7

将启用 2-GPU 模型并行性,其中第一个 GPU 将保存 30% 的模型层,第二个 GPU 将保存 70% 的模型层。模型层的百分比可以通过一些试错法进行调整,以便所有 GPU 消耗几乎相同的 GPU 内存大小,在这种情况下,我们可以为此模型并行化训练使用最大的批次大小。

模型并行性可以与数据并行性联合启用。例如,在上述情况下,我们启用了 2-GPU 模型并行性,同时我们还可以为其启用 4 个 Horovod 进程。在这种情况下,我们有 4 个用于数据并行性的 Horovod 进程,并且每个进程都将在 2 个 GPU 上拆分模型。

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

分类应用程序计算评估损失、Top-k 准确率、精确率和召回率作为指标。

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

复制
已复制!
            

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

必需参数

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

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

可选参数

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

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

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

如果您按照训练分类模型中的示例进行操作,请运行评估

复制
已复制!
            

tao model classification_tf1 evaluate -e classification_spec.cfg -k $YOUR_KEY

TAO 评估分类并生成以下指标

  • 损失

  • Top-K 准确率

  • 精确率 (P):TP / (TP + FP)

  • 召回率 (R):TP / (TP + FN)

  • 混淆矩阵

tao model classification_tf1 inference 命令对指定的输入图像集运行推理。对于分类,tao model classification_tf1 inference 为单个图像或 csv 文件(包含图像路径和多个图像的相应标签)提供命令行上的类标签输出。还可以启用 TensorRT Python 推理。

在 TAO 上训练的分类模型上执行 tao model classification_tf1 inference

复制
已复制!
            

tao model classification_tf1 inference [-h] -m <model> -i <image> -d <image dir> -k <key> -cm <classmap> -e <experiment_spec_file> [-b <batch size>] [--gpu_index <gpu_index>] [--log_file <log_file>]

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

必需参数

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

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

  • -d, --image_dir:用于推理的输入图像目录。

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

  • -cm, --class_map:指定类索引和标签映射的 json 文件。

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

可选参数

  • --batch_size:推理批次大小,默认值:1

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

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

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

注意

推理工具需要 cluster_params.json 文件来配置后处理块。当使用 -d 或目录模式执行时,将创建 result.csv 文件并将其存储在您使用 -d 指定的目录中。result.csv 的第一列包含文件路径,第二列包含预测标签。

注意

在单张图像和目录模式下,都需要类映射 (-cm),这应该是您的训练过程的副产品 (-classmap.json)。

剪枝从模型中删除参数以减小模型大小,同时使用 tao model classification_tf1 prune 命令确保模型本身的完整性。

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

复制
已复制!
            

tao model classification_tf1 prune [-h] -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>]

必需参数

  • -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。

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

使用 Prune 命令

以下是使用 tao model classification_tf1 prune 命令的示例

复制
已复制!
            

tao model classification_tf1 prune -m /workspace/output/weights/resnet_003.tlt -o /workspace/output/weights/resnet_003_pruned.tlt -eq union -pth 0.7 -k $KEY

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

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

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

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

复制
已复制!
            

tao model classification_tf1 export [-h] -m <path to the .tlt model file generated by training> -e <experiment_spec_file> [-k <key>] [-o <path to output file>] [--gen_ds_config <Flag to generate ds config and label file>] [--verbose] [--gpu_index <gpu_index>] [--log_file <log_file_path>] [--classmap_json CLASSMAP_JSON]

必需参数

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

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

可选参数

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

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

  • --gen_ds_config:一个布尔标志,指示是否在与 output_file 相同的目录中生成模板 DeepStream 相关配置 (“nvinfer_config.txt”) 以及标签文件 (“labels.txt”)。请注意,配置文件不是完整的配置文件,需要用户使用生成的参数更新 DeepStream 中的示例配置文件。

  • --classmap_json:classmap_json 文件的路径。它已在训练结果文件夹中生成。如果启用了 gen_ds_config,则需要此文件。

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

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

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

使用示例

以下是一个示例命令。

复制
已复制!
            

tao model classification_tf1 export -m /ws/output_retrain/weights/resnet_001.tlt -o /ws/export/final_model.etlt -k $KEY

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

有关使用 DeepStream 部署分类模型的更多信息,请参阅集成分类 (TF1/TF2) 模型页面。

上一篇 MaskRCNN
下一篇 多任务图像分类
© 版权所有 2024,NVIDIA。 上次更新时间:2024 年 10 月 15 日。