主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

YOLO v3深層学習を使用したオブジェクト検出用のコ,ド生成

この例では,カスタム層を使用した你只看一次(YOLO)意思v3オブジェクト検出器用のCUDA®墨西哥人を生成する方法を示します。YOLO v3意思はYOLO v2を意思改良したもので,複数のスケールにおける検出を追加してより小さなオブジェクトを検出できるようになっています。さらに,学習で使用される損失関数は,境界ボックス回帰用の平均二乗誤差と,オブジェクト分類用のバイナリ交差エントロピーに分割されており,検出精度が向上しています。この例で使用するYOLO v3意思ネットワークは,计算机视觉的工具箱(TM)の“YOLO v3深層学習を使用したオブジェクトの検出”の例を使用して学習させたものです。詳細は,YOLO v3深層学習を使用したオブジェクトの検出(计算机视觉工具箱)を参照してください。

サ,ドパ,ティの必要条件

必須

  • Cuda対応nvidia®gpuおよび互換性のあるドラaapl .バ。

オプション

スタティックライブラリ,ダイナミックライブラリ,または実行可能ファイルなどの墨西哥人以外のビルドについて,この例では以下の要件も適用されます。

Gpu環境の検証

この例を実行するためのコンパイラおよびライブラリが正しくセットアップされていることを確認するには,関数coder.checkGpuInstallを使用します。

envCfg = code . gpuenvconfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

YOLO v3ネットワ,ク

この例のYOLO v3ネットワ,クは,squeezenet(深度学习工具箱)がベ,スとなっています。このネットワークは,SqueezeNetの特徴抽出ネットワークを使用し,最後に2つの検出ヘッドが追加されています。2番目の検出ヘッドのサイズは,最初の検出ヘッドの2倍となっているため,小さなオブジェクトをより的確に検出できます。検出するオブジェクトのサaapl . exeズに基づいて,さまざまなサaapl . exeズの検出ヘッドを任意の数で指定できます。YOLO v3ネットワ,クは,学習デ,タを使用して推定されたアンカ,ボックスを使用します。これにより,データセットの種類に対応した初期の事前確率が改善され,ボックスを正確に予測できるようにネットワークに学習させることができます。アンカボックスの詳細にいては,アンカ,ボックスによるオブジェクトの検出(计算机视觉工具箱)を参照してください。

この例のYOLO v3ネットワ,クを次の図に示します。

各検出ヘッドは,境界ボックス座標(x, y,幅高さ),オブジェクトの信頼度,および各アンカーボックスマスクに対するクラスの確率を予測します。そのため,各検出ヘッドにおける最終畳み込み層の出力フィルターの数は,アンカーボックスマスクの数と,アンカーボックスあたりの予測要素の数を乗算したものになります。この検出ヘッドは,ネットワ,クの出力層を構成します。

事前学習済みのYOLO v3ネットワ,ク

YOLO v3ネットワ,クをダウンロ,ドします。

fileName = matlab.internal.examples.download金宝appSupportFile(“视觉/数据/”“yolov3SqueezeNetVehicleExample_21a.zip”);解压缩(文件名);

この例で使用するYOLO v3ネットワ,クの学習は,YOLO v3深層学習を使用したオブジェクトの検出(计算机视觉工具箱)で説明した手順を使用して行っています。

matFile =“yolov3SqueezeNetVehicleExample_21a.mat”;pretrained = load(matFile);Net = pretrained.net;

YOLO v3ネットワ,クは,resize2dLayer(图像处理工具箱)を使用し,隣接するピクセル値をスケーリング係数2で複製することによって,2次元の入力イメージのサイズを変更します。コ,ド生成がサポ,トされているカスタム層として,resize2DLayerが実装されています。詳細にいては,コ,ド生成用のカスタム深層学習層の定義(深度学习工具箱)を参照してください。

メモ:事前学習済みの検出器ネットワークは,计算机视觉工具箱YOLO v3意思™模型对象检测サポートパッケージからも利用できます。

この事前学習済みネットワークを使用するには,最初にアドオンエクスプローラーから计算机视觉工具箱YOLO v3意思模型对象检测をインストールしなければなりません。アドオンのンストルの詳細にいては,アドオンの取得と管理を参照してください。

次に,ネットワ,クをyolov3ObjectDetectorオブジェクトからmatファescルに保存して続行します。次に例を示します。

探测器= yolov3ObjectDetector(“darknet53-coco”);net =检测器。网络;matFile =“pretrainedYOLOv3Detector.mat”;保存(matFile,“净”);

エントリポ@ @ント関数yolov3Detect

エントリポ@ @ント関数yolov3Detectは,入力@ # @メ,ジを受け取り,それを関数yolov3Predictを介して予測用の学習済みネットワ,クに渡します。関数yolov3Predictは,ネットワークオブジェクトを垫ファイルから永続変数に読み込み,以降の予測呼び出しでその永続オブジェクトを再利用します。具体的には,この関数は,YOLO v3深層学習を使用したオブジェクトの検出(计算机视觉工具箱)の例で学習させたネットワ,クのdlnetwork(深度学习工具箱)表現を使用します。次に,yolov3Predict呼び出しから取得したYOLO v3グリッドセル座標からの予測が,サポ,ト関数generateTiledAnchorsおよびapplyAnchorBoxOffsetsを使用して境界ボックス座標に変換されます。

类型(“yolov3Detect.m”
function [bboxes,scores,labelsIndex] = yolov3Detect(matFile, im,…networkInputSize, networkOutputs, confidenceThreshold,…yolov3Detect函数检测图像中的边界框、分数和% labelsIndex。Copyright 2020-2021 The MathWorks, Inc.预处理数据%此示例将所有预处理转换应用到训练期间应用的数据集%,数据增强除外。由于示例%使用预训练的YOLO v3网络,因此输入数据必须代表原始数据的%,并且不作任何修改,以便进行公正的评估。具体来说,以下预处理操作应用于输入数据。% 1。将图像大小调整为网络输入大小,因为图像比networkInputSize大%。2.缩放范围为%[0 1]的图像像素。 3. Convert the resized and rescaled image to a dlarray object. im = dlarray(preprocessData(im, networkInputSize), "SSCB"); imageSize = size(im,[1,2]); %% Define Anchor Boxes % Specify the anchor boxes estimated on the basis of the preprocessed % training data used when training the YOLO v3 network. These anchor box % values are same as mentioned in "Object Detection Using YOLO v3 Deep % Learning" example. For details on estimating anchor boxes, see "Anchor % Boxes for Object Detection". anchors = [ 41 34; 163 130; 98 93; 144 125; 33 24; 69 66]; % Specify anchorBoxMasks to select anchor boxes to use in both the % detection heads of the YOLO v3 network. anchorBoxMasks is a cell array of % size M-by-1, where M denotes the number of detection heads. Each % detection head consists of a 1-by-N array of row index of anchors in % anchorBoxes, where N is the number of anchor boxes to use. Select anchor % boxes for each detection head based on size-use larger anchor boxes at % lower scale and smaller anchor boxes at higher scale. To do so, sort the % anchor boxes with the larger anchor boxes first and assign the first % three to the first detection head and the next three to the second % detection head. area = anchors(:, 1).*anchors(:, 2); [~, idx] = sort(area, 'descend'); anchors = anchors(idx, :); anchorBoxMasks = {[1,2,3],[4,5,6]}; %% Predict on Yolov3 % Predict and filter the detections based on confidence threshold. predictions = yolov3Predict(matFile,im,networkOutputs,anchorBoxMasks); %% Generate Detections % indices corresponding to x,y,w,h predictions for bounding boxes anchorIndex = 2:5; tiledAnchors = generateTiledAnchors(predictions,anchors,anchorBoxMasks,... anchorIndex); predictions = applyAnchorBoxOffsets(tiledAnchors, predictions,... networkInputSize, anchorIndex); [bboxes,scores,labelsIndex] = generateYOLOv3DetectionsForCodegen(predictions,... confidenceThreshold, overlapThreshold, imageSize, classes); end function YPredCell = yolov3Predict(matFile,im,networkOutputs,anchorBoxMask) % Predict the output of network and extract the confidence, x, y, % width, height, and class. % load the deep learning network for prediction persistent net; if isempty(net) net = coder.loadDeepLearningNetwork(matFile); end YPredictions = cell(coder.const(networkOutputs), 1); [YPredictions{:}] = predict(net, im); YPredCell = extractPredictions(YPredictions, anchorBoxMask); % Apply activation to the predicted cell array. YPredCell = applyActivations(YPredCell); end

オブジェクト検出用のエントリポ@ @ント関数の評価

次の手順に従って,テストデタからのメジに対するエントリポント関数を評価します。

  • 信頼度しきい値に0.5を指定し,信頼度スコアがこの値より高い検出のみ保持します。

  • オバラップしきい値に0.5を指定し,オバラップしている検出を削除します。

  • 入力デタからメジを読み取ります。

  • エントリポ@ @ント関数yolov3Detectを使用して,予測された境界ボックス,信頼度スコア,およびクラスラベルを取得します

  • 境界ボックスと信頼度スコアと共に▪▪メ▪▪ジを表示します。

必要なしきい値を定義します。

confidenceThreshold = 0.5;overlapThreshold = 0.5;

学習済みネットワクのネットワク入力サズと,ネットワク出力の数を指定します。

networkInputSize = [227 227 3];networkOutputs = number (net.OutputNames);

YOLO v3深層学習を使用したオブジェクトの検出(计算机视觉工具箱)の例のラベル付きデタセットから取得したサンプルメジデタを読み取ります。この▪▪メ▪ジには,車両タ▪▪プのオブジェクトの▪▪ンスタンスが1▪▪含まれています。

I = imread(“vehicleImage.jpg”);

クラス名を指定します。

classNames = {“汽车”};

YOLO v3ネットワ,クで検出メソッドを呼び出し,結果を表示します。

[bboxes,scores,labelsIndex] = yolov3Detect(matFile,I,...networkInputSize、networkOutputs confidenceThreshold overlapThreshold,类名);标签= classNames(labelsIndex);在图像上显示检测结果IAnnotated = insertObjectAnnotation(I,“矩形”、bboxes strcat(标签,{——”}, num2str(分数)));图imshow (IAnnotated)

Cuda mexの生成

エントリポ@ @ント関数yolov3Detect用のCUDA®コードを生成するには,墨西哥人ターゲットのGPUコード構成オブジェクトを作成し,ターゲット言語をc++に設定します。関数编码器。DeepLearningConfigを使用してCuDNN深層学習構成オブジェクトを作成し,それをGPUコ,ド構成オブジェクトのDeepLearningConfigプロパティに割り当てます。

cfg = code . gpuconfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig(TargetLibrary=“cudnn”);args = {code . constant (matFile),I,code . constant (networkInputSize),...confidenceThreshold coder.Constant (networkOutputs),...overlapThreshold,一会};codegen配置cfgyolov3Detectarg游戏arg游戏报告
代码生成成功:查看报告

TensorRTターゲット用のCUDA®コードを生成するには,CuDNN構成オブジェクトではなく,TensorRT深層学習構成オブジェクトを使用します。同様に,MKLDNNターゲット用のコードを生成するには,CPUコード構成オブジェクトを作成し,そのDeepLearningConfigプロパティとしてMKLDNN深層学習構成オブジェクトを使用します。

生成されたmexの実行

前回と同じ▪▪メ▪▪ジ入力を使用して生成されたcuda mexを呼び出し,結果を表示します。

[bboxes,scores,labelsIndex] = yolov3Detect_mex(matFile,I,...networkInputSize、networkOutputs confidenceThreshold,...overlapThreshold,类名);标签= classNames(labelsIndex);图;IAnnotated = insertObjectAnnotation(I,“矩形”、bboxes strcat(标签,{——”}, num2str(分数)));imshow (IAnnotated);

ユ,ティリティ関数

以下のユ,ティリティ関数は,YOLO v3深層学習を使用したオブジェクトの検出(计算机视觉工具箱)の例で使用されたものをベ,スとし,コ,ド生成に適合するように変更されています。

类型(“applyActivations.m”
版权所有:The MathWorks, Inc. numCells = size(YPredCell, 1);for iCell = 1:numCells for idx = 1:3 YPredCell{iCell,idx} = sigmoidActivation(YPredCell{iCell,idx});结束结束iCell = 1:numCells for idx = 4:5 YPredCell{iCell, idx} = exp(YPredCell{iCell, idx});end end for iCell = 1:numCells YPredCell{iCell, 6} = sigmoidActivation(YPredCell{iCell, 6});(1+exp(-x));结束
类型(“extractPredictions.m”
The MathWorks, Inc. numPredictionHeads = size(yforecasts, 1);预测= cell(numPredictionHeads,6);for ii = 1:numPredictionHeads %获取特征大小所需信息。numChannelsPred = size(yforecasts {ii},3);numAnchors = size(anchorBoxMask{ii},2);numPredElemsPerAnchors = numChannelsPred/ nummanchors;allIds = (1:numChannelsPred);stride = numPredElemsPerAnchors;endIdx = numChannelsPred;YPredictionsData = extractdata(yforecasts {ii}); % X positions. startIdx = 1; predictions{ii,2} = YPredictionsData(:,:,startIdx:stride:endIdx,:); xIds = startIdx:stride:endIdx; % Y positions. startIdx = 2; predictions{ii,3} = YPredictionsData(:,:,startIdx:stride:endIdx,:); yIds = startIdx:stride:endIdx; % Width. startIdx = 3; predictions{ii,4} = YPredictionsData(:,:,startIdx:stride:endIdx,:); wIds = startIdx:stride:endIdx; % Height. startIdx = 4; predictions{ii,5} = YPredictionsData(:,:,startIdx:stride:endIdx,:); hIds = startIdx:stride:endIdx; % Confidence scores. startIdx = 5; predictions{ii,1} = YPredictionsData(:,:,startIdx:stride:endIdx,:); confIds = startIdx:stride:endIdx; % Accumulate all the non-class indexes nonClassIds = [xIds yIds wIds hIds confIds]; % Class probabilities. % Get the indexes which do not belong to the nonClassIds classIdx = setdiff(allIds, nonClassIds, 'stable'); predictions{ii,6} = YPredictionsData(:,:,classIdx,:); end end
类型(“generateTiledAnchors.m”
函数tiledAnchors = generateTiledAnchors(YPredCell,anchorBoxes,…生成平铺的锚偏移,用于将预测从YOLO % v3网格单元坐标转换为边界框坐标%#codegen % Copyright 2020-2021 the MathWorks, Inc. numPredictionHeads = size(YPredCell,1);tiledAnchors = cell(numPredictionHeads, size(anchorIndex, 2));for i = 1:numPredictionHeads主播=锚盒(anchorBoxMask{i},:);[h,w,~,n] = size(YPredCell{i,1});[tiledAnchors{2},我tiledAnchors{1}我]= ndgrid (h - 0: 0: w1,…1:尺寸(锚,1),1:n);[~, ~, tiledAnchors{我3}]= ndgrid (h - 0: 0: w1,锚(:,2),1:n);[~, ~, tiledAnchors{我4}]= ndgrid (h - 0: 0: w1,锚(:1),1:n);结束结束
类型(“applyAnchorBoxOffsets.m”
函数YPredCell = applyanchorboxoffset (tiledAnchors,YPredCell,…Copyright 2020-2021 the MathWorks, Inc. for i = 1:size(YPredCell,1) [h,w,~,~] = size(YPredCell{i,1});YPredCell{i,anchorIndex(1)} = (tiledAnchors{i,1}+…YPredCell{我anchorIndex(1)})。/ w;YPredCell{i,anchorIndex(2)} = (tiledAnchors{i,2}+…YPredCell{我anchorIndex (2)}) / h;YPredCell{i,anchorIndex(3)} = (tiledAnchors{i,3}.*…YPredCell{我anchorIndex(3)})。/ inputImageSize (2);YPredCell{i,anchorIndex(4)} = (tiledAnchors{i,4}.*…YPredCell{我anchorIndex(4)})。/ inputImageSize (1); end end
类型(“preprocessData.m”
调整图像的大小,并将像素缩放到0到1之间。版权所有The MathWorks, Inc. imgSize = size(图片);将单通道的输入图像转换为3通道。if numel(imgSize) < 1 image = repmat(image,1,1,3);End image = im2single(rescale(image));image = iLetterBoxImage(image,code .const(targetSize(1:2)));结束函数Inew = iLetterBoxImage(I,targetSize) % LetterBoxImage通过保留输入图像I的宽高比%返回一个调整大小的图像。'targetSize'是一个1乘2的向量,包含%的目标维度。% %输入I可以是uint8、uint16、int16、double、single或logical,必须%为实且非稀疏。[Irow,Icol,Ichannels] = size(I); % Compute aspect Ratio. arI = Irow./Icol; % Preserve the maximum dimension based on the aspect ratio. if arI<1 IcolFin = targetSize(1,2); IrowFin = floor(IcolFin.*arI); else IrowFin = targetSize(1,1); IcolFin = floor(IrowFin./arI); end % Resize the input image. Itmp = imresize(I,[IrowFin,IcolFin]); % Initialize Inew with gray values. Inew = ones([targetSize,Ichannels],'like',I).*0.5; % Compute the offset. if arI<1 buff = targetSize(1,1)-IrowFin; else buff = targetSize(1,2)-IcolFin; end % Place the resized image on the canvas image. if (buff==0) Inew = Itmp; else buffVal = floor(buff/2); if arI<1 Inew(buffVal:buffVal+IrowFin-1,:,:) = Itmp; else Inew(:,buffVal:buffVal+IcolFin-1,:) = Itmp; end end end

参考文献

1.雷蒙,约瑟夫和阿里·法哈蒂。“YOLOv3:渐进式改进。”预印本,2018年4月8日提交。https://arxiv.org/abs/1804.02767。

参考

関数

オブジェクト

関連する例

詳細