YOLOv4
YOLOv4 是 TAO 中包含的对象检测模型。YOLOv4 支持以下任务
dataset_convert
kmeans
train
evaluate
inference
prune
export
这些任务可以使用 TAO Launcher 从命令行调用,使用以下约定
tao model yolo_v4 <sub_task> <args_per_subtask>
其中 args_per_subtask
是给定子任务所需的命令行参数。每个子任务在下面详细解释。
YOLOv4 的数据集结构与 DetectNet_v2 的结构相同。唯一的区别是用于从 KITTI 文本标签生成 TFRecords 的命令行。要为 YOLOv4 训练生成 TFRecords,请使用此命令
tao model yolo_v4 dataset_convert [-h] -d <dataset_spec>
-o <output_tfrecords_file>
[--gpu_index <gpu_index>]
必需参数
-d, --dataset_spec
: 数据集 spec 文件的路径。-o, --output_filename
: 输出 TFRecords 文件的路径。
可选参数
--gpu_index
: 运行此命令的 GPU 索引。如果机器安装了多个 GPU,我们可以指定用于运行此命令的 GPU 索引。请注意,此命令只能在单个 GPU 上运行。
以下是 YOLOv4 spec 文件的示例。它有 6 个主要组成部分:yolov4_config
、training_config
、eval_config
、nms_config
、augmentation_config
和 dataset_config
。spec 文件的格式是 protobuf 文本 (prototxt) 消息,其每个字段可以是基本数据类型或嵌套消息。下表总结了 spec 文件的顶层结构。
random_seed: 42
yolov4_config {
big_anchor_shape: "[(114.94, 60.67), (159.06, 114.59), (297.59, 176.38)]"
mid_anchor_shape: "[(42.99, 31.91), (79.57, 31.75), (56.80, 56.93)]"
small_anchor_shape: "[(15.60, 13.88), (30.25, 20.25), (20.67, 49.63)]"
box_matching_iou: 0.25
matching_neutral_box_iou: 0.5
arch: "resnet"
nlayers: 18
loss_loc_weight: 1.0
loss_neg_obj_weights: 1.0
loss_class_weights: 1.0
label_smoothing: 0.0
big_grid_xy_extend: 0.05
mid_grid_xy_extend: 0.1
small_grid_xy_extend: 0.2
freeze_bn: false
freeze_blocks: 0
force_relu: false
}
training_config {
batch_size_per_gpu: 8
num_epochs: 80
enable_qat: false
checkpoint_interval: 10
learning_rate {
soft_start_cosine_annealing_schedule {
min_learning_rate: 1e-7
max_learning_rate: 1e-4
soft_start: 0.3
}
}
regularizer {
type: L1
weight: 3e-5
}
optimizer {
adam {
epsilon: 1e-7
beta1: 0.9
beta2: 0.999
amsgrad: false
}
}
pretrain_model_path: "EXPERIMENT_DIR/pretrained_resnet18/tlt_pretrained_object_detection_vresnet18/resnet_18.hdf5"
}
eval_config {
average_precision_mode: SAMPLE
batch_size: 8
matching_iou_threshold: 0.5
}
nms_config {
confidence_threshold: 0.001
clustering_iou_threshold: 0.5
top_k: 200
}
augmentation_config {
hue: 0.1
saturation: 1.5
exposure:1.5
vertical_flip:0
horizontal_flip: 0.5
jitter: 0.3
output_width: 1248
output_height: 384
output_channel: 3
randomize_input_shape_period: 100
mosaic_prob: 0.5
mosaic_min_ratio:0.2
image_mean {
key: 'b'
value: 103.9
}
image_mean {
key: 'g'
value: 116.8
}
image_mean {
key: 'r'
value: 123.7
}
}
dataset_config {
data_sources: {
tfrecords_path: "/workspace/tao-experiments/data/training/tfrecords/<tfrecords pattern>"
image_directory_path: "/workspace/tao-experiments/data/training"
}
include_difficult_in_training: true
image_extension: "png"
target_class_mapping {
key: "car"
value: "car"
}
target_class_mapping {
key: "pedestrian"
value: "pedestrian"
}
target_class_mapping {
key: "cyclist"
value: "cyclist"
}
target_class_mapping {
key: "van"
value: "car"
}
target_class_mapping {
key: "person_sitting"
value: "pedestrian"
}
validation_data_sources: {
tfrecords_path: "/workspace/tao-experiments/data/val/tfrecords/<tfrecords pattern>"
image_directory_path: "/workspace/tao-experiments/data/val"
}
}
训练配置
训练配置 (training_config
) 定义了训练、评估和推理所需的参数。详细信息总结在下表中。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
batch_size_per_gpu | 每个 GPU 的批次大小;有效批次大小为 batch_size_per_gpu * num_gpus | 无符号整数,正数 | – |
checkpoint_interval | 每个模型检查点/验证的训练 epoch 数 | 无符号整数,正数 | 10 |
num_epochs | 训练网络的 epoch 数 | 无符号整数,正数。 | – |
enable_qat | 是否使用量化感知训练 | 布尔值 | 注意:YOLOv4 不支持加载已剪枝的 QAT 模型并在禁用 QAT 的情况下重新训练,反之亦然。例如,要获得已剪枝的 QAT 模型,请在启用 QAT 或 enable_qat=True 的情况下执行初始训练。 |
learning_rate | 支持具有以下嵌套参数的 soft_start_annealing_schedule 和 soft_start_cosine_annealing_schedule 之一
|
消息类型 | – |
regularizer | 此参数配置训练时使用的正则化器,并包含以下嵌套参数
|
消息类型 | L1(注意:NVIDIA 建议在剪枝前训练网络时使用 L1 正则化器,因为 L1 正则化使网络权重更易于剪枝。) |
optimizer | 优化器可以是 adam、sgd 和 rmsprop 之一。每种类型都有以下参数
以上参数的含义与 Keras 中的含义相同。 |
消息类型 | – |
pretrain_model_path | 预训练模型的路径(如果有)。最多可以存在一个 pretrain_model_path、resume_model_path 和 pruned_model_path。 | 字符串 | – |
resume_model_path | 要恢复训练的 TAO 检查点模型的路径(如果有)。最多可以存在一个 pretrain_model_path、resume_model_path 和 pruned_model_path。 | 字符串 | – |
pruned_model_path | 要重新训练的 TAO 剪枝模型的路径(如果有)。最多可以存在一个 pretrain_model_path、resume_model_path 和 pruned_model_path。 | 字符串 | – |
max_queue_size | 数据加载中预取批次的数量 | 无符号整数,正数 | – |
n_workers | 每个 GPU 数据加载的工作进程数 | 无符号整数,正数 | – |
use_multiprocessing | 是否使用 keras 序列数据加载器的多进程模式 | 布尔值 | true(如果发生死锁,请重新启动训练并使用 False) |
visualizer | 训练期间的可视化配置。 | 消息类型 | – |
early_stopping | 提前停止的参数 | 消息类型 | – |
学习率会根据训练期间使用的 GPU 数量自动缩放,或者有效学习率为 learning_rate * n_gpu
。
训练期间的可视化
训练期间的可视化由 visualizer
参数配置。其参数在下表中描述。
参数 | 描述 | 数据类型和约束 | 默认/建议值 |
enabled |
启用或禁用此功能的布尔标志 | 布尔值。 | – |
num_images |
要在 TensorBoard 中可视化的最大图像数量。 | 整数。 | 3 |
训练期间的可视化支持 3 种类型的可视化,即:标量、图像和直方图。这些类型的可视化都利用 TensorBoard 工具。每种类型在 TensorBoard GUI 界面中都有一个选项卡。使用标量选项卡,它可以可视化标量,如损失、学习率和验证 mAP 随时间变化(训练步骤)。使用图像选项卡,它可以可视化训练期间的增强图像,并在其上绘制边界框。使用直方图选项卡,它可以可视化正在训练的模型的每一层权重和偏差的直方图。
如果参数 enabled
设置为 True
,则将启用以上所有可视化。否则,所有可视化都将被禁用。
参数 num_images
用于限制要在 TensorBoard 的图像选项卡上可视化的最大图像数量。
在训练期间,可以在任何可以访问 TensorBoard 日志目录的地方进行可视化。通常,TAO 容器会将卷映射到主机,因此可以在主机上调用 TensorBoard。命令 tensorboard --logdir=/path/to/logs
可用于在 Web 浏览器中打开 TensorBoard 可视化 GUI。确保在运行此命令之前安装了 tensorboard
。如果环境中未安装,可以运行 pip3 install tensorboard
进行安装。/path/to/logs
参数是训练的结果目录,并附加了后缀 /logs
。
提前停止
提前停止的参数在下表中描述。
参数 | 描述 | 数据类型和约束 | 默认/建议值 |
monitor |
为了启用提前停止而要监控的指标。 | 字符串 | loss |
patience |
在停止训练之前检查 monitor 值的次数。 |
整数 | 正整数 |
min_delta |
monitor 值的最小值增量,低于该值,我们将其视为不减少。 |
浮点数 | 非负浮点数 |
评估配置
评估配置 (eval_config
) 定义了训练期间或独立评估所需的参数。详细信息总结在下表中。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
average_precision_mode | 平均精度 (AP) 计算模式可以是 SAMPLE 或 INTEGRATE。SAMPLE 用作 VOC 2009 或更早版本的 VOC 指标。INTEGRATE 用于 VOC 2010 或之后版本。 | 枚举类型(SAMPLE 或 INTEGRATE) | SAMPLE |
matching_iou_threshold | 预测框和真实框之间可以被视为匹配的最低 IoU | 浮点数 | 0.5 |
visualize_pr_curve | 启用或禁用 Precision-Recall 曲线可视化的布尔标志。 | 布尔值。 | – |
参数 visualize_pr_curve
,如果设置为 True
,将在 evaluate
命令期间生成 Precision-Recall 曲线的图像,图像的确切路径可以在屏幕日志中看到。通过检查图像,我们可以看到每个类在精度和召回率之间的权衡方面的性能。
NMS 配置
NMS 配置 (nms_config
) 定义了 NMS 后处理所需的参数。NMS 配置适用于模型在训练、验证、评估、推理和导出中的 NMS 层。详细信息总结在下表中。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
confidence_threshold | 置信度分数低于 confidence_threshold 的框将在应用 NMS 之前被丢弃。 | 浮点数 | 0.01 |
cluster_iou_threshold | 低于此 IoU 阈值的框将通过 NMS 过程。 | 浮点数 | 0.6 |
top_k | NMS keras 层之后将输出 top_k 个框。如果有效框的数量少于 k,则返回的数组将用置信度分数为 0 的框填充。 | 无符号整数 | 200 |
infer_nms_score_bits | 在 TensorRT OSS 的 NMS 插件中表示分数值的位数。有效范围是 [1, 10] 中的整数。将其设置为任何其他值将使其回退到普通 NMS。目前,此优化的 NMS 插件仅在 FP16 中可用,但它也应通过 INT8 数据类型选择,因为 TensorRT OSS 中没有 INT8 NMS,因此将选择 FP16 中最快的实现。如果回退到普通 NMS,则构建引擎时的实际数据类型将决定运行时的确切精度(FP16 或 FP32)。 | 整数。在区间 [1, 10] 中。 | 0 |
增强配置
增强配置 (augmentation_config
) 定义了在线数据增强所需的参数。详细信息总结在下表中。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
hue | 图像色调在 [-hue, hue] * 180.0 范围内变化 | [0, 1] 的浮点数 | 0.1 |
saturation | 图像饱和度在 [1.0 / saturation, saturation] 倍范围内变化 | 浮点数 >= 1.0 | 1.5 |
exposure | 图像曝光度在 [1.0 / exposure, exposure] 倍范围内变化 | 浮点数 >= 1.0 | 1.5 |
vertical_flip | 图像垂直翻转的概率 | [0, 1] 的浮点数 | 0 |
horizontal_flip | 图像水平翻转的概率 | [0, 1] 的浮点数 | 0.5 |
jitter | 增强中允许的最大抖动;“jitter” 在这里指的是 YOLO 网络中的抖动增强 | [0, 1] 的浮点数 | 0.3 |
output_width | 增强管道的基本输出图像宽度 | 整数,32 的倍数 | – |
output_height | 增强管道的基本输出图像高度 | 整数,32 的倍数 | – |
output_channel | 增强管道的输出通道数 | 1 或 3 | – |
output_depth | 图像的每个通道每个像素的位数。可以是 8 或 16。如果为 16,则 output_channel 应为 1。 | 8 或 16 | 8 |
randomize_input_shape_period | 随机更改输出宽度和高度的批次间隔。对于值 K,增强管道将每 K 个批次调整输出形状,调整后的输出宽度/高度将在基本宽度/高度的 0.6 到 1.5 倍范围内。注意:如果 K=0,则输出宽度/高度将始终是配置的确切基本宽度/高度,并且训练速度将快得多。但是,训练网络的准确性可能不如预期。 | 非负整数 | 10 |
mosaic_prob | 马赛克增强应用于一张图像的概率 | [0, 1] 的浮点数 | 0.5 |
mosaic_min_ratio | 一个子图像应占用的最小宽度/高度比率 | (0, 0.5) 的浮点数 | 0.2 |
image_mean | 用于指定图像均值的键/值对。如果省略,ImageNet 均值将用于图像预处理。如果设置,则根据 output_channel,必须配置 'r/g/b' 或 'l' 键/值对。 | 字典 | – |
数据集配置
YOLOv4 支持两种数据格式:序列格式(图像文件夹和带有 KITTI 格式的原始标签文件夹)和 tfrecords 格式(图像文件夹和 TFRecords)。根据我们的经验,如果禁用马赛克增强 (mosaic_prob=0),则使用 TFRecords 格式进行训练更快。如果启用马赛克增强 (mosaic_prob>0),则使用序列格式进行训练更快。train
和 evaluate
命令将根据您的 dataset_config
确定数据格式。
YOLOv4 数据加载器假定训练/验证拆分已完成,并且数据以 KITTI 格式准备:图像和标签位于两个单独的文件夹中,其中图像文件夹中的每个图像在标签文件夹中都有一个文件名相同的 .txt
标签文件,并且标签文件内容遵循 KITTI 格式。COCO 数据格式受支持,但仅通过 TFRecords。使用 dataset_convert
准备 TFRecords。
序列格式
如果您想使用序列格式,以下是 dataset_config
元素的示例
dataset_config {
data_sources: {
label_directory_path: "/workspace/tao-experiments/data/training/label_2"
image_directory_path: "/workspace/tao-experiments/data/training/image_2"
}
data_sources: {
label_directory_path: "/workspace/tao-experiments/data/training/label_3"
image_directory_path: "/workspace/tao-experiments/data/training/image_3"
}
include_difficult_in_training: true
target_class_mapping {
key: "car"
value: "car"
}
target_class_mapping {
key: "pedestrian"
value: "pedestrian"
}
target_class_mapping {
key: "cyclist"
value: "cyclist"
}
target_class_mapping {
key: "van"
value: "car"
}
target_class_mapping {
key: "person_sitting"
value: "pedestrian"
}
validation_data_sources: {
label_directory_path: "/workspace/tao-experiments/data/val/label_1"
image_directory_path: "/workspace/tao-experiments/data/val/image_1"
}
}
dataset_config
中的参数定义如下
data_sources
:要训练的数据集路径。如果您有多个训练数据源,可以使用多个data_sources
。此字段包含 2 个参数label_directory_path
:数据源标签文件夹的路径。image_directory_path
:数据源图像文件夹的路径。
include_difficult_in_training
:一个标志,指定是否在训练中包含困难框。如果设置为false
,则将忽略困难框。困难框是在 KITTI 标签中具有非零遮挡级别的框。target_class_mapping
:此参数将标签中的类名称映射到网络中要训练的目标类。为每个源类到目标类映射定义一个元素。包含此字段的目的是将相似的类对象分组到一个保护伞下。例如,“car”、“van”、“heavy_truck” 等可以分组在 “automobile” 下。“key” 字段是 tfrecords 文件中类名称的值,“value” 字段对应于网络预期学习的值。validation_data_sources
:捕获要验证的数据集路径。如果您有多个验证数据源,可以使用多个validation_data_sources
。与data_sources
一样,此字段包含两个参数。
target_class_mapping
中的类名称键必须与 KITTI 标签中显示的类名称相同,以便选择正确的类进行训练。
TFRecords 格式
TFRecords 格式需要所有标签的 tfrecords。这需要运行 tao model yolo_v4 dataset-convert
命令。该命令具有与 detectnet_v2 相同的功能和参数要求,有关如何生成 tfrecords 的详细信息,请查看 detectnet_v2 中的 预处理数据集。
如果您想使用从 KITTI 数据格式转换而来的 tfrecords 格式,以下是 dataset_config
元素的示例。在这里,我们假设您的 tfrecords 都生成在名为 tfrecords 的文件夹下,该文件夹与图像和标签位于同一父文件夹下
dataset_config {
data_sources: {
tfrecords_path: "/workspace/tao-experiments/data/training/tfrecords/<tfrecords pattern>"
image_directory_path: "/workspace/tao-experiments/data/training"
}
include_difficult_in_training: true
image_extension: "png"
target_class_mapping {
key: "car"
value: "car"
}
target_class_mapping {
key: "pedestrian"
value: "pedestrian"
}
target_class_mapping {
key: "cyclist"
value: "cyclist"
}
target_class_mapping {
key: "van"
value: "car"
}
target_class_mapping {
key: "person_sitting"
value: "pedestrian"
}
validation_data_sources: {
tfrecords_path: "/workspace/tao-experiments/data/val/tfrecords/<tfrecords pattern>"
image_directory_path: "/workspace/tao-experiments/data/val"
}
}
dataset_config
中的参数定义如下
data_sources
:要训练的数据集路径。如果您有多个训练数据源,可以使用多个data_sources
。此字段包含 2 个参数tfrecords_path
:数据源 tfrecords 的路径。image_directory_path
:包含图像文件夹的根目录的路径。
image_extension
:图像文件夹中包含的图像的图像扩展名。注意,要使用 tfrecords 格式,所有图像必须具有相同的扩展名,目前我们支持 jpg 和 pngvalidation_data_sources
:捕获要验证的数据集路径。此字段包含与data_sources
相同的两个参数。如果您有多个验证数据源,可以使用多个validation_data_sources
。
所有其他字段与序列格式 dataset_config
中的字段相同。
16 位灰度图像支持
TAO YOLOv4 可以支持 16 位灰度图像。要启用此功能,只需在 augmentation_config
中将 output_channel
设置为 1,将 output_depth
设置为 16。此外,通常 16 位灰度图像的均值与 RGB 图像的均值不同,因此通常有必要通过 augmentation_config
中的 image_mean
字典为其设置正确的通道均值。原则上,16 位图像的通道均值是从训练图像计算得出的统计值。以下是如何设置均值的示例。
image_mean {
key: "l"
value: 10141.5
}
请注意,只有 PNG 格式可以支持每通道每像素 16 位的深度。JPEG 格式不支持此功能。
类权重配置
YOLOV4 支持在训练期间对损失函数进行类级别加权。以下是类权重配置 (class_weighting_config
) 的示例,用于设置两个类的权重。
class_weighting_config {
class_weighting{
key: "person"
value: 1.0
}
class_weighting{
key: "bus"
value: 5.0
}
}
class_weighting_config
中的参数定义如下
class_weighting
:此参数将类名称映射到损失函数上的相应类权重。类权重value
应大于 0。如果未在配置中显式设置类权重,则将隐式分配默认值1.0
。enable_auto
:此参数指示是否在训练中启用自动类权重。将其设置为true
以根据每个类的训练损失自动生成类权重。
YOLO4 配置
YOLOv4 配置 (yolov4_config
) 定义了构建 YOLOv4 模型所需的参数。详细信息总结在下表中。
字段 | 描述 | 数据类型和约束 | 推荐/典型值 |
big_anchor_shape、mid_anchor_shape 和 small_anchor_shape | 这些设置应该是引号内的 1 维数组。这些数组的元素是元组,表示预定义的锚点形状,顺序为 “width, height”。默认的 YOLOv4 配置有九个预定义的锚点形状。它们分为三组,分别对应于大、中、小对象。对应于不同组的检测输出来自网络中的不同深度。您应该运行 kmeans 命令 (tao model yolo_v4 kmeans ) 来确定数据集的最佳锚点形状,并将这些锚点形状放在 spec 文件中。值得注意的是,任何字段的锚点形状数量不限于三个;您只需要在三个字段中的每一个中指定一个锚点形状。 |
字符串 | 使用 tao model yolo_v4 kmeans 命令来获取这些形状 |
box_matching_iou | 此字段应为介于 0 和 1 之间的浮点数。任何锚点与任何真实框的 IoU 至少为此值,都将与其具有最大 IoU 的真实框匹配。与 YOLOv3 相比,YOLOv4 中的一个真实框可能与多个锚点匹配。 | 浮点数 | 0.5 |
matching_neutral_box_iou | 此字段应为介于 0.25 和 1 之间的浮点数。任何推断的边界框与任何真实框的 IoU 至少为此值,都不会被视为负框,并且其负对象置信度损失将被分配为 0(中性框) | 浮点数 | 0.5 |
loss_loc_weight、loss_neg_obj_weights 和 loss_class_weights | 这些损失权重可以配置为浮点数。YOLOv4 损失是定位损失、负对象置信度损失、正对象置信度损失和分类损失的总和。正对象置信度损失的权重设置为 1,而其他损失的权重从配置文件中读取。 | 浮点数 | loss_loc_weight: 5.0 loss_neg_obj_weights: 50.0 loss_class_weights: 1.0 |
label_smoothing | 应用于分类损失的标签平滑。 | [0, 0.3] 的浮点数 | 0, 0.1, 0.2 |
big_grid_xy_extend、mid_grid_xy_extend 和 small_grid_xy_extend | 这些设置应该是小的正浮点数。相对于锚点框计算的框中心将根据以下公式重新校准:center_xy = calculated_xy * (grid_xy_extend + 1.0) - grid_xy_extend / 2.0 默认的 YOLOv4 有九个预定义的锚点形状。它们分为三组,分别对应于大、中、小对象。对应于不同组的检测输出来自网络中的不同深度。三种不同的 grid_xy_extend 配置允许用户为不同的锚点形状组定义不同的 grid_xy_extend 值。grid_xy_extend 设置使网络更容易提出中心接近或位于锚点边框上的推断框。 | [0, 0.3] 的浮点数 | 0.05, 0.1, 0.2 |
arch | 用于特征提取的骨干网络。目前,支持 “resnet”、“vgg”、“darknet”、“googlenet”、“mobilenet_v1”、“mobilenet_v2”、“cspdarknet” 和 “squeezenet”。 | 字符串 | resnet |
activation | YOLOv4 CSPDarkNet 骨干网络中使用的激活类型。仅支持 “relu”、“leaky_relu” 和 “mish”。对于其他骨干网络,此参数无用。 | 字符串 | “leaky_relu” |
nlayers | 特定架构中卷积层的数量。对于 “resnet”,支持 10、18、34、50 和 101。对于 “vgg”,支持 16 和 19。对于 “darknet” 或 “cspdarknet”,支持 19 和 53。所有其他网络都没有此配置,在这种情况下,您应该从配置文件中删除此配置。 | 无符号整数 | – |
freeze_bn | 一个标志,指定是否在训练期间冻结所有批归一化层。 | 布尔值 | False |
freeze_blocks | 在模型训练期间要冻结的模型中的块 ID 列表。您可以选择冻结模型中的某些 CNN 块,以使训练更稳定和/或更容易收敛。块的定义对于特定架构是启发式的(例如,按步幅或按模型中的逻辑块)。但是,块 ID 号按顺序标识模型中的块,因此您不必知道块在执行训练时的确切位置。要记住的一般原则是,块 ID 越小,它就越靠近模型输入;块 ID 越大,它就越靠近模型输出。您可以将整个模型划分为几个块,并可以选择冻结其中的一部分。请注意,对于 FasterRCNN,您只能冻结 ROI 池化层之前的块。无论如何,ROI 池化层之后的任何层都不会被冻结。对于不同的骨干网络,块的数量和每个块的块 ID 是不同的。值得详细解释如何为每个骨干网络指定块 ID。 | list(重复整数)
|
– |
force_relu | 一个标志,指定是否将所有激活函数替换为 ReLU。这对于为 NVDLA 训练模型很有用。 | 布尔值 | False |
锚点形状应与数据集中的大多数真实框匹配,以帮助网络学习边界框。YOLOv4 论文建议使用 kmeans 算法来获取锚点形状,并且 tao model yolo_v4 kmeans
命令在 TAO 算法中实现。您应该使用输出作为 yolov4_config
spec 文件中的锚点形状。
tao model yolo_v4 kmeans [-h] -l <label_folders>
-i <image_folders>
-x <network base input width>
-y <network base input height>
[-n <num_clusters>]
[--max_steps <kmeans max steps>]
[--min_x <ignore boxes with width less than this value>]
[--min_y <ignore boxes with height less than this value>]
必需参数
-l
: 训练标签文件夹的路径。多个文件夹路径应以空格分隔。-i
: 相应训练图像文件夹的路径。文件夹计数和顺序必须与标签文件夹匹配。-x
: 基本网络输入宽度。这应该是您的 spec 文件的增强配置部分中的output_width
。-y
: 基本网络输入高度。这应该是您的 spec 文件的增强配置部分中的output_height
。
可选参数
-n
: 形状聚类的数量。这定义了命令将输出多少个形状中心。默认值为 9(每组 3 个,共 3 组)。--max_steps
: kmeans 算法应运行的最大步数。如果算法在此步骤未收敛,将返回次优结果。默认值为 10000。--min_x
: 忽略宽度小于此值的真实框(在重塑图像中)(图像首先重塑为网络基本形状,如 -x, -y)。--min_y
: 忽略高度小于此值的真实框(在重塑图像中)(图像首先重塑为网络基本形状,如 -x, -y)。-h, --help
: 显示此帮助消息并退出。
使用此命令训练 YOLOv4 模型
tao model yolo_v4 train [-h] -e <experiment_spec>
-r <output_dir>
-k <key>
[--gpus <num_gpus>]
[--gpu_index <gpu_index>]
[--use_amp]
[--log_file <log_file_path>]
必需参数
-r, --results_dir
: 实验输出写入的文件夹路径。-k, --key
: 用于解密模型的加密密钥。-e, --experiment_spec_file
: 用于设置评估实验的实验规格文件。这应与训练规格文件相同。
可选参数
--gpus
: 用于多 GPU 场景中训练的 GPU 数量(默认值:1)。--gpu_index
: 用于运行训练的 GPU 索引。当机器安装了多个 GPU 时,您可以指定用于训练的 GPU 索引。--use_amp
: 启用 AMP 训练的标志。--log_file
: 日志文件的路径。默认路径为stdout
。-h, --help
: 显示此帮助消息并退出。
输入要求
输入大小:C * W * H(其中 C = 1 或 3,W >= 128,H >= 128,W、H 是 32 的倍数)
图像格式:JPG、JPEG、PNG
标签格式:KITTI 检测
示例用法
以下是在 YOLOv4 模型上使用 train 命令的示例
tao model yolo_v4 train --gpus 2 -e /path/to/spec.txt -r /path/to/result -k $KEY
要在 YOLOv4 模型上运行评估,请使用此命令
tao model yolo_v4 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
: 用于评估的模型文件的路径。该模型可以是.tlt
模型文件或 TensorRT 引擎。-k, --key
: 用于加载模型的密钥(如果模型是 TensorRT 引擎,则不需要)。
可选参数
-h, --help
: 显示此帮助消息并退出。--gpu_index
: 用于运行评估的 GPU 索引。当机器安装了多个 GPU 时,您可以指定用于运行评估的 GPU 索引。请注意,评估只能在单个 GPU 上运行。--log_file
: 日志文件的路径。默认路径为stdout
。
YOLOv4 网络的推理工具,可用于可视化边界框或在单个图像或图像目录上生成逐帧 KITTI 格式标签。以下显示了此工具的命令示例
tao model yolo_v4 inference [-h] -i <input directory>
-o <output annotated image directory>
-e <experiment spec file>
-m <model file>
-k <key>
[-l <output label directory>]
[-t <visualization threshold>]
[--gpu_index <gpu_index>]
[--log_file <log_file_path>]
必需参数
-m, --model
: 训练模型的路径(TAO 模型)或 TensorRT 引擎。-i, --in_image_dir
: 用于推理的输入图像目录。-o, --out_image_dir
: 用于输出带注释图像的目录路径。-k, --key
: 用于加载模型的密钥(如果模型是 TensorRT 引擎,则不需要)。-e, --config_path
: 训练的实验规格文件路径。
可选参数
-t, --draw_conf_thres
: 绘制边界框的阈值。默认值:0.3。-h, --help
: 显示此帮助消息并退出。-l, --out_label_dir
: 用于输出 KITTI 标签的目录。--gpu_index
: 用于运行推理的 GPU 索引。当机器安装了多个 GPU 时,我们可以指定用于运行评估的 GPU 索引。请注意,评估只能在单个 GPU 上运行。--log_file
: 日志文件的路径。默认路径为stdout
。
剪枝从模型中移除参数,以减小模型大小,同时使用 tao model yolo_v4 prune
命令,在不损害模型完整性的前提下进行。
tao model yolo_v4 prune
命令包括以下参数
tao model yolo_v4 prune [-h] -m <pretrained_model>
-o <output_file>
-k <key>
[-n <normalizer>]
[-eq <equalization_criterion>]
[-pg <pruning_granularity>]
[-pth <pruning threshold>]
[-nf <min_num_filters>]
[-el [<excluded_list>]
必需参数
-m, --model
: 预训练 YOLOv4 模型的路径-o, --output_file
: 输出检查点的路径-k, --key
: 用于加载 .tlt 模型的密钥
可选参数
-h, --help
: 显示此帮助消息并退出。-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)-nf, --min_num_filters
: 每层要保留的最小过滤器数量(默认值:16)-el, --excluded_layers
: 排除层的列表。示例:-i item1 item2(默认值:[])
剪枝后,模型需要重新训练。有关更多详细信息,请参阅重新训练剪枝模型。
使用剪枝命令
以下是使用 tao model yolo_v4 prune
命令的示例
tao model yolo_v4 prune -m /workspace/output/weights/resnet_003.tlt \
-o /workspace/output/weights/resnet_003_pruned.tlt \
-eq union \
-pth 0.7 -k $KEY
导出模型将训练过程与推理分离,并允许在 TAO 环境之外转换为 TensorRT 引擎。TensorRT 引擎特定于每个硬件配置,应为每个唯一的推理环境生成。导出的模型可以通用地用于训练和部署硬件。导出的模型格式称为 .etlt
。与 .tlt
类似,.etlt
模型格式也是一种加密模型格式,具有与其导出的 .tlt
模型相同的密钥。部署此模型时需要此密钥。
INT8 模式概述
TensorRT 引擎可以在 INT8 模式下生成以提高性能,但需要在引擎创建时使用校准缓存。如果使用设置为 int8
的 --data_type
标志运行 tao model yolo_v4 export
,则将使用校准张量文件生成校准缓存。预先生成校准信息并缓存它,无需在推理机器上校准模型。移动校准缓存通常比移动校准张量文件方便得多,因为它是一个小得多的文件,可以与导出的模型一起移动。使用校准缓存还可以加快引擎创建速度,因为构建缓存可能需要几分钟时间,具体取决于 Tensorfile 的大小和模型本身。
导出工具可以通过使用以下任一选项摄取训练数据来生成 INT8 校准缓存
选项 1:使用训练数据加载器加载训练图像以进行 INT8 校准。此选项现在是推荐的方法,通过利用训练数据集加载器来支持多个图像目录。这也确保了校准期间数据的两个重要方面
INT8 校准步骤中的数据预处理与训练过程中的数据预处理相同。
数据批次在整个训练数据集中随机采样,从而提高了 INT8 模型的准确性。
选项 2:将工具指向要用于校准模型的图像目录。对于此选项,请确保创建随机图像的子采样目录,以最好地代表您的训练数据集。
FP16/FP32 模型
如果您需要在 INT8 精度下运行推理,则仅需要 calibration.bin
。对于基于 FP16/FP32 的推理,导出步骤要简单得多。只需要提供来自训练/重新训练步骤的 .tlt
模型即可转换为 .etlt
。
导出模型
以下是 tao model yolo_v4 export
命令的命令行参数示例
tao model yolo_v4 export [-h]
-m <path to the .tlt model file generated by tao model train>
-k <key>
[-o <path to output file>]
[--cal_json_file <path to calibration json file>]
[--experiment_spec <path to experiment spec file>]
[--gen_ds_config]
[--verbose]
[--gpu_index <gpu_index>]
[--log_file <log_file_path>]
必需参数
-m, --model
: 要导出的.tlt 模型
文件的路径。-k, --key
: 用于保存.tlt
模型文件的密钥。-e, --experiment_spec
: 规格文件的路径。
可选参数
-h, --help
: 显示此帮助消息并退出。-o, --output_file
: 用于保存导出模型的路径。默认路径为./<input_file>.etlt
。--gen_ds_config
: 一个布尔标志,指示是否在与output_file
相同的目录中生成模板 DeepStream 相关配置 (“nvinfer_config.txt”) 以及标签文件 (“labels.txt”)。请注意,配置文件不是完整的配置文件,需要用户使用生成的参数更新 DeepStream 中的示例配置文件。--gpu_index
: 如果机器安装了多个 GPU,则用于导出模型的(离散)GPU 的索引。请注意,导出只能在单个 GPU 上运行。--log_file
: 日志文件的路径。默认路径为stdout
。
QAT 导出模式必需参数
--cal_json_file
: 包含 QAT 模型张量比例的 json 文件的路径。如果要生成 QAT 模型的引擎,则需要此参数。
导出启用 QAT 训练的模型时,用于校准激活的张量比例因子将从模型中剥离出来,并序列化到由 cal_json_file
参数定义的 JSON 文件中。
示例用法
以下是导出 YOLOv4 模型的示例命令
tao model yolo_v4 export -m /workspace/yolov4_resnet18_epoch_100.tlt \
-o /workspace/yolov4_resnet18_epoch_100_int8.etlt \
-e /workspace/yolov4_retrain_resnet18_kitti.txt \
-k $KEY \
有关 TensorRT 引擎生成、验证和 int8 校准,请参阅TAO 部署文档。
有关部署到 deep stream,请参阅部署到 DeepStream for YOLOv4。