预先准备
在开始建立和部署 TLT 中高准确率的车辆训练模型时,需要以下资源:
我们将使用 TLT 进行训练
pip3 install nvidia-pyindex
pip3 install nvidia-tlt
创建 ~/.tlt_mounts.json
文件,并加入以下内容:
{
"Mounts": [
{
"source": "/home/<username>/tlt-experiments",
"destination": "/workspace/tlt-experiments"
},
{
"source": "/home/<username>/openalpr",
"destination": "/workspace/openalpr"
}
]
}
将本机电脑上的路径 /home/<username>/tlt-experiments
,装载为Docker内的路径 /workspace/tlt-experiments
。 另外,将本机电脑上的路径 /home/<username>/openalpr
,装载为Docker内的路径 /workspace/openalpr
。
车牌识别 LPR(License plate recognition)
本节将逐步阐述如何从 NGC 取得预先训练好的美国 LPRNet 模型,并以此为基础进行微调。
资料集
使用 OpenALPR
资料集对 LPRNet
模型进行调整和验证。我们会将其中的 80%(177 张图片)用于训练,20%(44 张图片)则用于验证。
算法简介
LPRNet
可以在截取出的车牌图片中检测字符。LPRNet
首先是撷取图片的特征。利用广泛采用之 DNN 架构(例如 ResNet 10/18)做为 LPRNet 的骨干。 ResNet 网路的原始跨度为 32,但是为了能更适用于车牌影像的空间大小,请将跨度从 32 调整成 4。然后,将影像特征传送至分类器。不同于一般的影像分类任务(模型仅为一张影像提供单一类别 ID),LPRNet 模型会产生类别 ID 的序列。将影像特征沿着水平方向分成多个片段,在预测中为各个片段分配字元 ID。
最后,使用连接时间分类(connectionist temporal classification,CTC)损失,训练此序列分类器。训练演算法最佳化网路,以减少车牌的真值字元序列与预测字元序列之间的 CTC 损失。
基本上,LPRNet 是具有已调整 ResNet 骨干的序列分类模型。它是以影像做为网路输入,并产生序列输出。之后,使用以贪婪解码方法为基础的 CTC 解码器,从序列输出中将车牌解码。
准备数据集
首先,从 Github
上,将 OpenALPR
克隆下来:
$ git clone https://github.com/openalpr/benchmarks benchmarks
下载用于分割数据集的 Python 脚本 preprocess_openalpr_benchmark.py
,并运行。它将把数据集分为"训练"、"检测"两个部分
$ wget https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps/blob/release/tlt3.0/misc/dev_blog/LPDR/lpr/preprocess_openalpr_benchmark.py
$ python preprocess_openalpr_benchmark.py --input_dir=./benchmarks/endtoend/us --output_dir=./data/openalpr
每一张处理后的图片,都有对应的标签档。同时创建了 characters_list.txt
文件,该文件包含了美国车牌中所有的字符。
下载 tutorial_spec.txt
LPR训练配置文件。
$ wget https://raw.githubusercontent.com/NVIDIA-AI-IOT/deepstream_tlt_apps/release/tlt3.0/misc/dev_blog/LPDR/lpr/tutorial_spec.txt
调整 tutorial_spec.txt
文件中的路径。
执行以下命令进行训练
$ tlt lprnet train -e /workspace/tlt-experiments/lprnet/tutorial_spec.txt \
-r /workspace/tlt-experiments/lprnet/ \
-k nvidia_tlt \
-m /workspace/tlt-experiments/lprnet/us_lprnet_baseline18_trainable.tlt
TLT 同时支援多 GPU 训练(资料平行)和自动混合精度(automatic mixed precision,AMP)。想要提高训练速度时,可以使用 –gpus <num_gpus>
参数执行多个 GPU,并使用 –use_amp
参数执行混合精度训练。训练纪录包含验证资料集的准确率、训练损失和学习率,是以 .csv
格式储存在 <results_dir>
目录中。以下程式码范例是显示具有预先训练权重的训练纪录:
epoch,accuracy,loss,lr
0,nan,1.085993747589952,1e-05
1,nan,0.9726232198503731,1e-05
2,nan,0.9452087508756563,1e-05
3,nan,0.7897920507495686,1e-05
4,0.8409090909090909,0.5753771635772145,1e-05
…….
导出模型
想要在 DeepStream 或其他应用程式中部署 LPR 模型时,请汇出为 .etlt 格式。目前,LPR 仅支援 FP32 和 FP16 精度。相较于 LPD 的模型汇出命令,LPR 较简单:
$ tlt lprnet export -m /workspace/tlt-experiments/lprnet/weights/lprnet_epoch-24.tlt \
-k nvidia_tlt \
-e /workspace/tlt-experiments/lprnet/tutorial_spec.txt
输出 .etlt 模型是储存在与已训练 .tlt 模型相同的目录中。
已训练 LPR 模型的准确率
LPR 之评估指标为车牌辨识的准确率。如果车牌上的所有字元和顺序都正确,则视为辨识准确。您可以在 TLT Docker 中使用以下命令,在实验配置档中指定的验证资料集上执行评估:
$ tlt lprnet evaluate -m /workspace/tlt-experiments/lprnet/weights/lprnet_epoch-24.tlt -k nvidia_tlt -e /workspace/tlt-experiments/lprnet/tutorial_spec.txt
模型 | Epochs | 训练准确率 | 验证准确率 |
---|---|---|---|
baseline18_unpruned_from_scratch | 100 | 0% | 0% |
baseline18_unpruned_from_pretrained | 24 | 98.87% | 90.90% |
使用预先训练模型时,可以使用较小的期数达到高准确率。相反地,从零开始训练时,在期数增加 4 倍的情况下模型仍未开始汇聚。因此,必须大幅增加资料集,而导致训练时间和成本增加。