Visual ChangeNet-Classification
Visual ChangeNet-Classification 是 NVIDIA 开发的分类变化检测模型,包含在 TAO 中。Visual ChangeNet 支持以下任务
训练
评估
推理
导出
这些任务可以使用命令行上的以下约定从 TAO Launcher 调用
tao model visual_changenet <sub_task> <args_per_subtask>
其中 args_per_subtask
是给定子任务所需的命令行参数。每个子任务将在以下章节中详细解释。
VisualChangeNet-Classification 要求以图像和 CSV 文件的形式提供数据。有关 VisualChangeNet-Classification 的输入数据格式的更多信息,请参阅数据标注格式页面,其输入数据格式与光学检测相同。
配置自定义数据集
本节提供了使用上述数据集格式训练 VisualChangeNet-Classification 的示例配置和命令。
这是一个使用 NVIDIA 的 FAN Hybrid 主干网络训练 VisualChangeNet-Classification 模型的示例规范文件,使用了数据标注格式。
encryption_key: tlt_encode
task: classify
train:
pretrained_model_path: /path/to/pretrained/model.pth
resume_training_checkpoint_path: null
classify:
loss: "ce"
cls_weight: [1.0, 10.0]
num_epochs: 10
num_nodes: 1
validation_interval: 5
checkpoint_interval: 5
seed: 1234
optim:
lr: 0.0001
optim: "adamw"
policy: "linear"
momentum: 0.9
weight_decay: 0.01
results_dir: "${results_dir}/train"
tensorboard:
enabled: True
results_dir: /path/to/experiment_results
model:
backbone:
type: "fan_small_12_p4_hybrid"
pretrained_backbone_path: null
freeze_backbone: False
decode_head:
feature_strides: [4, 8, 16, 16]
classify:
train_margin_euclid: 2.0
eval_margin: 0.005
embedding_vectors: 5
embed_dec: 30
difference_module: 'learnable'
learnable_difference_modules: 4
dataset:
classify:
train_dataset:
csv_path: /path/to/train.csv
images_dir: /path/to/img_dir
validation_dataset:
csv_path: /path/to/val.csv
images_dir: /path/to/img_dir
test_dataset:
csv_path: /path/to/test.csv
images_dir: /path/to/img_dir
infer_dataset:
csv_path: /path/to/infer.csv
images_dir: /path/to/img_dir
image_ext: .jpg
batch_size: 16
workers: 2
fpratio_sampling: 0.2
num_input: 4
input_map:
LowAngleLight: 0
SolderLight: 1
UniformLight: 2
WhiteLight: 3
concat_type: linear
grid_map:
x: 2
y: 2
image_width: 128
image_height: 128
augmentation_config:
rgb_input_mean: [0.485, 0.456, 0.406]
rgb_input_std: [0.229, 0.224, 0.225]
num_classes: 2
evaluate:
checkpoint: "???"
inference:
checkpoint: "???"
export:
gpu_id: 0
checkpoint: "???"
onnx_file: "???"
input_width: 128
input_height: 512
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
model |
字典配置 | – | 模型架构的配置 | |
dataset |
字典配置 | – | 数据集的配置 | |
训练 |
字典配置 | – | 训练任务的配置 | |
评估 |
字典配置 | – | 评估任务的配置 | |
推理 |
字典配置 | – | 推理任务的配置 | |
encryption_key |
字符串 | 无 | 用于加密和解密模型文件的加密密钥 | |
results_dir |
字符串 | /results | 保存实验结果的目录 | |
导出 |
字典配置 | – | ONNX 导出任务的配置 | |
task |
字符串 | classify | 指示变化检测任务的标志。支持两个任务:‘segment’ 和 ‘classify’,分别用于分割和分类 |
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
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 | 保存训练结果的目录 | |
|
字典 字符串 |
无 ce |
* |
|
|
字典 字符串 |
无 ce |
* |
|
num_nodes |
无符号整数 | 1 | 节点数。如果该值大于 1,则启用多节点。 | |
pretrained_model_path |
字符串 | – | 用于初始化端到端模型权重的预训练模型检查点路径。 | |
|
字典配置 |
无 |
包含 VisualChangeNet 优化器的可配置参数,详见 |
|
|
字典配置 |
无 |
使用包含可配置参数的字典启用 TensorBoard 可视化 |
|
optim
optim:
lr: 0.0001
optim: "adamw"
policy: "linear"
momentum: 0.9
weight_decay: 0.01
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
lr |
浮点数 | 0.0005 | 学习率 | >=0.0 |
optim |
字符串 | adamw | ||
|
字符串 |
linear |
学习率调度器 |
linear/step |
momentum |
浮点数 | 0.9 | AdamW 优化器的动量 | |
weight_decay |
浮点数 | 0.1 | 权重衰减系数 | |
monitor_name |
字符串 | val_loss | 用于保存 top-k 检查点的监视器名称。 |
以下示例 model
配置提供了更改用于训练的 VisualChangeNet-Classification 架构的选项。VisualChangeNet-Classification 支持两种模型架构。架构 1 仅利用 FAN 主干网络的最后一个特征图,使用欧几里得距离进行对比学习。架构 2 利用 VisualChangeNet-Classification 可学习的差异模块,在 3 个特征分辨率下针对 4 个不同的特征,以最小化交叉熵损失。
model:
backbone:
type: "fan_small_12_p4_hybrid"
pretrained_backbone_path: null
freeze_backbone: False
decode_head:
feature_strides: [4, 8, 16, 16]
align_corner: False
classify:
train_margin_euclid: 2.0
eval_margin: 0.005
embedding_vectors: 5
embed_dec: 30
difference_module: 'learnable'
learnable_difference_modules: 4
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
|
字典 布尔值 |
无 无 |
一个字典,包含 VisualChangeNet-Classification 主干网络的以下可配置参数 * |
fan_tiny_8_p4_hybrid |
|
字典 布尔值 |
无 False 256 |
一个字典,包含解码器的以下可配置参数 * * |
True, False |
|
字典 |
无
5 |
一个字典,包含 VisualChangeNet-Classification 模型的以下可配置参数 |
>0 |
dataset
参数定义数据集来源、训练批次大小、数据增强和预处理。下面提供了一个 dataset
示例。
dataset:
classify:
train_dataset:
csv_path: /path/to/train.csv
images_dir: /path/to/img_dir
validation_dataset:
csv_path: /path/to/val.csv
images_dir: /path/to/img_dir
test_dataset:
csv_path: /path/to/test.csv
images_dir: /path/to/img_dir
infer_dataset:
csv_path: /path/to/infer.csv
images_dir: /path/to/img_dir
image_ext: .jpg
batch_size: 16
workers: 2
fpratio_sampling: 0.2
num_input: 4
input_map:
LowAngleLight: 0
SolderLight: 1
UniformLight: 2
WhiteLight: 3
concat_type: linear
grid_map:
x: 2
y: 2
image_width: 128
image_height: 128
augmentation_config:
rgb_input_mean: [0.485, 0.456, 0.406]
rgb_input_std: [0.229, 0.224, 0.225]
num_classes: 2
* 有关指定照明条件的更多信息,请参阅数据集标注格式定义。
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
segment |
字典 | – | segment 包含分割数据加载器的数据集配置 |
|
classify |
字典 | – | classify 包含分类数据加载器的数据集配置,详见 classify 部分。 |
classify
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
train_dataset |
字典 | – | 训练数据集的图像目录和 CSV 文件路径 | |
validation_dataset |
字典 | – | 验证数据集的图像目录和 CSV 文件路径 | |
test_dataset |
字典 | – | 测试数据集的图像目录和 CSV 文件路径 | |
infer_dataset |
字典 | – | 推理数据集的图像目录和 CSV 文件路径 | |
image_ext |
字符串 | .jpg | 数据集中图像的文件扩展名 | 字符串 |
batch_size |
整数 | 32 | 每个批次的样本数 | 字符串 |
workers |
整数 | 8 | 用于数据加载的工作进程数 | |
fpratio_sampling |
整数 | 0.1 | 要采样的假阳性示例的比率 | >0 |
num_input |
整数 | 4 | 每个输入图像的照明条件数* | >0 |
input_map |
字典 | – | 照明条件到指定串联顺序的索引的映射* | |
concat_type |
字符串 | linear | 用于不同图像照明条件的串联类型 | linear, grid |
|
字典 字典 字典配置 |
无 无 无 |
定义网格尺寸以将图像串联为网格的参数 * x:沿 x 轴的图像数量 * y:沿 y 轴的图像数量 |
字典 |
input_width |
整数 | 100 | 输入图像的宽度 | >0 |
input_height |
整数 | 100 | 输入图像的高度 | >0 |
num_classes |
整数 | 2 | 数据集中的类别数 | >1 |
augmentation_config |
字典 | 无 | 包含各种数据增强设置的字典,详细信息请参阅 augmentation 部分。 |
augmentation_config
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
|
字典 |
无 |
随机垂直和水平翻转数据增强设置。 |
>=0.0 |
|
字典 |
无 |
以指定的概率和角度随机旋转图像 |
>=0.0 |
|
字典 |
无 |
对图像应用随机颜色数据增强。 |
>=0.0 >=0.0 |
with_random_crop |
布尔值 | True | 应用随机裁剪数据增强。 | True, False |
with_random_blur |
布尔值 | True | 应用随机模糊数据增强。 | True, False |
rgb_input_mean |
List[float] | [0.485, 0.456, 0.406] | 预处理要减去的均值。 | |
rgb_input_std |
List[float] | [0.229, 0.224, 0.225] | 用于除以图像的标准差。 | |
augment |
布尔值 | False | 指示是否应用数据增强的标志 | True, False |
ViT 主干网络的示例 spec 文件
以下 spec 文件仅适用于 TAO 5.3 及更高版本。
encryption_key: tlt_encode
task: classify
train:
pretrained_model_path: /path/to/pretrained/model.pth
resume_training_checkpoint_path: null
classify:
loss: "contrastive"
cls_weight: [1.0, 10.0]
num_epochs: 10
num_nodes: 1
validation_interval: 5
checkpoint_interval: 5
seed: 1234
optim:
lr: 0.0001
optim: "adamw"
policy: "linear"
momentum: 0.9
weight_decay: 0.01
results_dir: "${results_dir}/train"
tensorboard:
enabled: True
results_dir: /path/to/experiment_results
model:
backbone:
type: "vit_large_nvdinov2"
pretrained_backbone_path: /path/to/pretrained/backbone.pth
freeze_backbone: False
decode_head:
feature_strides: [4, 8, 16, 32]
classify:
train_margin_euclid: 2.0
eval_margin: 0.005
embedding_vectors: 5
embed_dec: 30
difference_module: 'euclidean'
learnable_difference_modules: 4
dataset:
classify:
train_dataset:
csv_path: /path/to/train.csv
images_dir: /path/to/img_dir
validation_dataset:
csv_path: /path/to/val.csv
images_dir: /path/to/img_dir
test_dataset:
csv_path: /path/to/test.csv
images_dir: /path/to/img_dir
infer_dataset:
csv_path: /path/to/infer.csv
images_dir: /path/to/img_dir
image_ext: .jpg
batch_size: 16
workers: 2
fpratio_sampling: 0.2
num_input: 4
input_map:
LowAngleLight: 0
SolderLight: 1
UniformLight: 2
WhiteLight: 3
concat_type: grid
grid_map:
x: 2
y: 2
image_width: 112
image_height: 112
augmentation_config:
rgb_input_mean: [0.485, 0.456, 0.406]
rgb_input_std: [0.229, 0.224, 0.225]
num_classes: 2
evaluate:
checkpoint: "???"
inference:
checkpoint: "???"
export:
gpu_id: 0
checkpoint: "???"
onnx_file: "???"
input_width: 224
input_height: 224
使用以下命令运行 VisualChangeNet-Classification 训练
tao model visual_changenet train [-h] -e <experiment_spec>
task=classify
[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_file
:实验规范文件的路径。task
:visual_changenet 训练的任务(‘segment’ 或 ‘classify’)。默认值:segment。
可选参数
您可以设置可选参数来覆盖实验规范文件中的选项值。
-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'
最新的检查点也保存为 changenet_model_classify_latest.pth
。如果 changenet_model_classify_latest.pth
存在于 train.results_dir
中,则训练会自动从它恢复。如果提供了 train.resume_training_checkpoint_path
,则会取代它。
此逻辑的主要含义是,如果您希望从头开始触发全新训练,则可以
指定一个新的空结果目录 (推荐)
从结果目录中删除最新的检查点
这是一个用于测试已训练的 VisualChangeNet-Classification 模型的评估和推理的示例规范文件。
results_dir: /path/to/experiment_results
task: classify
model:
backbone:
type: "fan_small_12_p4_hybrid"
classify:
eval_margin: 0.005
dataset:
classify:
test_dataset:
csv_path: /path/to/test.csv
images_dir: /path/to/img_dir
infer_dataset:
csv_path: /path/to/infer.csv
images_dir: /path/to/img_dir
image_ext: .jpg
batch_size: 16
workers: 2
num_input: 4
input_map:
LowAngleLight: 0
SolderLight: 1
UniformLight: 2
WhiteLight: 3
concat_type: linear
grid_map:
x: 2
y: 2
output_shape:
- 128
- 128
augmentation_config:
rgb_input_mean: [0.485, 0.456, 0.406]
rgb_input_std: [0.229, 0.224, 0.225]
num_classes: 2
evaluate:
checkpoint: /path/to/checkpoint
results_dir: /results/evaluate
inference:
checkpoint: /path/to/checkpoint
results_dir: /results/inference
推理/评估
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
checkpoint |
字符串 | 要评估/推理的 PyTorch 模型路径 | ||
trt_engine |
字符串 | 要推理/评估的 TensorRT 模型路径。应仅与 TAO Deploy 一起使用 | ||
num_gpus |
无符号整数 | 1 | 要使用的 GPU 数量 | >0 |
gpu_ids |
无符号整数 | [0] | 要使用的 GPU ID | |
results_dir |
字符串 | 实验输出应写入的文件夹路径 | ||
vis_after_n_batches |
无符号整数 | 1 | 在多少批次后保存推理/评估可视化结果 | >0 |
batch_size |
无符号整数 | 推理/评估的批次大小 |
使用以下命令运行 VisualChangeNet-Classification 评估
tao model visual_changenet evaluate [-h] -e <experiment_spec_file>
task=classify
evaluate.checkpoint=<model to be evaluated>
[evaluate.<evaluate_option>=<evaluate_option_value>]
[evaluate.gpu_ids=<gpu indices>]
[evaluate.num_gpus=<number of gpus>]
Visual ChangeNet Classify 目前不支持多 GPU 评估。
必需参数
-e, --experiment_spec_file
:用于设置评估实验的实验规范文件。evaluate.checkpoint
:要评估的.pth
模型。
可选参数
evaluate.<evaluate_option>
:评估选项。
使用以下命令使用 .pth
模型在 VisualChangeNet-Classification 上运行推理
tao model visual_changenet inference [-h] -e <experiment_spec_file>
task=classify
inference.checkpoint=<inference model>
[inference.<evaluate_option>=<evaluate_option_value>]
[inference.gpu_ids=<gpu indices>]
[inference.num_gpus=<number of gpus>]
必需参数
-e, --experiment_spec_file
:用于设置评估实验的实验规范文件。inference.checkpoint
:要在其上运行推理的.pth
模型。
可选参数
inference.<inference_option>
:推理选项。
这是一个用于导出已训练的 VisualChangeNet 模型的示例规范文件
export:
checkpoint: /path/to/model.pth
onnx_file: /path/to/model.onnx
opset_version: 12
input_channel: 3
input_width: 128
input_height: 512
batch_size: -1
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
checkpoint |
字符串 | 要导出的 PyTorch 模型路径 | ||
onnx_file |
字符串 | .onnx 文件的路径 |
||
opset_version |
无符号整数 | 12 | 导出的 ONNX 的 opset 版本 | >0 |
input_channel |
无符号整数 | 3 | 输入通道大小。仅支持值 3。 | 3 |
input_width |
无符号整数 | 128 | 输入宽度 | >0 |
input_height |
无符号整数 | 512 | 输入高度 | >0 |
batch_size |
无符号整数 | -1 | ONNX 模型的批次大小。如果此值设置为 -1,则导出使用动态批次大小。 | >=-1 |
gpu_id |
无符号整数 | 0 | 要使用的 GPU ID | |
on_cpu |
布尔值 | False | 是否在 CPU 上导出 | |
verbose |
布尔值 | False | 打印出网络的易读表示 |
使用以下命令导出模型
tao model visual_changenet export [-h] -e <experiment spec file>
task=classify
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>
:导出选项。