主要内容

使用单次Multibox检测器进行对象检测的代码

此示例显示如何为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);

获得佩带的Dagnetwork.

net = getssdnw();
下载预训练检测器(44mb)…

DAG网络包含180层,包括卷积,Relu和批量归一化层,锚盒,SSD合并,焦损和其他层。要显示深度学习网络架构的交互式可视化,请使用分析(深度学习工具箱)功能。

分析(网);

ssdobj_detect.入学点函数

ssdObj_detect.m入口点函数取一个图像输入,并使用保存在的深度学习网络在图像上运行检测器SSDRESNET50VEHICEEXAMPLE_20A.MAT.文件。该函数加载网络对象SSDRESNET50VEHICEEXAMPLE_20A.MAT.文件到持久变量中ssdobj.并重新使用后续检测呼叫的持久对象。

类型('ssdobj_detect.m'
函数outimg = ssdobj_detect(in)%2019-2020 mathworks,Inc.persistent ssdobj;如果是isempty(ssdobj)ssdobj = coder.loaddeeplearningnetwork('ssdresnet50vehiceplice_20a.mat');终端%通过输入[Bboxes,〜,标签] = ssdobj.detect(in,'threshold',0.7);%将分类标签转换为CharAtor向量的单元格阵列,以%执行标签= CellStr(标签);%注释图像中的检测。如果〜isempty(标签)outimg = InsertObjectAnnotation(IN,'矩形',Bboxes,标签);否则outimg = in;结束

运行MEX代码生成

为此产生CUDA代码ssdObj_detect.m为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。用来编码器。DeepLearningConfig(GPU编码器)功能创建一个CUDNN.深度学习配置对象并将其分配给DeepLearningConfigGPU代码配置对象的属性。跑Codegen.命令指定输入大小[300,300,3]。该值对应于SSD网络的输入层大小。

cfg = coder.gpuconfig('mex');cfg.targetlang =.'c ++';cfg.deeplearningconfig = coder.deeplearningconfig(“cudnn”);Codegen.-Config.CFG.ssdobj_detect.-  args.{ONE(300,300,3,'UINT8')}报告
代码生成成功:要查看报告,请打开('codegen / mex / ssdobj_detect / html / eport.mldatx')。

运行生成的墨西哥人

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

videoFile ='highway_lanechange.mp4';videoFreader =愿景。VideoFileReader (videoFile'VideoOutputDatatype''uint8');depvideoplayer = Vision.DeployapleDapeplayAlyer('大小'“自定义”'CustomSize',[640 480]);

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

续= ~结束(videoFreader);cont i = step(videofreader);在= imresize(i,[300,300]);out = ssdobj_detect_mex(in);步骤(Demvideoplayer,Out);cont =〜ISDONE(VideoFreader)&& Inopen(depvideoplayer);如果关闭视频播放器图形窗口,则%退出循环结束

参考文献

[1]刘,魏,龙卷风犬,丹麦特·埃哈,基督教斯德,斯科特芦苇,郑阳富,亚历山大C.伯格。“SSD:单次拍摄多杆探测器。”第14届欧洲电脑愿景会议,ECCV 2016年。Springer Verlag,2016年。