单次多盒检测器目标检测的代码生成
这个例子展示了如何为SSD网络(ssdObjectDetector对象)生成CUDA®代码,并利用NVIDIA®cuDNN和TensorRT库。SSD网络基于前馈卷积神经网络,可以在单镜头中检测图像中的多个对象。SSD网络可以被认为有两个子网络。首先是特征提取网络,然后是检测网络。
类中训练的网络生成代码SSD深度学习对象检测示例来自计算机视觉工具箱™。有关更多信息,请参见SSD深度学习对象检测.的SSD深度学习对象检测示例使用ResNet-50进行特征提取。检测子网络相对于特征提取网络是一个小的CNN,由几个卷积层和特定于SSD的层组成。
第三方的先决条件
要求
本例生成CUDA MEX,并具有以下第三方需求。
CUDA启用NVIDIA GPU和兼容的驱动程序。
可选
对于非mex构建,如静态、动态库或可执行程序,此示例具有以下附加要求。
英伟达工具包。
英伟达cuDNN图书馆。
编译器和库的环境变量。有关更多信息,请参见第三方硬件(GPU编码器)而且设置必备产品2022世界杯八强谁会赢?(GPU编码器).
验证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)结束
参考文献
[1]刘,魏,德拉戈米尔·安格洛夫,杜米特鲁·埃尔汉,克里斯蒂安·舍格迪,斯科特·里德,程杨富,亚历山大·C.伯格。SSD:单发多盒探测器。第14届欧洲计算机视觉会议,ECCV 2016。施普林格1 - 2016。