在开始建立和部署 TLT 中高准确率的车辆训练模型时,需要以下资源:
我们将使用 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/
,装载为Docker内的路径 /workspace/tlt-experiments
。 另外,将本机电脑上的路径 /home/
,装载为Docker内的路径 /workspace/openalpr
。
本节将逐步阐述如何从 NGC 取得预先训练好的美国 LPD 模型,并使用 OpenALPR 进行微调。
我们将先下载 NGC 提供的 LPD 预训练模型,然后使用 OpenALPR
数据集对预训练模型进行微调。
LPD 模型使用来自 TLT 的 Detectnet_v2
神经网络进行训练。所使用的训练优化算法可以最大程度的减少物品定位和检测的损失度。
训练分为两个阶段进行。在第一阶段,使用正则化训练网路,以方便进行修剪。在第一阶段之后,修剪网路,删除核心范数低于修剪阈值的通道。在第二阶段,重新训练修剪后的网路。第二阶段不包含正规化。
从 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"
执行以下命令,开始进行训练
$ 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
预先训练模型为在您的资料集上进行训练和微调,提供极佳的起点。我们训练了两个模型,以进行比较:第一个模型是使用 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% |