主要内容

使用YOLO v3深度学习进行目标检测的代码生成

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

第三方的先决条件

要求

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

可选

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

检查GPU环境

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

envCfg = code . 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网络的文件。本例中使用的YOLO v3网络使用中描述的步骤进行训练基于YOLO v3深度学习的目标检测(计算机视觉工具箱).从MathWorks网站下载该文件,然后解压缩该文件。

fileName = matlab.internal.examples.download金宝appSupportFile(“视觉/数据/”“yolov3SqueezeNetVehicleExample_21aSPKG.zip”);数据= unzip(文件名);matFile = data{1,1};vehicleDetector = load(matFile);net = vehicledetector .detect . network
net = dlnetwork with properties: Layers: [75×1 nnet.cnn.layer.Layer] Connections: [84×2 table] Learnables: [66×3 table] State: [6×3 table] InputNames: {'data'} OutputNames: {'customOutputConv1' 'customOutputConv2'}初始化:1

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

要使用这个预训练的网络,必须首先从外接程序资源管理器中安装YOLO v3对象检测的计算机视觉工具箱模型。有关安装外接程序的详细信息,请参见获取和管理外接组件

然后,保存网络从yolov3ObjectDetector对象到一个mat文件并继续。例如,

探测器= yolov3ObjectDetector(“darknet53-coco”);net =检测器。网络;matFile =“pretrainedYOLOv3Detector.mat”;保存(matFile,“净”);

yolov3Detect入口点函数

yolov3Detect入口点函数接受图像输入,并使用保存在中的深度学习网络在图像上运行检测器yolov3SqueezeNetVehicleExample_21aSPKG.mat文件。方法加载网络对象yolov3SqueezeNetVehicleExample_21aSPKG.mat文件转换为持久变量yolov3Obj并在后续的检测调用中重用持久对象。

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

生成CUDA MEX

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

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

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

运行生成的MEX

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

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

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

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

参考文献

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

另请参阅

功能

对象

相关的例子

更多关于