ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用TLT训练车牌号识别

2021-07-01 22:59:40  阅读:361  来源: 互联网

标签:openalpr 训练 tlt lprnet TLT 车牌号 experiments workspace 识别


预先准备

在开始建立和部署 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_scratch1000%0%
baseline18_unpruned_from_pretrained2498.87%90.90%

使用预先训练模型时,可以使用较小的期数达到高准确率。相反地​​,从零开始训练时,在期数增加 4 倍的情况下模型仍未开始汇聚。因此,必须大幅增加资料集,而导致训练时间和成本增加。

标签:openalpr,训练,tlt,lprnet,TLT,车牌号,experiments,workspace,识别
来源: https://blog.csdn.net/chenjambo/article/details/118399910

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有