Main Content

YOLO v2 を使用したオブジェクト検出のコードの生成

この例では、You Only Look Once (YOLO) v2 オブジェクト検出器用の CUDA® MEX を生成する方法を説明します。YOLO v2 オブジェクトの検出ネットワークは 2 つのサブネットワークで構成されます。特徴抽出ネットワークに検出ネットワークが続きます。この例では、Computer Vision Toolbox™ の "YOLO v2 深層学習を使用したオブジェクト検出" の例で学習させたネットワークのコードを生成します。詳細については、YOLO v2 深層学習を使用したオブジェクトの検出を参照してください。この例を変更すれば、"事前学習済みの ONNX YOLO v2 オブジェクト検出器のインポート" の例で Computer Vision Toolbox™ からインポートしたネットワーク用の CUDA® MEX を生成できます。詳細については、事前学習済みの ONNX YOLO v2 オブジェクト検出器のインポートを参照してください。

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

必須

この例では、CUDA MEX を生成します。以下のサードパーティ要件が適用されます。

  • CUDA® 対応 NVIDIA® GPU および互換性のあるドライバー。

オプション

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

GPU 環境の検証

関数coder.checkGpuInstall (GPU Coder)を使用して、この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証します。

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

事前学習済みの DAGNetwork の取得

この例では、事前学習済みのネットワークを含む yolov2ResNet50VehicleExample MAT ファイルを使用します。ファイルのサイズは約 98 MB です。MathWorks の Web サイトからファイルをダウンロードします。

matFile = matlab.internal.examples.downloadSupportFile('vision/data','yolov2ResNet50VehicleExample.mat');
vehicleDetector = load(matFile);
net = vehicleDetector.detector.Network
net = 
  DAGNetwork with properties:

         Layers: [150×1 nnet.cnn.layer.Layer]
    Connections: [162×2 table]
     InputNames: {'input_1'}
    OutputNames: {'yolov2OutputLayer'}

DAG ネットワークには、畳み込み層、ReLU 層、バッチ正規化層に加えて、YOLO v2 変換層や YOLO v2 出力層など、150 個の層が含まれています。深層学習ネットワーク アーキテクチャを対話的に可視化して表示するには、関数 analyzeNetwork (Deep Learning Toolbox) を使用します。

analyzeNetwork(net);

エントリポイント関数 yolov2_detect

エントリポイント関数 yolov2_detect.m は、イメージ入力を受け取り、yolov2ResNet50VehicleExample.mat ファイルに保存されている深層学習ネットワークを使用して、イメージに対して検出器を実行します。この関数は、ネットワーク オブジェクトを yolov2ResNet50VehicleExample.mat ファイルから永続変数 yolov2Obj に読み込み、それ以降の検出の呼び出しではこの永続オブジェクトを再利用します。

type('yolov2_detect.m')
function outImg = yolov2_detect(in,matFile)

%   Copyright 2018-2021 The MathWorks, Inc.

persistent yolov2Obj;

if isempty(yolov2Obj)
    yolov2Obj = coder.loadDeepLearningNetwork(matFile);
end

% Call to detect method
[bboxes,~,labels] = yolov2Obj.detect(in,'Threshold',0.5);

% Convert categorical labels to cell array of charactor vectors
labels = cellstr(labels);

% Annotate detections in the image.
outImg = insertObjectAnnotation(in,'rectangle',bboxes,labels);

MEX コード生成の実行

エントリポイント関数用の CUDA コードを生成するには、MEX ターゲットの GPU コード構成オブジェクトを作成し、ターゲット言語を C++ に設定します。関数 coder.DeepLearningConfig (GPU Coder) を使用して CuDNN 深層学習構成オブジェクトを作成し、それを GPU コード構成オブジェクトの DeepLearningConfig プロパティに割り当てます。入力サイズを 224 x 224 x 3 に指定して codegen コマンドを実行します。この値は YOLOv2 の入力層サイズに対応します。

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
cfg.GenerateReport = true;
inputArgs = {ones(224,224,3,'uint8'),coder.Constant(matFile)};

codegen -config cfg yolov2_detect -args inputArgs
Code generation successful: View report

生成された MEX の実行

ビデオ ファイル リーダーを設定し、入力ビデオを読み取ります。ビデオ プレーヤーを作成し、ビデオと出力の検出を表示します。

videoFile = 'highway_lanechange.mp4';
videoFreader = vision.VideoFileReader(videoFile,'VideoOutputDataType','uint8');
depVideoPlayer = vision.DeployableVideoPlayer('Size','Custom','CustomSize',[640 480]);

ビデオ入力をフレームごとに読み取り、検出器を使用してビデオ内の車両を検出します。

cont = ~isDone(videoFreader);
while cont
    I = step(videoFreader);
    in = imresize(I,[224,224]);
    out = yolov2_detect_mex(in,matFile);
    step(depVideoPlayer, out);
    % Exit the loop if the video player figure window is closed
    cont = ~isDone(videoFreader) && isOpen(depVideoPlayer); 
end

参考文献

[1] Redmon, Joseph, and Ali Farhadi. "YOLO9000: Better, Faster, Stronger." 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). IEEE, 2017.

Copyright 2017-2021 The MathWorks, Inc.