主要内容

事前学習済みのONNX YOLO v2オブジェクト検出器のンポト

この例では,事前学習済みのONNX™(开放神经网络交换)你只看一次(YOLO) v2[1]オブジェクト検出ネットワークをインポートし,このネットワークを使用してオブジェクトを検出する方法を説明します。ネットワークをインポートした後,GPU编码器™を使用してこのネットワークを組み込みプラットフォームに展開したり,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ネットワクを展開します。tiny_yolov2フォルダ,から“Model.onnx”モデルを読み込みます。これは,帕斯卡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は,既定では最後に回帰層を追加します。yolov2ObjectDetectorは,YOLO v2検出ネットワ,クがyolov2OutputLayerで終わることを想定しているため,importONNXLayersによって追加された最後の回帰層を削除します。YOLO v2検出ネットワクの詳細にいては,YOLO v2入門を参照してください。

lgraph = removeLayers(“RegressionLayer_grid”);

YOLO v2の変換層と出力層の追加の節で,インポートした層にYOLO v2出意思力層とYOLO v2意思変換層を追加する方法が説明されています。

この例のネットワ,クには,サポ,トされていない層は含まれていません。インポートしたいネットワークにサポートされていない層が含まれている場合,関数はそれらをプレースホルダー層としてインポートすることに注意してください。。プレスホルダ層の置き換えの詳細にいては,findPlaceholderLayers(深度学习工具箱)を参照してください。

YOLO v2アンカ,ボックスの定義

YOLO v2は,事前定義されたアンカ,ボックスを使用してオブジェクトの位置を予測します。インポートしたネットワークで使用されているアンカーボックスは,小YOLO v2意思ネットワークコンフィギュレーションファイルで定義されています[4]。ONNXのアンカは,最終畳み込み層の出力サズ(13 × 13)に基づき定義されています。yolov2ObjectDetectorでアンカーを使用するには,ネットワークの入力サイズ(416 x 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個の欠条の値

  • チャネル6から10 -アンカ5個のxの値

  • チャネル11から15 -アンカ5個のyの値

  • チャネル16から20 -アンカ5個の幅の値

  • チャネル21から25 -アンカ5個の高さの値

  • チャネル26から30 -アンカ5個のクラス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の確率値

この例の最後にリストされている補助関数rearrangeONNXWeightsを使用して,インポートしたネットワークに含まれる最終畳み込み層の重みとバイアスを並べ替え,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の変換層と出力層を必要とします。これら2つの層を作成し,それらを直列に積み重ね,最終畳み込み層に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を使用して層グラフを組み立て,関数yolov2ObjectDetectorを使用してYOLO v2オブジェクト検出器を作成します。

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:[飞机自行车鸟船瓶子公共汽车猫椅子牛餐桌狗马摩托车人盆栽羊沙发火车电视监视器]

@ @ @ @ @ @ @ @ @ @ @ @ @ @ @

。結果を表示します。

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);

サポ,ト関数

函数[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。

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