EfficientDet (TF2)
使用 EfficientDet,支持以下任务
dataset_convert
train
evaluate
prune
inference
export
这些任务可以通过 TAO Launcher 从命令行按照以下约定调用
tao model efficientdet_tf2 <sub_task> <args_per_subtask>
其中 args_per_subtask
是给定子任务所需的命令行参数。以下详细解释了每个子任务。
EfficientDet 期望用于训练或验证的图像目录以及 COCO 格式的注释 JSON 文件。有关 EfficientDet 的数据格式的更多信息,请参阅数据注释格式页面。
原始图像数据和相应的注释文件需要在训练和评估之前转换为 TFRecords。dataset_convert
工具可以帮助实现无缝转换,同时提供对注释文件中潜在问题的洞察。以下部分详细介绍了如何使用 dataset_convert
。
数据集转换器工具的示例用法
以下描述了 dataset_convert
工具
tao model efficientdet_tf2 dataset-convert [-h] -e <conversion spec file>
以下是数据转换规范文件的示例。规范文件的格式为 YAML,配置参数位于 dataset_convert 下。
dataset_convert:
image_dir: '/workspace/tao-experiments/data/raw-data/train2017/'
annotations_file: '/workspace/tao-experiments/data/raw-data/annotations/instances_train2017.json'
output_dir: '/workspace/tao-experiments/data'
tag: 'train'
num_shards: 256
include_masks: True
下表总结了每个参数的详细信息
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
image_dir | 存储原始图像的目录路径 | 字符串 | – |
annotations_file | 注释 JSON 文件的路径 | 字符串 | – |
output_dir | 保存 TFRecords 的输出目录 | 字符串 | – |
tag | 转换后的 TFRecords 的分片数 | 整数 | 256 |
num_shards | 用于重新训练的 TAO 剪枝模型的路径(如果有) | 字符串 | – |
include_mask | 是否在转换期间包含分割真值 | 布尔值 | False |
如果对象的边界框超出图像帧的范围,或者对象掩码超出其边界框的范围,则会在 output_dir
中生成名为 <tag>_warnings.json
的日志文件。日志文件记录了具有问题对象 ID 的 image_id
。例如,{"200365": {"box": [918], "mask": []}
表示 object 918
的边界框在 image 200365
中超出范围。
以下示例显示了如何使用命令
tao model efficientdet_tf2 dataset_convert -i /path/to/convert.yaml
以下是 EfficientDet 规范文件的示例。它有 7 个主要组成部分:dataset
、model
、train
、evaluate
、inference
、prune
和 export
配置,以及加密密钥 (encryption_key
) 和结果目录 (results_dir
)。
dataset:
loader:
prefetch_size: 4
shuffle_file: False
shuffle_buffer: 10000
cycle_length: 32
block_length: 16
max_instances_per_image: 100
skip_crowd_during_training: True
num_classes: 91
train_tfrecords:
- '/datasets/coco/train-*'
val_tfrecords:
- '/datasets/coco/val-*'
val_json_file: '/datasets/coco/annotations/instances_val2017.json'
augmentation:
rand_hflip: True
random_crop_min_scale: 0.1
random_crop_max_scale: 2
auto_color_distortion: False
auto_translate_xy: False
train:
optimizer:
name: 'sgd'
momentum: 0.9
lr_schedule:
name: 'cosine'
warmup_epoch: 5
warmup_init: 0.0001
learning_rate: 0.2
amp: True
checkpoint: "/weights/efficientnet-b0_500.tlt"
num_examples_per_epoch: 100
moving_average_decay: 0.999
batch_size: 20
checkpoint_interval: 5
l2_weight_decay: 0.00004
l1_weight_decay: 0.0
clip_gradients_norm: 10.0
image_preview: True
qat: False
random_seed: 42
pruned_model_path: ''
num_epochs: 200
model:
name: 'efficientdet-d0'
aspect_ratios: '[(1.0, 1.0), (1.4, 0.7), (0.7, 1.4)]'
anchor_scale: 4
min_level: 3
max_level: 7
num_scales: 3
freeze_bn: False
freeze_blocks: []
input_width: 512
input_height: 512
evaluate:
batch_size: 8
num_samples: 5000
max_detections_per_image: 100
checkpoint: ''
export:
batch_size: 8
dynamic_batch_size: True
min_score_thresh: 0.4
checkpoint: ""
onnx_file: ""
inference:
checkpoint: ""
image_dir: ""
dump_label: False
batch_size: 1
prune:
checkpoint: ""
normalizer: 'max'
output_path: ""
equalization_criterion: 'union'
granularity: 8
threshold: 0.5
min_num_filters: 16
excluded_layers: []
encryption_key: 'nvidia_tlt'
results_dir: '/workspace/results_dir'
num_gpus: 1
gpu_ids: [0]
规范文件的格式为 YAML。下表总结了规范文件的顶级结构
字段 | 描述 |
dataset | 与数据源和数据加载器相关的配置 |
model | 与模型构建相关的配置 |
train | 与训练过程相关的配置 |
evaluate | 与独立评估过程相关的配置 |
prune | 用于剪枝训练模型的配置 |
inference | 用于运行模型推理的配置 |
export | 用于导出训练模型的配置 |
encryption_key | 全局加密密钥 |
results_dir | 保存实验结果和状态日志的目录 |
训练配置
训练配置 (train
) 定义了训练和评估所需的参数。下表总结了详细信息。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
batch_size | 每个 GPU 的批量大小,因此有效批量大小为 batch_size_per_gpu * num_gpus。 | 无符号整数,正数 | 16 |
num_epochs | 训练网络的 epoch 数 | 无符号整数,正数 | 300 |
num_examples_per _epoch | 训练集中的图像总数 | 无符号整数,正数 | – |
checkpoint | 预训练模型的路径(如果有) | 字符串 | – |
pruned_model_path | 用于重新训练的 TAO 剪枝模型的路径(如果有) | 字符串 | – |
checkpoint_interval | 每个模型检查点/验证应运行的训练 epoch 数 | 无符号整数,正数 | 10 |
amp | 是否使用混合精度训练 | 布尔值 | – |
moving_average_decay | 移动平均衰减 | 浮点数 | 0.9999 |
l2_weight_decay | L2 权重衰减 | 浮点数 | – |
l1_weight_decay | L1 权重衰减 | 浮点数 | – |
random_seed | 随机种子 | 无符号整数,正数 | 42 |
clip_gradients_norm | 按范数值裁剪梯度 | 浮点数 | 5 |
qat | 启用量化感知训练 | 布尔值 | False |
optimizer | 优化器配置 | ||
lr_schedule | 学习率调度器配置 |
优化器配置 (train.optimizer
) 指定优化器的类型和参数。 +———————+——————————————————————————————————-+——————————-+————————————————————————————–+ | 字段 | 描述 | 数据类型和约束 | 推荐/典型值 | +———————+——————————————————————————————————-+——————————-+————————————————————————————–+ | name | 优化器名称(仅支持 sgd
) | 字符串 | ‘sgd’ | +———————+——————————————————————————————————-+——————————-+————————————————————————————–+ | momentum | 动量 | 浮点数 | 0.9 | +———————+——————————————————————————————————-+——————————-+————————————————————————————–+
学习率调度器配置 (train.lr_schedule
) 指定学习率调度器的类型和参数。 +———————+——————————————————————————————————-+——————————-+————————————————————————————–+ | 字段 | 描述 | 数据类型和约束 | 推荐/典型值 | +———————+——————————————————————————————————-+——————————-+————————————————————————————–+ | name | 学习率调度器的名称。可用选项为 cosine
和 soft_anneal
| 字符串 | ‘cosine’ | +———————+——————————————————————————————————-+——————————-+————————————————————————————–+ | warmup_epoch | 学习率调度中的预热 epoch 数 | 无符号整数,正数 | – | +———————+——————————————————————————————————-+——————————-+————————————————————————————–+ | warmup_init | 预热期间的初始学习率 | 浮点数 | – | +———————+——————————————————————————————————-+——————————-+————————————————————————————–+ | learning_rate | 最大学习率 | 浮点数 | – | +———————+——————————————————————————————————-+——————————-+————————————————————————————–+ | annealing_epoch | 在此点开始退火至 warmup_init | 无符号整数,正数 | – | +———————+——————————————————————————————————-+——————————-+————————————————————————————–+
评估配置
评估配置 (evaluate
) 定义了训练期间或独立评估所需的参数。下表总结了详细信息。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
checkpoint | 要评估的 .tlt 模型的路径 | 字符串 | – |
max_detections_per_image | 要可视化的最大检测数 | 无符号整数,正数 | 100 |
batch_size | 每个 GPU 的批量大小,因此有效批量大小为 batch_size_per_gpu * num_gpus | 无符号整数,正数 | 16 |
num_samples | 用于评估的样本数 | 无符号整数 | – |
label_map | 存储索引到标签名称映射的 YAML 文件。(可选)如果设置,将计算每类 AP 指标 | 字符串 | – |
start_eval_epoch | 评估将在此 epoch 之后开始(默认值:1) | 无符号整数 | – |
results_dir | 存储评估结果的目录(可选) | 无符号整数 | – |
推理配置
推理配置 (inference
) 定义了使用训练后的 .tlt
模型进行独立推理所需的参数。下表总结了详细信息。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
checkpoint | 要运行推理的 .tlt 模型的路径 | 字符串 | – |
image_dir | 图像目录的路径 | 字符串 | – |
output_dir | 将保存带注释图像的输出目录的路径 | 字符串 | – |
dump_label | 是否以 KITTI 格式转储标签文件 | 布尔值 | – |
batch_size | 运行推理的批量大小 | 无符号整数 | – |
min_score_thresh | 渲染预测边界框的最小置信度阈值 | 字符串 | – |
label_map | 存储索引到标签名称映射的 YAML 文件(可选)如果设置,带注释的图像将具有与边界框关联的类标签 | 字符串 | – |
max_boxes_to_draw | 将在带注释的图像中渲染的最大边界框数 | 字符串 | – |
results_dir | 存储推理结果的目录(可选) | 无符号整数 | – |
数据集配置
数据集配置 (dataset
) 指定输入数据源和格式。这用于训练和评估。下表总结了详细描述。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
train_tfrecords | 用于训练的 TFRecord 路径 | 字符串 | – |
val_tfrecords | 用于验证的 TFRecord 路径 | 字符串 | – |
val_json_file | 用于验证的注释文件路径 | 字符串 | – |
num_classes | 类数。如果在注释中有 N 个类别,则 num_classes 应为 N+1(背景类) | 无符号整数 | – |
max_instances_per_image | 要解析的最大对象实例数(默认值:100) | 无符号整数 | 100 |
skip_crowd_during_training | 指定在训练期间是否跳过 crowd | 布尔值 | True |
loader | 数据加载器配置 | ||
augmentation | 数据增强配置 |
数据加载器配置 (dataset.loader
) 指定如何将数据批次馈送到模型中。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
prefetch_size | “WxH”格式的图像尺寸,其中 W 和 H 表示调整大小和填充后的输入的尺寸。 | 字符串 | “512x512” |
shuffle_file | 用于训练的 TFRecord 路径 | 字符串 | – |
shuffle_buffer | “WxH”格式的图像尺寸,其中 W 和 H 表示调整大小和填充后的输入的尺寸。 | 字符串 | “512x512” |
cycle_length | 用于训练的 TFRecord 路径 | 字符串 | – |
block_length | 用于训练的 TFRecord 路径 | 字符串 | – |
dataset.augmentation
配置指定预处理后使用的图像增强方法。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
rand_hflip | 一个标志,指定是否执行随机水平翻转 | 布尔值 | – |
random_crop_min_scale | RandomCrop 增强的最小比例(默认值:0.1) | 浮点数 | 0.1 |
random_crop_max_scale | RandomCrop 增强的最大比例(默认值:2.0) | 浮点数 | 2.0 |
auto_color_distortion | 启用自动颜色增强的标志 | 布尔值 | False |
auto_translate_xy | 在 X/Y 轴上启用自动图像平移的标志 | 布尔值 | False |
模型配置
模型配置 (model
) 指定模型结构。下表总结了详细描述。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
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 |
input_width | 输入宽度 | 无符号整数 | 512 |
input_height | 输入高度 | 无符号整数 | 512 |
剪枝配置
prune
配置定义了训练模型的剪枝过程。下表总结了详细描述。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
normalizer | 归一化方法。指定 max 以通过将每层中的每个范数除以最大范数进行归一化,或指定 L2 以通过除以包含所有内核范数的向量的 L2 范数进行归一化 |
字符串 | max |
equalization_criterion | 均衡元素级操作层或深度方向卷积层输入统计信息的标准。选项为 arithmetic_mean geometric_mean 、``union`` 和 intersection 。 |
字符串 | union |
granularity | 一次要移除的过滤器数量 | 整数 | 8 |
threshold | 剪枝阈值 | 浮点数 | – |
min_num_filters | 每层要保留的最小过滤器数量。默认值:16 | 整数 | 16 |
excluded_layers | 要从剪枝中排除的层列表 | 列表 | – |
checkpoint | 要剪枝的 .tlt 模型文件的路径 |
字符串 | – |
导出配置
export
配置包含将 .tlt
模型导出到 .onnx
模型的参数,该模型可用于部署。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
batch_size | 如果 dynamic_batch_size 设置为 False,则 .onnx 模型的最大批量大小 |
布尔值 | – |
dynamic_batch_size | 一个标志,指定是否在导出的 .onnx 模型中使用动态批量大小 |
布尔值 | True |
checkpoint | 要导出的 .tlt 模型文件的路径 |
字符串 | – |
onnx_file | 保存导出的 .onnx 模型的路径 |
字符串 | False |
min_score_thresh | NMS 层中的置信度阈值(默认值:0.01) | 浮点数 | – |
使用以下命令训练 EfficientDet 模型
tao model efficientdet_tf2 train [-h] -e <experiment_spec>
[results_dir=<global_results_dir>]
[model.<model_option>=<model_option_value>]
[dataset.<dataset_option>=<dataset_option_value>]
[train.<train_option>=<train_option_value>]
[num_gpus=<num GPUs>]
[gpu_ids=<gpu_index>]
必需参数
-e, --experiment_spec
:实验规范文件,用于设置训练实验。
可选参数
model.<model_option>
:模型选项。dataset.<dataset_option>
:数据集选项。train.<train_option>
:训练选项。num_gpus
:用于多 GPU 场景中训练的 GPU 数量。默认值为 1。gpu_ids
:用于训练的 GPU 索引。当机器安装了多个 GPU 时,可以使用此参数。-h, --help
:显示此帮助消息并退出。
输入要求
输入大小:C * W * H(其中 C = 1 或 3,W >= 128,H >= 128;W、H 是 32 的倍数)
图像格式:JPG
标签格式:COCO 检测
示例用法
这是一个 train
命令的示例
tao model efficientdet_tf2 train -e /path/to/spec.yaml num_gpus=2
要使用 EfficientDet 模型运行评估,请使用以下命令
tao model efficientdet_tf2 evaluate [-h] -e <experiment_spec>
evaluate.checkpoint=<model to be evaluated>
[evaluate.<evaluate_option>=<evaluate_option_value>]
[gpu_ids=<gpu_index>]
必需参数
-e, --experiment_spec
:实验规范文件,用于设置评估实验。这应与训练规范文件相同。evaluate.checkpoint
:要评估的.pth
模型。
可选参数
evaluate.<evaluate_option>
:评估选项。gpu_ids
:用于评估的 GPU 索引。当机器安装了多个 GPU 时,可以使用此参数。请注意,评估只能在单个 GPU 上运行。-h, --help
:显示此帮助消息并退出。
示例用法
这是一个使用 evaluate
命令的示例
tao model efficientdet_tf2 evaluate -e /path/to/spec.yaml
EfficientDet 模型的推理工具可用于可视化边界框,并在图像目录上生成逐帧 KITTI 格式标签。
tao model efficientdet_tf2 inference [-h] -e <experiment spec file>
inference.checkpoint=<model to be inferenced>
[inference.<inference_option>=<inference_option_value>]
[gpu_ids=<gpu_index>]
必需参数
-e, --experiment_spec
:实验规范文件的路径inference.checkpoint
:要推理的.pth
模型。
可选参数
inference.<inference_option>
:推理选项。gpu_ids
:在其上运行推理的 GPU 索引。当机器安装了多个 GPU 时,可以使用此参数。请注意,推理只能在单个 GPU 上运行。-h, --help
:显示此帮助消息并退出
示例用法
这是一个使用 inference
命令的示例
tao model efficientdet_tf2 inference -e /path/to/spec.yaml
剪枝从模型中删除参数,以减小模型大小,而不会使用 tao model efficientdet_tf2 prune
命令损害模型本身的完整性。
tao model efficientdet_tf2 prune
命令包括以下参数
tao model efficientdet_tf2 prune [-h] -e <experiment spec file>
prune.checkpoint=<model to be pruned>
[prune.<prune_option>=<prune_option_value>]
必需参数
-e, --experiment_spec
:实验规范文件的路径prune.checkpoint
:要剪枝的.pth
模型。
可选参数
prune.<prune_option>
:剪枝选项。gpu_ids
:在其上运行剪枝的 GPU 索引。当机器安装了多个 GPU 时,可以使用此参数。请注意,推理只能在单个 GPU 上运行。-h, --help
:显示此帮助消息并退出。
剪枝后,模型需要重新训练。有关更多详细信息,请参阅重新训练剪枝模型。
由于较大的 EfficientDet 模型的复杂性,剪枝过程将花费更长的时间才能完成。例如,在 V100 服务器上剪枝 EfficientDet-D5 模型可能至少需要 25 分钟。
使用 Prune 命令
这是一个使用 tao model efficientdet_tf2 prune
命令的示例
tao model efficientdet_tf2 prune -e /path/to/spec.yaml
导出模型将训练过程与部署分离,并允许在 TAO 环境之外转换为 TensorRT 引擎。TensorRT 引擎特定于每个硬件配置,应为每个唯一的推理环境生成。导出的模型可以在训练和部署硬件上通用使用。
导出 EfficientDet 模型
这是一个 tao model efficientdet_tf2 export
命令的命令行参数示例
tao model efficientdet_tf2 export [-h] -e <path to experiment spec>
export.checkpoint=<model to export>
export.onnx_file=<onnx path>
[export.<export_option>=<export_option_value>]
[gpu_ids=<gpu_index>]
必需参数
-e, --experiment_spec
:规范文件的路径export.checkpoint
:要导出的.pth
模型。export.onnx_file
:保存.etlt
或.onnx
模型的路径。
可选参数
export.<export_option>
:导出选项。gpu_ids
:用于导出模型的(离散)GPU 的索引。如果机器安装了多个 GPU,您可以指定 GPU 的索引以运行导出。请注意,导出只能在单个 GPU 上运行。-h, --help
:显示此帮助消息并退出。
示例用法
这是一个以 INT8 模式导出 EfficientDet 模型的示例命令。
tao model efficientdet_tf2 export -e /path/to/spec.yaml
有关 TensorRT 引擎生成、验证和 int8 校准,请参阅 TAO 部署文档。
请参阅集成 EfficientDet (TF1/TF2) 模型页面,了解有关将 EfficientDet TF2 模型部署到 Deepsteram 的更多信息。