NVIDIA中文车牌识别系列-2:使用TLT训练车牌识别LPD模型

预先准备

在开始建立和部署 TLT 中高准确率的车辆训练模型时,需要以下资源:

  • NGC 账号
  • DeepStream SDK

我们将使用 TLT 进行训练

pip3 install nvidia-pyindex
pip3 install nvidia-tlt

创建 ~/.tlt_mounts.json 文件,并加入以下内容:

{
    "Mounts": [
        {
            "source": "/home//tlt-experiments",
            "destination": "/workspace/tlt-experiments"
        },
        {
            "source": "/home//openalpr",
            "destination": "/workspace/openalpr"
        }

    ]
}

将本机电脑上的路径 /home//tlt-experiments,装载为Docker内的路径 /workspace/tlt-experiments。 另外,将本机电脑上的路径 /home//openalpr,装载为Docker内的路径 /workspace/openalpr

车牌侦测 LPD(License plate detection)

本节将逐步阐述如何从 NGC 取得预先训练好的美国 LPD 模型,并使用 OpenALPR 进行微调。

资料集

我们将先下载 NGC 提供的 LPD 预训练模型,然后使用 OpenALPR 数据集对预训练模型进行微调。

算法简介

LPD 模型使用来自 TLT 的 Detectnet_v2 神经网络进行训练。所使用的训练优化算法可以最大程度的减少物品定位和检测的损失度。

训练分为两个阶段进行。在第一阶段,使用正则化训练网路,以方便进行修剪。在第一阶段之后,修剪网路,删除核心范数低于修剪阈值的通道。在第二阶段,重新训练修剪后的网路。第二阶段不包含正规化。

训练 PLD 模型

从 Github 上将所需的数据集克隆下来

$ git clone https://github.com/openalpr/benchmarks benchmarks

下载用于调整图片/标签的 Python 脚本,并运行。

$ wget https://raw.githubusercontent.com/NVIDIA-AI-IOT/deepstream_tlt_apps/release/tlt3.0/misc/dev_blog/LPDR/lpd/lpd_prepare_data.py

$ python lpd_prepare_data.py --input_dir benchmarks/endtoend/us --output_dir  lpd  --target_width  640 --target_height 480

将调整后的数据集分为两个部分,其中 80% 用于训练,剩下 20% 则用于验证。

下载用于切分的配置文件 SPECS_tfrecord.txt

$ wget https://raw.githubusercontent.com/NVIDIA-AI-IOT/deepstream_tlt_apps/release/tlt3.0/misc/dev_blog/LPDR/lpd/SPECS_tfrecord.txt

打开 SPECS_tfrecord.txt 文件,并调整其中的路径。

//Line 26
  root_directory_path: "/workspace/openalpr/lpd/data"

//Line 36
  image_directory_path: "/workspace/openalpr/lpd/data"

运行分割命令

$ tlt detectnet_v2 dataset_convert -d /workspace/openalpr/SPECS_tfrecord.txt -o /workspace/openalpr/lpd_tfrecord/lpd

下载美国的 PLD 预训练模型 usa_unpruned.tlt

下载训练所需的配置文件 SPECS_train.txt

$ wget https://raw.githubusercontent.com/NVIDIA-AI-IOT/deepstream_tlt_apps/release/tlt3.0/misc/dev_blog/LPDR/lpd/SPECS_train.txt

调整 SPECS_train.txt 文件中的路径参数

//Line 28
  tfrecords_path: "/workspace/openalpr/lpd_tfrecord/*"
  image_directory_path: "/workspace/openalpr/lpd/data/"

//Line 74
  pretrained_model_file: "/workspace/openalpr/usa_unpruned.tlt"

训练 PLD 模型

执行以下命令,开始进行训练

$ tlt detectnet_v2 train -e /workspace/openalpr/SPECS_train.txt -r /workspace/openalpr/exp_unpruned -k nvidia_tlt

在完成训练后会看到以下纪录,显示出验证集的平均精度(average precision,AP):

class name      average precision (in %)
------------  --------------------------
lpd                     82.2808

训练完成后,可继续进行裁剪操作,以缩小模型。

导出模型

训练之后,如要进行部署,需要将其导出成格式为 .etlt 的加密文件。导出时需要设置 Key 进行加密,部署时也需要使用 Key 将其解密。

想要使用 INT8 精度执行推论时,也可以在模型汇出步骤中产生 INT8 校正表。在 DeepStream SDK 中可以直接使用加密 TLT。

想要以 INT8 汇出 LPD 模型时,请使用以下命令。此命令会先使用 –cal_image_dir 选项指定的校正影像,校正 INT8 模型。此模型的加密金钥是由 -k 选项指定,其可以是任何字串。汇出的 .etlt 档案和校正快取,是分别由 -o–cal_cache_file 选项指定。

$ tlt detectnet_v2 export -m /workspace/openalpr/exp_unpruned/weights/model.tlt \
                          -o /workspace/openalpr/export/unpruned_model.etlt \
                          --cal_cache_file /workspace/openalpr/export/calibration.bin \
                          -e /workspace/openalpr/SPECS_train.txt \
                          -k nvidia_tlt \
                          --cal_image_dir /workspace/openalpr/lpd/data/image \
                          --data_type int8 \
                          --batch_size 4 \
                          --batches 10 \
                          –-engine_file /workspace/openalpr/export/unpruned_int8.trt

评估 PLD 模型准确率

预先训练模型为在您的资料集上进行训练和微调,提供极佳的起点。我们训练了两个模型,以进行比较:第一个模型是使用 LPD 预先训练模型进行训练,第二个模型则是从零开始训练。下表为两个模型的平均精度均值(mAP)比较。使用预先训练模型,可以透过更小的资料集,更快达到目标精度。如果从零开始训练,则需要较大的资料集,且必须执行更长的时间,才能达到相同的精度。

您可以在 TLT Docker 中使用以下命令,在实验配置档中指定的验证资料集上执行评估:

$ tlt detectnet_v2 evaluate -m /workspace/openalpr/exp_unpruned/weights/model.tlt -k nvidia_tlt -e /workspace/openalpr/SPECS_train.txt
模型 Epochs 批次大小 mAP
LPD:從零開始訓練 120 4 53.11%
LPD:微調預先訓練模型 120 4 82.28%

你可能感兴趣的:(tlt)