主要内容

基于YOLO v3深度学习的目标检测代码生成

这个例子展示了如何为你只看一次(YOLO) v3对象检测器生成CUDA®MEX。YOLO v3在YOLO v2的基础上进行了改进,增加了多个尺度的检测,以帮助检测更小的对象。此外,将用于训练的损失函数分离为均方误差用于边界盒回归和二元交叉熵用于目标分类,有助于提高检测精度。本例中使用的YOLO v3网络是从使用YOLO v3深度学习的对象检测计算机视觉工具箱(TM)中的示例。有关更多信息,请参见使用YOLO v3深度学习的对象检测(计算机视觉工具箱)

第三方的先决条件

要求

  • CUDA支持NVIDIA®GPU和兼容的驱动程序。

可选

对于非mex构建,如静态、动态库或可执行程序,此示例具有以下附加要求。

验证GPU环境

要验证用于运行此示例的编译器和库是否已正确设置,请使用coder.checkGpuInstall函数。

envCfg = coder.gpuEnvConfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

YOLO v3意思网络

本例中的YOLO v3网络基于squeezenet(深度学习工具箱),采用SqueezeNet中的特征提取网络,并在末端增加两个检测头。第二探测头的尺寸是第一探测头的两倍,因此能够更好地探测小物体。注意,可以根据要检测的对象的大小指定任意大小的检测头的数量。YOLO v3网络使用训练数据估计的锚盒,以获得与数据集类型相对应的更好的初始先验,并帮助网络学习准确预测锚盒。有关锚框的信息,请参见对象检测的锚框(计算机视觉工具箱)

本例中的YOLO v3网络如下图所示。

每个检测头预测边界盒坐标(x、y、宽度、高度)、对象置信度和各自锚盒掩码的类概率。因此,对于每个检测头,最后一个卷积层的输出滤波器个数为锚盒掩码个数乘以每个锚盒预测元素个数。检测头组成网络的输出层。

经过培训的YOLO v3网络

此示例使用yolov3SqueezeNetVehicleExample_21aSPKG.zip包含预先训练的YOLO v3网络的文件。该文件的大小约为23 MB。从MathWorks网站下载该文件,然后解压缩该文件。

文件名= matlab.internal.examples.downloadSupportFile (“视觉/数据/”“yolov3SqueezeNetVehicleExample_21aSPKG.zip”);data =解压(文件名);matFile数据= {1};vehicleDetector =负载(matFile);网= vehicleDetector.detector.Network
层:[75×1 nnet.cnn.layer.Layer] Connections: [84×2 table] Learnables: [66×3 table] State: [6×3 table] InputNames: {'data'} OutputNames: {'customOutputConv1' 'customOutputConv2'} Initialized: 1

注意:您还可以通过YOLO v3对象检测支持包的计算机视觉工具箱™模型使用预先训练的检测器网络。

要使用这个预先训练好的网络,您必须首先从Add-On Explorer中安装用于YOLO v3对象检测的计算机视觉工具箱模型。有关安装插件的更多信息,请参见获取和管理插件

然后,保存yolov3ObjectDetector对象指向一个mat文件,然后继续。例如,

探测器= yolov3ObjectDetector (“darknet53-coco”);matFile =“pretrainedYOLOv3Detector.mat”;保存(matFile,“探测器”);

yolov3Detect入口点函数

yolov3Detect入口点函数接受一个图像输入,并使用保存在yolov3SqueezeNetVehicleExample_21aSPKG.mat文件。对象加载网络对象yolov3SqueezeNetVehicleExample_21aSPKG.mat文件到一个持久变量yolov3Obj并在后续的检测调用中重用持久对象。

类型(“yolov3Detect.m”
function outImg = yolov3Detect(in,matFile) % Copyright 2021 The MathWorks, Inc. persistent yolov3Obj;if isempty(yolov3Obj) yolov3Obj = code . loaddeeplearningnetwork (matFile);调用检测方法[bboxes,~,labels] = yolov3Obj.detect(in,'Threshold',0.5);将分类标签转换为字符向量的单元格数组标签= cellstr(标签);注释图像中的检测。outImg = insertObjectAnnotation(“矩形”,bboxes标签);

生成CUDA墨西哥人

要为入口点函数生成CUDA代码,需要为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。使用编码器。DeepLearningConfig函数来创建CuDNN的深度学习配置对象,并将其分配给DeepLearningConfig属性的图形处理器代码配置对象。运行codegen命令,指定输入大小为227 × 227 × 3。该值对应YOLOv3的输入层大小。

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

为了为TensorRT目标生成CUDA®代码,创建并使用TensorRT深度学习配置对象,而不是CuDNN配置对象。同样,要为MKLDNN目标生成代码,需要创建一个CPU代码配置对象,并使用MKLDNN深度学习配置对象作为它的配置对象DeepLearningConfig财产。

运行生成的MEX

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

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

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

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

gpucoder_YOLOv3_output.png

参考文献

1.雷蒙,约瑟夫和阿里·法哈迪。“YOLOv3:增量改进。”预印本,2018年4月8日提交。https://arxiv.org/abs/1804.02767。

另请参阅

功能

对象

相关的例子

更多关于

Baidu
map