导入预训练的ONNX YOLO v2对象检测器
这个例子展示了如何导入一个预先训练好的ONNX™(开放神经网络交换),你只看一次(YOLO) v2[1]物体检测网络,并利用它来检测物体。导入网络后,可以使用GPU Coder™将其部署到嵌入式平台,或者使用迁移学习对自定义数据进行再训练trainYOLOv2ObjectDetector
.
下载ONNX YOLO v2网络
下载与预先训练的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);结束
提取YOLO v2网络
解压下载的文件以提取Tiny YOLO v2网络。加载“Model.onnx”
模型从tiny_yolov2
文件夹,这是一个在PASCAL VOC数据集上预训练的ONNX YOLO v2网络[2].该网络可以检测20个不同类别的对象[3].
onnxfiles = untar(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(“RegressionLayer_grid”);
的添加YOLO v2转换和输出层部分展示了如何将YOLO v2输出层以及YOLO v2转换层添加到导入的层。
本例中的网络不包含不支持的层。万博1manbetx请注意,如果要导入的网络具有不受支持的层,则该函数将它们作为占位符层导入。万博1manbetx在使用导入的网络之前,必须替换这些层。有关替换占位符层的详细信息,请参见findPlaceholderLayers
(深度学习工具箱).
定义YOLO v2锚盒
YOLO v2使用预定义的锚框来预测对象的位置。导入网络中使用的锚框在Tiny YOLO v2网络配置文件中定义[4].ONNX锚点是根据最终卷积层的输出大小定义的,即13 × 13。使用锚yolov2ObjectDetector
,将锚框的大小调整为网络输入大小,即416 * 416。的锚框yolov2ObjectDetector
必须以[height, width]形式指定。
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个主播的欠条值
频道6至10 - 5个主播的X值
频道11至15 - Y值为5个主播
频道16至20 -五个锚的宽度值
通道21至25 -五个锚的高度值
通道26至30 - 5个锚的1级概率值
通道31至35 - 5个锚的第2类概率值
通道121至125 - 5个锚的20类概率值
然而,在最后一个大小为13 × 13的卷积层中,激活的排列方式不同。特征图中的25个通道中的每一个都对应于:
通道1 - X值
通道2 - Y值
通道3 -宽度值
通道4 -高度值
第5频道-借条值
通道6 -第一类概率值
通道7 - 2类概率值
通道25 - 20类概率值
使用支持函数万博1manbetxrearrangeONNXWeights
,在本例结束时列出,以重新排序导入网络中最后一个卷积层的权值和偏差,并以所需的格式获得激活yolov2ObjectDetector
.
weights = lgraph.Layers(end,1).Weights;bias = lgraph.Layers(end,1).Bias;layerName = lgraph.Layers(end,1).Name;numAnchorBoxes = size(onnxAnchors,1);[modWeights,modBias] = rearrangeONNXWeights(weights,bias,numAnchorBoxes);
使用重新排序的权重和偏差,将导入网络中最后一个卷积层的权重和偏差替换为新的卷积层。
filterSize = size(modWeights,[1 2]);numFilters = size(modWeights,4);mod卷积8 =卷积2dlayer (filterSize,numFilters,...“名字”layerName,“偏见”modBias,“重量”, modWeights);lgraph =替换层(lgraph,“convolution8”, modConvolution8);
添加YOLO v2转换和输出层
YOLO v2检测网络需要YOLO v2转换和YOLO v2输出层。创建这两个图层,将它们堆叠在一起,并将YOLO v2转换层附加到最后一个卷积层。
classNames = tinyYOLOv2Classes;layersToAdd = [yolov2TransformLayer(numAnchorBoxes,“名字”,“yolov2Transform”);yolov2OutputLayer (anchorBoxes“类”一会,“名字”,“yolov2Output”);];lgraph = addLayers(lgraph, layersToAdd);lgraph = connectLayers(lgraph,layerName,“yolov2Transform”);
的ElementwiseAffineLayer
在导入的网络中复制的预处理步骤yolov2ObjectDetector
.因此,删除ElementwiseAffineLayer
从导入的网络。
yoloScaleLayerIdx = find(...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(“图像”,“卷积”);结束
创建YOLO v2对象检测器
控件组装图层图形assembleNetwork
函数创建YOLO v2对象检测器yolov2ObjectDetector
函数。
net =汇编网络(lgraph)
net = DAGNetwork with properties: Layers: [34×1 nnet.cnn.layer.Layer] Connections: [33×2 table] InputNames: {'image'} OutputNames: {'yolov2Output'}
yolov2Detector = yolov2ObjectDetector(net)
yolov2Detector = yolov2ObjectDetector与属性:ModelName: 'importedNetwork'网络:[1×1 DAGNetwork] TrainingImageSize: [416 416] AnchorBoxes: [5×2 double] ClassNames:[飞机自行车鸟船瓶子公共汽车猫椅子牛餐桌狗马摩托车人盆栽羊沙发火车电视监视器]
使用导入的YOLO v2检测器检测对象
使用导入的检测器检测测试图像中的对象。显示结果。
I = imread(“highway.png”);将图像转换为BGR格式。Ibgr = cat(3,I(:,:,3),I(:,:,2),I(:,:,1));[bboxes, scores, labels] = detect(yolov2Detector, Ibgr);detectedImg = insertObjectAnnotation(I,“矩形”,盒子,分数);图imshow (detectedImg);
万博1manbetx支持功能
函数[modWeights,modBias] = rearrangeONNXWeights(weights,bias,numAnchorBoxes)rearrangeONNXWeights重排导入YOLO的权重和偏差%v2网络,满足yolov2ObjectDetector的要求。numAnchorBoxes是一个标量值,该值包含用于重排序权重和的锚的数量%的偏见。该函数的作用如下:% *提取与借条、盒子和类相关的权重和偏差。% *根据yolov2ObjectDetector的预期重新排序提取的权重和偏差。% *组合并将它们重新塑造回原始尺寸。weightsSize =大小(权重);biasSize =大小(偏差);sizeofforecasts = biasSize(3)/numAnchorBoxes;根据预测和锚点的大小重塑权重。%reshapedWeights =重塑(weights,prod(weightsSize(1:3)), sizeofforecasts,numAnchorBoxes);提取与借条、盒子和类相关的权重。weightsIou = reshapedWeights(:,5,:);weightsBoxes = reshapedWeights(:,1:4,:);weightsClasses = reshapedWeights(:,6:end,:);将所提取参数的权重按要求组合% yolov2ObjectDetector。reorderedWeights = cat(2,weightsIou,weightsBoxes,weightsClasses);permutedWeights = permute(reorderedWeights,[1 3 2]);将新权重重塑为原始大小。。modWeights =重塑(permutedWeights,weightsSize);根据预测和锚点的大小重塑偏差。。reshapedBias =重塑(偏差,大小预测,numAnchorBoxes);提取与借条、盒子和类相关的偏差。。biasIou = reshapedBias(5,:);biasBoxes = reshapedBias(1:4,:);biasClasses = reshapedBias(6:end,:);结合yolov2ObjectDetector所要求的提取参数的偏差。reorderedBias = cat(1,biasIou,biasBoxes,biasClasses);permutedBias = permute(reorderedBias,[2 1]);将新的偏差重塑为原始大小。。modBias =重塑(permutedBias,bias);结束函数classes = tinyYOLOv2Classes()返回与预训练的ONNX tiny 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.
[2]“迷你YOLO v2模型许可证。”https://github.com/onnx/onnx/blob/master/LICENSE.
埃弗汉,马克,卢克·范古尔,克里斯托弗·k·i·威廉姆斯,约翰·韦恩和安德鲁·泽瑟曼。“Pascal可视对象类(VOC)挑战”国际计算机视觉杂志88年,没有。2(六月2010):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计算机视觉和模式识别会议。6517 - 25。檀香山,HI: IEEE, 2017。https://doi.org/10.1109/CVPR.2017.690。
[2]微型YOLO v2模型
埃弗汉,马克,卢克·范古尔,克里斯托弗·k·i·威廉姆斯,约翰·韦恩和安德鲁·泽瑟曼。“Pascal可视对象类(VOC)挑战”国际计算机视觉杂志88.数字2(2010年6月):303-38。https://doi.org/10.1007/s11263 - 009 - 0275 - 4。