主要内容

单次多盒检测器目标检测的代码生成

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

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

第三方的先决条件

要求

本例生成CUDA MEX,并具有以下第三方需求。

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

可选

对于非mex构建,如静态、动态库或可执行程序,此示例具有以下附加要求。

验证GPU环境

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

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

获得预先训练的DAG网络

此示例使用ssdResNet50VehicleExample_20a包含预先训练的SSD网络的mat文件。这个文件的大小大约是44 MB。从MathWorks网站下载该文件。

ssdNetFile = matlab.internal.examples.downloadSupportFile (“视觉/数据”“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(in,matFile) %版权所有如果isempty(ssdObj) ssdObj = code . loaddeeplearningnetwork (matFile);end %传入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属性的图形处理器代码配置对象。运行codegen命令,指定输入大小为300x300x3。该值对应SSD Network的输入层大小。

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

运行生成的墨西哥人

为了测试生成的MEX,该示例使用了一个包含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)结束

图中包含一个axes对象。坐标轴对象包含一个image类型的对象。

参考文献

[1]刘,魏,德拉戈米尔·安格洛夫,杜米特鲁·埃尔汉,克里斯蒂安·舍格迪,斯科特·里德,程杨富,亚历山大·C.伯格。SSD:单发多盒探测器。第14届欧洲计算机视觉会议,ECCV 2016。施普林格1 - 2016。

Baidu
map