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_config
、training_config
、eval_config
、augmentation_config
和 dataset_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_mean
、geometric_mean
、union
和intersection
。 默认选项为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 环境之外转换为 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) 模型 页面。