使用Transfer Learning Toolkit加速智能视频分析

翻译自:https://devblogs.nvidia.com/accelerating-video-analytics-tlt/

在过去几年中,NVIDIA一直致力于开发解决方案,使AI可以应用于各行各业。 NVIDIA迁移学习工具包专门允许开发人员更快地使用深​​度学习开发智能视频分析(IVA)系统,并以最快、最有效的方式将他们的应用程序从原型应用到生产。

神经网络从数据中学习,获得称之为“权重”的参数。您可以通过将先前网络学习的特征转移到另一个神经网络来得到适合于新任务的模型,而不是从头开始训练新的神经网络。这被称为迁移学习。即使使用经过优化的预训练模型,也需要进行一定的迁移学习。这是因为某些应用程序需要学习图像的细节。示例包括捕获图像时光照条件的差异或视角的变化。传感器适应被广泛认为是计算机视觉应用中的迁移学习技术。

希望加速深度学习应用程序开发的开发人员可以使用预先训练的深度学习模型,如ResNet-10,ResNet-18,ResNet-50,GoogLeNet,VGG-16和VGG-19作为适应其自定义数据集的基础。他们可以借助Transfer Learning Toolkit为对象检测和图像分类用例逐步重新训练模型。

NVIDIA迁移学习工具包使用简单的命令行用户界面,使用户能够使用自己的数据微调预先训练的网络,还提供修剪模型、场景调整和添加新类别等功能,以加快深度学习训练工作流程,并允许导出到NVIDIA TensorRT进行推理。Transfer Learning Toolkit提供多GPU支持;您的应用程序可以部署在数据中心,云端,内部或本地工作站上的GPU加速平台上,以便与NVIDIA DeepStream SDK 3.0插件一起使用。

1 用于智能视频分析(IVA)的迁移学习工具包

致力于任何IVA应用程序(如停车管理、保护关键基础设施、零售分析、物流管理和访问控制)的开发人员可以使用带有NVIDIA DeepStream SDK 3.0的Transfer Learning Toolkit,为IVA用例提供更快、更有效的深度学习推理。

图1中的流程图显示了NVIDIA如何通过端到端深度学习工作流为IVA应用程序开发人员提供预训练模型的逐步迁移学习。下载docker容器后,list和pull命令允许用户查看提供的模型,并直接从NGC上的模型库获取。Jupyter notebook显示示例工作流程,在容器中包含的入门文档中提供了有关如何入门的指导。使用用户数据进行训练涉及指定数据的位置。提供了转换工具以帮助用户准备输入数据。

使用Transfer Learning Toolkit加速智能视频分析_第1张图片图1.使用Transfer Learning Toolkit的工作流程

对于计算机视觉用例,模型的内存占用需要紧凑。这些模型部署到边缘设备,支持通过DeepStream SDK和TensorRT进行快速推理。支持多个视频流通道很重要,因此较小的模型允许同时更大的并发处理。缩小尺寸也会导致更快的推理时间。因此,“修剪”模型是端到端工作流程中必不可少的一步。NVIDIA采用专利修剪技术,有助于模型压缩,使小型模型能够在Tesla平台上更快地进行推断。修剪后可能会出现一些准确性损失,需要再训练才能恢复损失。

Transfer Learning Toolkit使用Keras TensorFlow框架开发和处理模型。易于使用的界面使即使是不熟悉深度学习框架的开发人员也能够快速开发应用程序。Transfer Learning Toolkit可以轻松修剪和重新训练模型。高级API抽象出细节,允许开发人员专注于他们的应用程序开发而不是算法。

2 使用Transfer Learning Toolkit

让我们快速浏览一下Transfer Learning Toolkit的核心功能。迁移学习工具包预支持九个图像分类和检测模型,并包括已在公开数据集上进行过训练的网络。目标检测模型使用NVIDIA开发的检测技术。每个模型都在Pascal,Volta和Turing GPU上进行了优化和训练,以实现最高的准确度。

Image Classification

ResNet18
ResNet50
VGG16
VGG19
AlexNet
GoogLeNet

Object Detection

ResNet50
VGG16
GoogLeNet

让我们看一下如何使用Transfer Learning Toolkit功能的参考应用程序,例如重新训练、调整和修剪resnet50 4类目标检测器。

2.1 下载模型

使用List命令查看可用的模型。使用pull命令获取模型;添加版本参数。 NVIDIA将更新模型并对其进行版本控制,以便用户可以访问最新的优化。

tlt-pull --list_models -k 
tlt-pull --list_version --model_name $MODEL_NAME -k $API_KEY
tlt-pull --model_name $MODEL_NAME --version $VERSION -k $API_KEY --dir ./path/to/save/model

2.2 训练模型

用于目标检测的预训练模型使用kitti文件格式的数据集。 TLT提供从kitti到TFRecords的数据集转换器。 TFRecords有助于更快地遍历数据。

用户可以将他们的kitti格式数据集使用转换器将它们转换为TFRecords。

tlt-dataset-convert [-h] -d DATASET_EXPORT_SPEC -o OUTPUT_FILENAME
[-f VALIDATION_FOLD] [-v]

检测网络的模型输入要求包括:

  • 输入尺寸:3 x W x H,其中W≥480,H≥272,W和H是16的倍数; (如果使用预训练的权重,输入尺寸应为3 x 1248 x 384);
  • 图像格式:JPG,JPEG,PNG;
  • 标签格式:KITTI。

已经预先应用了自适应全局色调映射和静态白平衡。模型输出是一个水平边界,带有相关的标签,如汽车、自行车、人和路标。全部对应于尺寸为3 x 960 x 544的图像和检测的置信度。

从头开始训练模型涉及多次迭代和实验。预训练模型可用于减少微调模型所需的迭代次数和计算资源。训练配置文件有助于更轻松地指定参数。我们来看一个示例配置文件。

sample_spec.cfg

random_seed: 42
model_config {
   arch: "resnet",
   n_layers: 50
   input_image_size: "3,960,544"
}
train_config {
   train_dataset_path: "./dataset_train"
   val_dataset_path: "./dataset_val"
   pretrained_model_path: "./tlt_pretrained_model/resnet50.hdf5"
   batch_size_per_gpu: 64
   n_epochs: 15
   n_workers: 16
   step_size: 10
   learning_rate: 0.01
   weight_decay: 0.00005
   gamma: 0.1
}

用户只需将数据集路径更新为其位置,然后执行简单命令即可训练模型。 Transfer Learning Toolkit支持单GPU和多GPU训练。

tlt-train [-h] detection --gpus  -k  -r  [-e SPEC_FILE] [-v]
tlt-train classification -e sample_spec -r outdir -k  --gpus 4
tlt-train {classification, detection} --gpus

用于初始训练的参数包括批量大小和学习率等。

您应该尝试使用不同的超参数值来重新训练预训练模型,将learning_rate降低到1e-5。将batch_size增加到32可以提高准确性。

关于大规模多GPU训练的说明:

使用更多GPU进行训练可使网络更快地摄取更多数据,从而节省开发过程中的宝贵时间。 Transfer Learning Toolkit支持多GPU训练,因此用户可以使用多个GPU并行训练模型。此功能也有助于超参数优化。

2.3 验证训练好的模型

使用evaluate命令进行基于常见度量的模型评估:

tlt-evaluate detection [-h] [-e EXPERIMENT_SPEC_FILE] -m MODEL_FILE -k KEY [–use_training_set] [-v]

tlt-evaluate classification -d dataset_val \ -pm outdir/weights/resnet_015.hdf5 \ -b 32

目标检测任务的评估示例输出如下所示。
2018-11-06 01:05:44,920 [INFO] tensorflow: loss = 0.05362146, epoch = 0.0663716814159292, step = 15 (5.978 sec)
INFO:tensorflow:global_step/sec: 0.555544

=========== ====== ====== ======
class mAP easy hard mdrt
=========== ====== ====== ======
car 91.06 84.50 84.50
cyclist 0.00 7.70 7.70
pedestrian 0.00 0.00 0.00
=========== ====== ====== ======

分类任务评估的样本输出类似于图1中所示的输出。
在这里插入图片描述图1 样本分类的验证输出

2.4 模型剪枝和重训练

模型剪枝可以将参数数量减少一个数量级,从而使模型运行速度提高许多倍。修剪是指删除不必要的神经元连接,将存储参数所需的内存减少25%或更多。

剪枝已经证明可以增加IVA应用中视频帧的吞吐量。一项研究发现,ResNet-50四级检测器以每秒30帧的速度运行,是未修剪且未经GPU优化的模型吞吐量的3倍。之所以发生这种情况,是因为修剪API可以在不牺牲精度的情况下将模型的大小减小6倍。在修剪之后,需要重新训练模型以恢复准确性,因为在修剪期间可能已经移除了一些有用的连接。

tlt-train detection -e retrain_spec.cfg -r outdir_retrain

tlt-train classification -e $DATA_DIR/retrain_spec.cfg -r $RETRAIN_OUTPUT_DIR

通过修改此行,在retrain_spec.cfg中添加预训练模型文件路径:

pretrained_model_path: "OUTPUT_DIR/weights/resnet_50.hdf5"

2.5 导出模型

调整完成后,可以将模型导出为DeepStream SDK可用的格式,例如通用文件格式(uff)。包括一个名为TLT转换器的小工具。转换器使用tlt-export获取在TLT docker中导出的模型,并将其转换为TensorRT引擎。可选地,导出创建校准缓存文件以在转换期间执行int8 TensorRT引擎校准。导出的uff模型与数据类型无关,因为TensorRT在构建引擎时优化数据类型。导出仅在int8模式下生成校准缓存。模型导出器是多个导出功能的组合。

fp16和fp32数据类型的基本用法示例,未生成校准缓存:

tlt-export [-h] [-k KEY]
                [-o OUTPUT_FILE]
                [--outputs OUTPUTS]
                [--data_type {fp32,fp16,int8}]
                [-v]
                input_file

支持的data_types包括:FP16,FP32或INT8,可以在命令行中指定最大批量大小和最大工作空间大小。可以基于INT8引擎的校准数据文件执行模型校准。

tlt-export $RETRAIN_OUTPUT_DIR/weights/resnet_50.hdf5 -f uff --parser uff -o

$EXPORT_DIR/resnet_50.uff -k $API_KEY

NVIDIA不断构建开发人员工具,使AI和深度学习易于使用和部署,为正在构建创新解决方案的开发人员带来最终用户的独特体验。使用NVIDIA Transfer Learning Toolkit使得产品可以快速进入市场。应用Transfer Learning Toolkit早期访问计划,开始加速基于IVA的最终应用程序。

你可能感兴趣的:(DeepStream)