TAO v5.5.0

DetectNet_v2

DetectNet_v2 是 NVIDIA 开发的对象检测模型,包含在 TAO 中。DetectNet_v2 支持以下任务

  • dataset_convert

  • train

  • evaluate

  • inference

  • prune

  • calibration_tensorfile

  • export

这些任务可以使用 TAO Launcher 从命令行调用,使用以下约定

复制
已复制!
            

tao model detectnet_v2 <sub_task> <args_per_subtask>

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

NVIDIA 建议遵循下图中的工作流程,以生成经过训练和优化的 DetectNet_v2 模型。

tao_workflow_detectnet_v2.png

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

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

DetectNet_v2 应用程序需要将原始输入数据转换为 TFRecords,以便在数据批次中进行优化迭代。这可以使用 DetectNet_v2 下的 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 string 数据集根目录的路径
image_dir_name string 包含图像的目录的相对路径,相对于 root_directory_path 中的路径。
label_dir_name string 包含标签的目录的相对路径,相对于 root_directory_path 中的路径。
partition_mode string 将数据划分为多个 folds 时采用的方法。支持两种方法
  • 随机划分:数据分为 2 个 folds,trainval。此模式要求设置 val_split 参数。
  • 序列式划分:数据根据可用序列的数量划分为 n 个分区(由 num_partitions 参数定义)。
  • random
  • sequence
num_partitions int 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 str .png image_dir_name 参数中图像的扩展名。 .png .jpg .jpeg
val_split float 20 要为验证分离的数据百分比。这仅在 “random” 分区模式下有效。此分区在生成的 TFrecords 的 fold 0 中可用。在 dataset_config 中将验证 fold 设置为 0 0-100
kitti_sequence_to_frames_file str KITTI 序列到帧映射文件的名称。此文件必须存在于数据集根目录中,如 root_directory_path 中所述。
num_shards int 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 string 数据集根目录的路径
image_dir_names string (repeated) 包含图像的目录的相对路径,相对于 root_directory_path 中的路径,适用于每个分区。
annotation_files string (repeated) 包含 JSON 文件的目录的相对路径,相对于 root_directory_path 中的路径,适用于每个分区。
num_partitions int 2 数据中的分区数。分区数必须与 image_dir_namesannotation_files 的列表长度匹配。默认情况下,生成两个分区:valtrain n==len(annotation_files)
num_shards int (repeated) [10] 每个分区的 shards 数量。如果仅提供一个值,则相同的 shards 数量将应用于所有分区

下面显示的示例配置文件转换包含训练和验证数据的 COCO 数据集,其中验证的 shard 数量为 32,训练的 shard 数量为 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"

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

虽然 KITTI 是对象检测的公认数据集格式,但 DetectNet_v2 训练器需要将此数据转换为 TFRecord 文件才能摄取。dataset_convert 工具描述如下

复制
已复制!
            

tao model detectnet_v2 dataset_convert [-h] -d DATASET_EXPORT_SPEC -o OUTPUT_FILENAME [-f VALIDATION_FOLD]

您可以使用以下可选参数

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

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

  • -o output_filename: 输出文件名

  • -f, –validation-fold: 基于 0 的索引中的验证 fold。修改训练集时是必需的,否则是可选的。

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

复制
已复制!
            

tao model detectnet_v2 dataset_convert [-h] -d <path_to_tfrecords_conversion_spec> -o <path_to_output_tfrecords>

以下是执行 tao model detectnet_v2 dataset_convert 的输出日志

复制
已复制!
            

Using TensorFlow backend. 2019-07-16 01:30:59,073 - iva.detectnet_v2.dataio.build_converter - INFO - Instantiating a kitti converter 2019-07-16 01:30:59,243 - iva.detectnet_v2.dataio.kitti_converter_lib - INFO - Num images in Train: 10786 Val: 2696 2019-07-16 01:30:59,243 - iva.detectnet_v2.dataio.kitti_converter_lib - INFO - Validation data in partition 0. Hence, while choosing the validation set during training choose validation_fold 0. 2019-07-16 01:30:59,251 - iva.detectnet_v2.dataio.dataset_converter_lib - INFO - Writing partition 0, shard 0 /usr/local/lib/python2.7/dist-packages/iva/detectnet_v2/dataio/kitti_converter_lib.py:265: VisibleDeprecationWarning: Reading unicode strings without specifying the encoding argument is deprecated. Set the encoding, use None for the system default. 2019-07-16 01:31:01,226 - iva.detectnet_v2.dataio.dataset_converter_lib - INFO - Writing partition 0, shard 1 . . sheep: 242 bottle: 205 .. boat: 171 car: 418 2019-07-16 01:31:20,772 - iva.detectnet_v2.dataio.dataset_converter_lib - INFO - Writing partition 1, shard 0 .. 2019-07-16 01:32:40,338 - iva.detectnet_v2.dataio.dataset_converter_lib - INFO - Writing partition 1, shard 9 2019-07-16 01:32:49,063 - iva.detectnet_v2.dataio.dataset_converter_lib - INFO - Wrote the following numbers of objects: sheep: 695 .. car: 1770 2019-07-16 01:32:49,064 - iva.detectnet_v2.dataio.dataset_converter_lib - INFO - Cumulative object statistics 2019-07-16 01:32:49,064 - iva.detectnet_v2.dataio.dataset_converter_lib - INFO - Wrote the following numbers of objects: sheep: 937 .. car: 2188 2019-07-16 01:32:49,064 - iva.detectnet_v2.dataio.dataset_converter_lib - INFO - Class map. Label in GT: Label in tfrecords file sheep: sheep .. boat: boat For the dataset_config in the experiment_spec, please use labels in the tfrecords file, while writing the classmap. 2019-07-16 01:32:49,064 - iva.detectnet_v2.dataio.dataset_converter_lib - INFO - Tfrecords generation complete.

注意

dataset_convert 工具将 KITTI 格式数据文件中的类名称转换为小写字符。因此,在配置训练实验时,请确保在目标类映射下的 dataset_config 部分中使用小写类名称。在 dataset_config 部分中使用不正确的类名称可能会导致 mAP 为 0 的无效训练实验。

注意

当使用 dataset_convert 工具为评估创建单独的 TFRecords 时(可以使用参数 validation_data_sourcedataset_config 下定义),我们建议将 partition_mode 设置为 random,包含 2 个分区和任意 val_split (1-100)。数据加载器负责遍历所有 folds 并相应地生成 mAP。

要为 DetectNet_v2 执行训练、评估和推理,您需要配置多个组件,每个组件都有自己的参数。DetectNet_v2 实验的 trainevaluate 任务共享同一个配置文件。inference 任务使用单独的配置文件。

DetectNet_v2 训练的 spec 文件配置了训练管道的以下组件

  • 模型

  • BBox 真值生成

  • 后处理模块

  • 成本函数配置

  • 训练器

  • 增强模型

  • 评估器

  • 数据加载器

模型配置

可以使用 spec 文件中的 model_config 选项配置核心对象检测模型。

以下是示例模型配置,用于实例化具有预训练权重和冻结块 0 和 1 的 ResNet-18 模型,并将所有快捷方式设置为投影层。

复制
已复制!
            

# Sample model config for to instantiate a resnet18 model with pretrained weights and freeze blocks 0, 1 # with all shortcuts having projection layers. model_config { arch: "resnet" pretrained_model_file: <path_to_model_file> freeze_blocks: 0 freeze_blocks: 1 all_projections: True num_layers: 18 use_pooling: False use_batch_norm: True dropout_rate: 0.0 objective_set: { cov {} bbox { scale: 35.0 offset: 0.5 } } }

下表描述了 model_config 参数

参数

数据类型

默认值

描述

支持的值

all_projections bool False 对于具有快捷连接的模板,此参数定义是否应使用 1x1 投影层实例化所有快捷方式,而不管输入和输出之间的步幅是否发生变化。 TrueFalse(仅在 ResNet 模板中使用)
arch string resnet 用于训练的骨干特征提取器的架构。
  • resnet
  • vgg
  • mobilenet_v1
  • mobilenet_v2
  • googlenet
num_layers int 18 可扩展模板的特征提取器的深度。
  • resnet: 10, 18, 34, 50, 101
  • vgg: 16, 19
pretrained model file string 此参数定义预训练 TAO 模型文件的路径。如果 load_graph flag 设置为 false,则假定仅使用预训练模型文件的权重。在这种情况下,TAO train 在实验中构建特征提取器图,并从具有匹配层名称的预训练模型文件中加载权重。因此,支持跨不同分辨率和域的迁移学习。对于预训练模型中可能不存在的层,该工具使用随机权重初始化它们,并跳过该层的导入。 Unix 路径
use_pooling Boolean False 在下采样时,选择使用步幅卷积还是 MaxPooling。当 True 时,MaxPooling 用于下采样;但是,对于对象检测网络,NVIDIA 建议将其设置为 False 并使用步幅卷积。 TrueFalse
use_batch_norm Boolean False 一个标志,用于确定是否使用批归一化层。 TrueFalse
objective_set Proto 字典 用于训练网络的目标。对于对象检测网络,将其设置为学习 covbbox。对于当前的训练管道,不应更改这些参数。 cov {} bbox { scale: 35.0 offset: 0.5 }
dropout_rate Float 0.0 dropout 的概率 0.0-0.1
load_graph Boolean False 一个标志,用于确定是否从预训练模型文件加载图,还是仅加载权重。对于剪枝模型,将此参数设置为 True。剪枝会修改原始图,因此需要导入剪枝后的模型图和权重。 TrueFalse
freeze_blocks float (repeated) 此参数定义可以从实例化的特征提取器模板中冻结哪些块,并且对于不同的特征提取器模板是不同的。
  • ResNet 系列:对于 ResNet 系列,可用于冻结的块 ID 是 [0, 1, 2, 3, 4](包含)的任何子集。
  • 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](包含)的任何子集。
freeze_bn Boolean False 一个标志,用于确定在模型训练期间是否冻结批归一化层。 TrueFalse

BBox 真值生成器

DetectNet_v2 生成 2 个张量,covbbox。图像被划分为 16x16 网格单元。cov 张量(“coverage” 张量的缩写)定义了被对象覆盖的网格单元数。bbox 张量定义了对象左上角 (x1, y1) 和右下角 (x2, y2) 相对于网格单元的归一化图像坐标。为了获得最佳结果,您可以假设覆盖区域是 bbox 标签内的椭圆,中心单元格分配最大置信度,并向外减少覆盖范围。每个类都有自己的 coverage 和 bbox 张量,因此张量的形状如下

  • cov: Batch_size, Num_classes, image_height/16, image_width/16

  • bbox: Batch_size, Num_classes * 4, image_height/16, image_width/16(其中 4 是每个单元格的坐标数)

以下是 3 类检测器的示例栅格化器配置

复制
已复制!
            

# Sample rasterizer configs to instantiate a 3 class bbox rasterizer bbox_rasterizer_config { target_class_config { key: "car" value: { cov_center_x: 0.5 cov_center_y: 0.5 cov_radius_x: 0.4 cov_radius_y: 0.4 bbox_min_radius: 1.0 } } target_class_config { key: "cyclist" value: { cov_center_x: 0.5 cov_center_y: 0.5 cov_radius_x: 0.4 cov_radius_y: 0.4 bbox_min_radius: 1.0 } } target_class_config { key: "pedestrian" value: { cov_center_x: 0.5 cov_center_y: 0.5 cov_radius_x: 0.4 cov_radius_y: 0.4 bbox_min_radius: 1.0 } } deadzone_radius: 0.67 }

bbox_rasterizer 具有以下可配置参数

参数

数据类型

默认值

描述

支持的值

deadzone radius float 0.67 围绕对象椭圆的要被视为休眠区域(或无 bbox 区域)的区域。这在对象重叠的情况下特别有用,这样前景对象和背景对象就不会混淆。 0-1.0
target_class_config proto 字典 这是一个嵌套的配置字段,用于定义给定类的对象的覆盖区域。对于每个类,此字段都会重复。以下是 target_class_config 的可配置参数
  • cov_center_x (float): 对象的中心 x 坐标
  • cov_center_y (float): 对象的中心 y 坐标
  • cov_radius_x (float): 覆盖椭圆的 x 半径
  • cov_radius_y (float): 覆盖椭圆的 y 半径
  • bbox_min_radius (float): 为框绘制的覆盖区域的最小半径
  • cov_center_x: 0.0 - 1.0
  • cov_center_y: 0.0 - 1.0
  • cov_radius_x: 0.0 - 1.0
  • cov_radius_y: 0.0 - 1.0
  • bbox_min_radius: 0.0 - 1.0

后处理器

后处理器模块从原始检测输出生成可渲染的边界框。该过程包括以下步骤

  • 通过使用 coverage 张量中的置信度值对对象进行阈值处理,过滤掉有效的检测。

  • 使用 DBSCAN 对原始过滤后的预测进行聚类,以生成最终渲染的边界框。

  • 根据最终置信度阈值过滤掉较弱的聚类,该阈值从分组到聚类的候选框中导出。

以下是为 3 类网络学习 carcyclistpedestrian 的后处理器的示例定义

复制
已复制!
            

postprocessing_config { target_class_config { key: "car" value: { clustering_config { coverage_threshold: 0.005 dbscan_eps: 0.15 dbscan_min_samples: 1 minimum_bounding_box_height: 20 } } } target_class_config { key: "cyclist" value: { clustering_config { coverage_threshold: 0.005 dbscan_eps: 0.15 dbscan_min_samples: 1 minimum_bounding_box_height: 20 } } } target_class_config { key: "pedestrian" value: { clustering_config { coverage_threshold: 0.005 dbscan_eps: 0.15 dbscan_min_samples: 1 minimum_bounding_box_height: 20 } } } }

本节定义配置后处理器的参数。对于您可以训练的每个类,postprocessing_config 都有一个 target_class_config 元素,用于定义此类的聚类参数。每个目标类的参数包括以下内容

参数

数据类型

默认值

描述

支持的值

key string 后处理器模块正在配置的类的名称 网络对象类名称,在 cost_function_config 中提及。
value clustering _config proto 嵌套的 clustering-config proto 参数,用于配置后处理器模块。此模块的参数在下表中定义。 封装的对象,其中包含以下定义的参数。

clustering_config 元素配置此类的聚类块。以下是此元素的参数

参数 数据类型 默认值 描述 支持的值
coverage_threshold float coverage 张量输出的最小阈值,被视为用于聚类的有效候选框。来自 bbox 张量的相应索引处的四个坐标将传递以进行聚类。 0.0 - 1.0
dbscan_eps float 两个样本之间被认为在彼此邻域中的最大距离。这不是聚类内点距离的最大边界。dbscan_eps 值越大,分组在一起的框就越多。 0.0 - 1.0
dbscan_min_samples int 邻域中被视为核心点的点的总权重。这包括点本身。 >0
minimum_bounding_box_height int 聚类后要考虑作为有效检测的最小高度(以像素为单位)。 0 - 输入图像高度
clustering_algorithm enum DBSCAN 定义后处理算法,以将原始检测聚类到最终 bbox 渲染。当使用 HYBRID 模式时,请确保同时定义 DBSCANNMS 配置参数。 DBSCAN, NMS, HYBRID
dbscan_confidence_threshold float 0.1 用于过滤掉来自 DBSCAN 的聚类边界框输出的置信度阈值。 > 0.0
nms_iou_threshold float 0.2 Intersection Over Union (IOU) 阈值,用于从原始检测中过滤掉冗余框,以形成最终聚类输出。 (0.0 - 1.0)
nms_confidence_threshold float 0. 用于从 NMS 中过滤掉聚类边界框的置信度阈值。 0.0 - 1.0

在 TAO 3.21.08 中,DetectNet_v2 支持三种方法来聚类网络中的原始检测,以获得最终渲染的边界框。

  • DBSCAN: 基于密度的空间聚类应用

  • NMS: 非极大值抑制

  • HYDRID: DBSCAN + NMS

HYBRID 聚类下,DetectNet_v2 后处理首先将原始网络输出传递到 DBSCAN 聚类,并将来自 DBSCAN 的每个聚类的候选框用作 NMS 的输入。NMS 聚类生成最终渲染的框。

注意

对于 HYBRID 聚类,请确保在后处理配置中定义了 DBSCANNMS 相关参数。

成本函数

本节介绍如何配置成本函数以包含您要训练的类。对于您要训练的每个类,将目标类的新条目添加到 spec 文件中。我们建议不要更改 spec 文件中的参数,以便在使用这些类时获得最佳性能。此处的其他参数应保持不变。

复制
已复制!
            

cost_function_config { target_classes { name: "car" class_weight: 1.0 coverage_foreground_weight: 0.05 objectives { name: "cov" initial_weight: 1.0 weight_target: 1.0 } objectives { name: "bbox" initial_weight: 10.0 weight_target: 10.0 } } target_classes { name: "cyclist" class_weight: 1.0 coverage_foreground_weight: 0.05 objectives { name: "cov" initial_weight: 1.0 weight_target: 1.0 } objectives { name: "bbox" initial_weight: 10.0 weight_target: 1.0 } } target_classes { name: "pedestrian" class_weight: 1.0 coverage_foreground_weight: 0.05 objectives { name: "cov" initial_weight: 1.0 weight_target: 1.0 } objectives { name: "bbox" initial_weight: 10.0 weight_target: 10.0 } } enable_autoweighting: True max_objective_weight: 0.9999 min_objective_weight: 0.0001 }

训练器

以下是配置 DetectNet_v2 训练器的示例 training_config

复制
已复制!
            

training_config { batch_size_per_gpu: 16 num_epochs: 80 learning_rate { soft_start_annealing_schedule { min_learning_rate: 5e-6 max_learning_rate: 5e-4 soft_start: 0.1 annealing: 0.7 } } regularizer { type: L1 weight: 3e-9 } optimizer { adam { epsilon: 1e-08 beta1: 0.9 beta2: 0.999 } } cost_scaling { enabled: False initial_exponent: 20.0 increment: 0.005 decrement: 1.0 } visualizer { enabled: true num_images: 3 scalar_logging_frequency: 10 infrequent_logging_frequency: 1 target_class_config { key: "car" value: { coverage_threshold: 0.005 } } target_class_config { key: "pedestrian" value: { coverage_threshold: 0.005 } } } }

下表描述了用于配置训练器的参数

参数 数据类型 默认值 描述 支持的值
batch_size_per_gpu int 32 每个 GPU 每个批次的图像数量。 >1
num_epochs int 120 运行实验的总 epoch 数。
enable_qat bool False 启用使用量化感知训练 (QAT) 进行模型训练。有关 QAT 的更多信息,请参阅量化感知训练部分。 TrueFalse
learning rate learning rate scheduler proto soft_start _annealing _schedule 配置训练器的学习率计划。目前,DetectNet_v2 仅支持 soft_start 退火学习率计划,可以使用以下参数进行配置
  • soft_start (float): 将学习率从最小学习率提升到最大学习率的时间。
  • annealing (float): 将学习率从最大学习率降低到最小学习率的时间。
  • minimum_learning_rate (float): 学习率计划中的最小学习率。
  • maximum_learning_rate (float): 学习率计划中的最大学习率。
annealing: 0.0-1.0 且大于 soft_start Soft_start: 0.0 - 1.0 soft_start 为 0.3 和退火为 0.1 的示例 lr 图如下所示。
regularizer regularizer proto config 训练期间要使用的正则化器的类型和权重。有两个参数
  • type: 正在使用的正则化器的类型。
  • weight: 正则化器的浮点权重。
支持的类型值为
  • NO_REG
  • L1
  • L2
optimizer optimizer proto config 用于训练的优化器以及配置它的参数
  • epsilon (float): 一个非常小的数字,用于防止实现中出现任何被零除的情况。
  • beta1 (float)
  • beta2 (float)
cost_scaling costscaling _config 在训练期间启用成本缩放。目前,对于 DetectNet_v2 训练管道,请保持此参数不变。 cost_scaling { enabled: False initial_exponent: 20.0 increment: 0.005 decrement: 1.0 }
checkpoint interval float 0/10 保存中间模型的 train 的间隔(以 epoch 为单位)。 0 到 num_epochs

visualizer

visualizer proto config

可视化器的可配置元素。DetectNetv2 的可视化器与 TensorBoard 接口。
请参阅部分以了解可配置元素的说明。

DetectNet_v2 当前支持 soft_start 退火学习率计划。当学习率绘制为训练进度 (0.0, 1.0) 的函数时,结果曲线如下

learning_rate.png

在此实验中,soft_start 设置为 0.3,退火设置为 0.7,最小学习率为 5e-6,最大学习率或 base_lr 为 5e-4。

注意

我们建议在剪枝前训练网络时使用 L1 正则化器,因为 L1 正则化使剪枝网络权重更容易。剪枝后,当重新训练网络时,我们建议通过将正则化类型设置为 NO_REG 来关闭正则化。

可视化器

DetectNet_v2 支持通过 TensorBoard 可视化重要指标、权重直方图和中间图像。可视化的附带信息大致分为 2 类

  1. 频繁绘制的附带信息:这些是标量值,绘制为时间的函数。这些值绘制得更频繁,以便您可以看到连续的行为。

  2. 不频繁绘制的附带信息:这些包括直方图和中间图像,它们消耗更多资源来绘制,因此绘制频率较低。

网络的指标绘制为标量图,包括

  1. 边界框损失 (mean_cost_${class_bbox}): 计算 bbox 坐标精度的成本组件。

  2. 覆盖率损失 (mean_cost_${class_cov}): 产生对象置信度的 coverage blob 的成本。

  3. 任务成本 (task_cost): 计算为(覆盖率损失 + 边界框损失)。

  4. 正则化成本 (regularization_cost): 模型中所有正则化器损失的总和。

  5. 总成本 (total_cost): 计算为 任务成本 + (正则化器权重 * 正则化成本)

  6. 验证成本 (validation_cost): 这是评估期间计算的总成本。

  7. 平均精度均值 (mAP): 在训练期间计算的网络在所有类别的平均精度均值。

  8. 学习率 (lr): 应用于优化器的学习率。

频繁和不频繁附带信息的绘制间隔可通过训练配置的 visualizer 元素配置。

参数 数据类型 默认值 描述 支持的值
enabled bool ‘false’ 启用 TensorBoard 可视化的标志。 truefalse
num_images int 3 每个步骤要绘制的图像数量 1 < num_images < batch_size
scalar_logging_frequency int 10 每个 epoch 的点数 1 到 num_steps_per_epoch
infrequent_logging_frequency int 1 绘制不频繁可视化附带信息的间隔(以 epoch 数为单位) 1 到 num_epochs
target_class_config proto 字典 这是一个嵌套的配置字段,用于定义 coverage blob 的后处理阈值,以在聚类之前渲染原始边界框。可配置的参数是
  • coverage_threshold (float): 用于在聚类之前过滤候选边界框的原始阈值
  • coverage_threshold: 0.0 - 1.0

total_costvalidation_cost 的标量图很好地指示了模型训练的进行情况。如果这两个图收敛并在一段时间内下降,则意味着网络仍在学习。但是,如果 validation_cost 开始发散并上升,而 training_cost 趋于平稳或下降,则表明网络可能对训练数据集 过拟合

在图像选项卡下,DetectNet_v2 应用程序渲染多个图像。关键的关注图像是

  1. images: 这显示了当前正在训练的输入图像

  2. ${class_name}_rectangle_bbox_preds: 此图像显示了在应用 NMS/DBSCAN 聚类之前的网络原始预测。此处看到的输出是通过 coverage 阈值按类过滤的结果。

  3. ${class_name}_cov_norm: 这是归一化的 coverage 输出,它是网络表示对象存在的置信度的热图。

  4. ${class_name}_cov_gt: 这是归一化的 coverage 真值,它是网络应表示对象存在的置信度的热图。

随着训练的进行,您将看到 ${class_name}_cov_norm${class_name}_cov_gt 图像看起来相似,并且 ${class_name}_rectaging_bbox_preds 将仅显示 $class_name 的有效对象周围的边界框聚类

在直方图选项卡下,您可以看到模型中所有权重的直方图分布。这很好地指示了正则化器的工作效果以及可以剪枝多少模型。使用 L1 正则化器,强制权重更接近 0,使模型更易于剪枝。如果您看到直方图的大部分分布在 0 附近,则意味着模型在剪枝时会产生良好的收益。如果直方图更平坦,则表明您可能需要增加 L1 正则化器的权重,或者您的模型对于此数据集,无法进行积极的剪枝。

增强模块

增强模块在训练时提供一些基本的预处理和增强。以下是示例 augmentation_config 元素

复制
已复制!
            

# Sample augementation config for augmentation_config { preprocessing { output_image_width: 960 output_image_height: 544 output_image_channel: 3 min_bbox_width: 1.0 min_bbox_height: 1.0 } spatial_augmentation { hflip_probability: 0.5 vflip_probability: 0.0 zoom_min: 1.0 zoom_max: 1.0 translate_max_x: 8.0 translate_max_y: 8.0 } color_augmentation { color_shift_stddev: 0.0 hue_rotation_max: 25.0 saturation_shift_max: 0.2 contrast_scale_max: 0.1 contrast_center: 0.5 } }

注意

如果预处理块的输出图像高度和输出图像宽度与输入图像的尺寸不匹配,则数据加载器会填充零或裁剪以适合输出分辨率。它不会调整输入图像和标签的大小以进行拟合。

augmentation_config 包含三个元素

preprocessing: 此嵌套字段配置输入图像和真值标签预处理模块。它设置网络输入张量的形状。预处理真值标签以满足输入图像张量的尺寸。

参数 数据类型 默认/建议值 描述 支持的值
output _image _width int 增强输出的宽度。这与网络输入的宽度相同,并且必须是 16 的倍数。 >480
output _image _height int 增强输出的高度。这与网络输入的高度相同,并且必须是 16 的倍数。 >272
output _image _channel int 1, 3 增强输出的通道深度。这与网络输入的通道深度相同。目前,对于包含 JPG 图像的数据集,不建议使用 1 通道输入。对于 PNG 图像,支持 3 通道 RGB 和 1 通道单色图像。 1,3
output _image_min int 增强输出的较小边。这与网络输入的较小边相同。这用于 FasterRCNN 中具有动态形状的输入的情况,在 FasterRCNN 中,我们指定较小边的大小,数据加载器将调整图像大小,以使较小边为此数字并保持纵横比。 >272
output _image_max int 增强输出的较大边。这与网络输入的较大边相同。这用于 FasterRCNN 中具有动态形状的输入的情况,在 FasterRCNN 中,如果较小边并保持纵横比导致另一边超出此限制,它将调整大小,以使较大边正好为此数字并保持纵横比,以便较小边不超过 input_image_min >272
enable_auto _resize bool False 一个标志,用于在训练期间启用自动调整大小。当设置为 True 时,不再需要训练前的离线调整大小。启用此功能可能会增加训练时间。
min_bbox _height float 要考虑用于训练的对象标签的最小高度。 0 - output_image_height
min_bbox _width float 要考虑用于训练的对象标签的最小宽度。 0 - output_image_width
crop_right int 要从原始图像中提取的裁剪区域的右边界。 0 - 输入图像宽度
crop_left int 要从原始图像中提取的裁剪区域的左边界。 0 - 输入图像宽度
crop_top int 要从原始图像中提取的裁剪区域的上边界。 0 - 输入图像高度
crop_bottom int 要从原始图像中提取的裁剪区域的下边界。 0 - 输入图像高度
scale_height float 用于缩放裁剪图像高度的浮点因子。 > 0.0
scale_width float 用于缩放裁剪图像宽度的浮点因子。 > 0.0

spatial_augmentation: 此模块支持基本的空间增强,例如翻转、缩放和平移,可以进行配置。

参数 数据类型 默认/建议值 描述 支持的值
hflip_probability float 0.5 水平翻转输入图像的概率。 0.0-1.0
vflip_probability float 0.0 垂直翻转输入图像的概率。 0.0-1.0
zoom_min float 1.0 输入图像的最小缩放比例。 > 0.0
zoom_max float 1.0 输入图像的最大缩放比例。 > 0.0
translate_max_x int 8.0 要沿 x 轴添加的最大平移量。 0.0 - output_image_width
translate_max_y int 8.0 要沿 y 轴添加的最大平移量。 0.0 - output_image_height
rotate_rad_max float 0.69 要应用于图像和训练标签的旋转角度。范围定义在 [-rotate_rad_max, rotate_rad_max] 之间。 > 0.0 (模 2*pi

color_augmentation: 此模块配置色彩空间变换,例如颜色偏移、色调旋转、饱和度偏移和对比度调整。

参数 数据类型 默认/建议值 描述 支持的值
color_shift_stddev float 0.0 颜色偏移的标准偏差值。 0.0-1.0
hue_rotation_max float 25.0 色调旋转矩阵的最大旋转角度。 0.0-360.0
saturation_shift_max float 0.2 改变饱和度的最大偏移量。值 1.0 表示饱和度偏移没有变化。 0.0 - 1.0
contrast_scale_max float 0.1 对比度的斜率,围绕提供的中心旋转。值 0.0 使对比度保持不变。 0.0 - 1.0
contrast_center float 0.5 对比度围绕其旋转的中心。理想情况下,这设置为最大像素值的一半。由于我们的输入图像在 0 和 1.0 之间缩放,您可以将此值设置为 0.5。 0.5

数据加载器在线增强管道按以下顺序应用空间和色彩空间增强变换

  1. 数据加载器首先对从 tfrecords 文件读取的输入数据(图像和标签)执行预处理操作。在这里,根据 preprocessing 配置中提到的参数裁剪和缩放图像和标签。从原始图像生成裁剪图像和标签的边界由 crop_leftcrop_rightcrop_topcrop_bottom 参数定义。然后,此裁剪数据按 scale_heightscale_width 定义的比例因子缩放。这些操作的变换矩阵是全局计算的,并且每个图像都不会更改。

  2. 从预处理模块生成的网络张量随后会通过空间和颜色域中的随机增强管线。空间增强应用于图像和标签坐标,而颜色增强仅应用于图像。要应用颜色增强,必须将 output_image_channel 参数设置为 3。对于单色张量,不应用颜色增强。空间和颜色变换矩阵是根据 spatial_augmentationcolor_augmentation 配置参数定义的最大和最小范围的均匀分布,为每个图像计算的。

  3. 一旦生成了空间和颜色增强的网络输入张量,则输出将沿图像的右边缘和底边缘用零填充或裁剪,以适应 preprocessing 配置中定义的输出维度。

配置评估器

可以使用 evaluation_config 参数配置检测训练管线中的评估器。以下是 evaluation_config 元素的示例

复制
已复制!
            

# Sample evaluation config to run evaluation in integrate mode for the given 3 class model, # at every 10th epoch starting from the epoch 1. evaluation_config { average_precision_mode: INTEGRATE validation_period_during_training: 10 first_validation_epoch: 1 minimum_detection_ground_truth_overlap { key: "car" value: 0.7 } minimum_detection_ground_truth_overlap { key: "person" value: 0.5 } minimum_detection_ground_truth_overlap { key: "bicycle" value: 0.5 } evaluation_box_config { key: "car" value { minimum_height: 4 maximum_height: 9999 minimum_width: 4 maximum_width: 9999 } } evaluation_box_config { key: "person" value { minimum_height: 4 maximum_height: 9999 minimum_width: 4 maximum_width: 9999 } } evaluation_box_config { key: "bicycle" value { minimum_height: 4 maximum_height: 9999 minimum_width: 4 maximum_width: 9999 } } }

下表描述了用于配置评估的参数

参数 数据类型 默认/建议值 描述 支持的值
average_precision _mode 示例 计算每个类别的平均精度的模式。

  • SAMPLE:这是使用 11 个均匀间隔的召回率点作为 Pascal VOC 挑战赛 2007 中使用的 ap 计算模式。
  • INTEGRATE:这是 2011 年挑战赛中使用的 ap 计算模式
validation_period _during_training int 10 在训练期间运行评估的间隔。评估从此间隔开始运行,从下面指定的第一个验证 epoch 参数的值开始。 1 - epoch 总数
first_validation _epoch int 30 开始运行验证的第一个 epoch。理想情况下,最好等待至少占 epoch 总数 20-30% 的时间后再开始评估,因为初始 epoch 中的预测会相当不准确。可能会将过多的候选框发送到聚类,这可能会导致评估速度减慢。 1 - epoch 总数
minimum_detection _ground_truth_overlap proto 字典 在聚类后,ground truth 和预测框之间的最小 IOU,以调用有效检测。此参数是一个可重复的字典,每个类别都必须定义一个单独的字典。成员包括

  • key(字符串):类别名称
  • value(浮点数):交并比值
evaluation_box_config proto 字典 此嵌套配置字段配置要被视为有效 ground truth 和用于 AP 计算的预测的最小和最大框维度。

evaluation_box_config 字段具有以下可配置输入。

参数 数据类型 默认/建议值 描述 支持的值
minimum_height float 10 有效 ground truth 和预测 bbox 的最小高度(以像素为单位)。
    • 模型图像高度
minimum_width float 10 有效 ground truth 和预测 bbox 的最小宽度(以像素为单位)。
    • 模型图像宽度
maximum_height float 9999 有效 ground truth 和预测 bbox 的最大高度(以像素为单位)。 minimum_height - 模型图像高度
maximum_width float 9999 有效 ground truth 和预测 bbox 的最大宽度(以像素为单位)。 minimum _width - 模型图像宽度

数据加载器

数据加载器定义了要训练的数据的路径以及网络要训练的数据集中类别的类别映射。

以下是 dataset_config 元素的示例

复制
已复制!
            

dataset_config { data_sources: { tfrecords_path: "<path to the training tfrecords root/tfrecords train pattern>" image_directory_path: "<path to the training data source>" } image_extension: "jpg" target_class_mapping { key: "car" value: "car" } target_class_mapping { key: "automobile" value: "car" } target_class_mapping { key: "heavy_truck" value: "car" } target_class_mapping { key: "person" value: "pedestrian" } target_class_mapping { key: "rider" value: "cyclist" } validation_fold: 0 }

在此示例中,tfrecords 假定为多 fold,并且定义了要验证的 fold 编号。但是,评估不一定必须在训练集的拆分上运行。许多 ML 工程师选择在与训练数据集互斥的精心选择的评估数据集上评估模型。如果您希望在与训练数据集拆分不同的验证数据集上运行评估,则使用 dataset_convert 工具将此数据集转换为 tfrecords,如此处所述,并在 dataset_config 中使用 validation_data_source 字段来定义评估器的数据集。在这种情况下,请不要忘记从 spec 中删除 validation_fold 字段。当使用 validation_data_source 字段生成用于评估的 TFRecords 时,请查看此处的注释。

复制
已复制!
            

validation_data_source: { tfrecords_path: " <path to tfrecords to validate on>/tfrecords validation pattern>" image_directory_path: " <path to validation data source>" }

dataset_config 中的参数定义如下

  • data_sources:捕获要训练的 tfrecords 的路径。此字段包含 2 个参数

    • tfrecords_path:各个 tfrecords 文件的路径。此路径遵循 UNIX 样式的路径名模式扩展,因此可以使用捕获该目录中所有 tfrecords 文件的通用路径名模式。

    • image_directory_path:从中生成 tfrecords 的训练数据根目录的路径。

  • image_extension:要使用的图像的扩展名。

  • target_class_mapping:此参数将 tfrecords 中的类别名称映射到网络中要训练的目标类别。为每个源类别到目标类别的映射定义一个元素。包含此字段的目的是将相似的类别对象分组到一个保护伞下。例如:汽车、厢型车、重型卡车等可以归类为汽车。“key”字段是 tfrecords 文件中类别名称的值,“value”字段对应于网络预期学习的值。

  • validation_fold:在 n fold tfrecords 的情况下,您可以定义要用于验证的 fold 的索引。对于sequencewise 验证,请在 [0, N-1] 范围内选择验证 fold。对于随机分割 分区,强制验证 fold 索引为 0,因为 tfrecord 只是 2-fold。

注意

target_class_mapping 中的类别名称 key 必须与数据集转换器日志中显示的名称相同,以便选择正确的类别进行训练。

推理的规范文件

此 spec 文件配置 detectnet 的 infer 工具以生成有效的 bbox 预测。推理工具由 2 个模块组成,即推理器和 bbox 处理器。推理器实例化模型对象和预处理管线。bbox 处理器处理后处理、边界框的渲染以及序列化为 KITTI 格式输出标签。

推理器

推理器实例化一个模型对象,该对象从训练后的模型生成原始预测。可以将模型定义为在 TAO 后端或 TensorRT 后端中运行推理。

此处定义了推理器 spec 的示例 inferencer_config 元素

复制
已复制!
            

inferencer_config{ # defining target class names for the experiment. # Note: This must be mentioned in order of the networks classes. target_classes: "car" target_classes: "cyclist" target_classes: "pedestrian" # Inference dimensions. image_width: 1248 image_height: 384 # Must match what the model was trained for. image_channels: 3 batch_size: 16 gpu_index: 0 # model handler config tensorrt_config{ parser: ETLT etlt_model: "/path/to/model.etlt" backend_data_type: INT8 save_engine: true trt_engine: "/path/to/trt/engine/file" calibrator_config{ calibration_cache: "/path/to/calibration/cache" n_batches: 10 batch_size: 16 } } }

inferencer_config 参数在下表中进行了解释。

参数 数据类型 默认/建议值 描述 支持的值
target_classes 字符串(重复) 模型应输出的目标类别的名称。对于多类别模型,此参数重复 N 次。类别数量必须等于类别数量,并且顺序必须与训练配置文件的 costfunction_config 中的类别顺序相同。 例如,对于 3 类 kitti 模型,它将是
  • car
  • cyclist
  • pedestrian
batch_size int 1 每个推理批次的图像数量。 可以在 1 个 GPU 中容纳的最大图像数量
image_height int 384 模型将在其上进行推理的图像的高度(以像素为单位)。 >16
image_width int 1248 模型将在其上进行推理的图像的宽度(以像素为单位)。 >16
image_channels int 3 每个图像的通道数。 1,3
gpu_index int 0 要在其上运行推理的 GPU 的索引。这仅在 TAO 推理中才有用。对于 tensorRT 推理,默认情况下,选择的 GPU 为“0”。
tensorrt_config TensorRTConfig 用于实例化 TensorRT 对象的 Proto 配置。
tlt_config TLTConfig 用于实例化 TLT 模型对象的 Proto 配置。

如前所述,infer 工具能够使用本机 TAO 后端和 TensorRT 后端运行推理。可以使用 tensorrt_config proto 元素或 tlt_config proto 元素分别配置它们。在一个 spec 文件中,您只能使用其中之一。两个模型对象的定义是

参数 数据类型 默认/建议值 描述 支持的值
parser enum ETLT 要调用的 tensorrt 解析器。仅支持 ETLT 解析器。 ETLT
etlt_model string 导出的 etlt 模型文件的路径。 任何现有的 etlt 文件路径。
backend_data _type enum FP32 后端 TensorRT 推理引擎的数据类型。对于 int8 模式,请务必提及 calibration_cache。 FP32 FP16 INT8
save_engine bool False 从输入 etlt 文件保存 TensorRT 引擎的标志。如果需要在同一个 etlt 文件上运行推理,并且无需对推理器对象进行任何更改,这将节省初始化时间。 True, False
trt_engine string TensorRT 引擎文件的路径。这充当 I/O 参数。如果此处定义的路径不是引擎文件,则 infer 工具将从 etlt 文件创建新的 TensorRT 引擎。如果已经存在引擎,则该工具会从此处定义的引擎重新实例化推理器。 UNIX 路径字符串
calibration _config CalibratorConfig Proto 这是在 int8 推理模式下运行时必需的参数。此 proto 对象包含用于定义校准器对象的参数。即:calibration_cache:使用 export 生成的校准缓存文件的路径。

TLT_Config

参数 数据类型 默认/建议值 描述 支持的值
model string .tlt 模型文件的路径。
注意

由于 detectnet 是一个全卷积神经网络,因此可以在与训练分辨率不同的推理分辨率下进行推理。如果网络输入维度与训练分辨率不同,则会覆盖网络输入维度以在此分辨率下运行推理。在不同的分辨率下运行推理时,精度可能会有所下降,因为卷积核看不到此形状的对象特征。

Bbox 处理器

bbox 处理器负责后处理来自推理器的原始输出。它执行以下步骤

  1. 对原始输出进行阈值处理,以定义每个类别可能存在检测的网格单元。

  2. 从推理器的原始坐标重建图像空间坐标。

  3. 聚类原始阈值预测。

  4. 按类别过滤聚类预测。

  5. 在其输入维度中将最终边界框渲染到图像上,并将其序列化为 KITTI 格式元数据。

下面定义了示例 bbox_handler_config 元素。

复制
已复制!
            

bbox_handler_config{ kitti_dump: true disable_overlay: false overlay_linewidth: 2 classwise_bbox_handler_config{ key:"car" value: { confidence_model: "aggregate_cov" output_map: "car" bbox_color{ R: 0 G: 255 B: 0 } clustering_config{ coverage_threshold: 0.005 dbscan_eps: 0.3 dbscan_min_samples: 1 dbscan_confidence_threshold: 0.9 minimum_bounding_box_height: 4 } } } classwise_bbox_handler_config{ key:"default" value: { confidence_model: "aggregate_cov" bbox_color{ R: 255 G: 0 B: 0 } clustering_config{ coverage_threshold: 0.005 dbscan_eps: 0.3 dbscan_min_samples: 1 dbscan_confidence_threshold: 0.9 minimum_bounding_box_height: 4 } } } }

下面定义了用于配置 bbox 处理器的参数。

参数 数据类型 默认/建议值 描述 支持的值
kitti_dump bool false 启用以 KITTI 格式保存每个图像的最终输出预测的标志。 true, false
disable_overlay bool true 禁用每个图像的 bbox 渲染的标志。 true, false
overlay _linewidth int 1 bbox 边界的厚度(以像素为单位)。 >1
classwise_bbox _handler_config ClasswiseCluster Config(重复) 这是后处理参数的重复的按类别字典。DetectNet_v2 使用 dbscan 聚类将原始 bbox 分组为最终预测。对于具有多个输出类别的模型,为每个类别定义单独的字典可能很麻烦。在这种情况下,默认类别可用于网络中的所有类别。

classwise_bbox_handler_config 是一个 Proto 对象,其中包含用于配置聚类算法以及 bbox 渲染器的多个参数。

参数 数据类型 默认/建议值 描述 支持的值
confidence _model string aggregate_cov 计算聚类 bbox 的最终置信度的算法。在 aggregate_cov 模式下,检测的最终置信度是聚类中所有候选 bbox 的置信度之和。在 mean_cov 模式下,最终置信度是聚类中所有 bbox 的平均置信度。 aggregate_cov, mean_cov
bbox_color BBoxColor Proto 对象 每个框的 RGB 通道方向的颜色强度。 R: 0 - 255 G: 0 - 255 B: 0 - 255
clustering_config ClusteringConfig 用于配置 DBSCAN、NMS 或 HYBRID 聚类算法的 Proto 对象。它利用与训练配置的 postprocessing_config 中定义的参数相同的参数。有关参数的更多说明,请参阅此处

在创建可由 TAO 训练摄取的 TFRecords(如预处理数据集中所述)并设置 spec 文件后,您现在可以开始训练对象检测网络了。

以下概述了 DetectNet_v2 训练命令

复制
已复制!
            

tao model detectnet_v2 train [-h] -k <key> -r <result directory> -e <spec_file> [-n <name_string_for_the_model>] [--gpus <num GPUs>] [--gpu_index <comma separate gpu indices>] [--use_amp] [--log_file <log_file>]

必需参数

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

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

  • -e, --experiment_spec_file:spec 文件的路径。该路径可以是绝对路径,也可以是相对于工作目录的路径。默认情况下,使用来自 spec_loader.py 的 spec。

可选参数

  • -n, --model_name:保存的最终步骤模型的名称。如果未提供,则默认为模型。

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

  • --gpu_index:用于训练的 GPU 的索引。GPU 的引用方式与 ./deviceQuery CUDA 示例中提到的索引相同。

  • --use_amp:定义后,此标志启用自动混合精度模式。

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

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

输入要求

  • 输入大小:C * W * H(其中 C = 1 或 3,W > =480,H >=272,且 W、H 是 16 的倍数)

  • 图像格式:JPG、JPEG、PNG

  • 标签格式:KITTI 检测

注意

train 工具不支持在多种分辨率的图像上进行训练。但是,数据加载器确实支持将图像大小调整为规范文件中定义的输入分辨率。可以通过在 spec 文件的 augmentation_config 模块中将 enable_auto_resize 参数设置为 true 来启用此功能。

示例用法

这是使用两个 GPU 进行训练的命令示例

复制
已复制!
            

tao model detectnet_v2 train -e <path_to_spec_file> -r <path_to_experiment_output> -k <key_to_load_the_model> -n <name_string_for_the_model> --gpus 2

注意

train 工具不支持在多种分辨率的图像上进行训练,也不支持在训练期间调整图像大小。所有图像都必须离线调整大小为最终训练大小,并且必须相应地缩放相应的边界框。

注意

DetectNet_v2 现在支持从中间检查点恢复训练。当先前正在运行的训练实验过早停止时,只需使用与之前相同的命令行参数重新运行 detectnet_v2 训练命令即可从最后一个检查点重新启动训练。detectnet_v2 的训练器会在结果目录中找到上次保存的检查点,并从该检查点恢复训练。检查点保存的间隔由 detectnet_v2 的“training_config”下的 checkpoint_interval 参数定义。此外,在训练期间,保存的检查点编号等于以下公式:checkpoint_number = epoch_num * ceil(ceil((training_images)/gpu_nums)/batch_size_per_gpu )

在 DetectNet_v2 模型上执行 evaluate

复制
已复制!
            

tao model detectnet_v2 evaluate [-h] -e <experiment_spec -m <model_file> -k <key> [--use_training_set] [--gpu_index]

必需参数

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

  • -m, --model:用于评估的模型文件的路径。这可以是 .tlt 模型文件,也可以是使用 export 工具生成的 tensorrt 引擎。

  • -k, -–key:用于解密模型的加密密钥。此参数仅在 .tlt 模型文件的情况下才是必需的。

可选参数

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

  • -f, --framework:运行评估时要使用的框架(选项:“tlt”、“tensorrt”)。默认情况下,框架设置为 TensorRT。

  • --use_training_set:设置此标志以在训练数据集上运行评估。

  • --gpu_index:要在其上运行评估的 GPU 的索引。

如果您已按照训练检测模型中的示例进行操作,您现在可以使用以下命令评估模型

复制
已复制!
            

tao model detectnet_v2 evaluate -e <path to training spec file> -m <path to the model> -k <key to load the model>

注意

此命令在训练期间使用的同一验证集上运行评估。

使用以下步骤在带有 ground truth 标签的测试集上进行评估

  1. 按照数据输入部分列出的步骤,为此训练集创建 tfrecords。

  2. 更新训练 spec 文件的数据加载器配置部分,以包含新生成的 tfrecords。有关数据集配置的更多信息,请参阅创建实验 Spec 文件。您可以使用任何分区模式(序列/随机)创建 tfrecords。评估工具会迭代 validation_data_source 中提到的 tfrecords 模式中的所有 fold。

复制
已复制!
            

dataset_config { data_sources: { tfrecords_path: "<path to training tfrecords root>/<tfrecords_name*>" image_directory_path: "<path to training data root>" } image_extension: "jpg" target_class_mapping { key: "car" value: "car" } target_class_mapping { key: "automobile" value: "car" } .. .. .. target_class_mapping { key: "person" value: "pedestrian" } target_class_mapping { key: "rider" value: "cyclist" } validation_data_source: { tfrecords_path: "<path to testing tfrecords root>/<tfrecords_name*>" image_directory_path: "<path to testing data root>" } }

实验 spec 文件的其余部分应与训练 spec 文件保持相同。

detectnet_v2 的 infer 任务可用于可视化 bbox 和/或在单个图像或图像目录上生成逐帧 KITTI 格式标签。此任务的命令示例如下所示

复制
已复制!
            

tao model detectnet_v2 inference [-h] -e </path/to/inference/spec/file> -i </path/to/inference/input> -o </path/to/inference/output> -k <model key>

必需参数

  • -e, --inference_spec:推理 spec 文件的路径。

  • -i, --inference_input:输入图像目录或用于推理的单个图像。

  • -o, --inference_output:输出图像和标签的目录。带注释的图像位于 inference_output/images_annotated 中,标签位于 inference_output/labels 中。

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

该工具会自动在 output_path/images_annotated 中生成 bbox 渲染图像。要获取 KITTI 格式的 bbox 标签,请使用 此处提到的 kitti_dump parameter 配置 bbox_handler_config spec 文件。这将在 output_path/labels 中生成输出。

剪枝使用 prune 命令从模型中删除参数,以减小模型大小,而不会影响模型的完整性。

prune 任务包括以下参数

复制
已复制!
            

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

必需参数

  • -pm, --pretrained_model:预训练模型的路径。

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

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

可选参数

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

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

  • -eq, --equalization_criterion:均衡化元素级 op 层或深度方向卷积层的输入统计信息的标准。此参数对于 resnet 和 mobilenet 非常有用。选项为 arithmetic_meangeometric_meanunionintersection(默认值:union)。

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

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

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

  • -el, --excluded_layers:排除层列表(例如 -i item1 item2)(默认值:[])

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

使用 Prune 命令

以下是使用 prune 任务的示例

复制
已复制!
            

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

模型剪枝后,精度可能会略有下降,因为可能已删除了一些以前有用的权重。为了恢复精度,我们建议您使用 train 任务在同一数据集上重新训练此剪枝模型,如训练模型部分中所述,并使用更新后的 spec 文件,该文件指向新剪枝的模型作为预训练模型文件。

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

要加载预训练模型,请将 model_config 下的 load_graph 标志设置为 true

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

注意

在 TAO 5.0.0 及更高版本中,tao model detectnet_v2 export 命令将导出的模型直接序列化为未加密的 .onnx 文件。

INT8 模式概述

TensorRT 引擎可以在 INT8 模式下生成,以较低的精度运行,从而提高性能。此过程需要一个缓存文件,其中包含张量的比例因子,以帮助对抗由于低精度算术可能引起的量化误差。当 export--data_type 标志设置为 int8 的情况下运行时,将使用校准张量文件生成校准缓存。预先生成校准信息并缓存它消除了在推理机器上校准模型的需要。移动校准缓存通常比移动校准张量文件方便得多,因为它是一个小得多的文件,可以与导出的模型一起移动。使用校准缓存还可以加快引擎创建速度,因为构建缓存可能需要几分钟才能生成,具体取决于 Tensorfile 的大小和模型本身。

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

  • 选项 1:提供使用 DetectNet_v2 中定义的 calibration_tensorfile 任务生成的校准张量文件。此命令使用训练管线中的数据生成器来生成来自训练数据集的预处理输入图像批次的 drop。使用此方法,用户可以有机会维护用于在校准缓存文件中生成校准比例因子的训练数据的确切批次的记录。但是,这是生成 int8 缓存文件的两步过程。

  • 选项 2:将工具指向要用于校准模型的图像目录。对于此选项,您需要创建一个随机图像的子采样目录,该目录最能代表您的训练数据集。

  • 选项 3:直接使用训练数据加载器加载用于 INT8 校准的训练图像。此选项现在是推荐的方法,因为它有助于生成多个随机样本。这也确保了校准期间数据的两个重要方面

    • INT8 校准步骤中的数据预处理与训练过程中的数据预处理相同。

    • 数据批次在整个训练数据集中随机采样,从而提高了 int8 模型的精度。

    • 校准作为一个单步过程发生,数据批次是动态生成的。

NVIDIA 计划最终弃用选项 1,而仅支持选项 2 和 3。

tao_int8_calibration.png

FP16/FP32 模型

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

fp16_fp32_export.png

使用 calibration_tensorfile 命令生成 INT8 张量文件

INT8 张量文件是一个二进制文件,其中包含预处理的训练样本,可用于校准模型。在此版本中,TAO 仅支持 SSD、DSSD、DetectNet_v2 和分类模型的校准张量文件生成。

下面定义了用于生成校准张量文件的 calibration_tensorfile 命令的示例用法

复制
已复制!
            

tao model detectnet_v2 calibration_tensorfile [-h] -e <path to training experiment spec file> -o <path to output tensorfile> -m <maximum number of batches to serialize> [--use_validation_set]

必需参数

  • -e, --experiment_spec_file:实验 spec 文件的路径(仅 SSD 和 FasterRCNN 需要)。

  • -o, --output_path:将创建的输出张量文件的路径。

  • -m, --max_batches:要序列化的输入数据批次的数量。

可选参数

  • --use_validation_set:一个标志,指定是否使用验证数据集而不是训练集。

以下是调用分类模型的 calibration_tensorfile 命令的示例命令

复制
已复制!
            

tao model detectnet_v2 calibration_tensorfile -e $SPECS_DIR/classification_retrain_spec.cfg -m 10 -o $USER_EXPERIMENT_DIR/export/calibration.tensor

导出 DetectNet_v2 模型

以下是 export 命令的命令行参数

复制
已复制!
            

tao model detectnet_v2 export [-h] -m <path to the .tlt model file generated by tao model train> [-k <key>] [-o <path to output file [.onnx]>] [--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] [--force_ptq Flag to force PTQ] [--gen_ds_config Generate DeepStream config] [--onnx_route Backend library to be used to export the model.]

必需参数

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

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

  • -e, --experiment_spec:spec 文件的路径。faster_rcnn、ssd、dssd、yolo 和 retinanet 需要此参数。

可选参数

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

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

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

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

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

  • --onnx_route:用于将 .tlt/.hdf5 模型序列化为 .onnx 的后端库。选项为 keras2onnxtf2onnx

QAT 导出模式必需参数

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

注意

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

导出子任务的示例用法

以下是以 INT8 模式导出 DetectNet_v2 模型的示例命令。此命令显示选项 1:将 --cal_data_file 选项与使用 calibration_tensorfile 子任务生成的 calibration.tensor 一起使用。

复制
已复制!
            

tao model detectnet_v2 export -e $USER_EXPERIMENT_DIR/experiment_dir_retrain/experiment_spec.txt -m $USER_EXPERIMENT_DIR/experiment_dir_retrain/weights/resnet18_detector_pruned.tlt -o $USER_EXPERIMENT_DIR/experiment_dir_final/resnet18_detector.onnx -k $KEY

以下是成功导出的示例日志

生成模板 DeepStream 配置文件

TAO 支持序列化 Deepstream 的 nvinfer 元素的模板配置文件,以使用此模型。此配置文件包含网络特定的预处理参数和网络图参数,用于解析 etlt 模型文件。它还生成一个标签文件,其中包含模型训练的类别的名称,以及生成输出的顺序。要生成 Deepstream 配置,只需使用 --gen_ds_config 选项运行 export 命令。

以下示例显示了如何生成 DeepStream 配置

复制
已复制!
            

tao model detectnet_v2 export -m $USER_EXPERIMENT_DIR/detectnet_v2/model.tlt -o $USER_EXPERIMENT_DIR/detectnet_v2/model.int8.onnx -e $SPECS_DIR/detectnet_v2_kitti_retrain_spec.txt --gen_ds_config

模板 DeepStream 配置在输出模型文件的同一目录中生成为 nvinfer_config.txt,而标签则序列化在 labels.txt 文件中。nvinfer_config.txtlabels.txt 的示例输出如下

  • 示例 nvinfer_config.txt

    复制
    已复制!
                

    net-scale-factor=0.00392156862745098 offsets=0;0;0 infer-dims=3;544;960 tlt-model-key=tlt_encode network-type=0 num-detected-classes=3 uff-input-order=0 output-blob-names=output_cov/Sigmoid;output_bbox/BiasAdd uff-input-blob-name=input_1 model-color-format=0

  • 示例 labels.txt

    复制
    已复制!
                

    person bag face

注意

export 生成的 nvinfer_config.txt 文件不是一个完整的 config_infer_*.txt 文件,不能直接替换到 DeepStream 配置文件中。 您需要查找并替换此文件中定义的参数,并使用默认 config_infer_*.txt 文件中的参数进行替换。

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

有关将 DetectNet_v2 模型部署到 DeepStream 的更多信息,请参阅集成 DetectNet_v2 模型页面。

上一篇 对象检测
下一篇 FasterRCNN
© 版权所有 2024, NVIDIA。 上次更新于 2024 年 10 月 15 日。