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 模型。

DetectNet_v2 应用程序需要将原始输入数据转换为 TFRecords,以便在数据批次中进行优化迭代。这可以使用 DetectNet_v2 下的 dataset_convert
子任务完成。目前,支持 KITTI 和 COCO 格式。
dataset_convert
工具需要一个配置文件作为输入。以下部分包含配置文件的详细信息和示例。
数据集转换器的配置文件
dataset_convert
工具提供多个可配置参数。这些参数封装在一个 spec 文件中,用于将数据从原始标注格式转换为训练器可以摄取的 TFRecords 格式。可以使用 kitti_config
或 coco_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 时采用的方法。支持两种方法
|
|
num_partitions | int | 2(如果 partition_mode 为 random) | 用于拆分数据的分区数(N folds)。当分区模式设置为 random 时,将忽略此字段,因为默认情况下仅生成两个分区:val 和 train。在 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_names 和 annotation_files 的列表长度匹配。默认情况下,生成两个分区:val 和 train。 | 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_source
在 dataset_config
下定义),我们建议将 partition_mode
设置为 random,包含 2 个分区和任意 val_split
(1-100)。数据加载器负责遍历所有 folds 并相应地生成 mAP。
要为 DetectNet_v2 执行训练、评估和推理,您需要配置多个组件,每个组件都有自己的参数。DetectNet_v2 实验的 train
和 evaluate
任务共享同一个配置文件。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 投影层实例化所有快捷方式,而不管输入和输出之间的步幅是否发生变化。 | True 或 False(仅在 ResNet 模板中使用) |
arch | string | resnet | 用于训练的骨干特征提取器的架构。 |
|
num_layers | int | 18 | 可扩展模板的特征提取器的深度。 |
|
pretrained model file | string | – | 此参数定义预训练 TAO 模型文件的路径。如果 load_graph flag 设置为 false ,则假定仅使用预训练模型文件的权重。在这种情况下,TAO train 在实验中构建特征提取器图,并从具有匹配层名称的预训练模型文件中加载权重。因此,支持跨不同分辨率和域的迁移学习。对于预训练模型中可能不存在的层,该工具使用随机权重初始化它们,并跳过该层的导入。 |
Unix 路径 |
use_pooling | Boolean | False | 在下采样时,选择使用步幅卷积还是 MaxPooling。当 True 时,MaxPooling 用于下采样;但是,对于对象检测网络,NVIDIA 建议将其设置为 False 并使用步幅卷积。 | True 或 False |
use_batch_norm | Boolean | False | 一个标志,用于确定是否使用批归一化层。 | True 或 False |
objective_set | Proto 字典 | – | 用于训练网络的目标。对于对象检测网络,将其设置为学习 cov 和 bbox。对于当前的训练管道,不应更改这些参数。 | cov {} bbox { scale: 35.0 offset: 0.5 } |
dropout_rate | Float | 0.0 | dropout 的概率 | 0.0-0.1 |
load_graph | Boolean | False | 一个标志,用于确定是否从预训练模型文件加载图,还是仅加载权重。对于剪枝模型,将此参数设置为 True。剪枝会修改原始图,因此需要导入剪枝后的模型图和权重。 | True 或 False |
freeze_blocks | float (repeated) | – | 此参数定义可以从实例化的特征提取器模板中冻结哪些块,并且对于不同的特征提取器模板是不同的。 |
|
freeze_bn | Boolean | False | 一个标志,用于确定在模型训练期间是否冻结批归一化层。 | True 或 False |
BBox 真值生成器
DetectNet_v2 生成 2 个张量,cov 和 bbox。图像被划分为 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 的可配置参数
|
|
后处理器
后处理器模块从原始检测输出生成可渲染的边界框。该过程包括以下步骤
通过使用 coverage 张量中的置信度值对对象进行阈值处理,过滤掉有效的检测。
使用 DBSCAN 对原始过滤后的预测进行聚类,以生成最终渲染的边界框。
根据最终置信度阈值过滤掉较弱的聚类,该阈值从分组到聚类的候选框中导出。
以下是为 3 类网络学习 car、cyclist 和 pedestrian 的后处理器的示例定义
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 模式时,请确保同时定义 DBSCAN 和 NMS 配置参数。 | 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 聚类,请确保在后处理配置中定义了 DBSCAN 和 NMS 相关参数。
成本函数
本节介绍如何配置成本函数以包含您要训练的类。对于您要训练的每个类,将目标类的新条目添加到 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 的更多信息,请参阅量化感知训练部分。 | True 或 False |
learning rate | learning rate scheduler proto | soft_start _annealing _schedule | 配置训练器的学习率计划。目前,DetectNet_v2 仅支持 soft_start 退火学习率计划,可以使用以下参数进行配置
|
annealing: 0.0-1.0 且大于 soft_start Soft_start: 0.0 - 1.0 soft_start 为 0.3 和退火为 0.1 的示例 lr 图如下所示。 |
regularizer | regularizer proto config | 训练期间要使用的正则化器的类型和权重。有两个参数
|
支持的类型值为
|
|
optimizer | optimizer proto config | 用于训练的优化器以及配置它的参数
|
||
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) 的函数时,结果曲线如下

在此实验中,soft_start 设置为 0.3,退火设置为 0.7,最小学习率为 5e-6,最大学习率或 base_lr 为 5e-4。
我们建议在剪枝前训练网络时使用 L1 正则化器,因为 L1 正则化使剪枝网络权重更容易。剪枝后,当重新训练网络时,我们建议通过将正则化类型设置为 NO_REG
来关闭正则化。
可视化器
DetectNet_v2 支持通过 TensorBoard 可视化重要指标、权重直方图和中间图像。可视化的附带信息大致分为 2 类
频繁绘制的附带信息:这些是标量值,绘制为时间的函数。这些值绘制得更频繁,以便您可以看到连续的行为。
不频繁绘制的附带信息:这些包括直方图和中间图像,它们消耗更多资源来绘制,因此绘制频率较低。
网络的指标绘制为标量图,包括
边界框损失 (mean_cost_${class_bbox}): 计算 bbox 坐标精度的成本组件。
覆盖率损失 (mean_cost_${class_cov}): 产生对象置信度的 coverage blob 的成本。
任务成本 (task_cost): 计算为(覆盖率损失 + 边界框损失)。
正则化成本 (regularization_cost): 模型中所有正则化器损失的总和。
总成本 (total_cost): 计算为 任务成本 + (正则化器权重 * 正则化成本)。
验证成本 (validation_cost): 这是评估期间计算的总成本。
平均精度均值 (mAP): 在训练期间计算的网络在所有类别的平均精度均值。
学习率 (lr): 应用于优化器的学习率。
频繁和不频繁附带信息的绘制间隔可通过训练配置的 visualizer 元素配置。
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
enabled | bool | ‘false’ | 启用 TensorBoard 可视化的标志。 | true 或 false |
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 的后处理阈值,以在聚类之前渲染原始边界框。可配置的参数是
|
|
total_cost
和 validation_cost
的标量图很好地指示了模型训练的进行情况。如果这两个图收敛并在一段时间内下降,则意味着网络仍在学习。但是,如果 validation_cost
开始发散并上升,而 training_cost
趋于平稳或下降,则表明网络可能对训练数据集 过拟合。
在图像选项卡下,DetectNet_v2 应用程序渲染多个图像。关键的关注图像是
images
: 这显示了当前正在训练的输入图像${class_name}_rectangle_bbox_preds
: 此图像显示了在应用 NMS/DBSCAN 聚类之前的网络原始预测。此处看到的输出是通过 coverage 阈值按类过滤的结果。${class_name}_cov_norm
: 这是归一化的 coverage 输出,它是网络表示对象存在的置信度的热图。${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 |
数据加载器在线增强管道按以下顺序应用空间和色彩空间增强变换
数据加载器首先对从 tfrecords 文件读取的输入数据(图像和标签)执行预处理操作。在这里,根据
preprocessing
配置中提到的参数裁剪和缩放图像和标签。从原始图像生成裁剪图像和标签的边界由crop_left
、crop_right
、crop_top
和crop_bottom
参数定义。然后,此裁剪数据按scale_height
和scale_width
定义的比例因子缩放。这些操作的变换矩阵是全局计算的,并且每个图像都不会更改。从预处理模块生成的网络张量随后会通过空间和颜色域中的随机增强管线。空间增强应用于图像和标签坐标,而颜色增强仅应用于图像。要应用颜色增强,必须将
output_image_channel
参数设置为 3。对于单色张量,不应用颜色增强。空间和颜色变换矩阵是根据spatial_augmentation
和color_augmentation
配置参数定义的最大和最小范围的均匀分布,为每个图像计算的。一旦生成了空间和颜色增强的网络输入张量,则输出将沿图像的右边缘和底边缘用零填充或裁剪,以适应
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 | 示例 | 计算每个类别的平均精度的模式。 |
|
|
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,以调用有效检测。此参数是一个可重复的字典,每个类别都必须定义一个单独的字典。成员包括
|
||
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 模型,它将是
|
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 处理器负责后处理来自推理器的原始输出。它执行以下步骤
对原始输出进行阈值处理,以定义每个类别可能存在检测的网格单元。
从推理器的原始坐标重建图像空间坐标。
聚类原始阈值预测。
按类别过滤聚类预测。
在其输入维度中将最终边界框渲染到图像上,并将其序列化为 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 标签的测试集上进行评估
按照数据输入部分列出的步骤,为此训练集创建 tfrecords。
更新训练 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_mean
、geometric_mean
、union
和intersection
(默认值: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
导出模型将训练过程与部署分离,并允许在 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。

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

使用 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
的后端库。选项为keras2onnx
或tf2onnx
。
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.txt
和 labels.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 模型页面。