主要内容

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

这个例子展示了如何为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.(GPU编码器)验证运行此示例所需的编译器和库是否已正确设置。

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(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 = Vision.videofilereader(VideoFile,“VideoOutputDataType”“uint8”);depVideoPlayer =愿景。DeployableVideoPlayer (“大小”'风俗'“CustomSize”480年[640]);

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

cont =〜ISDONE(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。