TAO v5.5.0

FasterRCNN

FasterRCNN 是 NVIDIA TAO 支持的公共目标检测模型。TAO 中的 FasterRCNN 支持以下任务

  • dataset_convert

  • train

  • evaluate

  • inference

  • prune

  • export

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

复制
已复制!
            

tao model faster_rcnn <sub_task> <args_per_subtask>

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

FasterRCNN 的数据集结构与 DetectNet_v2 的结构相同。唯一的区别是用于从 KITTI 文本标签生成 TFRecords 的命令行。要为 FasterRCNN 训练生成 TFRecords,请使用此命令

复制
已复制!
            

tao model faster_rcnn dataset_convert [-h] -d <dataset_spec> -o <output_tfrecords_file> [--gpu_index <gpu_index>]

必需参数

  • -d, --dataset_spec:数据集规范文件的路径。

  • -o, --output_filename:输出 TFRecords 文件的路径。

可选参数

  • --gpu_index:运行此命令的 GPU 索引。如果机器安装了多个 GPU,我们可以指定用于运行此命令的 GPU 索引。请注意,此命令只能在单个 GPU 上运行。

实验规范(简称 spec 文件)定义了 FasterRCNN 模型整个工作流程(从训练到导出)所需的所有必要参数。以下是 FasterRCNN spec 文件的示例。spec 文件的格式是 protobuf 文本 (prototxt) 消息,其每个字段可以是基本数据类型或嵌套的 proto 消息。下表总结了 spec 文件的顶层结构。从表中,我们可以看到 spec 文件有 9 个组件:random_seedverboseenc_keydataset_configaugmentation_configmodel_configtraining_configinference_configevaluation_config

这是一个 FasterRCNN spec 文件的示例

复制
已复制!
            

random_seed: 42 enc_key: 'nvidia_tlt' verbose: True model_config { input_image_config { image_type: RGB image_channel_order: 'bgr' size_height_width { height: 384 width: 1248 } image_channel_mean { key: 'b' value: 103.939 } image_channel_mean { key: 'g' value: 116.779 } image_channel_mean { key: 'r' value: 123.68 } image_scaling_factor: 1.0 max_objects_num_per_image: 100 } arch: "resnet:18" anchor_box_config { scale: 64.0 scale: 128.0 scale: 256.0 ratio: 1.0 ratio: 0.5 ratio: 2.0 } freeze_bn: True freeze_blocks: 0 freeze_blocks: 1 roi_mini_batch: 256 rpn_stride: 16 use_bias: False roi_pooling_config { pool_size: 7 pool_size_2x: False } all_projections: True use_pooling:False } dataset_config { data_sources: { tfrecords_path: "/workspace/tao-experiments/tfrecords/kitti_trainval/kitti_trainval*" image_directory_path: "/workspace/tao-experiments/data/training" } image_extension: 'png' target_class_mapping { key: 'car' value: 'car' } target_class_mapping { key: 'van' value: 'car' } target_class_mapping { key: 'pedestrian' value: 'person' } target_class_mapping { key: 'person_sitting' value: 'person' } target_class_mapping { key: 'cyclist' value: 'cyclist' } validation_fold: 0 } augmentation_config { preprocessing { output_image_width: 1248 output_image_height: 384 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: 0 translate_max_y: 0 } color_augmentation { hue_rotation_max: 0.0 saturation_shift_max: 0.0 contrast_scale_max: 0.0 contrast_center: 0.5 } } training_config { enable_augmentation: True enable_qat: False batch_size_per_gpu: 8 num_epochs: 12 retrain_pruned_model: "/workspace/tao-experiments/data/faster_rcnn/model_1_pruned.tlt" rpn_min_overlap: 0.3 rpn_max_overlap: 0.7 classifier_min_overlap: 0.0 classifier_max_overlap: 0.5 gt_as_roi: False std_scaling: 1.0 classifier_regr_std { key: 'x' value: 10.0 } classifier_regr_std { key: 'y' value: 10.0 } classifier_regr_std { key: 'w' value: 5.0 } classifier_regr_std { key: 'h' value: 5.0 } rpn_mini_batch: 256 rpn_pre_nms_top_N: 12000 rpn_nms_max_boxes: 2000 rpn_nms_overlap_threshold: 0.7 regularizer { type: L2 weight: 1e-4 } optimizer { sgd { lr: 0.02 momentum: 0.9 decay: 0.0 nesterov: False } } learning_rate { soft_start { base_lr: 0.02 start_lr: 0.002 soft_start: 0.1 annealing_points: 0.8 annealing_points: 0.9 annealing_divider: 10.0 } } lambda_rpn_regr: 1.0 lambda_rpn_class: 1.0 lambda_cls_regr: 1.0 lambda_cls_class: 1.0 } inference_config { images_dir: '/workspace/tao-experiments/data/testing/image_2' model: '/workspace/tao-experiments/data/faster_rcnn/frcnn_kitti_resnet18_retrain.epoch12.tlt' batch_size: 1 detection_image_output_dir: '/workspace/tao-experiments/data/faster_rcnn/inference_results_imgs_retrain' labels_dump_dir: '/workspace/tao-experiments/data/faster_rcnn/inference_dump_labels_retrain' rpn_pre_nms_top_N: 6000 rpn_nms_max_boxes: 300 rpn_nms_overlap_threshold: 0.7 object_confidence_thres: 0.0001 bbox_visualize_threshold: 0.6 classifier_nms_max_boxes: 100 classifier_nms_overlap_threshold: 0.3 } evaluation_config { model: '/workspace/tao-experiments/data/faster_rcnn/frcnn_kitti_resnet18_retrain.epoch12.tlt' batch_size: 1 validation_period_during_training: 1 rpn_pre_nms_top_N: 6000 rpn_nms_max_boxes: 300 rpn_nms_overlap_threshold: 0.7 classifier_nms_max_boxes: 100 classifier_nms_overlap_threshold: 0.3 object_confidence_thres: 0.0001 use_voc07_11point_metric:False gt_matching_iou_threshold: 0.5 }

参数 描述 数据类型和约束 默认/建议值
random_seed 实验的随机种子。 无符号整数 42
enc_key TAO 模型的编码和解码密钥,可以被 tao model faster_rcnn traintao model faster_rcnn evaluatetao model faster_rcnn inference 的命令行参数覆盖。 字符串,不能为空
verbose 控制实验期间的日志记录级别。如果为 True,将打印更多日志。 布尔值(True 或 False) False
dataset_config 数据集的配置,这与 DetectNet_v2 中的 dataset_config 相同。 proto 消息
augmentation_config 数据增强的配置,与 DetectNet_v2 相同。 proto 消息
model_config 模型架构的配置。 proto 消息
training_config 使用模型进行训练的配置。 proto 消息
inference_config 使用模型进行推理的配置。 proto 消息
evaluation_config 使用模型进行评估的配置。 proto 消息

数据集

dataset_config 定义了 FasterRCNN 实验的数据集(包括训练数据集和验证数据集)。FasterRCNN 数据集的定义与 DetectNet_v2 的定义相同。有关此参数的详细信息,请查看 DetectNet_v2 dataset_config 文档。

数据增强

augmentation_config 定义了 FasterRCNN 模型训练期间的数据增强。FasterRCNN 数据增强的定义与 DetectNet_v2 的定义相同。有关此参数的详细信息,请查看 DetectNet_v2 augmentation_config 文档。

模型架构

model_config 定义了 FasterRCNN 模型架构。在此参数中,我们可以选择 FasterRCNN 模型的骨干网络,是否启用 BatchNormalization 层,是否在训练期间冻结 BatchNormalization 层,以及是否在训练期间冻结模型中的某些块。使用此参数,我们可以根据用例从通用 FasterRCNN 应用程序定义专门的 FasterRCNN 模型架构。下表总结了此参数的详细描述。

参数 描述 数据类型和约束 默认/建议值
input_image_config 定义输入图像格式,包括图像通道数、通道顺序、宽度和高度,以及在将输入馈送到模型之前对其进行的预处理(减去每通道均值并除以缩放因子)。有关详细信息,请参见下文。 proto 消息
arch FasterRCNN 模型的特征提取器(骨干网络)。FasterRCNN 支持 14 种骨干网络。 字符串类型。架构可以是 ResNet、VGG、GoogLeNet、MobileNet 或 DarkNet。对于每个特定的架构,它可以有不同的层或版本。详细信息如下。ResNet 系列:resnet:10、resnet:18、resnet:34、resnet:50、resnet:101 VGG 系列:vgg:16、vgg:19 GoogLeNet:googlenet MobileNet 系列:mobilenet_v1、mobilenet_v2 DarkNet:darknet:19、darknet:53 EfficientNet:efficientnet:b0、efficientnet:b1 这里可以使用一种符号约定,即对于可以有不同层数的模型,使用冒号后跟层号作为模型名称的后缀。例如,resnet
anchor_box_config 锚框的配置。 proto 消息。
roi_mini_batch 用于训练 RCNN 的 ROI 批次大小。 整数。 256
rpn_stride 从模型输入到 RPN 的累积步幅。此值在当前实现中是固定的 (16)。 整数。 16
freeze_bn 一个标志,用于冻结模型中的所有 BatchNormalization 层。冻结 BatchNormalization 层意味着冻结其移动平均值和移动方差,而其 gamma 和 beta 参数仍然是可训练的。这通常用于小批次大小的 FasterRCNN 训练中,以便从预训练模型初始化移动平均值和移动方差,并在训练期间固定。 布尔值。 False
dropout_rate dropout 率适用于模型中的 Dropout 层(如果有)。目前只有 VGG 16/19 和 EfficientNet 具有 Dropout 层。 浮点数。在区间 (0, 1) 内。 0.0
drop_connect_rate EfficientNet 的 drop_connect 率。 浮点数。在区间 (0, 1) 内。 0.0
freeze_blocks 训练期间要冻结的块 ID 列表。有时,由于某些原因(节省 GPU 内存、使训练过程更稳定等),我们希望在加载预训练模型后冻结模型中的某些块。 整数列表。对于 ResNet,有效的冻结块 ID 是 {0, 1, 2, 3}(含)的任何子集。对于 VGG,有效的冻结块 ID 是 {1, 2, 3, 4, 5}(含)的任何子集。对于 GoogLeNet,有效的冻结块 ID 是 {0, 1, 2, 3, 4, 5, 6, 7}(含)的任何子集。对于 MobileNet V1,有效的冻结块 ID 是 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}(含)的任何子集。对于 MobileNet V2,有效的冻结块 ID 是 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}(含)的任何子集。对于 DarkNet,有效的冻结块 ID 是 {0, 1, 2, 3, 4, 5}(含)的任何子集。对于 EfficientNet,有效的冻结块 ID 是 {0, 1, 2, 3, 4, 5, 6, 7}(含)的任何子集。 保持未指定。
use_bias 一个标志,用于为模型中的卷积层使用偏置。如果模型具有 BatchNormalization 层,我们通常将其设置为 False。 布尔值。 False
roi_pooling_config 模型中 ROIPooling (CropAndResize) 层的配置。 proto 消息。
all_projections 一个标志,用于将模型中的所有 shortcut 层替换为 projection 层。仅对 ResNet 和 MobileNet V2 有效。 布尔值。 False
use_pooling 一个标志,用于在模型中使用 pooling 层。此参数仅对 VGG 和 ResNet 有效。如果设置为 True,将在模型中使用 pooling 层(产生与论文中相同的模型结构)。否则,将使用带步幅的卷积层,并将省略 pooling 层。 布尔值。 False
activation 定义模型中使用的激活函数。仅对 EfficientNet 有效。对于 INT8 部署,使用 relu 激活的 EfficientNet 将比原始 swish 激活产生更好的精度 (mAP)。 proto 消息。

以上每个 proto 消息参数将在下面详细描述。

输入图像配置

input_image_config 定义了 FasterRCNN 模型支持的图像格式。我们可以自定义输入图像大小、每通道均值和图像预处理的缩放因子。我们还可以为我们的训练/验证数据集指定图像类型(RGB 或灰度),以及如果我们在训练期间使用 RGB 图像,则指定通道的顺序。下表详细描述了这一点。

参数 描述 数据类型和约束 默认/建议值
image_type 数据集中图像的类型。 枚举类型,可以是 RGBGRAY_SCALE RGB
size_min 指定输入图像的较小边尺寸,与 size_height_width 互斥。 proto 消息,只有一个 min 参数来指定较小边的像素尺寸。
size_height_width 指定输入图像的高度和宽度,与 size_min 互斥。 proto 消息,有两个参数:heightwidth,用于指定固定的图像大小。
image_channel_order 图像通道顺序。 字符串类型。对于 RGB 图像,可以是 rgbbgrl 用于灰度图像。
image_channel_mean 输入图像的每通道均值。 proto 字典,将每个通道映射到其均值。
image_scaling_factor 用于缩放图像的图像缩放因子。每个像素值将除以这个数字。 浮点数。 1.0
max_objects_num_per_image 数据集中每张图像的最大对象数。 整数。 100
注意

图像中的最大对象数取决于数据集。重要的是将参数 max_objects_num_per_image 设置为不小于此数字。否则,训练将失败。

锚框

参数 anchor_box_config 定义了 FasterRCNN 模型中的锚框大小和宽高比。它有两个子参数:scaleratio。它们每个都是浮点数列表,如下所示。

参数 描述 数据类型和约束 默认/建议值
scale 锚框比例(大小),单位为像素。 浮点数列表。
ratio 锚框的宽高比。 浮点数列表。

ROIPooling(CropAndResize)

roi_pooling_config 参数定义了模型中 ROIPooling(CropAndResize) 层中所需的参数。下表进行了描述。

参数 描述 数据类型和约束 默认/建议值
pool_size 池化 ROI 的输出空间大小(高度和宽度)。仅支持方形 ROI,因此此参数同时适用于高度和宽度。 整数。 7
pool_size_2x 一个标志,用于将池化 ROI 的大小加倍。如果设置为 True。CropAndResize 将生成大小为 2*pool_size 的 ROI,并在 RCNN 中将其下采样 2 倍以恢复到 pool_size。 布尔值。

激活函数

参数 activation 定义了 FasterRCNN 模型中激活函数的类型和参数。此参数仅对 EfficientNet 有效。

参数 描述 数据类型和约束 默认/建议值
activation_type 激活函数的类型。仅支持 reluswish 字符串。

训练配置

proto 消息 training_config 定义了 FasterRCNN 训练实验所需的所有必要参数。下表描述了每个参数。

参数 描述 数据类型和约束 默认/建议值
enable_augmentation 一个标志,用于在训练中启用数据增强。 布尔值。 True
pretrained_weights 用于初始化 FasterRCNN 模型的预训练权重的路径。 字符串。
retrain_pruned_model 我们将要重新训练的剪枝模型的路径。 字符串。
resume_from_model 我们将要恢复中断训练的模型的路径。 字符串。
rpn_min_overlap 用于将锚框与 groundtruth 框匹配的较低 IoU 阈值。如果锚框与任何 groundtruth 框的 IoU 低于此阈值,则此锚框将被视为负锚框。 浮点数。在区间 (0, 1) 内。 0.3
rpn_max_overlap 用于将锚框与 groundtruth 框匹配的较高 IoU 阈值。如果锚框与某些 groundtruth 框的 IoU 高于此阈值,则此锚框将被视为正锚框。 浮点数。在区间 (0, 1) 内。 0.7
classifier_min_overlap 用于生成 proposal 目标的较低 IoU 阈值。如果 ROI 与 groundtruth 框的 IoU 高于此数字且低于 classifier_max_overlap,则此 ROI 在训练期间被视为负 ROI(背景)。 浮点数。在区间 (0, 1) 内。 0.0
classifier_max_overlap 用于生成 proposal 目标的较高 IoU 阈值。如果 ROI 与 groundtruth 框的 IoU 高于此数字,则此 ROI 在训练期间被视为正 ROI。 浮点数。在区间 (0, 1) 内。 0.0
gt_as_roi 一个标志,用于在正 ROI 中包含 groundtruth 框,以用于训练 RCNN。 布尔值。 False
std_scaling RPN 回归损失的缩放因子(乘数)。 浮点数。 1.0
classifier_regr_std RCNN 回归损失的缩放因子(分母)。从“x”、“y”、“w”、“h”到其各自缩放因子的映射。 proto 字典。 {'x': 10, 'y': 10, 'w': 5, 'h': 5}
batch_size_per_gpu 每个 GPU 的训练批次大小。 整数。
num_epochs 训练的 epoch 数。 整数。 20
checkpoint_interval 我们将保存检查点的 epoch 周期。将此数字设置为大于 num_epochs 将基本上禁用检查点。 整数。 1
rpn_pre_nms_top_N 在 Proposal 层中的 NMS 之前要保留的框(ROI)的数量。 整数。
rpn_nms_max_boxes 在 Proposal 层中的 NMS 之后要保留的框(ROI)的最大数量。 整数。
rpn_nms_overlap_threshold Proposal 层中 NMS 的 IoU 阈值。 浮点数。在区间 (0, 1) 内。 0.7
regularizer 正则化器的配置。 proto 消息。
optimizer 优化器的配置。 proto 消息。
learning_rate 学习率调度器的配置。 proto 消息。
lambda_rpn_regr RPN 回归损失的权重因子。 浮点数。 1.0
lambda_rpn_class RPN 分类损失的权重因子。 浮点数。 1.0
lambda_cls_regr RCNN 回归损失的权重因子。 浮点数。 1.0
lambda_cls_class RCNN 分类损失的权重因子。 浮点数。 1.0
enable_qat 一个标志,用于启用 QAT(量化感知训练)。FasterRCNN 不支持加载非 QAT 剪枝模型并启用 QAT 进行重新训练。 布尔值。 False
model_parallelism 模型并行性的分数列表。每个数字是一个分数,表示要放置在 GPU 上的模型层的百分比。例如,两个重复的 model_parallelism: 0.5 表示训练将使用 2 个 GPU,并且每个 GPU 将具有一半的模型层。 重复浮点数
visualizer 训练期间的可视化配置。 proto 消息
early_stopping 提前停止的参数。 proto 消息

proto 消息的描述在下面进一步总结。

正则化器

参数 描述 数据类型和约束 默认/建议值
type 正则化器的类型。 枚举类型。L1L2NO_REG
weight 正则化器的惩罚。 浮点数。

优化器

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

复制
已复制!
            

optimizer { adam { lr: 0.00001 beta_1: 0.9 beta_2: 0.999 decay: 0.0 } }

Adam 优化器参数总结在下表中。

参数 描述 数据类型和约束 默认/建议值
lr 学习率。这实际上被学习率调度器覆盖,因此没有用处。 浮点数。 0.00001
beta_1 模型参数均值的动量。 浮点数。 0.9
beta_2 模型参数方差的动量。 浮点数。 0.999
decay 学习率的衰减因子。没用 浮点数。 0.0

SGD 优化器参数总结在下表中。

参数 描述 数据类型和约束 默认/建议值
lr 学习率。没用,因为学习率被学习率调度器覆盖。 浮点数。 0.00001
momentum SGD 的动量。 浮点数。 0.0
decay 学习率的衰减因子。没用,因为被学习率调度器覆盖。 浮点数。 0.0
nesterov 一个标志,用于为 SGD 启用 Nesterov 动量。 布尔值。 False

RMSProp 优化器参数总结在下表中。

参数 描述 数据类型和约束 默认/建议值
lr 学习率。没用,因为学习率被学习率调度器覆盖。 浮点数。 0.00001

学习率调度器

参数 learning_rate 定义了 FasterRCNN 训练中的学习率调度器。FasterRCNN 中支持两种类型的学习率调度器:soft_startstep。无论选择哪一个,它都将包装在 learning_rate proto 消息中。例如

复制
已复制!
            

learning_rate { step { base_lr: 0.00001 gamma: 1.0 step_size: 30 } }

soft_start 调度器的参数在下表中描述。

参数 描述 数据类型和约束 默认/建议值
base_lr 训练期间的最大学习率。 浮点数。
start_lr 训练开始时的初始学习率。 浮点数。小于 base_lr
soft_start 学习率曲线的软启动阶段的持续时间(占总 epoch 的百分比)。 浮点数。在区间 (0, 1) 内。
annealing_points 降低学习率的时间点列表。也以百分比表示。 浮点数列表。
annealing_divider 在每个 annealing_points 处降低学习率的除数。 浮点数。
learning_rate.png

step 调度器的参数在下表中描述。

参数 描述 数据类型和约束 默认/建议值
base_lr 训练开始时的基本学习率。 浮点数。
gamma 降低学习率的乘数。 浮点数。
step_size 学习率乘以 gamma 的步长(占总 epoch 的百分比)。 浮点数。
注意

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

训练期间的可视化

训练期间的可视化由 visualizer 参数配置。其参数在下表中描述。

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

训练期间的可视化支持 3 种类型的可视化,即:标量、图像和直方图。这些类型的可视化都利用 TensorBoard 工具。每种类型在 TensorBoard GUI 界面中都有一个选项卡。使用标量选项卡,它可以可视化标量,例如损失、学习率和验证 mAP 随时间(训练步骤)的变化。使用图像选项卡,它可以可视化训练期间增强的图像,并在其上绘制边界框。使用直方图选项卡,它可以可视化正在训练的模型的每一层权重和偏置的直方图。

如果参数 enabled 设置为 True,则将启用以上所有可视化。否则,将禁用所有可视化。

参数 num_images 用于限制要在 TensorBoard 的图像选项卡上可视化的最大图像数。

在训练期间,可以在任何可以访问 TensorBoard 日志目录的地方完成可视化。通常,TAO 容器会将卷映射到主机,因此可以在主机上调用 TensorBoard。tensorboard --logdir=/path/to/logs 命令可用于在 Web 浏览器中打开 TensorBoard 可视化 GUI。确保在运行此命令之前安装了 tensorboard。如果环境中未安装,可以运行 pip3 install tensorboard 进行安装。/path/to/logs 参数是用于保存 .tlt 模型的目录的路径,并附加后缀 /logs

提前停止

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

参数 描述 数据类型和约束 默认/建议值
monitor 要监视以启用提前停止的指标。 字符串 loss
patience 在停止训练之前检查 monitor 值的次数。 整数 正整数
min_delta monitor 值的最小值增量,低于该值时,我们认为它没有减少。 浮点数 非负浮点数

推理配置

参数 inference_config 定义了针对 FasterRCNN 模型运行推理所需的所有参数。

参数 描述 数据类型和约束 默认/建议值
images_dir 要运行推理的图像目录的路径。 字符串。
model 要运行推理的 .tlt 模型或 TensorRT 引擎的路径。 字符串。
batch_size 运行推理的批次大小。 整数。 1
rpn_pre_nms_top_N 在推理的 Proposal 层中的 NMS 之前要保留的框(ROI)的数量。 整数。
rpn_nms_max_boxes 在推理的 Proposal 层中的 NMS 之后要保留的框(ROI)的最大数量。 整数。
rpn_nms_overlap_threshold Proposal 层中 NMS 的 IoU 阈值。 浮点数。在区间 (0, 1) 内。 0.7
object_confidence_thres NMS 中的对象置信度分数阈值。置信度低于此数字的所有对象将在 NMS 中被滤除。 浮点数。在区间 (0, 1) 内。 0.0001
classifier_nms_max_boxes 要在 RCNN NMS 中保留的最大框数。 整数。 100
classifier_nms_overlap_threshold RCNN NMS IoU 阈值。 浮点数。在区间 (0, 1) 内。 0.3
detection_image_output_dir 检测图像的输出目录。 字符串。
bbox_caption_on 一个标志,用于在图像中显示每个检测到的对象的类名称和置信度。 布尔值。 False
labels_dump_dir 用于保存检测到的对象标签的输出目录。 字符串。
trt_inference 基于 TensorRT 的推理的配置。如果设置此参数,则推理将使用 TensorRT 引擎而不是 .tlt 模型。 proto 消息。
nms_score_bits 在 TensorRT OSS 中的 NMS 插件中表示分数值的位数。有效范围是 [1, 10] 中的整数。将其设置为任何其他值将使其回退到普通 NMS。目前,此优化的 NMS 插件仅在 FP16 中可用,但它也应通过 INT8 数据类型选择,因为 TensorRT OSS 中没有 INT8 NMS,因此将选择 FP16 中最快的实现。如果回退到普通 NMS,则构建引擎时的实际数据类型将决定运行的确切精度(FP16 或 FP32)。 整数。在区间 [1, 10] 内。 0

基于 TensorRT 的推理

参数 trt_inference 定义了基于 TensorRT 的推理的所有参数。指定后,推理将使用 TensorRT 引擎而不是 .tlt 模型。TensorRT 引擎假定由 tao-converter 工具生成。所有参数都总结在下表中。

参数 描述 数据类型和约束 默认/建议值
trt_engine 要加载的 TensorRT 引擎文件的路径。 字符串。
注意

参数 trt_inference 已弃用。参数 model 现在可以支持 .tlt 模型或 TensorRT 引擎(任何不以 .tlt 扩展名结尾的路径)。

评估配置

参数 evaluation_config 定义了针对 FasterRCNN 模型运行评估所需的所有参数。此参数与 inference_config 非常相似。

参数 描述 数据类型和约束 默认/建议值
model 运行评估的模型路径。可以是 .tlt 模型或 TensorRT 引擎。 字符串。
batch_size 运行推理的批次大小。 整数。 1
rpn_pre_nms_top_N 在评估的 Proposal 层中的 NMS 之前要保留的框(ROI)的数量。 整数。
rpn_nms_max_boxes 在评估的 Proposal 层中的 NMS 之后要保留的框(ROI)的最大数量。 整数。
rpn_nms_overlap_threshold Proposal 层中 NMS 的 IoU 阈值。 浮点数。在区间 (0, 1) 内。 0.7
object_confidence_thres NMS 中的对象置信度分数阈值。置信度低于此数字的所有对象将在 NMS 中被滤除。 浮点数。在区间 (0, 1) 内。 0.0001
classifier_nms_max_boxes 要在 RCNN NMS 中保留的最大框数。 整数。 100
classifier_nms_overlap_threshold RCNN NMS IoU 阈值。 浮点数。在区间 (0, 1) 内。 0.3
use_voc07_11point_metric 一个标志,用于使用 PASCAL VOC 2007 11 点 AP 指标。 布尔值。
validation_period_during_training 训练期间进行验证的周期(以 epoch 为单位)。 整数。 1
trt_evaluation 基于 TensorRT 的评估的配置。如果设置此参数,则评估将使用 TensorRT 引擎而不是 .tlt 模型。 proto 消息。
gt_matching_iou_threshold 用于将检测到的框与 groundtruth 框匹配的 IoU 阈值。与下面的 gt_matching_iou_threshold_range 互斥。 浮点数。 0.5
gt_matching_iou_threshold_range 用于计算多个 IoU 阈值下的 AP 和计算 COCO mAP 的 IoU 阈值范围。与上面的 gt_matching_iou_threshold 互斥。 proto 消息。
visualize_pr_curve 布尔标志,用于启用或禁用 Precision-Recall 曲线的可视化。 布尔值。
注意

参数 visualize_pr_curve,如果设置为 True,将在 evaluate 命令期间生成 Precision-Recall 曲线的图像,图像的确切路径可以在屏幕日志中看到。通过检查图像,我们可以看到每个类在精度和召回率之间的权衡方面的性能。

基于 TensorRT 的评估

在上表中,trt_evaluation 的定义与之前描述的 trt_inference 参数相同。

注意

参数 trt_evaluation 已弃用。参数 model 现在可以支持 .tlt 模型或 TensorRT 引擎(任何不以 .tlt 扩展名结尾的路径)。

评估 IoU 范围

gt_matching_iou_threshold_range 参数在下表中描述。

参数 描述 数据类型和约束 默认/建议值
start IoU 列表的起始点(包含)。 浮点数。在区间 (0, 1) 内。 0.5
step IoU 列表的步长。 浮点数。在区间 (0, 1) 内。 0.05
end IoU 列表的结束点(不包含)。 浮点数。在区间 (0, 1] 内。 1.0

要运行 FasterRCNN 模型的训练,请使用此命令

复制
已复制!
            

tao model faster_rcnn train [-h] -e <experiment_spec> -r <results_dir> [-k <enc_key>] [--gpus <num_gpus>] [--num_processes <number_of_processes>] [--gpu_index <gpu_index>] [--use_amp] [--log_file <log_file_path>]

必需参数

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

  • -r, --results_dir:训练实验的输出目录。

可选参数

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

  • -k, --enc_key:TAO 编码密钥,可以覆盖 spec 文件中的密钥。

  • --gpus:在多 GPU 场景中用于训练的 GPU 数量(默认值:1)。

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

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

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

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

输入要求

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

  • 图像格式:JPG、JPEG、PNG

  • 标签格式:KITTI 检测

示例用法

以下是使用 FasterRCNN 训练命令的示例

复制
已复制!
            

tao model faster_rcnn train --gpu_index 0 -e <experiment_spec> -r <results_dir>

使用预训练模型

通常,对于 FasterRCNN 的初始训练,使用预训练模型(权重)文件有助于获得更好的准确率。NVIDIA 建议使用 NVIDIA GPU Cloud (NGC) 中提供的预训练权重。FasterRCNN 通过名称加载预训练权重。也就是说,逐层地,如果 TAO 在预训练权重文件中找到一个层,其名称和权重(偏置)形状与 TAO 模型中的层匹配,它将把该层的权重(以及任何偏置)加载到模型中。如果 TAO 中的某些层在预训练权重中找不到匹配的层,那么 TAO 将跳过该层,并对该层使用随机初始化。一个例外是,如果 TAO 在预训练权重中找到一个匹配的层(以及任何偏置),但是预训练权重(或任何偏置)在该层中的形状与 TAO 模型中相应层的权重(偏置)形状不匹配,它也将跳过该层。

对于某些没有权重(偏置)的层,不会对其执行任何操作(因此将被跳过)。因此,总共有三种可能的状态来指示层的预训练权重加载的进展情况

  • "Yes" 表示一个层有权重(偏置),并且已从预训练权重文件成功加载以进行初始化。

  • "No" 表示一个层有权重(偏置),但由于权重(偏置)形状不匹配(或可能是其他原因),权重(偏置)无法成功加载,将改为使用随机初始化。

  • "None" 表示一个层根本没有权重(偏置),并且不会加载任何权重。在 FasterRCNN 训练日志中,有一个表格显示模型中每个层的预训练权重加载状态。

要在 FasterRCNN 训练中使用预训练模型,请将 pretrained_weights 路径设置为指向预训练的 .tlt 模型(使用与 FasterRCNN 训练相同的加密密钥生成)、Keras .hdf5 模型或 Keras .h5 权重。

注意

在训练开始时,FasterRCNN 将打印预训练模型加载状态(逐层)。如果模型遇到不良的 mAP,我们可以仔细检查此日志,以查看预训练模型是否已正确加载。

注意

FasterRCNN 不支持加载非 QAT 剪枝模型并启用 QAT 进行重新训练。为了使重新训练的模型成为 QAT 模型,需要也启用 QAT 进行初始训练。

重新训练剪枝模型

FasterRCNN 模型可以重新训练一次或多次。典型的用例是重新训练剪枝模型。要重新训练现有的 FasterRCNN 模型,请将 retrain_pruned_model 路径设置为指向现有的 FasterRCNN 模型。

恢复中断的训练

有时,训练作业可能会由于某些原因(例如,系统崩溃)而中断。在这些情况下,无需从头开始重新进行训练。我们可以从最后一个检查点(训练期间保存的 .tlt 模型)恢复中断的训练。在这种情况下,在 spec 文件中设置 resume_from_model 路径以指向最后一个检查点,然后重新运行训练以恢复作业。

输入形状:静态和动态

FasterRCNN 训练可以支持静态输入形状和动态输入形状。静态输入形状意味着输入的宽度和高度是常数,例如 960 x 544。静态形状是实践中最常用的情况。要启用静态输入形状,我们应该在 input_image_configaugmentation_config 中指定它。我们应该在 input_image_config 中使用 size_height_width 来指定输入的高度和宽度。同样,我们应该在 augmentation_config 中指定相同的两个数字。也就是说,我们在 augmentation_config 中指定 output_image_heightoutput_image_width

使用静态输入形状,我们可以离线调整图像大小到目标分辨率,或者我们可以在训练期间启用自动调整大小。通过将 augmentation_config 中的 enable_auto_resize 设置为 True,我们将启用训练期间的自动调整大小。自动调整大小将减少每次我们想要在不同分辨率下训练模型时手动调整图像大小的工作量。但是由于调整大小发生在训练期间,因此可能会增加训练时间。用户应该权衡离线调整大小和自动(在线)调整大小之间的利弊。

动态输入形状意味着输入的高度和宽度不是常数,而是在训练期间对于不同的图像可以改变。这种输入形状最初在文献中提出(例如在 FasterRCNN 论文中),我们在其中调整图像大小并保持宽高比,使得结果图像的较小边是给定的数字。除了对较小边的限制之外,我们还对较大边有限制。如果我们调整大小并保持宽高比,但结果图像的较大边的尺寸超过了对较大边的限制,那么我们将调整大小并保持宽高比,使得较大边的尺寸是给定的数字。在这种情况下,较小边也将不超过其限制。FasterRCNN 可以支持这种动态输入形状。要启用此功能,我们必须在 input_image_config 中指定 size_min,并在 augmentation_confg 中指定 output_image_minoutput_image_maxsize_minoutput_image_min 指示较小边尺寸的限制,而 output_image_max 指示较大边尺寸的限制。

请注意,关于 FasterRCNN 的动态形状有一些限制。

  • TAO FasterRCNN 训练/评估/推理只能在批大小为 1 的情况下工作。

  • TAO FasterRCNN 导出和 DeepStream(TensorRT) 推理/评估目前不支持动态形状。

模型并行

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

复制
已复制!
            

model_parallelism: 0.3 model_parallelism: 0.7

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

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

要运行 faster_rcnn 模型的评估,请使用此命令

复制
已复制!
            

tao model faster_rcnn evaluate [-h] -e <experiment_spec> [-k <enc_key>] [--gpu_index <gpu_index>] [--log_file <log_file_path>] [-m <model_path>]

必需参数

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

可选参数

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

  • -k, --enc_key:编码密钥,可以覆盖 spec 文件中的密钥。

  • --gpu_index:用于运行评估的 GPU 索引。当机器安装了多个 GPU 时,我们可以指定用于运行评估的 GPU 索引。请注意,评估只能在单个 GPU 上运行。

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

  • -m, --model:要运行评估的模型的路径。模型可以是 .tlt 模型或 TensorRT 引擎(任何不以 .tlt 扩展名结尾的路径)。模型路径(如果在此命令行中提供)将覆盖 spec 文件中的 evaluation_config.model

评估指标

PASCAL VOC 2007 vs 2012 指标

对于 FasterRCNN,评估将为评估模型生成 4 个指标:AP(平均精度)、precision、recall 和 RPN_recall,用于评估数据集中的每个类别。最后,它还将打印 mAP(平均平均精度)作为单个指标数字。支持两种模式来计算 AP,即 PASCAL VOC 2007 和 2012 指标。这可以在 spec 文件的 evaluation_config.use_voc_11_point_metric 参数中配置。如果此参数设置为 True,则 AP 计算将使用 VOC 2007 方法,否则将使用 VOC 2012 方法。

设置 IoU 值/范围以计算 AP/mAP

为了将检测到的对象与 groundtruth 对象匹配,我们可以定义不同的 IoU 阈值。PASCAL VOC 指标中使用 0.5 的 IoU,而在 MS COCO 中,使用 IoU 列表来计算 AP。例如,在 MS COCO 中,mAP@[0.5:0.05:0.95] 是在 10 个不同的 IoU 下的平均 AP,从 0.5 开始,到 0.95 结束,步长为 0.05。TAO FasterRCNN 支持评估一系列 IoU 的 AP,并计算 IoU 范围内的 mAP。具体来说,在 evaluation_config 中设置 gt_matching_iou_threshold 将生成单个 IoU 的 AP/mAP;为 IoU 列表(范围)设置 gt_matching_iou_threshold_range 将生成这些 IoU 值的 AP 和 mAP。为了计算 PASCAL VOC mAP,我们可以将前者设置为 0.5。为了计算 COCO mAP,我们可以将后者设置为 start: 0.5step: 0.05end: 1.0

RPN_recall 指标表示 FasterRCNN 模型的 RPN 的召回能力。RPN_recall 指标越高,意味着 RPN 可以更好地检测到作为前景的对象(但这并没有说明此对象属于哪个类别,因为这被委托给 RCNN)。RPN_recall 指标主要用于调试 FasterRCNN 模型的准确性问题。

FasterRCNN 网络的推理工具可用于可视化边界框或在图像目录上逐帧生成 KITTI 格式的标签。您可以从命令行执行此工具,如下所示

复制
已复制!
            

tao model faster_rcnn inference [-h] -e <experiment_spec> [-k <enc_key>] [--gpu_index <gpu_index>] [--log_file <log_file_path>] [-m <model_path>]

必需参数

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

可选参数

  • -h, --help:打印帮助日志并退出。

  • -k, --enc_key:编码密钥,可以覆盖 spec 文件中的密钥。

  • --gpu_index:用于运行推理的 GPU 索引。如果机器安装了多个 GPU,我们可以指定用于运行推理的 GPU 索引。请注意,推理只能在单个 GPU 上运行。

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

  • -m, --model:要用于推理的模型的路径。模型可以是 .tlt 模型或 TensorRT 引擎(任何不以 .tlt 扩展名结尾的路径)。模型路径(如果在此命令行中提供)将覆盖 spec 文件中的 inference_config.model

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

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

复制
已复制!
            

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

必需参数

  • -m, --model:要剪枝的预训练 .tlt 模型的路径。

  • -o, --output_file:保存剪枝后的 .tlt 模型的路径。

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

可选参数

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

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

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

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

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

    注意

    NVIDIA 建议更改阈值,以使模型中的参数数量保持在原始未剪枝模型的 10-20% 以内。

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

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

  • --gpu_index:用于运行剪枝的 GPU 索引。如果机器安装了多个 GPU,我们可以指定用于运行剪枝的 GPU 索引。请注意,剪枝只能在单个 GPU 上运行。

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

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

使用剪枝命令

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

复制
已复制!
            

tao model faster_rcnn prune -m /workspace/output/weights/resnet_003.tlt -o /workspace/output/weights/resnet_003_pruned.tlt -eq union -pth 0.7 -k nvidia_tlt

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

建议用户关闭正则化器(将正则化器类型设置为 NO_REG)或在 spec 文件中使用较小的权重衰减来恢复重新训练剪枝模型时的准确率。所有其他参数都可以从之前的训练中保留在 spec 文件中。

对于 FasterRCNN,重要的是将 retrain_pruned_model 路径设置为指向剪枝模型。

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

FasterRCNN 导出可以选择生成(部分)DeepStream 配置文件和标签文件。请参见下文。

INT8 模式概述

可以在 INT8 模式下生成 TensorRT 引擎以提高性能,但这需要在引擎创建时使用校准缓存。如果导出运行时 --data_type 标志设置为 int8,则校准缓存是使用校准张量文件生成的。预先生成校准信息并缓存它可以消除在推理设备上校准模型的需要。使用校准缓存还可以加快引擎创建速度,因为构建缓存可能需要几分钟才能生成,具体取决于校准数据的大小和模型本身。

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

  • 选项 1:使用训练数据加载器加载训练图像以进行 INT8 校准。此选项现在是推荐的方法,通过利用训练数据集加载器来支持多个图像目录。这也确保了校准期间数据的两个重要方面

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

    • 数据批次在整个训练数据集中随机采样,从而提高了 INT8 模型的准确率。

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

FP16/FP32 模型

如果您需要在 INT8 精度下运行推理,则只需要 calibration.bin。对于基于 FP16/FP32 的推理,导出步骤要简单得多。所需的只是提供一个来自训练/重新训练步骤的 .tlt 模型,以转换为 .etlt

导出模型

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

复制
已复制!
            

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

必需参数

  • -m, --model:要导出的 .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 参数定义的 JSON 文件。

示例用法

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

复制
已复制!
            

tao model faster_rcnn export --gpu_index 0 -m $USER_EXPERIMENT_DIR/data/faster_rcnn/frcnn_kitti_resnet18_retrain.epoch12.tlt -o $USER_EXPERIMENT_DIR/data/faster_rcnn/frcnn_kitti_resnet18_retrain_int8.etlt -e $SPECS_DIR/default_spec_resnet18_retrain_spec.txt -k nvidia_tlt

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

部署到 DeepStream

对于部署到 deepstream,请参阅 部署到 DeepStream for FasterRCNN

上一篇 DetectNet_v2
下一篇 YOLOv3
© Copyright 2024, NVIDIA. 上次更新日期:2024 年 10 月 15 日。