使用TLT训练车牌号识别

预先准备

在开始建立和部署 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 倍的情况下模型仍未开始汇聚。因此,必须大幅增加资料集,而导致训练时间和成本增加。

上一篇:【算术】寻找两个正序数组的中位数


下一篇:1981年第22届IMO预选题(Short List)