单次多盒检测器目标检测的代码生成
这个例子展示了如何为SSD网络(ssdObjectDetector对象)生成CUDA®代码,并利用NVIDIA®cuDNN和TensorRT库。SSD网络基于前馈卷积神经网络,可以在单个镜头中检测图像中的多个对象。SSD网络可以认为有两个子网络。特征提取网络,然后是检测网络。
中训练的网络生成代码使用SSD深度学习进行对象检测示例来自计算机视觉工具箱™。有关更多信息,请参见使用SSD深度学习进行对象检测.的使用SSD深度学习进行对象检测示例使用ResNet-50进行特征提取。与特征提取网络相比,检测子网是一个较小的CNN,由几个卷积层和SSD特定的层组成。
第三方的先决条件
要求
本例生成CUDA MEX,第三方需求如下。
CUDA启用NVIDIA GPU和兼容驱动程序。
可选
对于非mex构建,例如静态、动态库或可执行文件,此示例具有以下附加要求。
英伟达工具包。
NVIDIA cuDNN库。
编译器和库的环境变量。有关更多信息,请参见第三方硬件(GPU编码器)而且设置必备产品下载188bet金宝搏(GPU编码器).
检查GPU环境
使用coder.checkGpuInstall
(GPU编码器)函数验证运行此示例所需的编译器和库是否正确设置。
envCfg = code . gpuenvconfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);
获得预训练的DAG网络
本例使用ssdResNet50VehicleExample_20a
mat文件,包含预训练的SSD网络。该文件大小约为44 MB。从MathWorks网站下载该文件。
ssdNetFile = matlab.internal.examples.download金宝appSupportFile(“视觉/数据”,“ssdResNet50VehicleExample_20a.mat”);
DAG网络包含180层,包括卷积层、ReLU层、批归一化层、锚盒层、SSD合并层、焦损层等。要显示深度学习网络体系结构的交互式可视化,请使用analyzeNetwork
(深度学习工具箱)函数。
analyzeNetwork(净);
的ssdObj_detect
入口点函数
的ssdObj_detect.m
入口点函数接受图像输入,并使用保存在中的深度学习网络在图像上运行检测器ssdResNet50VehicleExample_20a.mat
文件。方法加载网络对象ssdResNet50VehicleExample_20a.mat
文件转换为持久变量ssdObj并在后续的检测调用中重用持久对象。
类型(“ssdObj_detect.m”)
function outImg = ssdObj_detect(in,matFile) %版权所有if isempty(ssdObj) ssdObj = code . loaddeeplearningnetwork (matFile);Pass in input [bboxes,~,labels] = detect(ssdObj,in,'Threshold',0.5);将类别标签转换为字符向量的单元格数组%执行标签= cellstr(标签);注释图像中的检测。if ~isempty(labels) outImg = insertObjectAnnotation(in,'rectangle',bboxes,labels);else outImg = in;结束
运行MEX代码生成
生成CUDA代码ssdObj_detect.m
入口点函数,为MEX目标创建GPU代码配置对象,并设置目标语言为c++。使用编码器。DeepLearningConfig
(GPU编码器)函数创建CuDNN
深度学习配置对象,并将其分配给DeepLearningConfig
GPU代码配置对象的属性。运行codegen
命令指定300 × 300 × 3的输入大小。该值对应“SSD Network”的输入层大小。
cfg = code . gpuconfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);inputArgs = {ones(300,300,3,“uint8”), coder.Constant (ssdNetFile)};codegen配置cfgssdObj_detectarg游戏inputArgs报告
代码生成成功:查看报告
运行生成的MEX
为了测试生成的MEX,该示例使用一个包含295张图像的小型车辆数据集。这些图片大多来自加州理工学院汽车1999年和2001年的数据集,由Pietro Perona创建并获得许可使用。
加载车辆数据集,随机选择10张图像来测试生成的代码。
解压缩vehicleDatasetImages.zipimageNames = dir(fullfile(pwd,“vehicleImages”,‘* . jpg”));imageNames = {imageNames.name}';rng (0);imageIndices = randi(length(imageNames),1,10);
逐帧读取视频输入,使用检测器检测视频中的车辆。
为idx = 1:10 testImage = imread(fullfile(pwd,“vehicleImages”imageNames {imageIndices (idx)}));resizedImage = imresize(testImage,[300,300]);detectorOutput = ssdObj_detect_mex(resizedImage,ssdNetFile);imshow (detectorOutput);暂停(0.5)结束
参考文献
[1]刘,魏,Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed,程阳,Alexander C. Berg。“SSD:单发多盒探测器。”第14届欧洲计算机视觉会议,ECCV 2016。施普林格Verlag, 2016。