TAO v5.5.0

EfficientDet (TF1)

EfficientDet 支持以下任务

  • dataset_convert

  • train

  • evaluate

  • prune

  • inference

  • export

这些任务可以通过命令行按照以下约定从 TAO Launcher 调用

复制
已复制!
            

tao model efficientdet_tf1 <sub_task> <args_per_subtask>

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

EfficientDet 期望用于训练或验证的图像目录以及 COCO 格式的带注释 JSON 文件。

原始图像数据和相应的注释文件需要在训练和评估之前转换为 TFRecords。 dataset_convert 工具可帮助实现无缝转换,同时提供对注释文件中潜在问题的洞察。 以下部分详细介绍了如何使用 dataset_convert

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

以下描述了 dataset_convert 工具

复制
已复制!
            

tao model efficientdet_tf1 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:是否在转换期间包含分割 ground truth。 默认值为 False。

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

    注意

    如果对象的边界框超出图像帧的范围,或者对象掩码超出其边界框的范围,则会在 output_dir 中生成一个名为 <tag>_warnings.json 的日志文件。 日志文件记录具有问题对象 ID 的 image_id。 例如,{"200365": {"box": [918], "mask": []} 表示 object 918 的边界框在 image 200365 中超出范围。

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

复制
已复制!
            

tao model efficientdet_tf1 dataset_convert -i /path/to/image_dir -a /path/to/train.json -o /path/to/output_dir

以下是 EfficientDet 规范文件的示例。 它有 5 个主要组成部分:model_configtraining_configeval_configaugmentation_configdataset_config。 规范文件的格式为 protobuf 文本 (.prototxt) 消息,其每个字段可以是基本数据类型或嵌套消息。

复制
已复制!
            

training_config { train_batch_size: 16 iterations_per_loop: 10 checkpoint_period: 10 num_examples_per_epoch: 14700 num_epochs: 300 model_name: 'efficientdet-d0' profile_skip_steps: 100 tf_random_seed: 42 lr_warmup_epoch: 5 lr_warmup_init: 0.00005 learning_rate: 0.1 amp: True moving_average_decay: 0.9999 l2_weight_decay: 0.00004 l1_weight_decay: 0.0 checkpoint: "/path/to/your/pretrained_model" # pruned_model_path: "/path/to/your/pruned/model" } dataset_config { num_classes: 91 image_size: "512,512" training_file_pattern: "/path/to/coco/train-*" validation_file_pattern: "/path/to/coco/val-*" validation_json_file: "/path/to/coco/annotations/instances_val2017.json" } eval_config { eval_batch_size: 16 eval_epoch_cycle: 10 eval_after_training: True eval_samples: 5000 min_score_thresh: 0.4 max_detections_per_image: 100 } model_config { model_name: 'efficientdet-d0' min_level: 3 max_level: 7 num_scales: 3 } augmentation_config { rand_hflip: True random_crop_min_scale: 0.1 random_crop_max_scale: 2.0 }

下表总结了规范文件的顶层结构

训练配置

训练配置 (training_config) 定义了训练、评估和推理所需的参数。 下表总结了详细信息。

字段 描述 数据类型和约束 推荐/典型值
train_batch_size 每个 GPU 的批量大小。 有效批量大小为 batch_size_per_gpu * num_gpus 无符号整数,正数 16
num_epochs 训练网络的 epoch 数 无符号整数,正数 300
num_examples_per _epoch 训练集中图像总数除以 GPU 数量 无符号整数,正数
checkpoint 预训练模型的路径(如果有) 字符串
pruned_model_path 用于重新训练的 TAO 剪枝模型的路径(如果有) 字符串
checkpoint_period 每个模型检查点/验证应运行的训练 epoch 数 无符号整数,正数 10
amp 一个标志,指定是否使用混合精度训练 布尔值
moving_average_decay 移动平均衰减 浮点数 0.9999
l2_weight_decay L2 权重衰减 浮点数
l1_weight_decay L1 权重衰减 浮点数
lr_warmup_epoch 学习率计划中的预热 epoch 数 无符号整数,正数
lr_warmup_init 预热期间的初始学习率 浮点数
learning_rate 最大学习率 浮点数
tf_random_seed 随机种子 无符号整数,正数 42
clip_gradients_norm 按范数值裁剪梯度 浮点数 5
skip_checkpoint _variables 如果指定,则不会加载具有匹配正则表达式的图层的权重。 这对于迁移学习特别有用。 字符串 “-predict*”

评估配置

评估配置 (eval_config) 定义了训练期间或独立评估所需的参数。 下表总结了详细信息。

字段 描述 数据类型和约束 推荐/典型值
eval_epoch_cycle 每次验证应运行的训练 epoch 数 无符号整数,正数 10
max_detections_per_image 要可视化的最大检测数 无符号整数,正数 100
min_score_thresh 可以被视为匹配的预测框的最小置信度 浮点数 0.5
eval_batch_size 每个 GPU 的批量大小。 有效批量大小为 batch_size_per_gpu * num_gpus 无符号整数,正数 16
eval_samples 用于评估的样本数 无符号整数

数据集配置

数据配置 (data_config) 指定输入数据源和格式。 这用于训练、评估和推理。 下表总结了详细描述。

字段 描述 数据类型和约束 推荐/典型值
image_size 图像尺寸,以引号括起来的元组形式表示:“(高度, 宽度)”。 这表示调整大小和填充后的输入的尺寸。 字符串 “(512, 512)”
training_file_pattern 用于训练的 TFRecord 路径 字符串
validation_file_pattern 用于验证的 TFRecord 路径 字符串
val_json_file 用于验证的注释文件路径 字符串
num_classes 类别的数量。 如果注释中有 N 个类别,则 num_classes 应为 N+1(背景类)。 无符号整数
max_instances_per_image 要解析的最大对象实例数(默认值:100) 无符号整数 100
skip_crowd_during_training 指定是否在训练期间跳过 crowd 布尔值 True

模型配置

模型配置 (model_config) 指定模型结构。 下表总结了详细描述。

字段 描述 数据类型和约束 推荐/典型值
model_name EfficientDet 模型名称 字符串 “efficientdet_d0”
min_level 输出特征金字塔的最小级别 无符号整数 3(仅支持 3)
max_level 输出特征金字塔的最大级别 无符号整数 7(仅支持 7)
num_scales 每个金字塔级别上的锚定八度音阶的数量(例如,如果设置为 3,则锚定比例为 [2^0, 2^(1/3), 2^(2/3)]) 无符号整数 3
max_instances_per_image 要解析的最大对象实例数(默认值:100) 无符号整数 100
aspect_ratios 表示每个金字塔级别上锚定纵横比的元组列表 字符串 “[(1.0, 1.0), (1.4, 0.7), (0.7, 1.4)]”
anchor_scale 基本锚定大小与特征金字塔步幅的比率 无符号整数 4

增强配置

augmentation_config 参数定义了预处理后的图像增强。

字段 描述 数据类型和约束 推荐/典型值
rand_hflip 一个标志,指定是否执行随机水平翻转 布尔值
random_crop_min_scale RandomCrop 增强的最小比例。 默认值为 0.1。 浮点数 0.1
random_crop_max_scale RandomCrop 增强的最大比例。 默认值为 2.0。 浮点数 2.0

使用以下命令训练 EfficientDet 模型

复制
已复制!
            

tao model efficientdet_tf1 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:在多 GPU 场景中用于训练的 GPU 数量。 默认值为 1。

  • --gpu_index:用于训练的 GPU 的索引。 当机器安装了多个 GPU 时,可以使用此参数。

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

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

输入要求

  • 输入大小:C * W * H(其中 C = 1 或 3,W >= 128,H >= 128;W、H 是 32 的倍数)

  • 图像格式:JPG

  • 标签格式:COCO 检测

示例用法

以下是 train 命令的示例

复制
已复制!
            

tao model efficientdet_tf1 train --gpus 2 -e /path/to/spec.txt -d /path/to/result -k $KEY

要使用 EfficientDet 模型运行评估,请使用以下命令

复制
已复制!
            

tao model efficientdet_tf1 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_path:用于评估的模型文件的路径(仅支持 TAO 模型)

  • -k, --key:用于加载 TAO 模型的密钥

可选参数

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

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

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

示例用法

以下是使用 evaluate 命令的示例

复制
已复制!
            

tao model efficientdet_tf1 evaluate -e /path/to/spec.txt -m /path/to/model.tlt -k $KEY

EfficientDet 模型的推理工具可用于可视化边界框,并在图像目录上生成逐帧 KITTI 格式标签。

复制
已复制!
            

tao model efficientdet_tf1 inference [-h] -i <input directory> -o <output annotated image directory> -e <experiment spec file> -m <model file> -k <key> [-l <output label directory>] [--gpu_index <gpu_index>] [--log_file <log_file_path>]

必需参数

  • -m, --model_path:预训练模型的路径(同时支持 TAO 模型和 TensorRT 引擎)

  • -i, --in_image_path:用于推理的输入图像目录

  • -o, --out_image_path:输出带注释图像的目录路径

  • -k, --key:用于加载 TAO 模型的密钥(如果使用 TensorRT 引擎,则不需要此参数)

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

可选参数

  • -l, --out_label_path:输出 KITTI 标签的目录

  • --label_map:训练标签的文本文件的路径

  • --gpu_index:运行推理的 GPU 的索引。 当机器安装了多个 GPU 时,可以使用此参数。 请注意,推理只能在单个 GPU 上运行。

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

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

示例用法

以下是使用 inference 命令的示例

复制
已复制!
            

tao model efficientdet_tf1 inference -e /path/to/spec.txt -m /path/to/model.tlt -k $KEY -o /path/to/output_dir -i /path/to/input_dir

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

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

复制
已复制!
            

tao model efficientdet_tf1 prune [-h] -m <efficientdet 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_path>]

必需参数

  • -m, --model:预训练 EfficientDet 模型的路径。

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

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

可选参数

  • -n, –normalizer:指定 max 以通过将每个范数除以图层内的最大范数来进行归一化;指定 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:排除图层的列表(例如 “-i item1 item2”)。 默认值为 []

  • --gpu_index:运行剪枝的 GPU 的索引。 当机器安装了多个 GPU 时,可以使用此参数。 请注意,推理只能在单个 GPU 上运行。

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

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

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

注意

由于较大的 EfficientDet 模型的复杂性,剪枝过程将花费更长的时间才能完成。 例如,在 V100 服务器上剪枝 EfficientDet-D5 模型可能至少需要 25 分钟。


使用剪枝命令

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

复制
已复制!
            

tao model efficientdet_tf1 prune -m /path/to/model.step-0.tlt \ -o /path/to/pruned_model/ \ -eq union \ -pth 0.7 -k $KEY

模型剪枝后,准确性可能会略有下降,因为某些先前有用的权重可能已被删除。 为了重新获得准确性,我们建议在同一数据集上重新训练此剪枝模型。 为此,请使用 tao model efficientdet_tf1 train 命令,如 训练模型 中所述,并使用更新的规范文件,该文件将新剪枝的模型指定为预训练模型文件。

我们建议关闭正则化器或减小 training_config 中 EfficientDet 的权重衰减,以便在重新训练剪枝模型时恢复准确性。 为此,请将正则化器类型设置为 NO_REG,如 训练配置 部分中所述。 其他参数可以从先前的训练中保留在规范文件中。

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

导出 EfficientDet 模型

以下是 tao model efficientdet_tf1 export 命令的命令行参数示例

复制
已复制!
            

tao model efficientdet_tf1 export [-h] -m <path to the .tlt model file> -e <path to experiment spec file> -k <key> [-o <path to output file>] [--gpu_index <gpu_index>] [--log_file <log_file_path>] [--verbose]

必需参数

  • -m, --model_path:要导出的 .tlt 模型文件的路径

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

  • -e, --experiment_spec:规范文件的路径

  • -o, --output_path:保存导出模型的路径

示例用法

以下是将 EfficientDet 模型导出到 .etlt 文件的示例命令。

复制
已复制!
            

tao model efficientdet_tf1 export -m /path/to/model.step-0.tlt \ -o /path/to/export/model.step-0.etlt \ -e /ws/spec.txt \ -k $KEY

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

有关部署到 DeepStream,请参阅 集成 EfficientDet (TF1/TF2) 模型 页面。

上一篇 RetinaNet
下一篇 语义分割
© 版权所有 2024,NVIDIA。 上次更新时间:2024 年 10 月 15 日。