主要内容

使用单镜头多盒检测器进行目标检测的代码生成

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

此示例生成用于培训的网络的代码基于SSD深度学习的目标检测来自计算机Vision Toolbox™的示例。有关详细信息,请参见基于SSD深度学习的目标检测(计算机视觉工具箱).的基于SSD深度学习的目标检测示例使用Reset-50进行特性提取。与特征提取网络相比,检测子网络是小CNN,并且由特定于SSD的少数卷积层和层组成。

第三方先决条件

必需的

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

  • CUDA支持NVIDIA GPU和兼容的司机。

可选

对于诸如静态,动态库或可执行文件的非MEX构建,此示例具有以下附加要求。

验证GPU环境

使用Coder.CheckGPuInstall.验证运行此示例所需的编译器和库是否已正确设置。

envcfg = coder.gpuenvconfig('主持人');envCfg。DeepLibTarget ='cudnn';envcfg.deepcodegen = 1;Envcf​​g.quiet = 1;Coder.CheckGPuInstall(Envcf​​g);

得到Pretrained DAGNetwork

网= getSSDNW ();

DAG网络共有180层,包括卷积层、ReLU层、批归一化层、锚盒层、SSD合并层、焦损层等。若要显示深度学习网络架构的交互式可视化,请使用analyzeNetwork(深度学习工具箱)函数。

analyzeNetwork(净);

ssdObj_detect入口点函数

ssdobj_detect.m.入口点函数采用图像输入并使用保存在图像的深度学习网络在图像上运行检测器ssdResNet50VehicleExample_20a.mat文件。对象加载网络对象ssdResNet50VehicleExample_20a.mat文件到一个持久变量ssdObj并在随后的检测调用中重用持久对象。

类型(“ssdObj_detect.m”
函数outimg = ssdobj_detect(in)%comp.cnchwery 2019-2021 Mathworks,Inc.Persistent SSDobj;如果是isempty(ssdobj)ssdobj = coder.loaddeeplearningnetwork('ssdresnet50vehiceplexample_20a.mat');输入%输入[bboxes,〜,label] = ssdobj.detect(in,'threshold',0.7);%将分类标签转换为charAtor向量的单元格数组,以获取%执行标签= Cellstr(标签);%注释图像中的检测。如果〜isempty(标签)outimg = InsertObjectAnnotation(In,'矩形',Bboxes,标签);否则outimg = in;结束

运行MEX代码生成

生成CUDA代码为ssdobj_detect.m.入口点函数,为MEX目标创建GPU代码配置对象,并将目标语言设置为C ++。使用coder.deeplearningconfig函数来创建CuDNN深度学习配置对象并将其分配给DeeplearningConfigGPU代码配置对象的属性。运行codegen指定输入大小为[300,300,3]的命令。该值对应SSD Network的输入层大小。

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

运行生成的mex.

设置视频文件读取器并读取输入视频。创建视频播放器以显示视频和输出检测。

VideoFile =.“highway_lanechange.mp4”;Videofreader = Vision.videofilereader(VideoFile,“VideoOutputDataType”“uint8”);depVideoPlayer =愿景。DeployableVideoPlayer (“大小”'风俗'“CustomSize”480年[640]);

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

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

参考

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

另请参阅

功能

对象

相关的例子

更多关于