主要内容

基于NVIDIA TensorRT库的深度学习预测

本示例展示了如何使用NVIDIA®TensorRT™库为深度学习应用程序生成代码。本例使用codegen命令生成一个MEX文件,该文件使用TensorRT与Logo识别分类网络进行预测。该示例还演示了如何使用codegen命令,生成一个8位整数和16位浮点预测的MEX文件。

第三方的先决条件

要求

此示例生成CUDA®MEX,需要支持CUDA的NVIDIA GPU和兼容的驱动程序。对于8位整型和16位浮点精度模式,您必须具有特定的GPU计算能力,请参阅第三方硬件

可选

对于非mex构建,例如静态、动态库或可执行文件,您还必须具备:

检查GPU环境

使用coder.checkGpuInstall函数验证运行此示例所需的编译器和库是否正确设置。

envCfg = code . gpuenvconfig (“主机”);envCfg。DeepLibTarget =“tensorrt”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

下载和加载预训练网络

本例使用预先训练的标识识别网络对图像中的标识进行分类。下载预培训LogoNet然后从MathWorks网站加载文件。该网络是在MATLAB中开发的,大小约为42 MB。该网络可以在不同的光照条件和摄像机角度下识别32个标志。有关训练标识识别网络的信息,请参见标志识别网络

net = getLogonet;

的logonet_predict入口点函数

logonet_predict.m入口点函数接受图像输入,并使用保存在的深度学习网络对图像进行预测LogoNet.mat文件。该函数从加载网络对象LogoNet.mat变成一个持久变量logonet并在后续的预测调用期间重用持久变量。

类型(“logonet_predict.m”
function out = logonet_predict(in) %#codegen %版权所有2017-2022 The MathWorks, Inc. %持久对象logonet用于加载网络对象。在%第一次调用此函数时,将构造持久对象并% setup。当该函数随后被调用时,相同的对象将被%重用,以便对输入调用predict,从而避免重构和%重新加载网络对象。持久logonet;if isempty(logonet) logonet = code . loaddeeplearningnetwork (' logonet .mat','logonet');End out = logonet.predict(in);结束

运行MEX代码生成

生成CUDA代码logonet_predict入口点函数,为MEX目标创建GPU代码配置对象,并设置目标语言为c++。使用编码器。DeepLearningConfig函数创建TensorRT深度学习配置对象,并将其分配给DeepLearningConfigGPU代码配置对象的属性。运行codegen命令,指定输入大小为227 × 227 × 3。该值对应于Logo识别网络的输入层大小。默认情况下,生成TensorRT代码在32位浮点数中运行推理。

cfg = code . gpuconfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“tensorrt”);codegen配置cfglogonet_predictarg游戏{code .typeof(single(0),[227 227 3])}报告
代码生成成功:查看报告

对测试图像进行预测

加载一个输入图像。调用logonet_predict_mex在输入图像上。

Im = imread(“gpucoder_tensorrt_test.png”);Im = imresize(Im, [227,227]);Predict_scores = logonet_predict_mex(单一(im));%得到前5个概率分数和他们的标签[val,indx] = sort(predict_scores,“下”);分数= val(1:5)*100;classnames = net.Layers(end).ClassNames;Top5labels = classnames(indx(1:5));

显示前五种分类标签。

outputImage = 0 (227,400,3,“uint8”);k = 1:3 outputImage(:,174:end,k) = im(:,:,k);结束Scol = 1;麻雀= 20;k = 1:5 outputImage = insertText(outputImage, [scol, srow],...(char (top5labels (k)),' 'num2str(分数(k),' % 2.2 f '),“%”],...“输入TextColor”' w '“字形大小”15岁的“BoxColor”“黑”);麻雀=麻雀+ 20;结束imshow (outputImage);

卸载已加载的MEX功能,释放GPU内存。

清晰的墨西哥人

生成8位整数预测的TensorRT代码

生成TensorRT代码,以int8精度运行推理。

通过使用NVIDIA TensorRT库和8位整数精度的推理计算来生成代码,支持这些额外的网络:万博1manbetx

  • 对象检测器网络,如YOLOv2和SSD

  • 回归和语义分割网络

TensorRT需要一个校准数据集来校准一个以浮点数训练的网络,以计算8位整数精度的推理。设置数据类型为int8并通过路径来标定数据集DeepLearningConfiglogos_dataset是一个子文件夹,其中包含按分类标签分组的图像。为int8万博1manbetx支持,GPU计算能力必须为6.1、7.0或更高。

注意,对于语义分割网络,校准数据图像必须是支持的格式万博1manbetximread函数。

解压缩(“logos_dataset.zip”);cfg = code . gpuconfig (墨西哥人的);cfg。TargetLang =“c++”;cfg.GpuConfig.ComputeCapability =“6.1”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“tensorrt”);cfg.DeepLearningConfig.DataType =“int8”;cfg.DeepLearningConfig.DataPath =“logos_dataset”;cfg. deeplearningconfig . numcalibrationbatch = 50;codegen配置cfglogonet_predictarg游戏{code .typeof(int8(0),[227 227 3])}报告
代码生成成功:查看报告

在测试图像上运行INT8预测

加载一个输入图像。调用logonet_predict_mex在输入图像上。

Im = imread(“gpucoder_tensorrt_test.png”);Im = imresize(Im, [227,227]);Predict_scores = logonet_predict_mex(int8(im));%得到前5个概率分数和他们的标签[val,indx] = sort(predict_scores,“下”);分数= val(1:5)*100;classnames = net.Layers(end).ClassNames;Top5labels = classnames(indx(1:5));

显示前五种分类标签。

outputImage = 0 (227,400,3,“uint8”);k = 1:3 outputImage(:,174:end,k) = im(:,:,k);结束Scol = 1;麻雀= 20;k = 1:5 outputImage = insertText(outputImage, [scol, srow],...(char (top5labels (k)),' 'num2str(分数(k),' % 2.2 f '),“%”],...“输入TextColor”' w '“字形大小”15岁的“BoxColor”“黑”);麻雀=麻雀+ 20;结束imshow (outputImage);

卸载已加载的MEX功能,释放GPU内存。

清晰的墨西哥人

生成16位浮点预测的TensorRT代码

生成运行推理的TensorRT代码fp16精度。为fp16万博1manbetx支持,GPU计算能力必须为5.3、6.0、6.2或更高。

请注意,量化误差发生在单精度累积运算并将其转换为半精度时。有关更多信息,请参见深度神经网络的量化

cfg = code . gpuconfig (墨西哥人的);cfg。TargetLang =“c++”;cfg.GpuConfig.ComputeCapability =“5.3”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“tensorrt”);cfg.DeepLearningConfig.DataType =“fp16”;codegen配置cfglogonet_predictarg游戏{code .typeof(half(0),[227 227 3])}报告
代码生成成功:查看报告

在测试图像上运行FP16预测

加载一个输入图像。调用logonet_predict_mex在输入图像上。

Im = imread(“gpucoder_tensorrt_test.png”);Im = imresize(Im, [227,227]);Predict_scores = logonet_predict_mex(一半(im));%得到前5个概率分数和他们的标签[val,indx] = sort(predict_scores,“下”);分数= val(1:5)*100;classnames = net.Layers(end).ClassNames;Top5labels = classnames(indx(1:5));

显示前五种分类标签。

outputImage = 0 (227,400,3,“uint8”);k = 1:3 outputImage(:,174:end,k) = im(:,:,k);结束Scol = 1;麻雀= 20;k = 1:5 outputImage = insertText(outputImage, [scol, srow],...(char (top5labels (k)),' 'num2str(分数(k),' % 2.2 f '),“%”],...“输入TextColor”' w '“字形大小”15岁的“BoxColor”“黑”);麻雀=麻雀+ 20;结束imshow (outputImage);

卸载已加载的MEX功能,释放GPU内存。

清晰的墨西哥人

另请参阅

功能

对象

相关的话题