主要内容

基于单镜头多盒检测器的目标检测代码生成

这个例子展示了如何为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);

得到Pretrained DAGNetwork

网= getSSDNW ();

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) % Copyright 2019-2021 The MathWorks, Inc. persistent ssdObj;if isempty(ssdObj) ssdObj = code . loaddeeplearningnetwork ('ssdResNet50VehicleExample_20a.mat');end % Pass in input [bboxes,~,labels] = ssdObj.detect(in,'Threshold',0.7);%将类别标签转换为字符向量的单元格数组%执行标签= cellstr(标签);%在图像中注释检测。if ~isempty(labels) outImg = insertObjectAnnotation(in,'rectangle',bboxes,labels);else outtimg = in;结束

运行MEX代码生成

生成的CUDA代码ssdObj_detect.m为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。使用编码器。DeepLearningConfig(GPU编码器)函数创建CuDNN的深度学习配置对象,并将其分配给DeepLearningConfig图形处理器代码配置对象的属性。运行codegen指定输入大小为[300,300,3]的命令。此值对应SSD Network的输入层大小。

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

运行生成的墨西哥人

设置视频文件读取器,读取输入视频。创建一个视频播放器来显示视频和输出检测。

videoFile =“highway_lanechange.mp4”;videoFreader =愿景。VideoFileReader (videoFile“VideoOutputDataType”,“uint8”);depVideoPlayer =愿景。DeployableVideoPlayer (“大小”,“自定义”,“CustomSize”480年[640]);

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

续= ~结束(videoFreader);cont I = step(videoFreader);在= imresize(我,[300300]);= ssdObj_detect_mex(的);步骤(depVideoPlayer);%如果视频播放器图形窗口关闭,退出循环= ~isDone(videoFreader) && isOpen(depVideoPlayer);结束

参考文献

[1] Liu, Wei, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng Yang Fu, Alexander C. Berg。“SSD:单次发射多盒探测器。”第十四届欧洲计算机视觉大会,ECCV 2016。施普林格1 - 2016。