MaskRCNN
MaskRCNN 支持以下任务
dataset_convert
train
evaluate
prune
inference
export
这些任务可以使用 TAO Launcher 从命令行调用,使用以下约定
tao model mask_rcnn <sub_task> <args_per_subtask>
其中 args_per_subtask
是给定子任务所需的命令行参数。 以下详细解释了每个子任务。
原始图像数据和相应的注释文件需要在训练和评估之前转换为 TFRecords。 dataset_convert
工具可以帮助实现无缝转换,同时提供有关注释文件中潜在问题的见解。 以下部分详细介绍了如何使用 dataset_convert
。
数据集转换器工具的示例用法
dataset_convert
工具的描述如下
tao model mask_rcnn dataset-convert [-h] -i <image_directory>
-a <annotation_json_file>
-o <tfrecords_output_directory>
[-t <tag>]
[-s <num_shards>]
[--include_mask]
您可以使用以下参数
-i, --image_dir
:原始图像存储目录的路径-a, --annotations_file
:注释 JSON 文件-o, --output_dir
:TFRecords 保存到的输出目录-t, --tag
:转换后的 TFRecords 的标签(例如“train”)。 标签默认为注释文件的名称。-s, --num_shards
:转换后的 TFRecords 的分片数。 默认值为 256。--include_mask
:是否在转换期间包含分割 groundtruth。 默认值为 True。-h, --help
:显示此帮助消息并退出。注意如果对象的边界框超出图像帧的范围,或者对象掩码超出其边界框的范围,则会在
output_dir
中生成名为<tag>_warnings.json
的日志文件。 日志文件记录具有问题对象 ID 的image_id
。 例如,{"200365": {"box": [918], "mask": []}
表示object 918
的边界框在image 200365
中超出范围。
以下示例显示了如何将命令与数据集一起使用
tao model mask_rcnn dataset_convert -i /path/to/image_dir
-a /path/to/train.json
-o /path/to/output_dir
注释文件中 categories
下的 id
应从 1 开始。
以下是 MaskRCNN 示例规格文件。 它有三个主要组件:顶层实验配置、data_config
和 maskrcnn_config
,下面将详细解释。 规格文件的格式是 protobuf 文本 (prototxt) 消息,其每个字段可以是基本数据类型或嵌套消息。 下表总结了规格文件的顶层结构。
以下是 MaskRCNN 规格文件的示例
seed: 123
use_amp: False
warmup_steps: 0
checkpoint: "/workspace/tao-experiments/maskrcnn/pretrained_resnet50/tlt_instance_segmentation_vresnet50/resnet50.hdf5"
learning_rate_steps: "[60000, 80000, 100000]"
learning_rate_decay_levels: "[0.1, 0.02, 0.002]"
total_steps: 120000
train_batch_size: 2
eval_batch_size: 4
num_steps_per_eval: 10000
momentum: 0.9
l2_weight_decay: 0.0001
l1_weight_decay: 0.0
warmup_learning_rate: 0.0001
init_learning_rate: 0.02
num_examples_per_epoch: 14700
# pruned_model_path: "/workspace/tao-experiments/maskrcnn/pruned_model/model.tlt"
data_config{
image_size: "(832, 1344)"
augment_input_data: True
eval_samples: 500
training_file_pattern: "/workspace/tao-experiments/data/train*.tfrecord"
validation_file_pattern: "/workspace/tao-experiments/data/val*.tfrecord"
val_json_file: "/workspace/tao-experiments/data/annotations/instances_val2017.json"
# dataset specific parameters
num_classes: 91
skip_crowd_during_training: True
max_num_instances: 200
}
maskrcnn_config {
nlayers: 50
arch: "resnet"
freeze_bn: True
freeze_blocks: "[0,1]"
gt_mask_size: 112
# Region Proposal Network
rpn_positive_overlap: 0.7
rpn_negative_overlap: 0.3
rpn_batch_size_per_im: 256
rpn_fg_fraction: 0.5
rpn_min_size: 0.
# Proposal layer.
batch_size_per_im: 512
fg_fraction: 0.25
fg_thresh: 0.5
bg_thresh_hi: 0.5
bg_thresh_lo: 0.
# Faster-RCNN heads.
fast_rcnn_mlp_head_dim: 1024
bbox_reg_weights: "(10., 10., 5., 5.)"
# Mask-RCNN heads.
include_mask: True
mrcnn_resolution: 28
# training
train_rpn_pre_nms_topn: 2000
train_rpn_post_nms_topn: 1000
train_rpn_nms_threshold: 0.7
# evaluation
test_detections_per_image: 100
test_nms: 0.5
test_rpn_pre_nms_topn: 1000
test_rpn_post_nms_topn: 1000
test_rpn_nms_thresh: 0.7
# model architecture
min_level: 2
max_level: 6
num_scales: 1
aspect_ratios: "[(1.0, 1.0), (1.4, 0.7), (0.7, 1.4)]"
anchor_scale: 8
# localization loss
rpn_box_loss_weight: 1.0
fast_rcnn_box_loss_weight: 1.0
mrcnn_weight_loss_mask: 1.0
}
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
seed | 实验的随机种子 | 无符号整数 | 123 |
warmup_steps | 学习率提升到 init_learning_rate 所需的步数 | 无符号整数 | – |
warmup_learning_rate | 预热阶段的初始学习率 | 浮点数 | – |
learning_rate_steps | 学习率以 learning_rate_decay_levels 中指定的因子衰减的步数列表 | 字符串 | – |
learning_rate_decay_levels | 衰减因子列表。 长度应与 learning_rate_steps 的长度匹配。 | 字符串 | – |
total_steps | 训练迭代总次数 | 无符号整数 | – |
train_batch_size | 训练期间的批次大小 | 无符号整数 | 4 |
eval_batch_size | 验证或评估期间的批次大小 | 无符号整数 | 8 |
num_steps_per_eval | 每 N 步保存一个检查点并运行评估。 | 无符号整数 | – |
momentum | SGD 优化器的动量 | 浮点数 | 0.9 |
l1_weight_decay | L1 权重衰减 | 浮点数 | 0.0001 |
l2_weight_decay | L2 权重衰减 | 浮点数 | 0.0001 |
use_amp | 指定是否使用自动混合精度训练 | 布尔值 | False |
checkpoint | 预训练模型的路径 | 字符串 | – |
maskrcnn_config | 模型的架构 | 消息 | – |
data_config | 输入数据配置 | 消息 | – |
skip_checkpoint_variables | 如果指定,则不会加载具有匹配正则表达式的层的权重。 这对于迁移学习尤其有用。 | 字符串 | – |
pruned_model_path | 剪枝后的 MaskRCNN 模型的路径 | 字符串 | – |
num_examples_per_epoch | 训练集中图像总数除以 GPU 数量 | 无符号整数 | – |
num_epochs | 训练网络的 epoch 数 | 无符号整数 | – |
visualize_images_summary | 是否在 TensorBoard 中预览图像和推理结果。 如果启用,则会将验证集中带有预测边界框的 10 张图像保存在 TensorBoard 事件文件中。 | 布尔值 | – |
必须指定 num_examples_per_epoch
参数,并且应指定 num_epochs
或 total_steps
。 如果两者都设置,则 total_steps
将被 num_epochs * num_examples_per_epoch / train_batch_size
覆盖
使用 skip_checkpoint_variables
时,您可以首先在训练日志中找到模型结构(下面显示了 MaskRCNN+ResNet50 模型结构的一部分)。 例如,如果要重新训练所有预测头,可以将 skip_checkpoint_variables
设置为“head”。 TAO 使用 Python re 库来检查“head”是否与任何层名称或 re.search($skip_checkpoint_variables, $layer_name)
匹配。
[MaskRCNN] INFO : ================ TRAINABLE VARIABLES ==================
[MaskRCNN] INFO : [#0001] conv1/kernel:0 => (7, 7, 3, 64)
[MaskRCNN] INFO : [#0002] bn_conv1/gamma:0 => (64,)
[MaskRCNN] INFO : [#0003] bn_conv1/beta:0 => (64,)
[MaskRCNN] INFO : [#0004] block_1a_conv_1/kernel:0 => (1, 1, 64, 64)
[MaskRCNN] INFO : [#0005] block_1a_bn_1/gamma:0 => (64,)
[MaskRCNN] INFO : [#0006] block_1a_bn_1/beta:0 => (64,)
[MaskRCNN] INFO : [#0007] block_1a_conv_2/kernel:0 => (3, 3, 64, 64)
[MaskRCNN] INFO : [#0008] block_1a_bn_2/gamma:0 => (64,)
[MaskRCNN] INFO : [#0009] block_1a_bn_2/beta:0 => (64,)
[MaskRCNN] INFO : [#0010] block_1a_conv_3/kernel:0 => (1, 1, 64, 256)
[MaskRCNN] INFO : [#0011] block_1a_bn_3/gamma:0 => (256,)
[MaskRCNN] INFO : [#0012] block_1a_bn_3/beta:0 => (256,)
[MaskRCNN] INFO : [#0110] block_3d_bn_3/gamma:0 => (1024,)
[MaskRCNN] INFO : [#0111] block_3d_bn_3/beta:0 => (1024,)
[MaskRCNN] INFO : [#0112] block_3e_conv_1/kernel:0 => (1, 1, 1024, [MaskRCNN] INFO : [#0144] block_4b_bn_1/beta:0 => (512,)
… … … … ...
[MaskRCNN] INFO : [#0174] post_hoc_d5/kernel:0 => (3, 3, 256, 256)
[MaskRCNN] INFO : [#0175] post_hoc_d5/bias:0 => (256,)
[MaskRCNN] INFO : [#0176] rpn/kernel:0 => (3, 3, 256, 256)
[MaskRCNN] INFO : [#0177] rpn/bias:0 => (256,)
[MaskRCNN] INFO : [#0178] rpn-class/kernel:0 => (1, 1, 256, 3)
[MaskRCNN] INFO : [#0179] rpn-class/bias:0 => (3,)
[MaskRCNN] INFO : [#0180] rpn-box/kernel:0 => (1, 1, 256, 12)
[MaskRCNN] INFO : [#0181] rpn-box/bias:0 => (12,)
[MaskRCNN] INFO : [#0182] fc6/kernel:0 => (12544, 1024)
[MaskRCNN] INFO : [#0183] fc6/bias:0 => (1024,)
[MaskRCNN] INFO : [#0184] fc7/kernel:0 => (1024, 1024)
[MaskRCNN] INFO : [#0185] fc7/bias:0 => (1024,)
[MaskRCNN] INFO : [#0186] class-predict/kernel:0 => (1024, 91)
[MaskRCNN] INFO : [#0187] class-predict/bias:0 => (91,)
[MaskRCNN] INFO : [#0188] box-predict/kernel:0 => (1024, 364)
[MaskRCNN] INFO : [#0189] box-predict/bias:0 => (364,)
[MaskRCNN] INFO : [#0190] mask-conv-l0/kernel:0 => (3, 3, 256, 256)
[MaskRCNN] INFO : [#0191] mask-conv-l0/bias:0 => (256,)
[MaskRCNN] INFO : [#0192] mask-conv-l1/kernel:0 => (3, 3, 256, 256)
[MaskRCNN] INFO : [#0193] mask-conv-l1/bias:0 => (256,)
[MaskRCNN] INFO : [#0194] mask-conv-l2/kernel:0 => (3, 3, 256, 256)
[MaskRCNN] INFO : [#0195] mask-conv-l2/bias:0 => (256,)
[MaskRCNN] INFO : [#0196] mask-conv-l3/kernel:0 => (3, 3, 256, 256)
[MaskRCNN] INFO : [#0197] mask-conv-l3/bias:0 => (256,)
[MaskRCNN] INFO : [#0198] conv5-mask/kernel:0 => (2, 2, 256, 256)
[MaskRCNN] INFO : [#0199] conv5-mask/bias:0 => (256,)
[MaskRCNN] INFO : [#0200] mask_fcn_logits/kernel:0 => (1, 1, 256, 91)
[MaskRCNN] INFO : [#0201] mask_fcn_logits/bias:0 => (91,)
MaskRCNN 配置
MaskRCNN 配置 (maskrcnn_config
) 定义了模型结构。 此模型用于训练、评估和推理。 下表包含详细描述。 目前,MaskRCNN 仅支持 ResNet10/18/34/50/101 作为其骨干网络。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
nlayers | ResNet arch 中的层数 | 无符号整数 | 50 |
arch | 骨干特征提取器名称 | 字符串 | resnet |
freeze_bn | 是否冻结骨干网络中的所有 BatchNorm 层 | 布尔值 | False |
freeze_blocks | 骨干网络中要冻结的 conv 块列表 | 字符串 ResNet:对于 ResNet 系列,可用于冻结的块 ID 是 [0, 1, 2, 3](包括)的任何子集 | – |
gt_mask_size | groundtruth 掩码大小 | 无符号整数 | 112 |
rpn_positive_overlap | 为锚点分配正标签的下限阈值 | 浮点数 | 0.7 |
rpn_negative_overlap | 为锚点分配负标签的上限阈值 | 浮点数 | 0.3 |
rpn_batch_size_per_im | RPN 中每个图像的采样锚点数 | 无符号整数 | 256 |
rpn_fg_fraction | 批次中所需的正锚点分数 | 无符号整数 | 0.5 |
rpn_min_size | 最小提议高度和宽度 | 0 | |
batch_size_per_im | 每个图像的 RoI 小批量大小 | 无符号整数 | 512 |
fg_fraction | 标记为前景的 RoI 小批量目标分数 | 浮点数 | 0.25 |
fast_rcnn_mlp_head_dim | Fast-RCNN 分类头维度 | 无符号整数 | 1024 |
bbox_reg_weights | 边界框正则化权重 | 字符串 | “(10, 10, 5, 5)” |
include_mask | 指定是否包含掩码头 | 布尔值 | True(目前仅支持 True) |
mrcnn_resolution | 掩码头分辨率(必须是 4 的倍数) | 无符号整数 | 28 |
train_rpn_pre_nms_topn | 在训练期间应用 NMS 之前要保留的得分最高的 RPN 提议数(每个 FPN 级别) | 无符号整数 | 2000 |
train_rpn_post_nms_topn | 在训练期间应用 NMS 之后要保留的得分最高的 RPN 提议数(生成的总数) | 无符号整数 | 1000 |
train_rpn_nms_threshold | 训练期间 RPN 中的 NMS IOU 阈值 | 浮点数 | 0.7 |
test_detections_per_image | NMS 之后的边界框候选数 | 无符号整数 | 100 |
test_nms | 测试期间的 NMS IOU 阈值 | 浮点数 | 0.5 |
test_rpn_pre_nms_topn | 在测试期间应用 NMS 之前要保留的得分最高的 RPN 提议数(每个 FPN 级别) | 无符号整数 | 1000 |
test_rpn_post_nms_topn | 在测试期间应用 NMS 之后要保留的得分最高的 RPN 提议数(生成的总数) | 无符号整数 | 1000 |
test_rpn_nms_threshold | 测试期间 RPN 中的 NMS IOU 阈值 | 浮点数 | 0.7 |
min_level | 输出特征金字塔的最小级别 | 无符号整数 | 2 |
max_level | 输出特征金字塔的最大级别 | 无符号整数 | 6 |
num_scales | 每个金字塔级别的锚点倍频程尺度数(例如,如果设置为 3,则锚点尺度为 [2^0, 2^(1/3), 2^(2/3)]) | 无符号整数 | 1 |
aspect_ratios | 表示每个金字塔级别上锚点的纵横比的元组列表 | 字符串 | “[(1.0, 1.0), (1.4, 0.7), (0.7, 1.4)]” |
anchor_scale | 基础锚点大小到特征金字塔步幅的比例 | 无符号整数 | 8 |
rpn_box_loss_weight | 用于调整总损失中 RPN 框损失的权重 | 浮点数 | 1.0 |
fast_rcnn_box_loss_weight | 用于调整总损失中 FastRCNN 框回归损失的权重 | 浮点数 | 1.0 |
mrcnn_weight_loss_mask | 用于调整总损失中掩码损失的权重 | 浮点数 | 1.0 |
min_level
、max_level
、num_scales
、aspect_ratios
和 anchor_scale
用于确定 MaskRCNN 的锚点生成。 anchor_scale
是基础锚点比例,而 min_level
和 max_level
设置不同特征图上比例的范围。 例如,min_level
处特征图的实际锚点比例为 anchor_scale * 2^min_level
,而 max_level
处特征图的实际锚点比例为 anchor_scale * 2^max_level。 它将根据实际锚点比例生成不同 aspect_ratios
的锚点。
数据配置
数据配置 (data_config
) 指定输入数据源和格式。 这用于训练、评估和推理。 下表总结了详细描述。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
image_size | 图像尺寸,以引号内的元组形式表示。 “(高度, 宽度)”表示调整大小和填充后的输入的尺寸。 | 字符串 | “(832, 1344)” |
augment_input_data | 指定是否扩充数据 | 布尔值 | True |
eval_samples | 用于评估的样本数 | 无符号整数 | – |
training_file_pattern | 用于训练的 TFRecord 路径 | 字符串 | – |
validation_file_pattern | 用于验证的 TFRecord 路径 | 字符串 | – |
val_json_file | 用于验证的注释文件路径 | 字符串 | – |
num_classes | 类数。 如果注释中有 N 个类别,则 num_classes 应为 N+1(背景类) | 无符号整数 | – |
skip_crowd_during_training | 指定是否在训练期间跳过 crowd | 布尔值 | True |
prefetch_buffer_size | tf.data.Dataset 使用的预取缓冲区大小(默认值:AUTOTUNE) | 无符号整数 | – |
shuffle_buffer_size | tf.data.Dataset 使用的 shuffle 缓冲区大小(默认值:4096) | 无符号整数 | 4096 |
n_workers | 用于解析和预处理数据的工作线程数(默认值:16) | 无符号整数 | 16 |
max_num_instances | 要解析的最大对象实例数(默认值:200) | 无符号整数 | 200 |
如果在训练期间发生内存不足错误,请尝试首先设置较小的 image_size
或 batch_size
。 如果错误仍然存在,请尝试减小 n_workers
、shuffle_buffer_size
和 prefetch_buffer_size
值。 最后,如果原始图像具有非常大的分辨率,请离线调整图像大小并创建新的 tfrecords 以避免将大型图像加载到 GPU 内存。
使用此命令训练 MaskRCNN 模型
tao model mask_rcnn train [-h] -e <experiment_spec>
-d <output_dir>
-k <key>
[--gpus <num_gpus>]
[--gpu_index <gpu_index>]
[--log_file <log_file_path>]
必需参数
-d, --model_dir
:实验输出写入到的文件夹的路径。-k, --key
:用于解密模型的加密密钥。-e, --experiment_spec_file
:用于设置评估的实验规范文件。 这应与训练规范文件相同。
可选参数
--gpus num_gpus
:用于训练的 GPU 数量和要启动的进程数。 默认值为 1。--gpu_index
:如果机器安装了多个 GPU,则用于导出模型的(离散)GPU 的索引。 请注意,导出只能在单个 GPU 上运行。--log_file
:日志文件的路径。 默认路径为stdout
。-h, --help
:显示此帮助消息并退出。
输入要求
输入大小:C * W * H(其中 C = 3,W >= 128,H >= 128,且 W、H 是 2^
max_level
的倍数)图像格式:JPG
标签格式:COCO 检测
示例用法
以下是使用 MaskRCNN 模型上的 train
命令的示例
tao model mask_rcnn train --gpus 2 -e /path/to/spec.txt -d /path/to/result -k $KEY
要运行 MaskRCNN 模型的评估,请使用此命令
tao model mask_rcnn evaluate [-h] -e <experiment_spec_file>
-m <model_file>
-k <key>
[--gpu_index <gpu_index>]
[--log_file <log_file_path>]
必需参数
-e, --experiment_spec_file
:用于设置评估实验的实验规范文件。 这应与训练规范文件相同。-m, --model
:用于评估的模型文件的路径(仅支持 .tlt 模型)。-k, --key
:用于加载模型的密钥。
可选参数
--gpu_index
:如果机器安装了多个 GPU,则用于导出模型的(离散)GPU 的索引。 请注意,导出只能在单个 GPU 上运行。--log_file
:日志文件的路径。 默认路径为stdout
。-h, --help
:显示此帮助消息并退出。
剪枝从模型中删除参数以减小模型大小。 需要重新训练才能重新获得未剪枝模型的性能。
prune
命令包括以下参数
tao model mask_rcnn prune [-h] -m <pretrained_model>
-o <output_dir>
-k <key>
[-n <normalizer>]
[-eq <equalization_criterion>]
[-pg <pruning_granularity>]
[-pth <pruning threshold>]
[-nf <min_num_filters>]
[-el [<excluded_list>]
[--gpu_index <gpu_index>]
[--log_file <log_file>]
必需参数
-m, --pretrained_model
:预训练模型的路径。-o, --output_dir
:包含剪枝模型的输出目录,命名为model.tlt
。-k, --key
:用于加载.tlt
模型的密钥。
可选参数
-h, --help
:显示此帮助消息并退出。-n, --normalizer
:max
表示通过将每个范数除以层内的最大范数来进行归一化;L2
表示通过除以包含所有内核范数的向量的 L2 范数来进行归一化。 (默认值:max)-eq, --equalization_criterion
:均衡元素级操作层或深度卷积层输入统计信息的标准。 此参数对于 resnet 和 mobilenet 很有用。 选项包括arithmetic_mean
、geometric_mean
、union
和intersection
。 (默认值:union
)-pg, --pruning_granularity
:一次要删除的过滤器数量。 (默认值:8)-pth
:用于比较归一化范数的阈值。 (默认值:0.1)-nf, --min_num_filters
:每层要保留的最小过滤器数量(默认值:16)-el, --excluded_layers
:excluded_layers 列表。 示例:-i item1 item2(默认值:[])--gpu_index
:用于运行评估的 GPU 的索引(当机器安装了多个 GPU 时很有用)。 请注意,评估只能在单个 GPU 上运行。--log_file
:日志文件的路径。 默认为stdout
。
以下是使用 prune
命令的示例
tao model mask_rcnn prune -m /workspace/model.step-100.tlt
-o /workspace/output
-eq union
-pth 0.7 -k $KEY
剪枝后,模型需要先重新训练才能用于推理或评估。
模型剪枝后,精度可能会降低。 发生这种情况是因为某些以前有用的权重可能已被删除。 为了重新获得精度,NVIDIA 建议您在同一数据集上重新训练此剪枝后的模型。 为此,请运行 tao model mask_rcnn train
命令,并使用更新后的规格文件,该文件通过设置 pruned_model_path
指向新剪枝的模型。
建议用户在重新训练期间关闭正则化器。 您可以通过将 l1_weight_decay
和 l2_weight_decay
的正则化器权重都设置为 0 来执行此操作。 其他参数可以从之前的训练保留在规格文件中。 train_batch_size
和 eval_batch_size
必须保持不变。
MaskRCNN 网络的 inference
工具可用于可视化边界框或在图像目录上生成逐帧 COCO 格式标签。 以下是使用此工具的示例
tao model mask_rcnn inference [-h] -i <input directory>
-r <results directory>
-e <experiment spec file>
-m <model file>
[-k <key>]
[-t <bbox confidence threshold>]
[--include_mask]
[--gpu_index <gpu_index>]
[--log_file <log_file_path>]
必需参数
-m, --model_path
:训练后的 MaskRCNN 模型的路径(.tlt
模型或转换后的 TensorRT 引擎)。-i, --image_dir
:用于推理的输入图像目录。 支持的图像格式包括 PNG、JPG 和 JPEG。-e, --experiment_spec
:用于训练的实验规格文件的路径。-r, --results_dir
:输出带注释图像的目录路径。
可选参数
-k, --key
:用于加载.tlt
模型的密钥(如果使用 TensorRT 引擎,则不需要)。-t, --threshold
:用于绘制边界框的阈值(默认值:0.6)-c, --class_map
:包含类名称的文本文件,该文件应与注释文件中类别 ID 升序排列的类别名称匹配。 如果省略标签文件,则带注释的图像将不会在边界框旁边显示类别名称。 此参数仅 TensorRT 引擎支持。--include_mask
:指定是否在带注释的输出上绘制掩码。--gpu_index
:如果机器安装了多个 GPU,则用于导出模型的(离散)GPU 的索引。 请注意,导出只能在单个 GPU 上运行。--log_file
:日志文件的路径。 默认路径为stdout
。-h, --help
:显示此帮助消息并退出。
导出模型将训练过程与推理分离,并允许在 TAO 环境之外转换为 TensorRT 引擎。 TensorRT 引擎特定于每个硬件配置,应为每个唯一的推理环境生成。 导出的模型可以在训练和部署硬件之间通用使用。
导出的模型格式称为 .etlt
。 与 .tlt
模型格式一样,.etlt
是一种加密模型格式,它使用与从中导出的 .tlt
模型相同的密钥。 部署此模型时需要此密钥。
INT8 模式概述
TensorRT 引擎可以在 INT8 模式下生成以提高性能,但需要在引擎创建时使用校准缓存。 如果在运行 export
时 --data_type
标志设置为 int8
,则使用校准张量文件生成校准缓存。 预先生成校准信息并缓存它消除了在推理机器上校准模型的需要。 移动校准缓存通常比移动校准张量文件方便得多,因为它是一个小得多的文件,可以与导出的模型一起移动。 使用校准缓存还可以加快引擎创建速度,因为构建缓存可能需要几分钟才能生成,具体取决于 Tensorfile 的大小和模型本身。
导出工具可以通过使用以下选项之一摄取训练数据来生成 INT8 校准缓存
选项 1:使用训练数据加载器加载训练图像以进行 INT8 校准。 此选项现在是支持多个图像目录的推荐方法,通过利用训练数据集加载器。 这也确保了校准期间数据的两个重要方面
INT8 校准步骤中的数据预处理与训练过程中的数据预处理相同。
数据批次在整个训练数据集中随机采样,从而提高了 INT8 模型的准确性。
选项 2:将工具指向要用于校准模型的图像目录。 对于此选项,请确保创建随机图像的子采样目录,该目录最能代表您的训练数据集。
FP16/FP32 模型
如果您需要在 INT8 精度下运行推理,则只需要 calibration.bin
。 对于基于 FP16/FP32 的推理,导出步骤要简单得多:您只需提供来自训练/重新训练步骤的 .tlt
模型即可转换为 .etlt
格式。
导出 MaskRCNN 模型
以下是 tao model mask_rcnn export
命令的命令行参数示例
tao model mask_rcnn export [-h] -m <path to the .tlt model file generated by tao model train>
-k <key>
--experiment_spec <path to experiment spec file>
[-o <path to output file>]
[--gen_ds_config <Flag to generate ds config and label file>]
[--gpu_index <gpu_index>]
[--log_file <log_file_path>]
必需参数
-m, --model
:要使用export
导出的.tlt
模型文件的路径。-k, --key
:用于保存.tlt
模型文件的密钥。-e, --experiment_spec
:规格文件的路径。
可选参数
-o, --output_file
:用于保存导出模型的路径。 默认路径为./<input_file>.etlt
。--gen_ds_config
:一个布尔标志,指示是否在与output_file
相同的目录中生成模板 DeepStream 相关配置 (“nvinfer_config.txt”) 以及标签文件 (“labels.txt”)。 请注意,配置文件不是完整的配置文件,需要用户使用生成的参数更新 DeepStream 中的示例配置文件。--gpu_index
:如果机器安装了多个 GPU,则用于导出模型的(离散)GPU 的索引。 请注意,导出只能在单个 GPU 上运行。--log_file
:日志文件的路径。 默认路径为stdout
。-h, --help
:显示此帮助消息并退出。
MaskRCNN 不支持 QAT。
示例用法
以下是以 INT8 模式导出 MaskRCNN 模型的示例命令
tao model mask_rcnn export -m /ws/model.step-25000.tlt \
-k nvidia_tlt \
-e /ws/maskrcnn_train_resnet50.txt
有关 TensorRT 引擎生成、验证和 int8 校准,请参阅 TAO 部署文档。
请参阅集成 MaskRCNN 模型以了解有关将 MaskRCNN 模型部署到 DeepStream 的更多信息。