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 的训练实验规范文件包括 model
、train
和 dataset
参数。以下是使用 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 |
|
字符串 |
MultiStep |
学习率调度器。提供了两个调度器 |
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
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
|
列表 dict |
|
训练数据源 |
|
|
列表 dict |
|
验证数据源 |
|
|
dict |
|
用于评估的测试数据源 |
|
|
dict |
|
用于推理的推理数据源 |
|
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
:用于设置训练实验的实验规范文件
可选参数
您可以设置可选参数来覆盖实验规范文件中的选项值。
-h, --help
:显示此帮助消息并退出。model.<model_option>
:模型选项。dataset.<dataset_option>
:数据集选项。train.<train_option>
:训练选项。train.optim.<optim_option>
:优化器选项
对于训练、评估和推理,我们为每个各自的任务公开 2 个变量:num_gpus
和 gpu_ids
,它们分别默认为 1
和 [0]
。如果两者都已传递,但不一致,例如 num_gpus = 1
,gpu_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
模型。
可选参数
evaluate.<evaluate_option>
:评估选项。
推理
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
模型。
可选参数
inference.<inference_option>
:推理选项。
导出
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
模型的路径。
可选参数
export.<export_option>
:导出选项。
对于部署,请参阅 TAO Deploy 文档。
有关将 Deformable DETR 模型部署到 DeepStream 的更多信息,请参阅集成 Deformable DETR 模型页面。