在过去的几年里,英伟达一直在开发解决方案,使人工智能可以惠及每一个行业。
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易于使用和部署,为开发人员构建创新的解决方案,为最终用户带来独特的体验。