TAO v5.5.0

Deformable DETR

Deformable DETR 是 TAO 中包含的对象检测模型。它支持以下任务

  • 转换

  • 训练

  • 评估

  • 推理

  • 导出

这些任务可以使用 TAO Launcher 从命令行调用,使用以下约定

复制
已复制!
            

tao model deformable_detr <sub_task> <args_per_subtask>

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

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

注意

您的 COCO JSON 文件中的 category_id 应从 1 开始,因为 0 设置为背景类。此外,dataset.num_classes 应设置为 max class_id + 1。例如,即使 COCO 中仅使用了 80 个类,但最大的 class_id 是 90,因此 dataset.num_classes 应设置为 91。

数据分片(可选)

注意

如果注释已为 JSON 格式且您的数据集小于 COCO 数据集,则无需分片。此子任务还假设您的数据集为 KITTI 格式。

对于大型数据集,您可以选择使用 convert 将数据集分片为较小的块,以减轻内存负担。在此过程中,基于 KITTI 的注释将转换为较小的分片 JSON 文件,类似于其他对象检测网络。以下是将基于 KITTI 的文件夹转换为多个分片 JSON 文件的示例规范文件。

复制
已复制!
            

input_source: /workspace/tao-experiments/data/sequence.txt results_dir: /workspace/tao-experiments/sharded image_dir_name: images label_dir_name: labels num_shards: 32 num_partitions: 1 mapping_path: /path/to/your_category_mapping

下表总结了每个参数的详细信息

参数 数据类型 默认值 描述 支持的值
input_source 字符串 列出数据源的 .txt 文件
results_dir 字符串 将存储分片 JSON 文件的输出目录
image_dir_name 字符串 input_source .txt 文件中列出的路径到包含图像的目录的相对路径
label_dir_name 字符串 input_source .txt 文件中列出的路径到包含 JSON 数据的目录的相对路径
num_shards 无符号整数 32 每个分区的分片数 >0
num_partitions 无符号整数 1 数据中的分区数 >0
mapping_path 字符串 包含类映射的 JSON 文件的路径

类别映射应包含数据集的映射,并且应按反字母顺序排列。默认映射如下所示

复制
已复制!
            

DEFAULT_TARGET_CLASS_MAPPING = { "Person": "person", "Person Group": "person", "Rider": "person", "backpack": "bag", "face": "face", "large_bag": "bag", "person": "person", "person group": "person", "person_group": "person", "personal_bag": "bag", "rider": "person", "rolling_bag": "bag", "rollingbag": "bag", "largebag": "bag", "personalbag": "bag" }

以下示例显示了如何使用命令

复制
已复制!
            

tao model deformable_detr convert -e /path/to/spec.yaml

Deformable DETR 的训练实验规范文件包括 modeltraindataset 参数。以下是使用 resnet50 主干在 COCO 数据集上训练 Deformable DETR 模型的示例规范文件。

复制
已复制!
            

dataset: train_data_sources: - image_dir: /path/to/coco/train2017/ json_file: /path/to/coco/annotations/instances_train2017.json val_data_sources: - image_dir: /path/to/coco/val2017/ json_file: /path/to/coco/annotations/instances_val2017.json num_classes: 91 batch_size: 4 workers: 8 augmentation: scales: [480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800] input_mean: [0.485, 0.456, 0.406] input_std: [0.229, 0.224, 0.225] horizontal_flip_prob: 0.5 train_random_resize: [400, 500, 600] train_random_crop_min: 384 train_random_crop_max: 600 random_resize_max_size: 1333 test_random_resize: 800 model: pretrained_model_path: /path/to/your-pretrained-backbone-model backbone: resnet_50 train_backbone: True num_feature_levels: 4 dec_layers: 6 enc_layers: 6 num_queries: 300 with_box_refine: True dropout_ratio: 0.3 train: optim: lr: 0.0002 lr_backbone: 0.00002 lr_linear_proj_mult: 0.1 momentum: 0.9 weight_decay: 0.0001 lr_scheduler: MultiStep lr_decay: 0.1 lr_steps: [40] optimizer: AdamW num_epochs: 10 checkpoint_interval: 5 validation_interval: 5 clip_grad_norm: 0.1 precision: fp32 distributed_strategy: ddp activation_checkpoint: True num_gpus: 1 gpu_ids: [0] num_nodes: 1 seed: 1234

参数 数据类型 默认值 描述 支持的值
model dict config 模型架构的配置
dataset dict config 数据集的配置
训练 dict config 训练任务的配置
评估 dict config 评估任务的配置
推理 dict config 推理任务的配置
encryption_key 字符串 用于加密和解密模型文件的加密密钥
results_dir 字符串 /results 保存实验结果的目录
导出 dict config ONNX 导出任务的配置
gen_trt_engine dict config TensorRT 生成任务的配置。仅在 tao deploy 中使用

model

model 参数提供更改 Deformable DETR 架构的选项。

复制
已复制!
            

model: pretrained_model_path: /path/to/your-resnet50-pretrained-model backbone: resnet_50 train_backbone: True num_feature_levels: 4 dec_layers: 6 enc_layers: 6 num_queries: 300 with_box_refine: True dropout_ratio: 0.3

参数 数据类型 默认值 描述 支持的值
pretrained_backbone_path 字符串 预训练主干文件的可选路径 字符串到路径
backbone 字符串 resnet_50 模型的主干名称。支持 GCViT 和 ResNet 50 主干。 resnet_50、gc_vit_xxtiny、gc_vit_xtiny、gc_vit_tiny、gc_vit_small、gc_vit_base、gc_vit_large
train_backbone 布尔值 True 一个标志,指定是否训练主干 True/False
num_feature_levels 无符号整数 4 模型中要使用的特征级别数 1,2,3,4
return_interm_indices 整数列表 [1, 2, 3, 4] 模型中要使用的特征级别的索引。长度必须与 num_feature_levels 匹配。 [0, 1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3], [1, 2], [1]
dec_layers 无符号整数 6 transformer 中的解码器层数 >0
enc_layers 无符号整数 6 transformer 中的编码器层数 >0
num_queries 无符号整数 300 查询数 >0
dim_feedforward 无符号整数 1024 前馈网络的维度 >0
num_select 无符号整数 100 后处理期间选择的 Top-K 预测数 >0
with_box_refine 布尔值 True 一个标志,指定是否启用迭代边界框细化 True, False
dropout_ratio 浮点数 0.3 丢弃隐藏单元的概率 0.0 ~ 1.0
cls_loss_coef 浮点数 2.0 匹配成本中分类误差的相对权重 >0.0
bbox_loss_coef 浮点数 5.0 匹配成本中边界框坐标的 L1 误差的相对权重 >0.0
giou_loss_coef 浮点数 2.0 匹配成本中边界框的 GIoU 损失的相对权重 >0.0
focal_alpha 浮点数 0.25 焦点损失中的 alpha >0.0
aux_loss 布尔值 True 一个标志,指定是否使用辅助解码损失(每个解码器层的损失) True, False

训练

train 参数定义训练过程的超参数。

复制
已复制!
            

train: optim: lr: 0.0002 lr_backbone: 0.00002 lr_linear_proj_mult: 0.1 momentum: 0.9 weight_decay: 0.0001 lr_scheduler: MultiStep lr_decay: 0.1 lr_steps: [40] optimizer: AdamW num_epochs: 10 checkpoint_interval: 5 validation_interval: 5 clip_grad_norm: 0.1 precision: fp32 distributed_strategy: ddp activation_checkpoint: True num_gpus: 1 gpu_ids: [0] num_nodes: 1 seed: 1234

参数 数据类型 默认值 描述 支持的值
num_gpus 无符号整数 1 用于分布式训练的 GPU 数量 >0
gpu_ids List[int] [0] 用于分布式训练的 GPU 索引
seed 无符号整数 1234 用于 random、numpy 和 torch 的随机种子 >0
num_epochs 无符号整数 10 运行实验的总 epoch 数 >0
checkpoint_interval 无符号整数 1 保存检查点的 epoch 间隔 >0
validation_interval 无符号整数 1 运行验证的 epoch 间隔 >0
resume_training_checkpoint_path 字符串 从中恢复训练的中间 PyTorch Lightning 检查点
results_dir 字符串 /results/train 保存训练结果的目录
optim dict config 优化器的配置,包括学习率、学习率调度器和权重衰减 >0
clip_grad_norm 浮点数 0.1 按 L2 范数裁剪梯度的量。值 0.0 指定不裁剪 >=0
precision 字符串 fp32 指定“fp16”启用精度训练。使用 fp16 进行训练可以帮助节省 GPU 内存。 fp32, fp16
distributed_strategy 字符串 ddp 多 GPU 训练策略。支持 DDP(分布式数据并行)和 FSDP(完全分片数据并行)。 ddp, fsdp
activation_checkpoint 布尔值 True True 值指示 train 在后向传递中重新计算以节省 GPU 内存,而不是存储激活。 True, False
pretrained_model_path 字符串 要加载以进行微调的预训练模型检查点路径
num_nodes 无符号整数 1 节点数。如果该值大于 1,则启用多节点 >0
freeze 字符串列表 [] 模型中要冻结的层名称列表(例如 ["backbone", "transformer.encoder", "input_proj"]
verbose 布尔值 False 一个标志,指定是否打印来自优化器的详细学习率缩放 True, False

optim

optim 参数定义训练中优化器的配置,包括学习率、学习率调度器和权重衰减。

复制
已复制!
            

optim: lr: 0.0002 lr_backbone: 0.00002 lr_linear_proj_mult: 0.1 momentum: 0.9 weight_decay: 0.0001 lr_scheduler: MultiStep lr_decay: 0.1 lr_steps: [40] optimizer: AdamW

参数

数据类型

默认值

描述

支持的值

lr 浮点数 2e-4 训练模型(不包括主干)的初始学习率 >0.0
lr_backbone 浮点数 2e-5 训练主干的初始学习率 >0.0
lr_linear_proj_mult 浮点数 0.1 训练线性投影层的初始学习率 >0.0
momentum 浮点数 0.9 AdamW 优化器的动量 >0.0
weight_decay 浮点数 1e-4 权重衰减系数 >0.0

lr_scheduler

字符串

MultiStep

学习率调度器。提供了两个调度器
* MultiStep:从 lr_steps 中将 lr 降低 lr_decay
* StepLR:在每个 lr_step_size 处将 lr 降低 lr_decay

MultiStep/StepLR

lr_decay 浮点数 0.1 学习率调度器的降低因子 >0.0
lr_steps 整数列表 [40] 用于 MultiStep 调度器的降低学习率的步长 整数列表
lr_step_size 无符号整数 40 用于 StepLR 调度器的降低学习率的步长 >0
lr_monitor 字符串 val_loss AutoReduce 调度器的监视器值 val_loss/train_loss
optimizer 字符串 AdamW 训练期间使用的优化器 AdamW/SGD

dataset

dataset 参数定义数据集源、训练批次大小和增强。

复制
已复制!
            

dataset: train_data_sources: - image_dir: /path/to/coco/images/train2017/ json_file: /path/to/coco/annotations/instances_train2017.json val_data_sources: - image_dir: /path/to/coco/images/val2017/ json_file: /path/to/coco/annotations/instances_val2017.json test_data_sources: image_dir: /path/to/coco/images/val2017/ json_file: /path/to/coco/annotations/instances_val2017.json infer_data_sources: image_dir: /path/to/coco/images/val2017/ classmap: /path/to/coco/annotations/coco_classmap.txt num_classes: 91 batch_size: 4 workers: 8

参数 数据类型 默认值 描述 支持的值

train_data_sources

列表 dict

训练数据源
* image_dir:包含训练图像的目录
* json_file:JSON 文件的路径,该文件使用训练注释 COCO 格式

val_data_sources

列表 dict

验证数据源
* image_dir:包含验证图像的目录
* json_file:JSON 文件的路径,该文件使用验证注释 COCO 格式

test_data_sources

dict

用于评估的测试数据源
* image_dir:包含测试图像的目录
* json_file:JSON 文件的路径,该文件使用测试注释 COCO 格式

infer_data_sources

dict

用于推理的推理数据源
* image_dir:包含推理图像的目录
* classmap:包含类名称的 .txt 文件的路径

augmentation dict config 定义增强方法的参数
num_classes 无符号整数 91 训练数据中的类数 >0
batch_size 无符号整数 4 训练和验证的批次大小 >0
workers 无符号整数 8 并行处理数据的工作线程数 >0
train_sampler 字符串 default_sampler 小批量采样方法。非默认采样方法可以为多节点作业启用。如果 dataset_type 未设置为 default,则此配置不起作用 default_sampler、non_uniform_sampler、uniform_sampler
dataset_type 字符串 serialized 如果设置为 default,我们将遵循 torchvision 中的标准 CocoDetection 数据集结构,该结构在每个子进程中加载 COCO 注释。这会导致数据冗余副本,并且如果 workers 很高,则可能导致 RAM 爆炸。如果设置为 serialized,则数据通过 pickle 和 torch.Tensor 序列化,从而允许数据在子进程之间共享。因此,可以大大改善 RAM 使用率。 serialized, default

augmentation

augmentation 参数包含增强的超参数。

复制
已复制!
            

augmentation: scales: [480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800] input_mean: [0.485, 0.456, 0.406] input_std: [0.229, 0.224, 0.225] horizontal_flip_prob: 0.5 train_random_resize: [400, 500, 600] train_random_crop_min: 384 train_random_crop_max: 600 random_resize_max_size: 1333 test_random_resize: 800

参数 数据类型 默认值 描述 支持的值
scales 整数列表 [480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800] 执行随机调整大小的尺寸列表。
input_mean 浮点数列表 [0.485, 0.456, 0.406] RGB 帧的输入均值:(input - mean) / std 浮点数列表 / size=1 或 3
input_std 浮点数列表 [0.229, 0.224, 0.225] RGB 帧的输入标准差:(input - mean) / std 浮点数列表 / size=1 或 3
horizontal_flip_prob 浮点数 0.5 训练期间水平翻转的概率 >=0
train_random_resize 整数列表 [400, 500, 600] 执行训练数据随机调整大小的尺寸列表 整数列表
train_random_crop_min 无符号整数 384 训练数据的最小随机裁剪大小 >0
train_random_crop_max 无符号整数 600 训练数据的最大随机裁剪大小 >0
random_resize_max_size 无符号整数 1333 训练数据的最大随机调整大小 >0
test_random_resize 无符号整数 800 测试数据的随机调整大小 >0
fixed_padding 布尔值 True 一个标志,指定是否将图像(不带填充)调整为 (sorted(scales[-1]), random_resize_max_size) 大小,以防止 CPU 内存泄漏。 True/False
fixed_random_crop 无符号整数 一个标志,用于启用大规模抖动,该抖动用于 ViT 主干。生成的图像分辨率固定为 fixed_random_crop 可被 32 整除

使用以下命令运行 Deformable DETR 训练

复制
已复制!
            

tao model deformable_detr train [-h] -e <experiment_spec_file> [results_dir=<global_results_dir>] [model.<model_option>=<model_option_value>] [dataset.<dataset_option>=<dataset_option_value>] [train.<train_option>=<train_option_value>] [train.gpu_ids=<gpu indices>] [train.num_gpus=<number of gpus>]

必需参数

唯一必需的参数是实验规范的路径

  • -e, --experiment_spec:用于设置训练实验的实验规范文件

可选参数

您可以设置可选参数来覆盖实验规范文件中的选项值。

注意

对于训练、评估和推理,我们为每个各自的任务公开 2 个变量:num_gpusgpu_ids,它们分别默认为 1[0]。如果两者都已传递,但不一致,例如 num_gpus = 1gpu_ids = [0, 1],则会修改它们以遵循具有更多 GPU 的设置,例如 num_gpus = 1 -> num_gpus = 2

检查点和恢复训练

在每个 train.checkpoint_interval,都会保存 PyTorch Lightning 检查点。它被称为 model_epoch_<epoch_num>.pth。这些保存在 train.results_dir 中,如下所示

复制
已复制!
            

$ ls /results/train 'model_epoch_000.pth' 'model_epoch_001.pth' 'model_epoch_002.pth' 'model_epoch_003.pth' 'model_epoch_004.pth'

最新的检查点也将另存为 dd_model_latest.pth。如果 dd_model_latest.pth 存在于 train.results_dir 中,则训练将自动从 dd_model_latest.pth 恢复。如果提供了 train.resume_training_checkpoint_path,则它将被取代。

此逻辑的主要含义是,如果您希望从头开始触发全新训练,则可以

  • 指定新的空结果目录(推荐),或者

  • 从结果目录中删除最新的检查点

优化训练 Deformable DETR 的资源

训练 Deformable DETR 需要强大的 GPU(例如 V100/A100),至少具有 15GB 的 VRAM 和大量 CPU 内存,才能在像 COCO 这样的标准数据集上进行训练。在本节中,我们概述了一些可用于仅使用有限资源启动训练的策略。

优化 GPU 内存

有多种方法可以优化 GPU 内存使用率。一种明显的技巧是减少 dataset.batch_size。但是,这可能会导致您的训练时间比平时更长。因此,我们建议设置以下配置以优化 GPU 消耗。

  • train.precision 设置为 fp16 以启用自动混合精度训练。这可以将您的 GPU 内存使用率降低 50%。

  • train.activation_checkpoint 设置为 True 以启用激活检查点。通过重新计算激活而不是将其缓存到内存中,可以提高内存使用率。

  • train.distributed_strategy 设置为 fsdp 以启用完全分片数据并行训练。这将跨不同进程共享梯度计算,以帮助减少 GPU 内存。

  • 尝试使用更轻量级的主干,如 gc_vit_xxtiny,或通过将 model.train_backbone 设置为 False 来冻结主干。

  • 尝试根据您的数据集更改 dataset.augmentation 中的增强分辨率。

优化 CPU 内存

为了加速数据加载,通常的做法是设置大量工作线程以生成多个进程。但是,如果您的注释文件非常大,这可能会导致您的 CPU 内存不足。因此,我们建议设置以下配置以优化 CPU 消耗。

  • dataset.dataset_type 设置为 serialized,以便可以跨不同的子进程共享基于 COCO 的注释数据。

  • dataset.augmentation.fixed_padding 设置为 True,以便在批次制定之前填充图像。由于训练期间的随机调整大小和随机裁剪增强,变换后生成的图像分辨率可能因图像而异。这种可变的图像分辨率可能会导致内存泄漏,并且 CPU 内存会缓慢堆积,直到在训练过程中内存不足。这是 PyTorch 的限制,因此我们建议将 fixed_padding 设置为 True,以帮助稳定 CPU 内存使用率。

评估

evaluate 参数定义评估过程的超参数。

复制
已复制!
            

evaluate: checkpoint: /path/to/model.pth conf_threshold: 0.0

参数 数据类型 默认值 描述 支持的值
checkpoint 字符串 要评估的 PyTorch 模型路径
results_dir 字符串 /results/evaluate 保存评估结果的目录
num_gpus 无符号整数 1 用于分布式评估的 GPU 数量 >0
gpu_ids List[int] [0] 用于分布式评估的 GPU 索引
trt_engine 字符串 要评估的 TensorRT 模型路径。应仅与 tao deploy 一起使用
conf_threshold 浮点数 0.0 用于过滤预测的置信度阈值 >=0

要使用 Deformable DETR 模型运行评估,请使用此命令

复制
已复制!
            

tao model deformable_detr evaluate [-h] -e <experiment_spec> evaluate.checkpoint=<model to be evaluated> [evaluate.<evaluate_option>=<evaluate_option_value>] [evaluate.gpu_ids=<gpu indices>] [evaluate.num_gpus=<number of gpus>]

必需参数

  • -e, --experiment_spec:用于设置评估实验的实验规范文件

  • evaluate.checkpoint:要评估的 .pth 模型。

可选参数

推理

inference 参数定义推理过程的超参数。

复制
已复制!
            

inference: checkpoint: /path/to/model.pth conf_threshold: 0.5 color_map: person: red car: blue

参数 数据类型 默认值 描述 支持的值
checkpoint 字符串 要推理的 PyTorch 模型路径
results_dir 字符串 /results/inference 保存推理结果的目录
num_gpus 无符号整数 1 用于分布式推理的 GPU 数量 >0
gpu_ids List[int] [0] 用于分布式推理的 GPU 索引
trt_engine 字符串 要推理的 TensorRT 模型路径。应仅与 tao deploy 一起使用
conf_threshold 浮点数 0.5 用于过滤预测的置信度阈值 >=0
color_map dict 每个类的边界框的颜色映射 字符串 dict

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

复制
已复制!
            

tao model deformable_detr inference [-h] -e <experiment spec file> inference.checkpoint=<model to be inferenced> [inference.<inference_option>=<inference_option_value>] [inference.gpu_ids=<gpu indices>] [inference.num_gpus=<number of gpus>]

必需参数

  • -e, --experiment_spec:用于设置推理实验的实验规范文件

  • inference.checkpoint:要推理的 .pth 模型。

可选参数

导出

export 参数定义导出过程的超参数。

复制
已复制!
            

export: checkpoint: /path/to/model.pth onnx_file: /path/to/model.onnx on_cpu: False opset_version: 12 input_channel: 3 input_width: 960 input_height: 544 batch_size: -1

参数 数据类型 默认值 描述 支持的值
checkpoint 字符串 要导出的 PyTorch 模型路径
onnx_file 字符串 .onnx 文件的路径
on_cpu 布尔值 True 如果此值为 True,则 DMHA 模块将导出为标准 pytorch。如果此值为 False,则模块将使用 TRT 插件导出。 True, False
opset_version 无符号整数 12 导出的 ONNX 的 opset 版本 >0
input_channel 无符号整数 3 输入通道大小。仅支持值 3。 3
input_width 无符号整数 960 输入宽度 >0
input_height 无符号整数 544 输入高度 >0
batch_size 无符号整数 -1 ONNX 模型的批次大小。如果此值设置为 -1,则导出使用动态批次大小。 >=-1
复制
已复制!
            

tao model deformable_detr export [-h] -e <experiment spec file> export.checkpoint=<model to export> export.onnx_file=<onnx path> [export.<export_option>=<export_option_value>]

必需参数

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

  • export.checkpoint:要导出的 .pth 模型。

  • export.onnx_file:保存 .etlt.onnx 模型的路径。

可选参数

有关将 Deformable DETR 模型部署到 DeepStream 的更多信息,请参阅集成 Deformable DETR 模型页面。

上一页 OCDNet
下一页 ReIdentificationNet
© 版权所有 2024, NVIDIA。 上次更新时间:2024 年 10 月 15 日。