前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用NVIDIA迁徙学习工具包加速智能视频分析

利用NVIDIA迁徙学习工具包加速智能视频分析

作者头像
GPUS Lady
发布2018-12-25 16:07:41
9220
发布2018-12-25 16:07:41
举报
文章被收录于专栏:GPUS开发者GPUS开发者

在过去的几年里,英伟达一直在开发解决方案,使人工智能可以惠及每一个行业。

NVIDIA Transfer Learning Toolkit特别允许开发人员使用深度学习技术来研究智能视频分析(IVA)系统的更快实现,并以最快和最有效的方式将其应用程序从原型带到生产环境。

神经网络通过学习神经网络中被编译为“权重”的数据来获得知识。不需要从头开始训练新的神经网络,您可以通过提取这些权重并将它们转移到另一个神经网络,来转移以前学到的特性。即使使用优化的、预先训练的模型,也需要一定数量的迁移学习。这是因为某些应用程序需要学习图像的细节。例子包括当图像被捕获时光线设置的差异或视角的变化。传感器自适应作为一种传输学习技术在计算机视觉应用中得到了广泛的认可。

希望加速其深度学习应用程序开发的开发人员可以使用ResNet-10、ResNet-18、ResNet-50、GoogLeNet、VGG-16和VGG-19等预先训练的深度学习模型作为基础,以适应其自定义数据集。他们可以在迁徙学习工具包(Transfer Learning Toolkit)的帮助下对模型进行增量式的再训练,以进行对象检测和图像分类用例。

NVIDIA迁徙学习工具包使用一个简单的命令行用户界面,使用户能够用他们自己的数据来微调预先训练的网络,并且还提供了诸如修剪模型、场景适应和为更快的深度学习训练工作流添加新类的能力,并且还允许导出基于NVIDIA TensorRT的推理。迁徙学习工具包提供多GPU支持;您的应用程序可以部署在数据中心的GPU加速平台上、云平台、或本地工作站上,以便进一步与NVIDIA DeepStreamSDK 3.0插件一起使用。

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

从事任何IVA应用程序(如停车管理、关键基础设施保护、零售分析、后勤管理和访问控制)的开发人员都可以从使用带有NVIDIA DeepStream SDK 3.0的Transfer.ingToolkit进行IVA快速有效的深度学习推断中获益。

图1的流程图显示了NVIDIA如何为经过预训练的模型启用逐步迁徙学习,并为IVA应用程序开发人员提供了端到端的深度学习工作流。在下载了docker容器之后,list和pull命令允许用户查看提供了哪些模型,并直接从NGC上的模型注册中心获得。Jupyter notebooks显示了示例工作流程,容器中包括的入门文档中提供了入门的指导。使用用户数据的训练涉及指定数据位于何处。提供迁徙工具以帮助用户准备输入数据。

(图1:使用迁移学习工具包的工作流)

对于计算机视觉使用的例子,模型的内存占用需要是紧凑的。这些模型部署到可以支持用DeepStreamSDK和TensorRT进行快速推理的边缘设备。多个视频流信道很重要,因此较小的模型能够使用更多的同时信道。减小大小也会导致更快的推理时间。因此,“修剪”模型是端到端工作流中必不可少的一个步骤。NVIDIA使用专利的修剪技术,帮助进行模型压缩,使较小的模型能够在Tesla平台上提供更快的推断。修剪后可能会出现一些精度损失,需要再训练以恢复损失。

迁徙工具包在底层使用Keras TensorFlow框架来开发和处理模型,易于使用的界面使得即使不熟悉深度学习框架的开发人员也能够快速开发应用程序。迁移学习工具包使得修剪和重新训练模型变得容易。高级API抽象掉了细节,允许开发人员将重点放在应用程序开发而不是算法上。

使用迁移学习工具包特性

让我们快速浏览一下迁移学习工具包的关键特性。9个图像分类和检测模型预先打包在迁徙学习工具包中,其中包括在公共可用数据集上经过训练的网络。对象检测模型采用NVIDIA开发的检测技术。每个模型都经过Pascal、Volta和Turing gpu的优化和训练,以达到最高的精度水平。

图像分类

· ResNet18

· ResNet50

· VGG16

· VGG19

· AlexNet

· GoogLeNet

目标检测

· ResNet50

· VGG16

· GoogLeNet

让我们看一个如何使用迁移学习工具包特性的参考应用程序,例如为resnet50 4类对象检测器重新培训、调整和修剪

步骤1:下载模型

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

tlt-pull--list_models -k <NGC API Key>

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:训练模型

用于对象检测的预训练模型使用kitti文件格式的数据集。TLT提供了一个从kitti到TFRecords的数据集转换器。TFRecords帮助更快地遍历数据。

用户可以携带kitti格式的数据集,并使用转换器将其转换为TFRecords

代码语言:javascript
复制
tlt-dataset-convert [-h] -d DATASET_EXPORT_SPEC -o OUTPUT_FILENAME
代码语言:javascript
复制
[-f VALIDATION_FOLD] [-v]

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

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

自适应全局色调映射和静态白平衡已经被提前应用。模型输出是一个水平边界,带有相关的标签,如汽车、自行车、人员和路标。这些都对应于3×960×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

}

用户只需更新数据集路径到他们的位置,并执行简单的命令来训练模型。迁移学习工具包支持单个和多个gpu训练。

tlt-train [-h] detection --gpus <numGPUs> -k <encoding key> -r <result directory> [-e SPEC_FILE][-v]

tlt-train classification -e sample_spec -routdir -k <NGC API Key> --gpus 4

tlt-train {classification, detection}--gpus<num GPUs>

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

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

关于多GPU大规模训练的注意事项

使用更多gpu进行训练可以让网络更快地吸收更多数据,节省了开发过程中宝贵的时间。迁移学习工具包支持多gpu培训,用户可以使用多个gpu并行训练模型。该特性也有助于超参数优化。

步骤3:评估训练后的模型

使用公共度量标准进行模型评估,使用evaluate命令:

tlt-evaluate detection [-h] [-eent_spec_file] -m MODEL_FILE -k KEY [-use_training_set] [-v]

tlt-evaluate classification -d dataset_val\ -pm outdir/weights/resnet_015。hdf5 \ - b32

目标检测任务评价的样本输出如下图所示。

代码语言:javascript
复制
2018-11-06 01:05:44,920 [INFO] tensorflow: loss = 0.05362146, epoch = 0.0663716814159292, step = 15 (5.978 sec)
代码语言:javascript
复制
INFO:tensorflow:global_step/sec: 0.555544
代码语言:javascript
复制
..
代码语言:javascript
复制
===========  ======  ======  ======
代码语言:javascript
复制
 class mAP    easy    hard    mdrt
代码语言:javascript
复制
===========  ======  ======  ======
代码语言:javascript
复制
    car      91.06   84.50   84.50
代码语言:javascript
复制
  cyclist     0.00    7.70    7.70
代码语言:javascript
复制
pedestrian    0.00    0.00    0.00
代码语言:javascript
复制
===========  ======  ======  ======

分类任务评估的示例输出如图1所示。

(图1:样本分类评价输出)

步骤四:模型修剪和再训练

修剪将参数的数量减少了一个数量级,从而导致模型运行速度快了许多倍。修剪是指去除不必要的神经元连接,将存储参数所需的内存减少25%或更多。

修剪已经证明可以提高IVA应用程序中视频帧的吞吐量。一项研究发现ResNet-50四类检测器以每秒30帧的速度运行,是未修剪和未优化GPU模型吞吐量的3倍。这是因为修剪API可以在不牺牲精度的情况下将模型的大小减少6倍。修剪后,需要对模型进行重新训练以恢复精度,因为修剪过程中可能会删除一些有用的连接。

tlt-train detection -eretrain_spec.cfg -r outdir_retrain

或者

tlt-trainclassification -e $DATA_DIR/retrain_spec.cfg -r$RETRAIN_OUTPUT_DIR

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

pretrained_model_path:"OUTPUT_DIR/weights/resnet_50.hdf5"

步骤5:模型导出

一旦适应完成,模型就可以导出为DeepStream SDK可用的格式,例如通用文件格式(uff)。包括一个名为TLT转换器的小实用程序。转换器采用使用TLT -export在TLT docker中导出的模型,并将其转换为TensorRT引擎。或者,导出创建一个校准缓存文件,以便在转换期间执行int8TensorRT引擎校准。导出的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

英伟达不断开发工具,使AI/ deep learning易于使用和部署,为开发人员构建创新的解决方案,为最终用户带来独特的体验。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档