主要内容

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

此示例显示了如何导入预折叠的onnx™(开放神经网络交换)您只需看一次(yolo)v2[1]目标检测网络,并利用它来检测目标。导入网络后,可以使用GPU Coder™将其部署到嵌入式平台,也可以使用传输学习对其进行自定义数据再培训trainYOLOv2ObjectDetector

下载ONNX YOLO v2网络

下载与佩带的微小YOLO V2网络相关的文件[2][3]

pretrowsurl =“https://onnxzoo.blob.core.windows.net/models/opset_8/tiny_yolov2/tiny_yolov2.tar.gz”;pretrainedNetZip ='yolov2tmp.tar.gz';如果〜存在(pretRateNetZip,'文件') disp ('下载掠夺网络(58 MB)......');websave (pretrainedNetZip pretrainedURL);结束
下载掠夺网络(58 MB)......

提取YOLO v2网络

解压缩并解压缩下载的文件,以解压缩Tiny YOLO v2网络。加载'model.onnx'模型,它是普斯诺克斯VOC数据集预定的ONNX YOLO V2网络。网络可以从20个不同类别中检测到对象[4]

pretrainedNetTar = gunzip (pretrainedNetZip);onnxfiles =压缩(pretrainedNetTar {1});pretrainedNet = onnxfiles {1,2};

导入ONNX YOLO v2层

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

lgraph = importonnxlayers(pretRateNet,“ImportWeights”,真的);
警告:导入的层没有输出层,因为ONNX文件没有指定网络的输出层类型。在添加输出层之前,这些层是不可训练的。要么将输出层添加到导入层,要么在调用importONNXLayers时使用'OutputLayerType'指定输出层类型。

在本例中,您向导入的层添加了一个输出层,因此您可以忽略此警告。这添加YOLO v2转换和输出层一节展示如何将YOLO v2输出层和YOLO v2转换层添加到导入层。

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

定义YOLO v2锚盒

YOLO V2使用预定义的锚盒来预测对象位置。导入的网络中使用的锚盒在Tiny Yolo V2网络配置文件中定义[5]。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预计以下安排中最后一个卷积层的特征图的125个通道:

  • 频道1至5 -欠条值为5个锚

  • 5个锚点的通道6到10 - x值

  • 对于五个锚点的通道11至15 - y值

  • 通道16到20 -宽度值为5个锚

  • 频道21至25 -高度值为5个锚

  • 通道26到30 - 第1类锚点的概率值

  • 频道31至35 - 5个锚的2级概率值

  • 频道121至125 - 5个锚的20级概率值

然而,在最后一个卷积层中,其尺寸为13-13,激活是不同的。特征图中的25个通道中的每一个对应于:

  • 通道1 - X值

  • 通道2 - y值

  • 通道3 - 宽度值

  • 通道4 - 高度值

  • 通道5 -欠条值

  • 频道6 - 类1概率值

  • 通道7 - 类2概率值

  • 信道25 - 20级概率值

使用支持功能万博1manbetx后轮Xweights.,对导入网络中最后一个卷积层的权值和偏差进行重新排序,并以所要求的格式获得激活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,'卷积8',modonvolution8);

添加YOLO v2转换和输出层

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

一会= tinyYOLOv2Classes;layersToAdd = [yolov2TransformLayer(numAnchorBoxes,'名称'“yolov2Transform”);Yolov2OutputLayer(锚盒,“类”一会,'名称''yolov2output');];Lgraph = Addlayers(Llargraphy);Lgraph = ConnectLayers(LAGHER,LAYRNAME,“yolov2Transform”);

ElementwiseAffineLayer在导入的网络中重复预处理步骤Yolov2ObjectDetector。因此,删除ElementwiseAffineLayer来自导入的网络。

yoloscalelayeridx =查找(......Arrayfun(@(x)是(x,“nnet.onnx.layer.ElementwiseAffineLayer”),......lgraph.Layers));如果〜isempty(yoloscalelayeridx)i = 1:size(yoloScaleLayerIdx,1) layerNames {i} = lgraph.Layers(yoloScaleLayerIdx,1).Name;结束Lgraph = RemoveLayers(LAPRAGE,LAYRNAMES);Lgraph = ConnectLayers(LAPHAGE,'input_image'“卷积”);结束

创建YOLO V2对象检测器

控件组装图层图assembleNetwork函数创建一个YOLO v2对象检测器Yolov2ObjectDetector函数。

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

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

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

我= imread ('car1.jpg');%将图像转换为BGR格式。我=猫(3,我(:,:,3),我(:,:2),我(:,:1));[bboxes, scores, labels] =检测(yolov2Detector, I);detectedImg = insertObjectAnnotation(我“矩形”,bboxes,得分);图imshow(侦察免疫);

万博1manbetx支持功能

函数[modWeights, modBias] = rearrangeONNXWeights(重量、偏见、numAnchorBoxes)%RearRangeOnnxweights重新排列导入Yolo的权重和偏差%v2网络需要yolov2ObjectDetector。numAnchorBoxes是一个标量%值,其中包含用于重新排序权重和的锚的数量%偏见。此函数执行以下操作:% *提取与欠条、盒子、类相关的权重和偏差。%*按Yolov2ObjectDetector按预期重新排序提取的权重和偏置。% *将它们合并并重新塑造回原来的尺寸。weightsSize =大小(重量);biasSize =大小(偏差);sizeOfPredictions = biasSize (3) / numAnchorBoxes;%重塑重量关于预测和锚的大小。Reshapedweights = Rehape(重量,产品(1:3),suestiofprictions,Numanchorboxes);%提取与IoU、boxes和classes相关的权重。weightsIou = reshapedWeights (: 5:);1:4, weightsBoxes = reshapedWeights (::);weightsClasses = reshapedWeights(::, 6:结束);%将提取的参数的权重根据需要组合%yolov2objectdetector。Reorderedweights = Cat(2,rightsiou,权重箱,举重类);置换重量=允许(Reorderedweights,[1 3 2]);将新权重重塑为原始大小。modWeights =重塑(permutedWeights weightsSize);重塑偏差与预测和锚的大小。ReshapedBias = Rehape(偏见,suestiofprictictions,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个不同类[4]的图像。类= [......“飞机”“自行车”“鸟”“船”“瓶子”“公共汽车”“汽车”......“猫”“椅子”“牛”“dinindtable”“狗”“马”“摩托车”......“人”“pottedplant”“羊”“沙发”“训练”“tvmonitor”];结束

参考文献

Redmon, Joseph和Ali Farhadi。“YOLO9000:更好、更快、更强。”2017年IEEE计算机视觉与模式识别(CVPR)会议,6517-25。火奴鲁鲁,嗨:IEEE, 2017。https://doi.org/10.1109/CVPR.2017.690。

[2]“微型YOLO v2模型。”https://github.com/onnx/models/tree/master/vision/object_detection_segimentation/tiny-yolov2.

[3]“Tiny YOLO v2 Model License。”https://github.com/onnx/onnx/blob/master/license.

[4] Everingham,Mark,Luc Van Gool,Christopher K. I. Williams,John Winn和Andrew Zisserman。“Pascal Visual Object类(VOC)挑战。”国际电脑视觉88号,否。2(2010年6月):303-38。https://doi.org/10.1007/S11263-009-0275-4。

[5]“YOLOV2-TINY-VOC.CFG”https://github.com/pjreddie/darknet/blob/master/cfg/yolov2-tiny-voc.cfg.