这个例子说明如何导入预训练ONNX™(开放式神经网络交换)仅看一次(永乐)V2[1]物体检测网络,并利用它来检测物体。导入网络后,您可以使用GPU编码器™将其部署到嵌入式平台,或使用迁移学习对自定义数据进行再培训trainYOLOv2ObjectDetector
.
下载与预培训的Tiny YOLO v2网络相关的文件。
pretrainedURL ='https://ssd.mathworks.com/万博1manbetxsupportfiles/vision/deeplearning/models/yolov2/tiny_yolov2.tar';pretrainedNetTar ='yolov2Tiny.tar';如果〜存在(pretrainedNetTar,'文件') disp (“预训练下载网(58 MB)......”);websave(pretrainedNetTar,pretrainedURL);结束
下载预训练的网络(58 MB)...
解压下载的文件以解压Tiny YOLO v2网络。加载'Model.onnx'
模型从tiny_yolov2
其中,ONNX YOLO v2网络是在PASCAL VOC数据集上预训练的。该网络可以检测20个不同类别的目标[4].
onnxfiles =压缩(pretrainedNetTar);pretrainedNet =“tiny_yolov2 / Model.onnx”;
使用importONNXLayers
功能导入下载的网络。
lgraph = importONNXLayers(pretrainedNet,“ImportWeights”,真的);
警告:导入的层没有输出层,因为ONNX文件没有指定网络的输出层类型。在添加输出层之前,这些层是不可训练的。要么向导入的层添加一个输出层,要么在importONNXLayers调用中使用'OutputLayerType'指定输出层类型。
在本例中,您向导入的层添加了一个输出层,因此可以忽略此警告。这添加YOLO v2变换和输出层小节展示了如何将YOLO v2输出层以及YOLO v2 Transform层添加到导入层。
在此示例中,网络中没有不支持的层。万博1manbetx需要注意的是,如果你想进口网络具有不支持层,功能进口它们作为占位符层。万博1manbetx在可以使用导入的网络,则必须更换这些层。有关更换占位层的更多信息,请参阅findPlaceholderLayers
.
YOLO V2使用预定义锚箱预测对象的位置。导入的网络中使用的锚定框的微小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 -五个主播的IoU值
频道6至10 - X值五个锚点
通道11〜15 - Y值五个锚点
通道16到20 -五个锚的宽度值
频道21至25 -五个锚的高度值
通道26至30 - 五个锚1类概率值
频道31到35 - 5个锚的第2类概率值
121至125频道- 5个锚的20级概率值
然而,在最后一层的大小为13 × 13的卷积层中,激活的排列不同。feature map中的25个通道分别对应于:
通道1 - X值
通道2 - Y值
通道3 - 宽度值
4频道 - 高度值
通道5 - IoU值
通道6 - 1点的概率值
通道7 - 2级的概率值
信道25 - 20类概率值
使用支持函数万博1manbetxrearrangeONNXWeights
,以重新排序导入网络中最后一个卷积层的权值和偏差,并获得所需格式的激活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转换层附加到最后一个卷积层。
一会= 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(1),1).Name;结束lgraph = removeLayers(lgraph,layerNames);lgraph = connectLayers(lgraph,'Input_image'那“卷积”);结束
控件组装层图assembleNetwork
函数创建YOLO v2对象检测器yolov2ObjectDetector
函数。
净= assembleNetwork(lgraph)
net = DAGNetwork with properties: Layers: [34×1 net.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:[飞机自行车鸟船瓶子巴士汽车猫椅子牛餐台狗马摩托车人盆栽植物羊沙发火车电视监视器]
使用导入的检测器检测测试图像中的对象。显示结果。
我= imread (“highway.png”);%转换图像格式BGR。Ibgr =猫(3,我(:,:,3),我(:,:2),我(:,:1));[bboxes, scores, labels] =检测(yolov2Detector, Ibgr);detectedImg = insertObjectAnnotation(我“矩形”,bboxes,分数);图imshow(detectedImg);
函数[modWeights, modBias] = rearrangeONNXWeights(重量、偏见、numAnchorBoxes)%rearrangeONNXWeights重新排列导入YOLO的重量和偏见%v2网络,由yolov2ObjectDetector要求。numAnchorBoxes是一个标量%值,该值包含用于重新排序权重和的锚的数量%的偏差。该函数执行以下操作:% *提取与IoU、框和类相关的权重和偏差。%*重新排序所提取的重量和偏见如预期由yolov2ObjectDetector。% *将它们组合并重塑为原始维度。weightsSize =大小(重量);biasSize =大小(偏差);sizeOfPredictions = biasSize (3) / numAnchorBoxes;%重塑的权重相对于预测和锚的大小。reshapedWeights =重塑(重量,PROD(weightsSize(1:3)),sizeOfPredictions,numAnchorBoxes);%提取与IoU、boxes、classes相关的权重。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);%提取与IoU、盒子和类别相关的偏差。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对应的类名% 网络。%%在Pascal VOC数据集上预训练微小的YOLO v2网络,%包含来自20个不同类的图像。类= [......“飞机”那“自行车”那“鸟”那“船”那“瓶子”那“公共汽车”那“汽车”那......“猫”那“椅子”那“牛”那“diningtable”那“狗”那“马”那“摩托车”那......“人”那“pottedplant”那“羊”那“沙发”那“训练”那“tvmonitor”];结束
雷蒙德,约瑟夫和阿里·法哈迪。“YOLO9000:更好、更快、更强。”2017 IEEE计算机视觉与模式识别会议(CVPR), 6517-25。火奴鲁鲁,HI: IEEE, 2017。https://doi.org/10.1109/CVPR.2017.690。
[2]“微型YOLO v2模型”。https://github.com/onnx/models/tree/master/vision/object_detection_segmentation/tiny-yolov2
[3]“微小的YOLO v2模型许可。”https://github.com/onnx/onnx/blob/master/LICENSE.
[4]爱华灵咸,马克,吕克凡GOOL,克里斯托弗K. I.·威廉姆斯,约翰·威恩,和安德鲁·齐塞尔曼。“帕斯卡视觉对象类(VOC)的挑战。”国际计算机视觉88,没有。2(2010年6月):303-38。https://doi.org/10.1007/s11263-009-0275-4。
[5] “yolov2-微小-voc.cfg”https://github.com/pjreddie/darknet/blob/master/cfg/yolov2-tiny-voc.cfg.
importONNXNetwork
|assembleNetwork
|convolution2dLayer
|replaceLayer
|removeLayers
|connectLayers
|findPlaceholderLayers
|检测
(计算机视觉工具箱)|trainYOLOv2ObjectDetector
(计算机视觉工具箱)|addLayers
yolov2ObjectDetector
(计算机视觉工具箱)