主要内容

导入预先训练的ONNX YOLO v2对象检测器

这个例子展示了如何导入一个预先训练的ONNX™(开放神经网络交换),你只看一次(YOLO) v2[1]物体检测网络,并利用它来检测物体。导入网络后,可以使用GPU Coder™将其部署到嵌入式平台,或者使用迁移学习对自定义数据进行重新训练trainYOLOv2ObjectDetector

下载ONNX YOLO v2网络

下载与预先训练的Tiny YOLO v2网络相关的文件。

pretrainedURL =“https://ssd.mathworks.com/supportfiles/vision/deeplearning/models/yolov2/tiny_yolov2.tar”;pretrainedNetTar =“yolov2Tiny.tar”如果~存在(pretrainedNetTar“文件”) disp (下载预训练网络(58 MB)…);websave (pretrainedNetTar pretrainedURL);结束

提取YOLO v2网络

解压缩下载的文件以解压缩Tiny YOLO v2网络。加载“Model.onnx”模型从tiny_yolov2文件夹,它是在PASCAL VOC数据集上预训练的ONNX YOLO v2网络[2].该网络可以检测20个不同类的对象[3]

onnxfiles =压缩(pretrainedNetTar);pretrainedNet = fullfile (“tiny_yolov2”“Model.onnx”);

导入ONNX YOLO v2图层

使用importONNXLayers函数导入下载的网络。

lgraph = importONNXLayers (pretrainedNet,“ImportWeights”,真正的);

importONNXLayers默认情况下在末尾添加回归层。移除importONNXLayers as添加的最后一个回归层yolov2ObjectDetector期望YOLO v2检测网络以yolov2OutputLayer.有关YOLO v2检测网络的更多信息,请参见从YOLO v2开始

lgraph = removeLayers (lgraph,“RegressionLayer_grid”);

添加YOLO v2转换和输出层部分展示了如何添加YOLO v2输出层和YOLO v2转换层到导入的层。

本例中的网络不包含不支持的层。注意,如果要导入的网络具有不支持的层,则该函数将它们作为占位符层导入。在使用导入的网络之前,必须替换这些层。有关替换占位符层的更多信息,请参见findPlaceholderLayers(深度学习工具箱)

定义YOLO v2锚盒

YOLO v2使用预定义的锚框来预测对象的位置。导入网络中使用的锚框在Tiny YOLO v2网络配置文件中定义[4].ONNX锚是根据最终卷积层的输出大小定义的,输出大小为13 × 13。使用锚yolov2ObjectDetector,将锚框的大小调整为网络输入大小,即416 × 416。锚盒yolov2ObjectDetector必须在[高度,宽度]表格中指定。

onnxAnchors = [1.08, 1.19;3.42、4.41;6.63、11.38;9.42、5.11;16.62、10.52);inputSize = lgraph.Layers (1,1) .InputSize (1:2);lastActivationSize =(13、13);upScaleFactor = inputSize. / lastActivationSize;anchorBoxesTmp = upScaleFactor。* onnxAnchors;anchorBoxes = [anchorBoxesTmp (:, 2), anchorBoxesTmp (: 1)];

重新排列检测层权重

为了提高处理效率,必须对导入网络中最后一个卷积层的权值和偏差进行重新排序,以获得在这种安排下的激活yolov2ObjectDetector需要。yolov2ObjectDetector期望最后一个卷积层的feature map的125个通道,排列如下:

  • 通道1到5 -五个锚的欠条值

  • 频道6到10 - 5个锚的X值

  • 频道11到15 - Y值为五个锚

  • 通道16到20 -五个锚的宽度值

  • 通道21到25 -五个锚的高度值

  • 频道26到30 - 5个锚的1类概率值

  • 通道31至35 - 5个锚的2类概率值

  • 通道121到125 - 5个锚的20类概率值

然而,在最后一个卷积层(大小为13乘13)中,激活的排列方式不同。feature map中的25个通道中的每一个都对应于:

  • 通道1 - X值

  • 通道2 - Y值

  • 通道3 -宽度值

  • 通道4 -高度值

  • 通道5 -欠条值

  • 频道6 -第1类概率值

  • 频道7 - 2类概率值

  • 频道25 - 20类概率值

使用配套功能rearrangeONNXWeights,对导入网络中最后一个卷积层的权值和偏差进行重新排序,并以所需的格式获得激活yolov2ObjectDetector

重量= lgraph.Layers(结束,1).Weights;偏见= lgraph.Layers(结束,1).Bias;layerName = lgraph.Layers(结束,1). name;numAnchorBoxes =大小(onnxAnchors, 1);[modWeights, modBias] = rearrangeONNXWeights(重量、偏见、numAnchorBoxes);

使用重排序的权值和偏差将导入网络中的最后一个卷积层的权值和偏差替换为新的卷积层。

filterSize = size(modWeights,[1 2]);numFilters =大小(modWeights 4);modConvolution8 = convolution2dLayer (filterSize numFilters,...“名字”layerName,“偏见”modBias,“重量”, modWeights);lgraph = replaceLayer (lgraph,“convolution8”, modConvolution8);

添加YOLO v2转换和输出层

YOLO v2检测网络需要YOLO v2转换和YOLO v2输出层。创建这两个层,将它们串联起来,并将YOLO v2转换层附加到最后一个卷积层。

一会= tinyYOLOv2Classes;layersToAdd = [yolov2TransformLayer(numAnchorBoxes,“名字”“yolov2Transform”);yolov2OutputLayer (anchorBoxes“类”一会,“名字”“yolov2Output”);];lgraph = addLayers(lgraph, layersToAdd);lgraph = connectLayers (lgraph layerName,“yolov2Transform”);

ElementwiseAffineLayer在导入的网络中重复执行的预处理步骤yolov2ObjectDetector.因此,删除ElementwiseAffineLayer从导入的网络。

yoloScaleLayerIdx =找到(...arrayfun (@ (x) isa (x,“nnet.onnx.layer.ElementwiseAffineLayer”),...lgraph.Layers));如果~ isempty (yoloScaleLayerIdx)i = 1:size(yoloScaleLayerIdx,1) layerNames {i} = lgraph.Layers(yoloScaleLayerIdx(i,1),1).Name;结束lgraph = removeLayers (lgraph layerNames);lgraph = connectLayers (lgraph,“图像”“卷积”);结束

创建YOLO v2对象检测器

组合图层图使用assembleNetwork方法创建YOLO v2对象检测器yolov2ObjectDetector函数。

净= assembleNetwork (lgraph)
net = DAGNetwork属性:Layers: [34×1 nnet.cnn.layer.Layer] Connections: [33×2 table] InputNames: {'image'} OutputNames: {'yolov2Output'}
yolov2Detector = yolov2ObjectDetector(净)
yolov2Detector = yolov2ObjectDetector,具有properties: ModelName: 'importedNetwork' Network: [1×1 DAGNetwork] TrainingImageSize: [416 416] AnchorBoxes: [5×2 double] ClassNames:[飞机自行车鸟船瓶子公共汽车猫椅子牛餐桌狗马摩托车人盆栽羊沙发火车电视监视器]

使用导入的YOLO v2检测器检测对象

使用导入的检测器检测测试图像中的对象。显示结果。

我= imread (“highway.png”);将图像转换为BGR格式。Ibgr =猫(3,我(:,:,3),我(:,:2),我(:,:1));[bboxes, scores, labels] = detect(yolov2Detector, Ibgr);detectedImg = insertObjectAnnotation(我“矩形”bboxes,分数);图imshow (detectedImg);

支持功能

函数[modWeights, modBias] = rearrangeONNXWeights(重量、偏见、numAnchorBoxes)rearrangeONNXWeights重新排列导入YOLO的权重和偏差%v2网络要求yolov2ObjectDetector。numAnchorBoxes是一个标量值,该值包含用于对权重和进行重新排序的锚的数量%的偏见。该函数执行以下操作:% *提取与借据、盒子和类相关的权重和偏差。% *根据yolov2ObjectDetector所期望的对提取的权重和偏差重新排序。% *将它们组合并重塑为原始尺寸。weightsSize =大小(重量);biasSize =大小(偏差);sizeOfPredictions = biasSize (3) / numAnchorBoxes;根据预测和锚点的大小重新调整权重。。reshapedWeights =重塑(重量、刺激(weightsSize (1:3)), sizeOfPredictions, numAnchorBoxes);提取与借据、方框和类相关的权重。weightsIou = reshapedWeights (: 5:);1:4, weightsBoxes = reshapedWeights (::);weightsClasses = reshapedWeights(::, 6:结束);根据所要求的组合提取参数的权重% yolov2ObjectDetector。reorderedWeights =猫(2 weightsIou weightsBoxes weightsClasses);permutedWeights = permute(reorderedWeights,[1 3 2]);将新权重重塑为原始大小。。modWeights =重塑(permutedWeights weightsSize);重塑关于预测和锚点大小的偏差。。reshapedBias =重塑(偏见,sizeOfPredictions numAnchorBoxes);提取与借据、盒子和类相关的偏差。。: biasIou = reshapedBias(5日);: biasBoxes = reshapedBias (1:4);biasClasses = reshapedBias(6:最后,);结合yolov2ObjectDetector所要求的提取参数的偏差。reorderedBias =猫(1 biasIou biasBoxes biasClasses);permutedBias = permute(reorderedBias,[2 1]);将新的偏差重塑为原始大小。。modBias =重塑(permutedBias biasSize);结束函数类= tinyYOLOv2Classes ()返回预先训练的ONNX微型YOLO v2对应的类名%网络。微型YOLO v2网络是在Pascal VOC数据集上预先训练的,%,包含来自20个不同类的图像。类= [...“飞机”“自行车”“鸟”“船”“瓶子”“公共汽车”“汽车”...“猫”“椅子”“牛”“diningtable”“狗”“马”“摩托车”...“人”“pottedplant”“羊”“沙发”“训练”“tvmonitor”];结束

参考文献

雷德蒙,约瑟夫和阿里·法哈迪。“YOLO9000:更好、更快、更强。”2017 IEEE计算机视觉与模式识别(CVPR)会议, 6517 - 25所示。檀香山,HI: IEEE, 2017。https://doi.org/10.1109/CVPR.2017.690

“迷你YOLO v2模型许可证。”https://github.com/onnx/onnx/blob/master/LICENSE

[3]埃弗林汉姆,马克,卢克·范古尔,克里斯托弗·k·i·威廉姆斯,约翰·韦恩,安德鲁·齐瑟曼。Pascal可视对象类(VOC)挑战。国际计算机视觉杂志88年,没有。2(2010年6月):303-38。https://doi.org/10.1007/s11263-009-0275-4

[4]“yolov2-tiny-voc.cfg”https://github.com/pjreddie/darknet/blob/master/cfg/yolov2-tiny-voc.cfg

参考文献

雷德蒙,约瑟夫和阿里·法哈迪。“YOLO9000:更好、更快、更强。”2017 IEEE计算机视觉与模式识别(CVPR)会议。6517 - 25。檀香山,HI: IEEE, 2017。https://doi.org/10.1109/CVPR.2017.690。

[4]埃弗林汉姆,马克,卢克·范古尔,克里斯托弗·k·i·威廉姆斯,约翰·韦恩,安德鲁·齐瑟曼。Pascal可视对象类(VOC)挑战。计算机视觉国际杂志88.第2期(2010年6月):303-38。https://doi.org/10.1007/s11263 - 009 - 0275 - 4。

Baidu
map