TAO v5.5.0

SSD

使用 SSD,支持以下任务

  • dataset_convert

  • train

  • evaluate

  • prune

  • inference

  • export

这些任务可以通过命令行按照以下提到的约定从 TAO Launcher 调用

复制
已复制!
            

tao model ssd <sub_task> <args_per_subtask>

其中,args_per_subtask 是给定子任务所需的命令行参数。以下详细解释了每个子任务。

TAO 中的对象检测应用程序期望使用 KITTI 格式的数据进行训练和评估。

有关 KITTI 数据格式的更多信息,请参阅数据注释格式页面。

ssd 数据加载器支持原始 KITTI 格式的数据以及 TFrecords。

为了使用 TFRecords 优化跨数据批次的迭代,需要首先将原始输入数据转换为 TFRecords 格式。这可以使用 dataset_convert 子任务完成。目前,支持 KITTI 和 COCO 格式。

dataset_convert 工具需要一个配置文件作为输入。以下章节包含配置文件的详细信息和示例。

数据集转换器的配置文件

dataset_convert 工具提供了几个可配置的参数。这些参数封装在一个 spec 文件中,用于将数据从原始注释格式转换为训练器可以摄取的 TFRecords 格式。可以使用 kitti_configcoco_config 分别配置 KITTI 和 COCO 格式。在一个 spec 文件中,您只能使用其中一个。spec 文件是一个 prototxt 格式的文件,具有以下全局参数

  • kitti_config:一个嵌套的 prototxt 配置,包含多个输入参数

  • coco_config:一个嵌套的 prototxt 配置,包含多个输入参数

  • image_directory_path:数据集根目录的路径。image_dir_name 被附加到此路径以获取输入图像,并且必须与实验 spec 文件中指定的路径相同。

  • target_class_mapping:prototxt 字典,将 tfrecords 中的类名映射到网络中要训练的目标类。

kitti_config

以下是 kitti_config 字段的可配置参数的描述

参数

数据类型

默认值

描述

支持的值

root_directory_path 字符串 数据集根目录的路径
image_dir_name 字符串 包含图像的目录相对于 root_directory_path 的路径。
label_dir_name 字符串 包含标签的目录相对于 root_directory_path 的路径。
partition_mode 字符串 将数据划分为多个 folds 时采用的方法。支持两种方法
  • 随机分区:数据分为 2 个 folds,trainval。此模式要求设置 val_split 参数。
  • 序列式分区:数据根据可用序列的数量划分为 n 个分区(由 num_partitions 参数定义)。
  • random
  • sequence
num_partitions 整数 2 (如果 partition_mode 为 random) 用于拆分数据的分区数(N folds)。当分区模型设置为 random 时,将忽略此字段,因为默认情况下仅生成两个分区:valtrain。在 sequence 模式下,数据分为 n-folds。分区数最好少于 kitti_sequence_to_frames 文件中的序列总数。 n=2 用于随机分区 n < kitti_sequence_to_frames_file 中的序列数
image_extension 字符串 .png image_dir_name 参数中图像的扩展名。 .png .jpg .jpeg
val_split 浮点数 20 要为验证分离的数据百分比。这仅在“random”分区模式下有效。此分区在生成的 TFrecords 的 fold 0 中可用。在 dataset_config 中将验证 fold 设置为 0 0-100
kitti_sequence_to_frames_file 字符串 KITTI 序列到帧映射文件的名称。此文件必须存在于 root_directory_path 中提到的数据集根目录下。
num_shards 整数 10 每个 fold 的 shards 数量。 1-20

下面显示的示例配置文件将 100% KITTI 数据集转换为训练集。

复制
已复制!
            

kitti_config { root_directory_path: "/workspace/tao-experiments/data/" image_dir_name: "training/image_2" label_dir_name: "training/label_2" image_extension: ".png" partition_mode: "random" num_partitions: 2 val_split: 0 num_shards: 10 } image_directory_path: "/workspace/tao-experiments/data/" target_class_mapping { key: "car" value: "car" } target_class_mapping { key: "pedestrian" value: "pedestrian" } target_class_mapping { key: "cyclist" value: "cyclist" } target_class_mapping { key: "van" value: "car" } target_class_mapping { key: "person_sitting" value: "pedestrian" } target_class_mapping { key: "truck" value: "car" }

coco_config

以下是 coco_config 字段的可配置参数的描述

参数

数据类型

默认值

描述

支持的值

root_directory_path 字符串 数据集根目录的路径
image_dir_names 字符串(重复) 包含图像的目录相对于 root_directory_path 的路径,用于每个分区。
annotation_files 字符串(重复) 包含 JSON 文件的目录相对于 root_directory_path 的路径,用于每个分区。
num_partitions 整数 2 数据中的分区数。分区数必须与 image_dir_namesannotation_files 的列表长度匹配。默认情况下,生成两个分区:valtrain n==len(annotation_files)
num_shards 整数(重复) [10] 每个分区的 shards 数量。如果仅提供一个值,则相同的 shards 数量应用于所有分区

下面显示的示例配置文件转换带有训练和验证数据的 COCO 数据集,其中验证的 shards 数量为 32,训练的 shards 数量为 256。

复制
已复制!
            

coco_config { root_directory_path: "/workspace/tao-experiments/data/coco" image_dir_names: ["val2017", "train2017"] annotation_files: ["annotations/instances_val2017.json", "annotations/instances_train2017.json"] num_partitions: 2 num_shards: [32, 256] } image_directory_path: "/workspace/tao-experiments/data/coco"

数据集转换器工具的示例用法

以下描述了 dataset_convert 工具

复制
已复制!
            

tao model ssd dataset-convert [-h] -d DATASET_EXPORT_SPEC -o OUTPUT_FILENAME [-v]

您可以使用以下参数

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

  • -d, --dataset-export-spec:检测数据集 spec 的路径,其中包含导出 .tfrecord 文件的配置

  • -o, --output_filename:输出文件名

  • -v:启用详细模式以显示调试消息

以下示例显示了如何将命令与数据集一起使用

复制
已复制!
            

tao model ssd dataset_convert -d /path/to/spec.txt -o /path/to/tfrecords/train

以下是 SSD spec 文件的示例。它有六个主要组成部分:ssd_configtraining_configeval_confignms_configaugmentation_configdataset_config。spec 文件的格式是 protobuf 文本 (prototxt) 消息,其每个字段可以是基本数据类型或嵌套消息。

复制
已复制!
            

random_seed: 42 ssd_config { aspect_ratios: "[[1.0, 2.0, 0.5], [1.0, 2.0, 0.5, 3.0, 1.0/3.0], [1.0, 2.0, 0.5, 3.0, 1.0/3.0], [1.0, 2.0, 0.5, 3.0, 1.0/3.0], [1.0, 2.0, 0.5], [1.0, 2.0, 0.5]]" scales: "[0.07, 0.15, 0.33, 0.51, 0.69, 0.87, 1.05]" two_boxes_for_ar1: true clip_boxes: false variances: "[0.1, 0.1, 0.2, 0.2]" arch: "resnet" nlayers: 18 freeze_bn: false freeze_blocks: 0 } training_config { batch_size_per_gpu: 16 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 } } eval_config { validation_period_during_training: 10 average_precision_mode: SAMPLE batch_size: 16 matching_iou_threshold: 0.5 } nms_config { confidence_threshold: 0.01 clustering_iou_threshold: 0.6 top_k: 200 } augmentation_config { output_width: 300 output_height: 300 output_channel: 3 image_mean { key: 'b' value: 103.9 } image_mean { key: 'g' value: 116.8 } image_mean { key: 'r' value: 123.7 } } dataset_config { data_sources: { # option 1 tfrecords_path: "/path/to/train/tfrecord" # option 2 # label_directory_path: "/path/to/train/labels" # image_directory_path: "/path/to/train/images" } include_difficult_in_training: true target_class_mapping { key: "car" value: "car" } target_class_mapping { key: "pedestrian" value: "pedestrian" } target_class_mapping { key: "cyclist" value: "cyclist" } target_class_mapping { key: "van" value: "car" } target_class_mapping { key: "person_sitting" value: "pedestrian" } validation_data_sources: { label_directory_path: "/path/to/val/labels" image_directory_path: "/path/to/val/images" } }

以下各节总结了 spec 文件的顶层结构。

训练配置

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

字段 描述 数据类型和约束 推荐/典型值
batch_size_per_gpu 每个 GPU 的批次大小,因此有效批次大小为 batch_size_per_gpu * num_gpus 无符号整数,正数
num_epochs 训练网络的 epoch 数 无符号整数,正数

enable_qat

是否使用量化感知训练

布尔值

注意:SSD 不支持加载已剪枝的非 QAT 模型并使用启用 QAT 的方式重新训练
它,反之亦然。例如,要获得已剪枝的 QAT 模型,
请使用启用 QAT 或 enable_qat=True 的方式执行初始训练。

learning_rate

仅支持具有这些嵌套参数的 soft_start_annealing_schedule。

1. min_learning_rate:整个实验期间的最小学习率
2. max_learning_rate:整个实验期间的最大学习率
3. soft_start:预热前经过的时间(以进度百分比表示
介于 0 和 1 之间)
4. annealing:开始退火学习率的时间

消息类型

regularizer

此参数配置训练时要使用的正则化器,并包含
以下嵌套参数。

1. type:要使用的正则化器的类型。NVIDIA 支持 NO_REG、L1 和 L2
2. weight:正则化器权重的浮点值

消息类型

L1

注意:NVIDIA 建议在剪枝前训练网络时使用 L1 正则化器
因为 L1 正则化有助于使网络权重更
易于剪枝。

max_queue_size 数据加载中预取批次的数量 无符号整数,正数
n_workers 用于数据加载的工作进程数(使用 tfrecords 时设置为小于 4) 无符号整数,正数
use_multiprocessing 是否使用 keras 序列数据加载器的多处理模式 布尔值
visualizer 训练可视化配置 消息类型
early_stopping 提前停止配置 消息类型
注意

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

训练可视化配置

训练期间的可视化由 visualizer 参数配置。下表描述了它的参数。

参数 描述 数据类型和约束 推荐/典型值
enabled 用于启用或禁用此功能的布尔标志 布尔值。
num_images 要在 TensorBoard 中可视化的最大图像数量。 整数。 3

如果启用可视化,则将在训练期间生成 tensorboard 日志,包括学习率、训练损失、验证损失、验证 mAP 和每个类的验证 AP 的图表。并且带有 bbox 的增强图像也将在 tensorboard 中生成。

提前停止

下表描述了提前停止的参数。

参数 描述 数据类型和约束 推荐/典型值
monitor 为了启用提前停止而要监控的指标。 字符串 loss
patience 在停止训练之前检查 monitor 值的次数。 整数
min_delta monitor 值的最小值增量,低于该值我们认为它没有减少。 浮点数

评估配置

评估配置 (eval_config) 定义了在训练期间或作为独立过程进行评估所需的参数。下表总结了详细信息。

字段 描述 数据类型和约束 推荐/典型值
validation_period_during_training 每次验证的训练 epoch 数 无符号整数,正数 10

average_precision_mode

平均精度 (AP) 计算模式可以是 SAMPLE 或 INTEGRATE。SAMPLE
用作 VOC 指标,用于 VOC 2009 或更早版本。INTEGRATE 用于 VOC 2010 或之后版本。

ENUM 类型 (SAMPLE 或 INTEGRATE)

SAMPLE

matching_iou_threshold 预测框和 ground truth 框的最低 IoU,可以被认为是匹配。 布尔值 0.5
visualize_pr_curve 用于启用或禁用 Precision-Recall 曲线可视化的布尔标志。 布尔值

NMS 配置

NMS 配置 (nms_config) 定义了 NMS 后处理所需的参数。NMS 配置适用于训练、验证、评估、推理和导出中模型的 NMS 层。下表总结了详细信息。

字段 描述 数据类型和约束 推荐/典型值
confidence_threshold 在应用 NMS 之前,置信度得分低于 confidence_threshold 的框将被丢弃。 浮点数 0.01
cluster_iou_threshold IoU 阈值,低于该阈值的框将通过 NMS 过程。 浮点数 0.6
top_k NMS keras 层之后将输出 top_k 个框。如果有效框的数量少于 k,则返回的数组将填充置信度得分为 0 的框。 无符号整数 200
infer_nms_score_bits 用于表示 TensorRT OSS 中 NMS 插件中得分值的位数。有效范围是 [1, 10] 中的整数。将其设置为任何其他值将使其回退到普通 NMS。目前,此优化的 NMS 插件仅在 FP16 中可用,但它也应由 INT8 数据类型选择,因为 TensorRT OSS 中没有 INT8 NMS,因此将选择 FP16 中最快的实现。如果回退到普通 NMS,则构建引擎时的实际数据类型将决定运行的确切精度(FP16 或 FP32)。 整数。在 [1, 10] 区间内。 0

增强配置

augmentation_config 参数定义了预处理后的图像大小。SSD 论文中的增强方法将在训练期间执行,包括随机翻转、放大、缩小和颜色抖动。增强后的图像将调整为 augmentation_config 中定义的输出形状。在评估过程中,只会执行调整大小。

注意

增强方法的详细信息可以在 论文的第 2.2 节和 3.6 节中找到。

字段 描述 数据类型和约束 推荐/典型值
output_channel 增强管道的输出图像通道。 整数
output_width 预处理图像和网络输入的宽度。 整数,32 的倍数
output_height 预处理图像和网络输入的高度。 整数,32 的倍数
random_crop_min_scale RandomCrop 增强的最小 patch 比例。默认值:0.3 浮点数 >= 1.0
random_crop_max_scale RandomCrop 增强的最大 patch 比例。默认值:1.0 浮点数 >= 1.0
random_crop_min_ar RandomCrop 增强的最小纵横比。默认值:0.5 浮点数 > 0
random_crop_max_ar RandomCrop 增强的最大纵横比。默认值:2.0 浮点数 > 0
zoom_out_min_scale ZoomOut 增强的最小比例。默认值:1.0 浮点数 >= 1.0
zoom_out_max_scale ZoomOut 增强的最大比例。默认值:4.0 浮点数 >= 1.0
brightness 颜色抖动增强中的亮度增量。默认值:32 整数 >= 0
contrast 颜色抖动增强中的对比度增量因子。默认值:0.5 [0, 1) 的浮点数
saturation 颜色抖动增强中的饱和度增量因子。默认值:0.5 [0, 1) 的浮点数
hue 颜色抖动增强中的色调增量。默认值:18 整数 >= 0
random_flip 执行随机水平翻转的概率。默认值:0.5 [0, 1) 的浮点数
image_mean 用于指定图像均值的键/值对。如果省略,ImageNet 均值将用于图像预处理。如果设置,则根据 output_channel,必须配置 'r/g/b' 或 'l' 键/值对。 字典
注意

如果设置 random_crop_min_scale = random_crop_max_scale = 1.0,则 RandomCrop 增强将被禁用。同样,设置 zoom_out_min_scale = zoom_out_max_scale = 1,ZoomOut 增强将被禁用。如果所有颜色抖动增量值都设置为 0,则颜色抖动增强将被禁用。

数据集配置

dataset_config 参数定义了训练数据集、验证数据集和 target_class_mapping 的路径。

字段 描述 数据类型和约束 推荐/典型值
data_sources 训练数据集的路径。当使用 tfrecord 作为数据集摄取时,设置
  • tfrecords_path:tfrecords 的路径

当使用原始 KITTI 标签和图像时,设置

  • label_directory_path:标签目录的路径
  • image_directory_path:图像目录的路径
消息类型
include_difficult_in_training 指定是否在标签中包含困难对象(Pascal VOC difficult 标签或 KITTI 遮挡对象) 布尔值 true
validation_data_sources 训练数据集图像和标签的路径 消息类型
target_class_mapping 标签中类到目标类的映射 消息类型
注意

data_sourcesvalidation_data_sources 都是重复字段。可以将多个数据集添加到 sources。

SSD 配置

SSD 配置 (ssd_config) 定义了构建 SSD 模型所需的参数。下表总结了详细信息。

字段 描述 数据类型和约束 推荐/典型值
aspect_ratios_global 在 aspect_ratios_global 中定义的纵横比的 anchor boxes 将为用于预测的每个特征层生成。请注意,aspect_ratios_global 或 aspect_ratios 参数是必需的;您不需要同时指定两者。 字符串 “[1.0, 2.0, 0.5, 3.0, 0.33]”
aspect_ratios 不同 SSD 特征层的 anchor boxes 的纵横比注意:aspect_ratios_global 或 aspect_ratios 参数是必需的;您不需要同时指定两者。 字符串 “[[1.0,2.0,0.5], [1.0,2.0,0.5], [1.0,2.0,0.5], [1.0,2.0,0.5], [1.0,2.0,0.5], [1.0, 2.0, 0.5, 3.0, 0.33]]”
two_boxes_for_ar1 如果此参数为 True,则将生成两个纵横比为 1 的框。一个具有此层的比例,另一个具有作为此层的比例和下一层的比例的几何平均值的比例。 布尔值 True
clip_boxes 如果为 true,则将截断所有角点 anchor boxes,使其完全位于特征图像内。 布尔值 False
scales 一个正浮点数列表,其中包含每个卷积预测器层的缩放因子。此列表的元素数量必须比预测器层的数量多一个,以便如果 two_boxes_for_ar1 为 true,则最后一层的第二个纵横比 1.0 框可以具有适当的比例。除了此列表中的最后一个元素外,每个正浮点数都是该层中框的缩放因子。例如,如果一层的比例为 0.1,则该层生成的纵横比为 1 的 anchor box(如果 two_boxes_for_ar1 设置为 True,则为第一个纵横比 1 框)的高度和宽度将为 0.1*min(img_h, img_w)。min_scale 和 max_scale 是两个正浮点数。如果它们都出现在配置中,则程序可以通过均匀分割 min_scale 和 max_scale 之间的空间来自动生成比例。 字符串 “[0.05, 0.1, 0.25, 0.4, 0.55, 0.7, 0.85]”
min_scale/max_scale variances 如果它们都出现在配置中,则将通过均匀分割 min_scale 和 max_scale 之间的空间来均匀生成比例。包含 4 个正浮点数的列表。这四个浮点数按顺序表示框中心 x、框中心 y、log 框高度和 log 框宽度的方差。框中心 (cx, cy) 的框偏移和相对于 anchor 的 log 框大小(高度/宽度)将除以其各自的方差值。因此,较大的方差会导致两个不同的框在编码偏移量上的差异不显着。 浮点数
steps 一个可选列表,用引号引起来,长度是用于预测的特征层数。元素应为浮点数或两个浮点数的元组/列表。步骤定义了 anchor-box 中心点应相隔多少像素。如果元素是浮点数,则垂直和水平边距相同。否则,第一个值是 step_vertical,第二个值是 step_horizontal。如果未提供步骤,则 anchor boxes 将均匀分布在图像内部。 字符串
offsets 一个可选的浮点数列表,用引号引起来,长度等于用于预测的特征层数。第一个 anchor box 的边距为 offsets[i]*steps[i] 像素,从左侧和顶部边框开始。如果未提供偏移量,则默认值将为 0.5。 字符串
arch 用于特征提取的骨干网络。目前,支持“resnet”、“vgg”、“darknet”、“googlenet”、“mobilenet_v1”、“mobilenet_v2”和“squeezenet”。 字符串 resnet
nlayers 特定 arch 中的 conv 层数。对于“resnet”,支持 10、18、34、50 和 101。对于“vgg”,支持 16 和 19。对于“darknet”,支持 19 和 53。所有其他网络都没有此配置,用户应从配置文件中删除此参数。 无符号整数
freeze_bn 是否在训练期间冻结所有批归一化层。 布尔值 False
freeze_blocks 在模型训练期间要冻结的块 ID 列表。您可以选择冻结模型中的某些 CNN 块,以使训练更稳定和/或更容易收敛。块的定义对于特定架构是启发式的。例如,按步幅或按模型中的逻辑块等。但是,块 ID 号按顺序识别模型中的块,因此您不必知道执行训练时块的确切位置。作为一般原则,块 ID 越小,它越靠近模型输入;块 ID 越大,它越靠近模型输出。您可以将整个模型划分为几个块,并有选择地冻结其中的一部分。请注意,对于 FasterRCNN,您只能冻结 ROI 池化层之前的块。ROI 池化层之后的任何层无论如何都不会被冻结。对于不同的骨干网络,块的数量和每个块的块 ID 是不同的。值得详细解释一下如何为每个骨干网络指定块 ID。 列表(重复整数)
  • ResNet 系列。对于 ResNet 系列,可用于冻结的块 ID 是 [0, 1, 2, 3](含)的任何子集
  • VGG 系列。对于 VGG 系列,可用于冻结的块 ID 是 [1, 2, 3, 4, 5](含)的任何子集
  • GoogLeNet。对于 GoogLeNet,可用于冻结的块 ID 是 [0, 1, 2, 3, 4, 5, 6, 7](含)的任何子集
  • 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](含)的任何子集
  • DarkNet。对于 DarkNet 19 和 DarkNet 53,可用于冻结的块 ID 是 [0, 1, 2, 3, 4, 5](含)的任何子集

使用此命令训练 SSD 模型

复制
已复制!
            

tao model ssd train [-h] -e <experiment_spec> -r <output_dir> -k <key> [--gpus <num_gpus>] [--gpu_index <gpu_index>] [--use_amp] [--log_file <log_file>] [-m <resume_model_path>] [--initial_epoch <initial_epoch>]

必需参数

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

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

  • -e, --experiment_spec_file:用于设置评估实验的实验规范文件。这应与训练规范文件相同。

可选参数

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

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

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

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

  • -m, --resume_model_weights:预训练模型或要继续训练的模型的路径。

  • --initial_epoch:要从其恢复的 Epoch 编号。

  • --use_multiprocessing:在数据生成器中启用多处理模式。

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

输入要求

  • 输入大小:C * W * H(其中 C = 1 或 3,W >= 128,H >= 128)

  • 图像格式:JPG、JPEG、PNG

  • 标签格式:KITTI 检测

示例用法

以下是在 SSD 模型上使用 train 命令的示例

复制
已复制!
            

tao model ssd train --gpus 2 -e /path/to/spec.txt -r /path/to/result -k $KEY

使用以下命令对 SSD 模型运行评估

复制
已复制!
            

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

必需参数

  • -m, --model:要评估的 .tlt 模型或 TensorRT 引擎。

  • -e, --experiment_spec_file:用于设置评估实验的实验 spec 文件。这应与训练 spec 文件相同。

可选参数

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

  • -k, --key.tlt 模型的编码密钥

  • --gpu_index:用于运行评估的 GPU 索引(当机器安装了多个 GPU 时很有用)。请注意,评估只能在单个 GPU 上运行。

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

以下是评估 SSD 模型的示例命令

复制
已复制!
            

tao model ssd evaluate -m /path/to/trained_tlt_ssd_model -k <model_key> -e /path/to/ssd_spec.txt

SSD 网络的 inference 命令可用于可视化 bboxes 或在图像目录上生成逐帧 KITTI 格式标签。以下是使用此工具的示例

复制
已复制!
            

tao model ssd inference [-h] -i <input directory> -o <output annotated image directory> -e <experiment spec file> -m <model file> -k <key> [-l <output label directory>] [-t <bbox filter threshold>] [--gpu_index <gpu_index>] [--log_file <log_file>]

必需参数

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

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

  • -o, --out_image_dir:输出带注释图像的目录路径。

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

  • -e, --config_path:训练实验 spec 文件的路径。

可选参数

  • -t, --threshold:用于绘制 bbox 和转储标签文件的阈值。(默认值:0.3)。

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

  • -l, --out_label_dir:用于输出 KITTI 标签的目录。

  • --gpu_index:用于运行推理的 GPU 索引(当机器安装了多个 GPU 时很有用)。请注意,评估只能在单个 GPU 上运行。

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

以下是使用 SSD 模型进行推理的示例

复制
已复制!
            

tao model ssd inference -i /path/to/input/images_dir -o /path/to/output/dir -m /path/to/trained_tlt_ssd_model -k <model_key> -e /path/to/ssd_spec.txt

剪枝从模型中删除参数以减小模型大小,而不会损害模型本身的完整性。

prune 命令包括以下参数

复制
已复制!
            

tao model ssd prune [-h] -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>] [--gpu_index <gpu_index>] [--log_file <log_file>]

必需参数

  • -m, --pretrained_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 ssd 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 ssd train 命令,并使用更新的 spec 文件,该文件指向新剪枝的模型作为预训练模型文件。

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

注意

SSD 不支持加载已剪枝的非 QAT 模型并使用启用 QAT 的方式重新训练它,反之亦然。例如,要获得已剪枝的 QAT 模型,请使用启用 QAT 或 enable_qat=True 的方式执行初始训练。

TAO 包括 export 命令,用于导出和准备 TAO 模型以部署到 DeepStreamexport 命令可以选择性地为 TensorRT INT8 引擎校准生成校准缓存。

导出模型将训练过程与推理分离,并允许在 TAO 环境之外转换为 TensorRT 引擎。TensorRT 引擎特定于每个硬件配置,应为每个唯一的推理环境生成。这可以互换地称为 .trt.engine 文件。相同的导出 TAO 模型可以在训练和部署硬件之间通用使用。这称为 .etlt 文件或加密的 TAO 文件。在模型导出期间,TAO 模型使用私钥加密。当您部署此模型进行推理时,需要此密钥。

INT8 模式概述

TensorRT 引擎可以在 INT8 模式下生成以提高性能,但需要在引擎创建时使用校准缓存。如果运行 export--data_type 标志设置为 int8,则校准缓存是使用校准张量文件生成的。预先生成校准信息并缓存它消除了在推理机器上校准模型的需要。移动校准缓存通常比移动校准张量文件方便得多,因为它是一个小得多的文件,可以与导出的模型一起移动。使用校准缓存还可以加快引擎创建速度,因为构建缓存可能需要几分钟才能生成,具体取决于 Tensorfile 的大小和模型本身。

导出工具可以通过使用以下方法摄取训练数据来生成 INT8 校准缓存

  • 将工具指向要用于校准模型的图像目录。对于此选项,请确保创建随机图像的子采样目录,这些图像最能代表您的训练数据集。

FP16/FP32 模型

只有当您需要在 INT8 精度下运行推理时,才需要 calibration.bin。对于基于 FP16/FP32 的推理,导出步骤要简单得多:您只需提供来自 train 步骤的模型到 export,即可将其转换为加密的 TAO 模型。

fp16_fp32_export.png

导出命令

使用以下命令导出 SSD 模型

复制
已复制!
            

tao model ssd export [-h] -m <path to the .tlt model file generated by tao model train> -k <key> -e <path to experiment spec file> [-o <path to output file>] [--cal_json_file <path to calibration json file>] [--gen_ds_config] [--gpu_index <gpu_index>] [--log_file <log_file_path>] [--verbose]

必需参数

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

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

  • -e, --experiment_spec:spec 文件的路径。

可选参数

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

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

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

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

QAT 导出模式所需参数

  • --cal_json_file:包含 QAT 模型张量比例的 json 文件的路径。如果要生成 QAT 模型的引擎,则此参数是必需的。

注意

导出使用 QAT 启用的模型时,用于校准激活的张量比例因子将从模型中剥离出来,并序列化为 cal_json_file 参数定义的 TensorRT 可读缓存文件。

导出模型

以下是导出 SSD 模型的示例命令

复制
已复制!
            

tao model ssd export -m $USER_EXPERIMENT_DIR/data/ssd/ssd_kitti_retrain_epoch12.tlt \ -o $USER_EXPERIMENT_DIR/data/ssd/ssd_kitti_retrain.int8.etlt \ -e $SPECS_DIR/ssd_kitti_retrain_spec.txt \ --key $KEY

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

有关部署到 DeepStream,请参阅将 SSD 部署到 DeepStream

Previous YOLOv4-tiny
Next DSSD
© 版权所有 2024,NVIDIA。 上次更新时间:2024 年 10 月 15 日。