LPRNet
LPRNet(车牌识别网络)以图像作为网络输入,并预测车牌字符序列。
LPRNet 的数据集包含裁剪的车牌图像和相应的标签文件。
数据结构必须采用以下格式
/Dataset_01
/images
0000.jpg
0001.jpg
0002.jpg
...
...
...
N.jpg
/labels
0000.txt
0001.txt
0002.txt
...
...
...
N.txt
/characters_list.txt
每个裁剪的车牌图像都有一个对应的标签文本文件,其中包含特定车牌中的一行字符。还有一个 characters_list.txt 文件,其中包含车牌数据集中找到的所有字符。每个字符占一行。
LPRNet 的规范文件包括 random_seed
、lpr_config
、training_config
、eval_config
、augmentation_config
和 dataset_config
参数。以下是在 NVIDIA 车牌数据集上进行训练的示例
random_seed: 42
lpr_config {
hidden_units: 512
max_label_length: 8
arch: "baseline"
nlayers: 10
}
training_config {
batch_size_per_gpu: 32
num_epochs: 100
learning_rate {
soft_start_annealing_schedule {
min_learning_rate: 1e-6
max_learning_rate: 1e-4
soft_start: 0.001
annealing: 0.7
}
}
regularizer {
type: L2
weight: 5e-4
}
}
eval_config {
validation_period_during_training: 5
batch_size: 1
}
augmentation_config {
output_width: 96
output_height: 48
output_channel: 3
max_rotate_degree: 5
rotate_prob: 0.5
gaussian_kernel_size: 5
gaussian_kernel_size: 7
gaussian_kernel_size: 15
blur_prob: 0.5
reverse_color_prob: 0.5
keep_original_prob: 0.3
}
dataset_config {
data_sources: {
label_directory_path: "/path/to/train/labels"
image_directory_path: "/path/to/train/images"
}
characters_list_file: "/path/to/lp_characters"
validation_data_sources: {
label_directory_path: "/path/to/test/labels"
image_directory_path: "/path/to/test/images"
}
}
参数 | 数据类型 | 默认值 | 描述 |
random_seed |
无符号整数 | 42 | 实验的随机种子 |
lpr_config |
proto 消息 | – | 模型架构的配置 |
training_config |
proto 消息 | – | 训练过程的配置 |
eval_config |
proto 消息 | – | 评估过程的配置 |
augmentation_config |
proto 消息 | – | 数据增强的配置 |
dataset_config |
proto 消息 | – | 数据集的配置 |
lpr_config
lpr_config
参数提供更改 LPRNet 架构的选项。
lpr_config {
hidden_units: 512
max_label_length: 8
arch: "baseline"
nlayers: 10
}
参数 |
数据类型 |
默认值 |
描述 |
支持的值 |
---|---|---|---|---|
hidden_units |
无符号整数 | 512 | LPRNet 的 LSTM 层中隐藏单元的数量 | |
max_label_length |
无符号整数 | 8 | 数据集中车牌的最大长度 | |
arch |
字符串 | baseline | LPRNet 的架构 | baseline |
nlayers |
无符号整数 | 10 | LPRNet 中卷积层的数量 | 10, 18 |
training_config
training_config
参数定义训练过程的超参数。
training_config {
checkpoint_interval: 5
batch_size_per_gpu: 32
num_epochs: 100
learning_rate {
soft_start_annealing_schedule {
min_learning_rate: 1e-6
max_learning_rate: 1e-4
soft_start: 0.001
annealing: 0.7
}
}
regularizer {
type: L2
weight: 5e-4
}
}
参数 | 数据类型 | 默认值 | 描述 | 支持的值 | |
batch_size_per_gpu |
整数 | 32 | 每个 GPU 每个批次的图像数量 | >1 | |
num_epochs |
整数 | 120 | 实验中运行的总 epoch 数 | ||
checkpoint_interval |
整数 | 5 | 保存检查点的时间间隔 | >0 | |
|
学习率调度器 proto |
soft_start |
训练器的学习率调度。目前, * |
annealing: 0.0-1.0 且大于 soft_start – Soft_start: 0.0 - 1.0 下图显示了 soft start 为 0.3 和 annealing 为 0.1 的学习率曲线示例。 |
|
|
regularizer proto config |
|
此参数配置训练期间要使用的正则化器的类型和权重。此配置包含两个 * |
以下是 * NO_REG |
|
visualizer |
消息类型 | 训练可视化配置 | |||
early_stopping |
消息类型 | 提前停止配置 |
visualizer
训练期间的可视化使用 visualizer
参数进行配置。下表描述了这些参数。
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
enabled |
布尔值 | false | 用于启用或禁用此功能的布尔标志 | |
num_images |
整数 | 3 |
要在 TensorBoard 中可视化的最大图像数量。 | >0 |
如果启用可视化,则训练期间将生成 TensorBoard 日志,包括学习率、训练损失和验证准确率的图表。增强图像也将在 TensorBoard 中生成。
early_stopping
下表描述了提前停止的参数。
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
monitor |
字符串 | 为了启用提前停止而要监视的指标 | loss |
|
patience |
整数 | 0 | 停止训练前对 monitor 值进行检查的次数 |
|
min_delta |
浮点数 | 0.0 | monitor 最小值的 delta,低于该值则视为未减少。 |
eval_config
eval_config
参数定义评估过程的超参数。评估的指标是车牌识别准确率。如果车牌中的所有字符都分类正确,则认为识别正确。
eval_config {
validation_period_during_training: 5
batch_size: 1
}
参数 | 数据类型 | 默认/建议值 | 描述 | 支持的值 |
validation_period_during_training |
整数 | 5 | 在训练期间运行评估的时间间隔。评估从此间隔开始运行,起始于下面指定的第一个验证 epoch 参数的值。 | 1 - 总 epoch 数 |
batch_size |
整数 | 1 | 要进行单次推理的样本数 | >0 |
augmentation_config
augmentation_config
参数包含训练期间增强的超参数。它还定义了网络输入的空间大小。
augmentation_config {
output_width: 96
output_height: 48
output_channel: 3
max_rotate_degree: 5
rotate_prob: 0.5
gaussian_kernel_size: 5
gaussian_kernel_size: 7
gaussian_kernel_size: 15
blur_prob: 0.5
reverse_color_prob: 0.5
keep_original_prob: 0.3
}
参数 | 数据类型 | 默认/建议值 | 描述 | 支持的值 |
output_width |
无符号整数 | 96 | 预处理图像的宽度。网络输入的宽度 | >0 |
output_height |
无符号整数 | 48 | 预处理图像的高度。网络输入的高度 | >0 |
output_channel |
无符号整数 | 3 | 预处理图像的通道 | 1, 3 |
keep_original_prob |
浮点数 | 0.3 | 保留原始图像的概率。仅调整大小将应用于具有此概率的图像 | 0.0 ~ 1.0 |
max_rotate_degree |
无符号整数 | 5 | 增强的最大旋转角度 | 0.0 ~ 90.0 |
rotate_prob |
浮点数 | 0.5 | 旋转图像的概率 | 0.0 ~ 1.0 |
gaussian_kernel_size |
无符号整数 | 5, 7, 15 | 高斯模糊的内核大小 | >0 |
blur_prob |
浮点数 | 0.5 | 模糊图像的概率 | 0.0 ~ 1.0 |
reverse_color_prob |
浮点数 | 0.5 | 反转图像颜色的概率 | 0.0 ~ 1.0 |
dataset_config
dataset_config
参数定义训练数据集、验证数据集和字符列表文件的路径。
dataset_config {
data_sources: {
label_directory_path: "/path/to/train/labels"
image_directory_path: "/path/to/train/images"
}
characters_list_file: "/path/to/lp_characters"
validation_data_sources: {
label_directory_path: "/path/to/test/labels"
image_directory_path: "/path/to/test/images"
}
}
参数 | 数据类型 | 默认/建议值 | 描述 | 支持的值 |
data_sources |
dataset proto | 训练数据集图像和标签的路径
|
||
validation_data_sources |
dataset proto | 验证数据集图像和标签的路径 | ||
characters_list_file |
字符串 | 字符列表文件的路径 | 此文件中的字符应为 unicode 格式。 |
data_sources
和 validation_data_sources
都是重复字段。可以将多个数据集添加到源。
使用以下命令运行 LPRNet 训练
tao model lprnet train -e <experiment_spec_file>
-r <results_dir>
-k <key>
[--gpus <num_gpus>]
[--gpu_index <gpu_index>]
[--use_amp]
[--log_file <log_file>]
[-m <resume_model_path>]
[--initial_epoch <initial_epoch>]
必需参数
-e, --experiment_spec_file
:实验规范文件的路径-r, --results_dir
:实验输出应写入的文件夹的路径。-k, --key
:用户特定的编码密钥,用于保存或加载.tlt
模型。
可选参数
--gpus
:在多 GPU 场景中用于训练的 GPU 数量(默认值:1)。--gpu_index
:用于运行训练的 GPU 索引。当机器安装了多个 GPU 时,我们可以指定用于运行训练的 GPU 索引。--use_amp
:用于启用 AMP 训练的标志。--log_file
:日志文件的路径。默认为stdout
。-m, --resume_model_weights
:预训练模型或要继续训练的模型的路径。--initial_epoch
:开始训练的 epoch。
以下是使用 LPRNet 训练命令的示例
tao model lprnet train --gpu_index=0 -e $DEFAULT_SPEC -r $RESULTS_DIR -k $YOUR_KEY
要从 .tlt
模型恢复训练,请将 -m
设置为该模型,并将 --initial_epoch
设置为起始 epoch 编号。
LPRNet 的评估指标是识别准确率。如果车牌中的所有字符都正确,则认为识别准确。
使用以下命令运行 LPRNet 评估
tao model lprnet evaluate -m <model>
-e <experiment_spec_file>
[-k <key>]
[--gpu_index <gpu_index>]
[--log_file <log_file>]
[--trt]
必需参数
-m, --model
:要评估的.tlt
模型或TRT
引擎。-e, --experiment_spec_file
:实验规范文件,用于设置评估实验。这应与训练规范文件相同。
可选参数
-h, --help
:显示此帮助消息并退出。-k, --key
:.tlt
模型的编码密钥。--gpu_index
:用于运行评估的 GPU 索引。当机器安装了多个 GPU 时,您可以指定用于运行评估的 GPU 索引。请注意,评估只能在单个 GPU 上运行。--log_file
:日志文件的路径。默认为stdout
。--trt
:评估 TRT 引擎。
以下是使用 LPRNet 评估命令的示例
tao model lprnet evaluate --gpu_index=0 -m $TRAINED_TLT_MODEL -e $DEFAULT_SPEC -k $YOUR_KEY
使用以下命令在 LPRNet 上运行推理,使用 .tlt
模型或 TensorRT 引擎
tao model lprnet inference -m <model>
-i <in_image_path>
-e <experiment_spec>
[-k <key>]
[--gpu_index <gpu_index>]
[--log_file <log_file>]
[--trt]
必需参数
-m, --model
:用于推理的.tlt
模型或 TensorRT 引擎-i, --in_image_path
:要进行推理的车牌图像的路径。-e, --experiment_spec
:实验规范文件,用于设置导出。可以与训练规范相同。
可选参数
-h, --help
:显示此帮助消息并退出。-k, --key
:.tlt
模型的编码密钥。--gpu_index
:用于运行推理的 GPU 索引。当机器安装了多个 GPU 时,我们可以指定用于运行推理的 GPU 索引。请注意,推理只能在单个 GPU 上运行。--log_file
:日志文件的路径。默认为stdout
。--trt
:使用 TRT 引擎运行推理。
以下是使用 LPRNet 推理命令的示例
tao model lprnet inference --gpu_index=0 -m $SAVED_TRT_ENGINE -i $PATH_TO_TEST_IMAGES -e $DEFAULT_SPEC --trt
使用以下命令将 LPRNet 导出为 .etlt
格式以进行部署
tao model lprnet export -m <model>
-k <key>
-e <experiment_spec>
[--gpu_index <gpu_index>]
[--log_file <log_file>]
[-o <output_file>]
[--data_type {fp32,fp16}]
[--max_workspace_size <max_workspace_size>]
[--max_batch_size <max_batch_size>]
[--engine_file <engine_file>]
[-v]
必需参数
-m, --model
:要导出的.tlt
模型。-k, --key
:.tlt
模型的编码密钥。-e, --experiment_spec
:实验规范文件,用于设置导出。可以与训练规范相同。
可选参数
--gpu_index
:用于导出模型的(离散)GPU 的索引。如果机器安装了多个 GPU,我们可以指定用于运行导出的 GPU 索引。请注意,导出只能在单个 GPU 上运行。--log_file
:日志文件的路径。默认为stdout
。-o, --output_file
:保存导出模型的路径。默认值为./<input_file>.etlt
。--data_type
:如果处于 INT8 模式,则生成校准缓存所需的目标引擎数据类型。选项为fp32
或fp16
。默认值为fp32
。
您可以使用以下可选参数来保存生成的 TRT 引擎,以验证导出
--max_batch_size
:TensorRT 引擎的最大批次大小。默认值为16
。--max_workspace_size
:TensorRT 引擎的最大工作区大小。默认值为1073741824(1<<30)
。--engine_file
:序列化 TensorRT 引擎文件的路径。请注意,此文件特定于硬件,不能在 GPU 之间通用。有助于在主机上使用 TensorRT 快速测试模型准确率。由于 TensorRT 引擎文件特定于硬件,因此除非部署 GPU 与训练 GPU 完全相同,否则您不能将此引擎文件用于部署。
以下是使用 LPRNet 导出命令的示例
tao model lprnet export --gpu_index=0 -m $TRAINED_TAO_MODEL -e $DEFAULT_SPEC -k $YOUR_KEY
您训练的深度学习和计算机视觉模型可以部署在边缘设备上,例如 Jetson Xavier、Jetson Nano 或 Tesla,或者在使用 NVIDIA GPU 的云中。
DeepStream SDK 是一种流分析工具包,用于加速构建基于 AI 的视频分析应用程序。TAO 与 DeepStream SDK 集成,因此使用 TAO 训练的模型可以与 Deepstream 开箱即用。
DeepStream 无法直接解析 LPRNet .etlt
。您应使用 tao-converter
将 .etlt
模型转换为优化的 TensorRT 引擎,然后将该引擎集成到 DeepStream 管道中。
使用 tao-converter
tao-converter
是 TAO 提供的一种工具,用于简化 TAO 训练的模型在 TensorRT 和/或 Deepstream 上的部署。对于具有基于 x86 的 CPU 和独立 GPU 的部署平台,tao-converter
分布在 TAO Docker 容器中。因此,建议使用 Docker 容器生成引擎。但是,这要求用户遵守与 Docker 容器分发的 TensorRT 相同的次要版本。TAO Docker 容器包含 TensorRT 版本 7.1。为了将引擎与不同次要版本的 TensorRT 一起使用,请将转换器从 /opt/nvidia/tools/tao-converter
复制到目标机器,并按照 x86 的说明运行它并生成 TensorRT 引擎。
对于 aarch64 平台,tao-converter
可在 开发者专区 中下载。
以下是通过 tao-converter
生成 LPRNet 引擎的示例命令
tao-converter <etlt_model> -k <key_to_etlt_model> -p image_input,1x3x48x96,4x3x48x96,16x3x48x96 -e <path_to_generated_trt_engine>
通过此命令,将生成具有动态输入形状的优化 TensorRT 引擎。(此引擎的动态形状:min_shape=[1x3x48x96],opt_shape=[4x3x48x96],max_shape=[16x3x48x96]。形状格式为 NCHW。)
在 DeepStream 示例中部署 LPRNet
获得 LPRNet 的 TensorRT 引擎后,您可以将其部署到 DeepStream 的 LPDR 示例 中。此示例是一个完整的解决方案,包括汽车检测、车牌检测和车牌识别。此示例中提供了一个可配置的 CTC 解码器。