主要内容

代码生成的对象检测采用单发射击Multibox探测器

这个例子展示了如何生成CUDA®代码SSD网络(ssdObjectDetector对象)和利用NVIDIA®cuDNN和TensorRT库。SSD网络基于前馈卷积神经网络检测图像中的多个对象在一个镜头。SSD网络可以被认为是有两个子网。特征提取的网络,其次是一个检测网络。

这个示例中生成代码的网络训练使用SSD深度学习对象检测计算机视觉的工具箱™的例子。有关更多信息,请参见使用SSD深度学习对象检测。的使用SSD深度学习对象检测示例使用ResNet-50特征提取。检测子是一个小的CNN与特征提取网络和由一些特定于SSD卷积的一层又一层。

第三方的先决条件

要求

这个示例中生成CUDA墨西哥人,有以下第三方的要求。

  • CUDA启用NVIDIA GPU和兼容的驱动程序。

可选

等non-MEX构建静态、动态库或可执行文件,这个例子有以下额外的需求。

验证GPU环境

使用coder.checkGpuInstall(GPU编码器)函数来确认所需的编译器和库运行这个例子是正确设置。

envCfg = coder.gpuEnvConfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

得到Pretrained DAG网络

下面的例子使用了ssdResNet50VehicleExample_20a包含pretrained MAT-file SSD网络。这个文件是大约44个MB大小。从MathWorks网站下载文件。

ssdNetFile = matlab.internal.examples.download金宝appSupportFile (“视觉/数据”,“ssdResNet50VehicleExample_20a.mat”);

DAG网络包含180层包括卷积,ReLU,和批处理标准化层,锚箱,SSD合并,焦损失和其他层。显示一个交互式可视化的深度学习网络体系结构,使用analyzeNetwork(深度学习工具箱)函数。

负载(ssdNetFile);analyzeNetwork (detector.Network);

ssdObj_detect入口点函数

ssdObj_detect.m入口点函数接受一个图像输入和运行上的探测器使用深度学习网络保存在图像ssdResNet50VehicleExample_20a.mat文件。加载的网络对象的函数ssdResNet50VehicleExample_20a.mat文件到一个持续的变量ssdObj在随后的检测要求和重用持久对象。

类型(“ssdObj_detect.m”)
函数outImg = ssdObj_detect (matFile) % MathWorks版权2019 - 2022年,公司持续ssdObj;如果isempty (ssdObj) ssdObj = coder.loadDeepLearningNetwork (matFile);结束%通过输入[bboxes、~、标签]=检测(ssdObj,在“阈值”,0.5);%转换分类标签单元阵列的特征向量% = cellstr执行标签(标签);%注释图像中检测。如果~ isempty(标签)outImg = insertObjectAnnotation(“矩形”,bboxes标签);其他outImg =;结束

墨西哥人运行代码生成

生成CUDA代码ssdObj_detect.m入口点函数,创建一个GPU代码配置对象为一个墨西哥人的目标和目标语言设置为c++。使用coder.DeepLearningConfig(GPU编码器)函数创建一个CuDNN深度学习配置对象,并将其分配给DeepLearningConfigGPU代码配置对象的属性。运行codegen命令指定一个输入的大小300 - 300 - 3。这个值对应于SSD网络的输入层大小。

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig = coder.DeepLearningConfig (“cudnn”);inputArgs = {(300300 3“uint8”),coder.Constant (ssdNetFile)};codegen配置cfgssdObj_detectarg游戏inputArgs报告
代码生成成功:查看报告

运行生成的墨西哥人

测试生成的墨西哥人,示例使用一个小型车辆的数据集,其中包含295张图片。这些图片来自加州理工学院的汽车1999年和2001年的数据集,可以在加州理工学院的研究数据资源库中网站由Pietro Perona一起提供,经允许使用。

加载车辆数据集和随机选择10图像测试生成的代码。

解压缩vehicleDatasetImages.zipimageNames = dir (fullfile (pwd,“vehicleImages”,‘* . jpg”));imageNames = {imageNames.name} ';rng (0);imageIndices =兰迪(长度(imageNames), 1, 10);

读取视频输入帧和使用检测器检测视频中的车辆。

idx = 1:10 testImage = imread (fullfile (pwd,“vehicleImages”imageNames {imageIndices (idx)}));resizedImage = imresize (testImage [300300]);detectorOutput = ssdObj_detect_mex (resizedImage ssdNetFile);imshow (detectorOutput);暂停(0.5)结束

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象的形象。

引用

[1]刘魏,Dragomir Anguelov, Dumitru Erhan,基督教Szegedy,斯科特•里德程杨傅,亚历山大·c·伯格。“SSD:单一multibox探测器拍摄的。”In 14th European Conference on Computer Vision, ECCV 2016. Springer Verlag, 2016.