UNET
UNet 是一个语义分割模型,支持以下任务
训练
剪枝
评估
推理
导出
这些任务可以通过 TAO Launcher 从命令行调用,遵循以下约定
tao model unet <sub_task> <args_per_subtask>
其中 args_per_subtask
是给定子任务所需的命令行参数。 每个子任务的详细说明如下。
要对 Unet 执行训练、评估、剪枝和推理,您需要配置多个组件,每个组件都有自己的参数。UNet 实验的 train
、evaluate
、prune
和 inference
任务共享同一个配置文件。
Unet 训练的规范文件配置了训练流程的这些组件
模型
训练器
数据集
模型配置
可以使用规范文件中的 model_config
选项配置分割模型。
以下是示例模型配置,用于实例化一个 resnet18 模型,其中块 0 和 1 被冻结,所有快捷连接都设置为投影层
# Sample model config for to instantiate a resnet18 model freeze blocks 0, 1
# with all shortcuts having projection layers.
model_config {
num_layers: 18
all_projections: true
arch: "resnet"
freeze_blocks: 0
freeze_blocks: 1
use_batch_norm: true
initializer: HE_UNIFORM
training_precision {
backend_floatx: FLOAT32
}
model_input_height: 320
model_input_width: 320
model_input_channels: 3
}
下表描述了 model_config
参数
参数 |
数据类型 |
默认值 |
描述 |
支持的值 |
---|---|---|---|---|
all_projections |
Boolean |
False |
对于具有快捷连接的模板,此参数定义是否应使用 1x1 实例化所有快捷方式 |
True/False(仅在 resnet 模板中使用) |
arch |
string |
resnet |
用作训练的骨干特征提取器的架构 |
resnet、vgg、vanilla_unet、efficientnet_b0、vanilla_unet_dynamic |
num_layers |
int |
18 |
可扩展模板的特征提取器的深度 |
* resnets: 10, 18, 34, 50, 101 |
enable_qat |
Boolean |
False |
启用使用量化感知训练 (QAT) 进行模型训练。有关 |
True/False |
use_pooling |
Boolean |
False |
一个布尔值,用于确定在下采样时是使用步幅卷积还是 MaxPooling。 当为 True 时,使用 MaxPooling 进行 |
True/False |
use_batch_norm | Boolean | False | 一个布尔值,用于确定是否使用批归一化层 | True/False |
training precision | Proto 字典 | – | 包含一个嵌套参数,用于设置后端训练框架的精度 | backend_floatx: FLOAT32 |
load_graph |
Boolean |
False |
对于剪枝模型,将此参数设置为 True。 剪枝会修改原始图,因此需要同时导入剪枝后的模型图和权重。 |
True/False |
freeze_blocks |
float |
– |
此参数定义可以从实例化的特征提取器模板中冻结哪些块,并且对于不同的 |
* ResNet 系列:对于 ResNet 系列,可用于冻结的块 ID 是 [0, 1, 2, 3](含)的任何子集 |
freeze_bn |
Boolean |
False |
您可以选择在训练期间冻结模型中的批 |
True/False |
initializer |
enum |
GLOROT_UNIFORM |
卷积层的初始化。 支持的初始化是 He Uniform、He Normal 和 Glorot uniform。 |
HE_UNIFORM, HE_NORMAL, GLOROT_UNIFORM |
model_input_height |
int |
– |
模型的模型输入高度维度,应为 16 的倍数。 |
>100 |
model_input_width |
int |
– |
模型的模型输入宽度维度,应为 16 的倍数。 |
>100 |
model_input_channels |
int |
– |
模型的模型输入通道维度,对于 Resnet/VGG 骨干网络,应设置为 3。 对于基于 vanilla_unet 的模型,可以设置为 1 或 3 |
1/3 |
vanilla_unet
模型最初在本文中提出:U-Net:用于生物医学图像分割的卷积网络。 此模型推荐用于二元分割用例。 标准 UNet 的输入尺寸固定为 572 x 572
。
训练
本节概述如何配置训练参数。 以下是 training_config
元素的示例
training_config {
batch_size: 2
epochs: 3
log_summary_steps: 10
checkpoint_interval: 1
loss: "cross_dice_sum"
learning_rate:0.0001
lr_scheduler {
cosine_decay {
alpha : 0.01
decay_steps: 500
}
}
regularizer {
type: L2
weight: 3.00000002618e-09
}
optimizer {
adam {
epsilon: 9.99999993923e-09
beta1: 0.899999976158
beta2: 0.999000012875
}
}
}
下表描述了 training_config
的参数。
参数 |
数据类型 |
默认值 |
描述 |
支持的值 |
---|---|---|---|---|
batch_size | int | 1 | 每个 GPU 每个批次的图像数量 | >= 1 |
epochs | int | 无 | 训练模型的 epoch 数。 一个 epoch 表示对整个数据集进行一次训练迭代。 | > 1 |
log_summary_steps | int | 1 | 摘要步骤间隔,用于将训练详细信息打印到 stdout | 1 - 每个 epoch 的步数 |
checkpoint_interval | int | 1 | 保存检查点的 epoch 间隔数 | 1 - 总 epoch 数 |
loss | string | cross_entropy | 用于分割的损失。 任务支持的损失如下
|
cross_entropy, cross_dice_sum, dice |
learning_rate | float | 0.0001 | 学习率初始化值。 | 0 - 1 |
lr_scheduler | lr_scheduler 原型配置 | 无(恒定学习率) | 支持以下 lr_schedulers
|
|
weights_monitor | bool | False | 指定是否记录权重范围的 tensorboard 可视化。 | True/ False |
visualizer | visualizer 原型配置 | – | 此参数定义 Tensorboard 可视化器的功能。 可视化器配置包括以下参数:* save_summary_steps (int):需要在 Tensorboard 上可视化的损失的步数。 * infrequent_save_summary_steps (int):需要在其后可视化权重直方图、输入图像、训练预测掩码和 Groundtruth 掩码叠加的步数。 | <= 每个 epoch 的步数 <= 整个训练的总步数 |
regularizer | regularizer 原型配置 | – | 此参数配置训练期间要使用的正则化器的类型和权重。 两个参数包括
|
type 支持的值为
|
optimizer | optimizer 原型配置 | 此参数定义要用于训练的优化器,以及配置它的参数,即
|
||
activation | string | softmax sigmoid | 要在最后一层上使用的激活函数。 任务支持的激活函数如下
|
softmax, sigmoid |
Dice 损失目前仅支持二元分割。 不支持多类分割的通用 Dice 损失。
如果您的掩码以 COCO JSON 格式保存,则可以使用 UNet 数据集转换器将这些掩码转换为 UNet PNG 掩码图像。 以下部分详细介绍了如何使用 dataset_convert
。
COCO 到 UNet 格式数据集转换器工具的示例用法
dataset_convert
工具的描述如下
tao model unet dataset-convert [-h] -f <path_to_coco_json_file>
-r <results dir to save mask images>
[-n <number of images>]
您可以使用以下参数。
必需参数
-f, --coco_file
:原始图像存储目录的路径-r, --results_dir
:PNG 掩码图像将保存到的结果目录的路径
可选参数
-n, --num_files
:要从 COCO JSON 文件转换为掩码图像的前“n”个图像的数量。 如果未提供,则转换 COCO JSON 文件中的所有图像。-h, --help
:打印帮助消息。注意如果分割掩码的最紧密边界框超出图像帧的边界,则将在
results_dir
中生成名为skipped_annotations_log.json
的日志文件。 日志文件记录与有问题的分割标注相关的image_id
和annotation_id
值。 缺少分割的标注和缺少标注字段的图像也记录在.json
文件中。 例如,以下日志行表示id 562121
的分割在image 226111
中超出边界。{"error": "The segmentation map is out of bounds or faulty.", "image_id": 226111, "annotation_id": 562121 }
以下示例显示了如何将命令与数据集一起使用
tao model unet dataset_convert -f /path/to/coco_json_file
-r /path/to/results_dir/images
-n 8
数据集
本节介绍如何配置 dataset_config
函数。 您可以将输入图像和相应的掩码以文件夹或文本文件的形式馈送。
以下是使用文件夹作为输入的 dataset_config
元素的示例
dataset_config {
dataset: "custom"
augment: True
resize_padding: True
resize_method: BILINEAR
augmentation_config {
spatial_augmentation {
hflip_probability : 0.5
vflip_probability : 0.5
crop_and_resize_prob : 0.5
}
brightness_augmentation {
delta: 0.2
}
}
input_image_type: "grayscale"
train_images_path:"/workspace/tao-experiments/data/unet/isbi/images/train"
train_masks_path:"/workspace/tao-experiments/data/unet/isbi/masks/train"
val_images_path:"/workspace/tao-experiments/data/unet/isbi/images/val"
val_masks_path:"/workspace/tao-experiments/data/unet/isbi/masks/val"
test_images_path:"/workspace/tao-experiments/data/unet/isbi/images/test"
data_class_config {
target_classes {
name: "foreground"
mapping_class: "foreground"
label_id: 0
}
target_classes {
name: "background"
mapping_class: "background"
label_id: 1
}
}
}
请参阅结构化图像和掩码文件夹,其中提供了图像和掩码路径内容的描述。
以下是使用文本文件作为输入的 dataset_config
元素的示例
dataset_config {
dataset: "custom"
augment: True
augmentation_config {
spatial_augmentation {
hflip_probability : 0.5
vflip_probability : 0.5
crop_and_resize_prob : 0.5
}
brightness_augmentation {
delta: 0.2
}
}
input_image_type: "color"
train_data_sources: {
data_source: {
image_path: "/workspace/images_train/images_source1.txt"
masks_path: "/workspace/labels_train/labels_source1.txt"
}
data_source: {
image_path: "/workspace/images_train/images_source2.txt"
masks_path: "/workspace/labels_train/labels_source2.txt"
}
}
val_data_sources: {
data_source: {
image_path: "/workspace/images_val/images_source1.txt"
masks_path: "/workspace/labels_val/labels_source1.txt"
}
data_source: {
image_path: "/workspace/images_val/images_source2.txt"
masks_path: "/workspace/labels_val/labels_source2.txt"
}
}
test_data_sources: {
data_source: {
image_path: "/workspace/images_test/images_source1.txt"
masks_path: "/workspace/labels_test/labels_source1.txt"
}
data_source: {
image_path: "/workspace/images_test/images_source2.txt"
masks_path: "/workspace/labels_test/labels_source2.txt"
}
}
data_class_config {
target_classes {
name: "foreground"
mapping_class: "foreground"
label_id: 0
}
target_classes {
name: "background"
mapping_class: "background"
label_id: 1
}
}
}
请参阅图像和掩码文本文件,其中提供了文本文件内容的描述。
下表描述了用于配置 dataset_config
的参数
参数 |
数据类型 |
默认值 |
描述 |
支持的值 |
---|---|---|---|---|
dataset | string | custom | 使用的输入类型数据集。 当前支持的数据集是用户自定义的。 未来将添加开源数据集。 | custom |
augment | bool | False | 如果应在训练时在线扩充输入,则以 0.5 的概率完成以下扩充。 可以修改扩充配置以更改每种扩充类型的概率。
|
true / false |
buffer_size | integer | 数据集大小 | 预取时将缓冲的最大元素数。 此参数对于大型数据集很有用 | <= 训练数据集样本数 |
filter_data | bool | False | 跳过训练期间不存在的那些图像/掩码 | true/ fasle |
augmentation_config | Proto 消息 | 无 | 包含 spatial_augmentation 原型和 brightness_augmentation 原型,用于配置相应扩充的概率。 | |
spatial_augmentation | Proto 字典 | 无
|
包含以下可配置字段。 如果 augment 参数设置为 True,则设置为默认值。
|
|
brightness_augmentation | Proto 字典 | 0.2 | 配置以下参数:delta:使用 delta 值调整亮度。 | 非负整数 |
input_image_type | string | color | 输入图像类型,指示输入图像是灰度还是彩色 (RGB) | color/ grayscale |
resize_padding | bool | False | 图像将在所有边上使用零填充调整大小,以保持纵横比 | true / false |
resize_method | string | BILINEAR | 图像使用以下方法之一调整大小:* BILINEAR:双线性插值。 如果 antialias 为 true,则在下采样时变为半径为 1 的 hat/tent 滤波器函数。 * NEAREST_NEIGHBOR:最近邻插值。 * BICUBIC:Keys 的三次插值。 * AREA:使用面积插值的抗锯齿重采样 | BILINEAR NEAREST_NEIGHBOR BICUBIC AREA |
train_images_path | string | 无 | 输入训练图像路径 | UNIX 路径字符串 |
train_masks_path | string | 无 | 输入训练掩码路径 | UNIX 路径字符串 |
val_images_path | string | 无 | 输入验证图像路径 | UNIX 路径字符串 |
val_masks_path | string | 无 | 输入验证掩码路径 | UNIX 路径字符串 |
test_images_path | string | 无 | 输入测试图像路径 | UNIX 路径字符串 |
train_data_sources | Proto 消息 | 无 | 输入训练 data_source 原型,其中包含训练序列的文本文件 | |
val_data_sources | Proto 消息 | 无 | 输入训练 data_source 原型,其中包含验证序列的文本文件 | |
test_data_sources | Proto 消息 | 无 | 输入训练 data_source 原型,其中包含测试序列的文本文件 | |
data_source | Proto 字典 | – | 每个文本文件对应一个序列的重复字段。 以下是 data_source 配置的参数
|
|
data_class_config | Proto 字典 | 无 | Proto 字典,其中包含作为 target_classes 原型一部分的训练类的信息,如下所述。 | |
target_classes | Proto 字典 | – | 每个训练类的重复字段。 以下是 target_classes 配置的必需参数
|
训练图像支持的图像扩展格式为“.png”、“.jpg”、“.jpeg”、“.PNG”、“.JPG”和“.JPEG”。
按照这些说明准备输入数据并设置规范文件后。 现在,您可以开始训练语义分割网络了。
以下是 UNet 训练命令
tao model unet train [-h] -k <key>
-r <result directory>
-e <spec_file>
[-m <Pre-trained weights to initialize>]
[-n <name of the model>
[--gpus <num GPUs>]
[--gpu_index <space separate gpu indices>]
[--use_amp]
必需参数
-r, --results_dir
:应写入实验输出的文件夹的路径。-k, –key
:用于保存或加载.tlt
模型的用户特定编码密钥。-e, --experiment_spec_file
:规范文件的路径。
可选参数
-m, --pretrained_model_file
:要初始化的预训练模型的路径。 此参数默认为None
。 此参数配置为剪枝模型以进行重新训练。-n, --model_name
:最终检查点将保存在权重目录中的名称。 默认值为model.tlt
。--gpus
:用于训练的 GPU 数量和要启动的进程数。 默认值为 1。--gpu_index
:用于训练的 GPU 的索引。 GPU 索引在./deviceQuery
CUDA 示例中描述。--use_amp
:启用自动混合精度模式的标志-h, --help
:打印此帮助消息。
输入要求
输入大小:C * W * H(其中 C = 3 或 1,对于 vanilla unet,W = 572,H = 572,对于其他架构,W >= 128,H >= 128,且 W、H 是 32 的倍数)。
图像格式:JPG、JPEG、PNG、BMP
标签格式:图像/掩码对
图像和掩码不需要等于模型输入大小。 图像/掩码将在训练期间调整为模型输入大小。
示例用法
这是一个用于双 GPU 训练的命令示例
tao model unet train -e </path/to/spec/file>
-r </path/to/experiment/output>
-k <key_to_load_the_model>
-n <name_string_for_the_model>
-m <Pre-trained weights to initialize the model>
--gpus 2
UNet 支持从中间检查点恢复训练。 如果先前运行的训练实验过早停止,您可以通过简单地使用与之前相同的命令行参数重新运行 UNet 训练命令,从上次检查点重新启动训练。 UNet 的训练器在结果目录中找到上次保存的检查点并从那里恢复训练。 检查点保存的间隔由 UNet 的“training_config”下的 checkpoint_interval 参数定义。 恢复训练时,请勿使用预训练权重参数。
UNet 支持 Tensorboard 可视化,用于损失,可视化训练期间训练图像上的预测掩码以及输入图像上的 Ground truth 掩码叠加。 tensorboard 日志保存在 output/events 目录中,以便对其进行可视化。
剪枝从模型中删除参数以减小模型大小,而不会使用 prune
命令损害模型本身的完整性。
prune
任务包括以下参数
tao model unet prune [-h] -m <pretrained_model>
-e <spec_file>
-o <output_file>
-k <key>
[-n <normalizer>]
[-eq <equalization_criterion>]
[-pg <pruning_granularity>]
[-pth <pruning threshold>]`
[-nf <min_num_filters>]
[-el [<excluded_list>]
必需参数
-m, --pretrained_model
:要剪枝的模型的路径。 通常,使用最后一个 epoch 模型。-e, --experiment_spec_file
:规范文件的路径。-o, --output_file
:剪枝模型的路径。-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
:排除层列表(例如-i item1 item2
)(默认值:[])
剪枝后,需要重新训练模型。 有关更多详细信息,请参阅重新训练剪枝模型。
剪枝模型不直接支持评估和推理。 您必须先重新训练剪枝模型,然后才能执行评估和推理。
使用 Prune 命令
以下是使用 prune
任务的示例
tao model unet prune -e </path/to/spec/file>
-m </path/to/weights to be pruned>
-o </path/to/pruned weights>
-eq union
-pth 0.7
-k $KEY
模型架构 Shufflenet
不支持剪枝。
模型剪枝后,精度可能会略有下降,因为某些先前有用的权重可能已被删除。 为了恢复精度,我们建议您使用 train
命令在同一数据集上重新训练此剪枝模型,如训练模型部分所述,并将 -m, --pretrained_model
参数指向新剪枝的模型作为预训练模型文件。
我们建议在 UNet 的 training_config
中将正则化器权重设置为零,以在重新训练剪枝模型时恢复精度。 所有其他参数都可以从之前的训练中保留在规范文件中。
要加载剪枝模型以及重新训练,请将 model_config
下的 load_graph
标志设置为 true
。
按如下方式在 UNet 模型上执行 evaluate
tao model unet evaluate [-h] -e <experiment_spec>
-m <model_file>
-o <output folder>
-k <key>
[--gpu_index]
必需参数
-e, --experiment_spec_file
:用于设置评估实验的实验规范文件。 这应与训练规范文件相同。-m, --model_path
:用于评估的模型文件的路径。 这可以是.tlt
模型文件,也可以是使用export
工具生成的 tensorrt 引擎。-o, --output_dir
:评估指标保存为 JSON 文件的输出目录。 TAO 推理保存到output_dir/results_tlt.json
,TRT 推理保存到output_dir/results_trt.json
。 结果 JSON 文件包含每个类别的精度、召回率、f1 分数和 IOU。 它还提供这些指标的加权平均值、宏平均值和微平均值。 有关平均指标的更多信息,请参阅分类报告。-k, -–key
:用于解密模型的加密密钥。 此参数仅在使用
.tlt
模型文件时是必需的。
可选参数
-h, --help
:显示此帮助消息并退出。--gpu_index
:要在其上运行评估的 GPU 的索引
如果您已按照训练 Unet 模型中的示例进行操作,您现在可以使用以下命令评估模型
示例用法
这是一个用于评估模型的命令示例
tao model unet evaluate -e </path/to/training/spec/file>
-m </path/to/the/model>
-o </path/to/evaluation/output>
-k <key to load the model>
此命令使用提供给 val_images_path
和 val_masks_path
或 dataset_config
中 :code:`val_data_sources` 下提供的文本文件的图像和掩码运行评估。
UNet 的 inference
任务可用于可视化分割并在图像目录上生成逐帧 PNG 格式标签。 此任务的命令示例如下所示
tao model unet inference [-h] -e <experiment_spec>
-m <model_file>
-o <output folder to save inference images>
-k <key>
[--gpu_index]
必需参数
-e, --experiment_spec_file
:推理规范文件的路径。-o, --output_dir
:带标注的输出图像和标签的目录。 带标注的图像位于vis_overlay_tlt
中,标签位于mask_labels_tlt
中。 如果 TRT 引擎用于推理,则带标注的图像保存在vis_overlay_trt
中,预测标签保存在mask_labels_trt
中。-k, --enc_key
:用于加载模型的密钥。
该工具会自动在 output_dir/vis_overlay_tlt
中生成分割叠加图像。 标签将在 output_dir/mask_labels_tlt
中生成。 trt
推理的带标注的分割图像和标签分别保存在 output_dir/vis_overlay_trt
和 output_dir/mask_labels_trt
中。
TAO 中的 UNet 模型应用程序包括一个 export
子任务,用于导出和准备训练好的 UNet 模型以部署到 DeepStream。export
子任务可以选择生成 TensorRT INT8 引擎校准的校准缓存。
导出模型将训练过程与部署分离,并允许在 TAO 环境之外转换为 TensorRT 引擎。 TensorRT 引擎特定于每个硬件配置,应为每个唯一的推理环境生成。 这可以互换地称为 .trt
或 .engine
文件。 同一个导出的 TAO 模型可以通用地用于训练和部署硬件。 这称为 .etlt
文件或加密的 TAO 文件。 在模型导出期间,TAO 模型使用私钥加密。 当您部署此模型进行推理时,需要此密钥。
INT8 模式概述
TensorRT 引擎可以在 INT8 模式下生成,以较低的精度运行,从而提高性能。 此过程需要一个缓存文件,其中包含张量的比例因子,以帮助对抗由于低精度算术而可能出现的量化错误。 当 export
与设置为 int8
的 --data_type
标志一起运行时,校准缓存是使用校准张量文件生成的。 预先生成校准信息并缓存它消除了在推理机器上校准模型的需要。 移动校准缓存通常比移动校准张量文件方便得多,因为它是一个小得多的文件,可以与导出的模型一起移动。 使用校准缓存还可以加快引擎创建速度,因为构建缓存可能需要几分钟才能生成,具体取决于张量文件的大小和模型本身。
导出工具可以通过提取训练数据来生成 INT8 校准缓存。 您需要将该工具指向一个图像目录,以用于校准模型。 您还需要创建一个随机图像的子采样目录,以最好地代表您的训练数据集。

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

导出 UNet 模型
以下是 export
命令的命令行参数示例
tao model unet export [-h] -m </path/to the .tlt model file generated by tao model train>
-k <key>
-e </path/to/experiment/spec_file>
[-o </path/to/output/file>]
[-s <strict_type_constraints>]
[--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>]
[--engine_file </path/to/the/TensorRT/engine_file>]
[--gen_ds_config] <Flag to generate ds config and label file>]
[--verbose Verbosity of the logger]
必需参数
-m, --model
:要使用export
导出的 .tlt 模型文件的路径。-k, --key
:用于保存.tlt
模型文件的密钥。-e, --experiment_spec
:规范文件的路径。
可选参数
-o, --output_file
:要将导出的模型保存到的路径。 默认路径为./<input_file>.etlt
。--data_type
:用于在 INT8 模式下生成校准缓存的引擎数据类型。 选项为fp32
、fp16
和int8
。 默认值为fp32
。 如果使用 int8,则需要int8
参数。--gen_ds_config
:一个布尔标志,指示是否生成模板 DeepStream 相关配置 (“nvinfer_config.txt”) 以及标签文件 (“labels.txt”),与output_file
在同一目录中。 请注意,配置文件不是完整的配置文件,需要用户使用生成的参数更新 DeepStream 中的示例配置文件。-s, --strict_type_constraints
:一个布尔标志,指示在构建 TensorRT 引擎时是否应用 TensorRTstrict_type_constraints
。 请注意,这仅适用于应用 INT8 模式的严格类型。
INT8 导出模式必需参数
--cal_data_file
:与--cal_image_dir
一起使用的输出文件。--cal_image_dir
:用于校准的图像目录。
如果为命令行上的 --cal_data_file
参数提供了有效路径,则导出工具会生成一个中间 TensorFile,以便从 --cal_image_dir
图像目录中的随机批次图像中重复使用。 此张量文件用于校准。 如果未提供 --cal_image_dir
,则随机输入张量用于校准。 生成的张量文件中的批次数量从设置为 --batches
参数的值中获得,batch_size
从设置为 --batch_size
参数的值中获得。 确保 --cal_image_dir
中提到的目录中至少有 batch_size * batches
个图像。 有效的图像扩展名为“.jpg”、“.jpeg”和“.png”。 在这种情况下,校准张量的 input_dimensions
从 .tlt
模型的输入层派生。
INT8 导出可选参数
--cal_cache_file
:用于保存校准缓存文件的路径。 默认值为./cal.bin
。--batches
:用于校准和推理测试的批次数。 默认值为 10。--batch_size
:用于校准的批大小。 默认值为 8。--max_batch_size
:TensorRT 引擎的最大批大小。 默认值为 1。--min_batch_size
:TensorRT 引擎的最小批大小。 默认值为 1。--opt_batch_size
:TensorRT 引擎的最佳批大小。 默认值为 1。--max_workspace_size
:TensorRT 引擎的最大工作区大小。 默认值为 1073741824 = 1<<30--experiment_spec
:用于训练/推理/评估的experiment_spec
。--engine_file
:序列化的 TensorRT 引擎文件的路径。 请注意,此文件特定于硬件,不能在 GPU 之间通用。 引擎文件允许您在主机上使用 TensorRT 快速测试模型的准确性。 由于 TensorRT 引擎文件特定于硬件,因此除非部署 GPU 与训练 GPU 相同,否则您不能将引擎文件用于部署。--force_ptq
:一个布尔标志,用于强制对导出的.etlt
模型执行训练后量化。
导出启用 QAT 训练的模型时,用于校准激活的张量比例因子会从模型中剥离出来,并序列化到 cal_cache_file
参数定义的 TensorRT 可读缓存文件中。但是,当前版本的 QAT 本身不支持在 Jetson 上进行 DLA int8 部署。要在 Jetson 上使用 DLA int8
部署此模型,请使用 --force_ptq
标志来使用 TensorRT 后训练量化生成校准缓存文件。
导出子任务的示例用法
以下是使用 --cal_image_dir
选项的 UNet 模型的示例命令。
tao model unet export
-m $USER_EXPERIMENT_DIR/unet/model.tlt
-o $USER_EXPERIMENT_DIR/unet/model.int8.etlt
-e $SPECS_DIR/unet_train_spec.txt
--key $KEY
--cal_image_dir $USER_EXPERIMENT_DIR/data/isbi/images/val
--data_type int8
--batch_size 8
--batches 10
--cal_data_file $USER_EXPERIMENT_DIR/export/isbi_cal_data_file.txt
--cal_cache_file $USER_EXPERIMENT_DIR/export/isbi_cal.bin
--engine_file $USER_EXPERIMENT_DIR/export/int8.isbi.engine
有关部署,请参阅 :ref:TAO 部署文档 <unet_with_tao_deploy>
有关将 UNet 模型部署到 DeepStream 的更多信息,请参阅集成 UNet 模型页面。