Visual ChangeNet-Segmentation
Visual ChangeNet-Segmentation 是 NVIDIA 开发的语义变化分割模型,包含在 TAO 中。Visual ChangeNet 支持以下任务
训练
评估
推理
导出
这些任务可以使用以下命令行约定从 TAO Launcher 调用
tao model visual_changenet <sub_task> <args_per_subtask>
其中 args_per_subtask
是给定子任务所需的命令行参数。每个子任务将在以下章节中解释。
VisualChangeNet-Segmentation 要求数据以图像和掩码文件夹的形式提供。有关 VisualChangeNet-Segmentation 的输入数据格式的更多信息,请参阅数据注释格式页面。
配置自定义数据集
本节提供了一个示例配置和命令,用于使用上述 LEVIR-CD 数据集描述的数据集格式训练 VisualChangeNet-Segmentation。LEVIR-CD 数据集是一个大规模遥感建筑物变化检测数据集。
这是一个示例规范文件,用于使用 NVIDIA 的 FAN Hybrid 主干在 LEVIR-CD 数据集上训练 VisualChangeNet-Segmentation 模型,使用数据注释格式。
encryption_key: tlt_encode
task: segment
train:
pretrained_model_path: /path/to/pretrained/model.pth
resume_training_checkpoint_path: null
segment:
loss: "ce"
weights: [0.5, 0.5, 0.5, 0.8, 1.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
betas: [0.9, 0.999]
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]
dataset:
segment:
dataset: "CNDataset"
root_dir: /path/to/root/dataset/dir/
data_name: "LEVIR-CD"
label_transform: "norm"
batch_size: 16
workers: 2
multi_scale_train: True
multi_scale_infer: False
num_classes: 2
img_size: 256
image_folder_name: "A"
change_image_folder_name: "B"
list_folder_name: 'list'
annotation_folder_name: "label"
train_split: "train"
validation_split: "val"
label_suffix: .png
augmentation:
random_flip:
vflip_probability: 0.5
hflip_probability: 0.5
enable: True
random_rotate:
rotate_probability: 0.5
angle_list: [90, 180, 270]
enable: True
random_color:
brightness: 0.3
contrast: 0.3
saturation: 0.3
hue: 0.3
enable: True
with_scale_random_crop:
enable: True
with_random_crop: True
with_random_blur: True
evaluate:
checkpoint: "???"
vis_after_n_batches: 10
inference:
checkpoint: "???"
vis_after_n_batches: 1
export:
gpu_id: 0
checkpoint: "???"
onnx_file: "???"
input_width: 256
input_height: 256
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
模型 |
字典配置 | – | 模型架构的配置 | |
数据集 |
字典配置 | – | 数据集的配置 | |
训练 |
字典配置 | – | 训练任务的配置 | |
评估 |
字典配置 | – | 评估任务的配置 | |
推理 |
字典配置 | – | 推理任务的配置 | |
encryption_key |
字符串 | 无 | 用于加密和解密模型文件的加密密钥 | |
results_dir |
字符串 | /results | 保存实验结果的目录 | |
导出 |
字典配置 | – | ONNX 导出任务的配置 | |
task |
字符串 | segment | 指示变化检测任务的标志。支持两个任务:“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 |
* |
|
num_nodes |
无符号整数 | 1 | 节点数。如果值大于 1,则启用多节点。 | |
pretrained_model_path |
字符串 | – | 预训练模型检查点的路径,用于初始化端到端模型权重。 | |
|
字典配置 |
无 |
包含 VisualChangeNet 优化器的可配置参数,详见 |
|
optim
optim:
lr: 0.0001
optim: "adamw"
policy: "linear"
momentum: 0.9
weight_decay: 0.01
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
lr |
浮点型 | 0.0005 | 学习率 | >=0.0 |
optim |
字符串 | adamw | ||
|
字符串 |
线性 |
学习率调度器 |
linear/step |
momentum |
浮点型 | 0.9 | AdamW 优化器的动量 | |
weight_decay |
浮点型 | 0.1 | 权重衰减系数 |
以下示例 model
配置提供了更改 VisualChangeNet-Segmentation 架构以进行训练的选项。
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
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
|
字典 布尔型 |
无 无 |
包含以下可配置参数的字典 * |
fan_tiny_8_p4_hybrid |
|
字典 |
无 |
包含以下可配置参数的字典 |
True, False |
dataset
参数定义数据集源、训练批次大小、增强和预处理。下面提供了 dataset
的示例。
dataset:
segment:
dataset: "CNDataset"
root_dir: /path/to/root/dataset/dir/
data_name: "LEVIR-CD"
label_transform: "norm"
batch_size: 16
workers: 2
multi_scale_train: True
multi_scale_infer: False
num_classes: 2
img_size: 256
image_folder_name: "A"
change_image_folder_name: "B"
list_folder_name: 'list'
annotation_folder_name: "label"
train_split: "train"
validation_split: "val"
test_split: "test"
predict_split: 'predict'
label_suffix: .png
augmentation:
random_flip:
vflip_probability: 0.5
hflip_probability: 0.5
enable: True
random_rotate:
rotate_probability: 0.5
angle_list: [90, 180, 270]
enable: True
random_color:
brightness: 0.3
contrast: 0.3
saturation: 0.3
hue: 0.3
enable: True
with_scale_random_crop:
enable: True
with_random_crop: True
with_random_blur: True
color_map:
'0': [255, 255, 255]
'1': [0, 0, 0]
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
segment |
字典 | – | segment 包含分割数据加载器的数据集配置,详见segment 部分。 |
|
classify |
字典 | – | classify 包含分类数据加载器的数据集配置 |
segment
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
数据集 |
字典 | CNDataset | 分割支持的数据加载器 | CNDataset |
root_dir |
字符串 | – | 数据集所在的根目录路径。 | |
data_name |
字符串 | LEVIR-CD | 数据集标识符 | LEVIR-CD、LandSCD、自定义 |
batch_size |
整数 | 32 | 每个批次的样本数 | >0 |
workers |
整数 | 2 | 用于数据加载的工作进程数 | >=0 |
multi_scale_train |
布尔型 | True | 是否启用多尺度训练 | True, False |
multi_scale_infer |
布尔型 | False | 是否启用多尺度推理 | True, False |
num_classes |
整数 | 2 | 数据集中的类别数。 | >=2 |
img_size |
整数 | 256 | 调整大小后输入图像的大小。 | |
image_folder_name |
字符串 | A | 包含输入图像的文件夹名称。 | |
change_image_folder_name |
字符串 | B | 包含更改后图像的文件夹名称 | |
list_folder_name |
字符串 | 列表 | 包含数据集分割列表 CSV 文件的文件夹名称。 | |
annotation_folder_name |
字符串 | label | 包含注释掩码的文件夹名称 | |
train_split |
字符串 | 训练 | 用于训练的数据集分割,应指示 list_folder_name 中 CSV 文件的名称。 | |
validation_split |
字符串 | val | 用于验证的数据集分割,应指示 list_folder_name 中 CSV 文件的名称。 | |
test_split |
字符串 | test | 用于评估的数据集分割,应指示 list_folder_name 中 CSV 文件的名称。 | |
predict_split |
字符串 | predict | 用于推理的数据集分割,应指示 list_folder_name 中 CSV 文件的名称。 | |
label_suffix |
字符串 | .png | 标签图像文件的后缀。 | |
augmentation |
字典 | 无 | 包含各种数据增强设置的字典,详见augmentation 部分。 | |
color_map |
Optional[Dict[str, List[int]]] | 无 | 字符串类标签(“0”到“n”)到 RGB 颜色代码的映射。 |
augmentation
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
|
字典 |
无 |
随机垂直和水平翻转增强设置。 |
>=0.0 |
|
字典 |
无 |
使用指定的概率和角度随机旋转图像 |
>=0.0 |
|
字典 |
无 |
对图像应用随机颜色增强。 |
>=0.0 >=0.0 |
|
字典 |
无 |
应用随机缩放和裁剪增强。 |
True, False |
with_random_crop |
布尔型 | True | 应用随机裁剪增强。 | True, False |
with_random_blur |
布尔型 | True | 应用随机模糊增强。 | True, False |
mean |
List[float] | [0.5, 0.5, 0.5] | 预处理要减去的均值。 | |
std |
List[float] | [0.5, 0.5, 0.5] | 用于除以图像的标准差。 |
ViT 主干的示例规范文件
以下规范文件仅与 TAO 5.3 及更高版本相关。
encryption_key: tlt_encode
task: segment
train:
pretrained_model_path: /path/to/pretrained/model.pth
resume_training_checkpoint_path: null
segment:
loss: "ce"
weights: [0.5, 0.5, 0.5, 0.8, 1.0]
num_epochs: 350
num_nodes: 1
validation_interval: 1
checkpoint_interval: 1
optim:
lr: 0.00002
optim: "adamw"
policy: "linear"
momentum: 0.9
weight_decay: 0.01
betas: [0.9, 0.999]
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]
dataset:
segment:
dataset: "CNDataset"
root_dir: /path/to/root/dataset/dir/
data_name: "LEVIR-CD"
label_transform: "norm"
batch_size: 16
workers: 2
multi_scale_train: True
multi_scale_infer: False
num_classes: 2
img_size: 256
image_folder_name: "A"
change_image_folder_name: "B"
list_folder_name: 'list'
annotation_folder_name: "label"
train_split: "train"
validation_split: "val"
label_suffix: .png
augmentation:
random_flip:
vflip_probability: 0.5
hflip_probability: 0.5
enable: True
random_rotate:
rotate_probability: 0.5
angle_list: [90, 180, 270]
enable: True
random_color:
brightness: 0.3
contrast: 0.3
saturation: 0.3
hue: 0.3
enable: True
with_scale_random_crop:
enable: True
with_random_crop: True
with_random_blur: True
evaluate:
checkpoint: "???"
vis_after_n_batches: 10
inference:
checkpoint: "???"
vis_after_n_batches: 1
export:
gpu_id: 0
checkpoint: "???"
onnx_file: "???"
input_width: 256
input_height: 256
使用以下命令运行 VisualChangeNet-Segmentation 训练
tao model visual_changenet train -e <experiment_spec_file>
task=segment
[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_segment_latest.pth
。如果 changenet_model_segment_latest.pth
存在于 train.results_dir
中,训练将自动从它恢复。如果提供了 train.resume_training_checkpoint_path
,则它将被取代。
此逻辑的主要含义是,如果您希望从头开始触发全新训练,则
指定一个新的空结果目录(推荐),或者
从结果目录中删除最新的检查点
这是一个示例规范文件,用于测试已训练的 VisualChangeNet-Segmentation 模型的评估和推理
results_dir: /path/to/experiment_results
task: segment
model:
backbone:
type: "fan_small_12_p4_hybrid"
dataset:
segment:
dataset: "CNDataset"
root_dir: /path/to/root/dataset/dir/
data_name: "LEVIR-CD"
label_transform: "norm"
batch_size: 16
workers: 2
multi_scale_train: True
multi_scale_infer: False
num_classes: 2
img_size: 256
image_folder_name: "A"
change_image_folder_name: "B"
list_folder_name: 'list'
annotation_folder_name: "label"
test_split: "test"
predict_split: 'predict'
label_suffix: .png
evaluate:
checkpoint: /path/to/checkpoint
vis_after_n_batches: 1
results_dir: /results/evaluate
inference:
checkpoint: /path/to/checkpoint
vis_after_n_batches: 1
results_dir: /results/inference
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
checkpoint |
字符串 | 要评估/推理的 PyTorch 模型路径 | ||
vis_after_n_batches |
整数 | 每个可视化输出保存之间的批次间隔数。 | ||
trt_engine |
字符串 | 要推理的 TensorRT 模型路径。应仅与 TAO Deploy 一起使用 | ||
num_gpus |
无符号整数 | 1 | 要使用的 GPU 数量 | >0 |
gpu_ids |
无符号整数 | [0] | 要使用的 GPU ID | |
results_dir |
字符串 | 应在其中写入实验输出的文件夹路径 |
使用以下命令运行 VisualChangeNet-Segmentation 评估
tao model visual_changenet evaluate -e <experiment_spec>
task=segment
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_file
:用于设置评估实验的实验规范文件。evaluate.checkpoint
:要评估的.pth
模型。
可选参数
evaluate.<evaluate_option>
:评估选项。
使用以下命令在 VisualChangeNet-Segmentation 上运行推理,使用 .tlt
模型
tao model visual_changenet inference -e <experiment_spec>
task=segment
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: 256
input_height: 256
batch_size: -1
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
checkpoint |
字符串 | 要导出的 PyTorch 模型路径 | ||
onnx_file |
字符串 | .onnx 文件的路径 |
||
opset_version |
无符号整数 | 12 | 导出的 ONNX 的 opset 版本 | >0 |
input_channel |
无符号整数 | 3 | 输入通道大小。仅支持值 3。 | 3 |
input_width |
无符号整数 | 256 | 输入宽度 | >0 |
input_height |
无符号整数 | 256 | 输入高度 | >0 |
batch_size |
无符号整数 | -1 | ONNX 模型的批次大小。如果此值设置为 -1,则导出使用动态批次大小。 | >=-1 |
使用以下命令导出模型
tao model visual_changenet export [-h] -e <experiment spec file>
task=segment
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>
:导出选项。