主要内容

进口Pretrained ONNX YOLO v2意思对象探测器

这个例子展示了如何导入一个pretrained ONNX™(打开神经网络交换)你只看一次(YOLO)意思v2[1]对象检测网络,用它来检测对象。在导入网络之后,您可以将其部署到嵌入式平台使用GPU编码器™或自定义数据使用转移学习和培训trainYOLOv2ObjectDetector

网络下载ONNX YOLO v2的意思

下载文件相关pretrained微小YOLO v2意思网络。

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

提取YOLO v2意思网络

将下载的文件解压到提取小YOLO v2意思网络。加载“Model.onnx”模型从tiny_yolov2文件夹,这是一个ONNX YOLO v2意思网络pretrained帕斯卡VOC的数据集[2]。网络可以从20个不同的检测对象类[3]

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

进口ONNX YOLO v2层意思

使用importONNXLayers功能导入下载的网络。

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

importONNXLayers回归层默认最后补充道。删除最后一个回归层由importONNXLayers补充道yolov2ObjectDetector预计YOLO v2意思检测网络结束yolov2OutputLayer。YOLO v2意思检测网络上更多的信息,请参阅开始使用YOLO v2的意思

lgraph = removeLayers (lgraph,“RegressionLayer_grid”);

添加YOLO v2意思转换和输出层小节展示如何添加YOLO v2输出层以及YOLO v2意思意思转换层来导入的层。

网络在这个例子中不包含支持层。金宝app请注意,如果您想要导入网络不支持层,进口它们作为占位符功能层。金宝app你可以用你的进口网络之前,您必须更换这些层。层替换占位符的更多信息,见findPlaceholderLayers(深度学习工具箱)

定义YOLO v2意思锚箱

YOLO v2意思使用预定义的锚箱预测对象的位置。中使用的锚箱进口网络小YOLO v2意思网络配置文件中定义[4]。ONNX锚定义对最终的输出大小卷积层,这是13-by-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 -借据值五个主持人

  • 通道6到10 - X值五个主持人

  • 频道11到15 - Y值五锚

  • 16至20 -渠道宽度值五个主持人

  • 频道21到25 - 5锚的高度值

  • 渠道26到30 - 1级概率值五个主持人

  • 通道31到35 -类2五个锚的概率值

  • 频道121 - 125 - 20类概率值五个主持人

然而,在过去的卷积层,大小13-by-13,激活排列不同。每个25通道的特性映射对应:

  • 通道1 - X值

  • 通道2 - Y值

  • 通道3 -宽度值

  • 第四频道——高度值

  • 通道5 -借据值

  • 通道6 - 1级概率值

  • 频道7 -二班概率值

  • 频道25 - 20类概率值

使用支持函数金宝apprearrangeONNXWeights,在这个例子中,列出重新排序最后卷积层的重量和偏见在导入网络和获得所需的激活的格式yolov2ObjectDetector

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

取代最后卷积层的重量和偏见在进口与新卷积网络层使用重新排序权重和偏见。

filterSize =大小(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:尺寸(yoloScaleLayerIdx, 1) layerNames{我}= lgraph.Layers (yoloScaleLayerIdx(我,1),1). name;结束lgraph = removeLayers (lgraph layerNames);lgraph = connectLayers (lgraph,“图像”,“卷积”);结束

创建YOLO v2意思对象探测器

组装层图使用assembleNetwork功能和创建一个YOLO v2意思对象探测器使用yolov2ObjectDetector函数。

净= assembleNetwork (lgraph)
网= DAGNetwork属性:层:[34×1 nnet.cnn.layer.Layer]连接:[33×2表]InputNames:{“图像”}OutputNames: {“yolov2Output”}
yolov2Detector = yolov2ObjectDetector(净)
yolov2Detector = yolov2ObjectDetector属性:ModelName:“importedNetwork”网络:[1×1 DAGNetwork] TrainingImageSize: 416年[416]AnchorBoxes:[5×2双]一会:[飞机自行车鸟船瓶猫巴士车椅牛diningtable狗马摩托车人pottedplant羊沙发火车tvmonitor]

使用进口YOLO v2意思检测器检测对象

使用导入的探测器来探测对象在测试图像。显示结果。

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

金宝app支持功能

函数[modWeights, modBias] = rearrangeONNXWeights(重量、偏见、numAnchorBoxes)% rearrangeONNXWeights重新进口的重量和偏见YOLO。意思%根据yolov2ObjectDetector v2网络。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 =排列(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 =排列(reorderedBias [2 1]);%重塑新的偏见到原始大小。modBias =重塑(permutedBias biasSize);结束函数类= tinyYOLOv2Classes ()%返回相对应的类名pretrained ONNX小YOLO v2的意思%网络。%%的微小YOLO v2网络意思是帕斯卡pretrained VOC的数据集,%来自20个不同的类包含图像。类= [“飞机”,“自行车”,“鸟”,“船”,“瓶子”,“公共汽车”,“汽车”,“猫”,“椅子”,“牛”,“diningtable”,“狗”,“马”,“摩托车”,“人”,“pottedplant”,“羊”,“沙发”,“训练”,“tvmonitor”];结束

引用

[1]Redmon,约瑟夫和阿里蒂。“YOLO9000:更好、更快、更强”。2017年IEEE计算机视觉与模式识别会议(CVPR),6517 - 25所示。火奴鲁鲁,你好:IEEE 2017。https://doi.org/10.1109/CVPR.2017.690

[2]“小YOLO v2许可模型意思。”https://github.com/onnx/onnx/blob/master/LICENSE

[3]Everingham,马克,吕克·范干傻事,克里斯托弗·k·威廉姆斯,约翰·韦恩和安德鲁Zisserman。“帕斯卡视觉对象类(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

引用

[1]Redmon,约瑟夫和阿里蒂。“YOLO9000:更好、更快、更强”。2017年IEEE计算机视觉与模式识别会议(CVPR)。6517 - 25。火奴鲁鲁,你好:IEEE 2017。https://doi.org/10.1109/CVPR.2017.690。

[4]Everingham,马克,吕克·范干傻事,克里斯托弗·k·威廉姆斯,约翰·韦恩和安德鲁Zisserman。“帕斯卡视觉对象类(VOC)的挑战。”88年国际计算机视觉杂志》上。2号(2010年6月):303 - 38。https://doi.org/10.1007/s11263 - 009 - 0275 - 4。