Main Content

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

YOLO v2 および Intel MKL-DNN を使用したオブジェクト検出の C++ コードの生成

この例では、Intel® プロセッサで YOLO v2 オブジェクト検出ネットワークの C++ コードを生成する方法を説明します。生成されたコードは Intel Math Kernel Library for Deep Neural Networks (MKL-DNN) を使用します。

詳細については、YOLO v2 深層学習を使用したオブジェクトの検出 (Computer Vision Toolbox)を参照してください。

前提条件

  • Intel Math Kernel Library for Deep Neural Networks (MKL-DNN)

  • MKL-DNN ライブラリをサポートするプロセッサのリストを調べるには MKLDNN CPU Support を参照してください。

  • MATLAB® Coder™ (C++ コード生成のため)

  • MATLAB Coder Interface for Deep Learning サポート パッケージ

  • DAGNetwork オブジェクトの使用のための Deep Learning Toolbox™

  • ビデオ I/O 操作のための Computer Vision Toolbox™

サポートされるコンパイラとライブラリのバージョンの詳細については、サードパーティ製のハードウェアとソフトウェアを参照してください。

この例は、Linux®、Windows® および macOS プラットフォームでサポートされており、MATLAB Online ではサポートされていません。

事前学習済みの DAGNetwork オブジェクトの取得

DAG ネットワークには、畳み込み層、ReLU 層、バッチ正規化層、および YOLO v2 変換層と YOLO v2 出力層を含む、150 の層が含まれています。

net = getYOLOv2();
Downloading pretrained detector (98 MB)...

コマンド net.Layers を使用して、ネットワークのすべての層を確認します。

net.Layers

関数 yolov2_detection のコード生成

サンプルの付いた関数 yolov2_detection は、イメージ入力を取り、yolov2ResNet50VehicleExample.mat に保存されたネットワークを使用して、イメージに対して検出機能を実行します。この関数は yolov2ResNet50VehicleExample.mat から永続変数 yolov2Obj にネットワーク オブジェクトを読み込みます。後続の関数の呼び出しでは、永続的なオブジェクトが検出に再利用されます。

type('yolov2_detection.m')
function outImg = yolov2_detection(in)

%   Copyright 2018-2019 The MathWorks, Inc.

% A persistent object yolov2Obj is used to load the YOLOv2ObjectDetector object.
% At the first call to this function, the persistent object is constructed and
% set up. Subsequent calls to the function reuse the same object to call detection 
% on inputs, thus avoiding having to reconstruct and reload the
% network object.
persistent yolov2Obj;

if isempty(yolov2Obj)
    yolov2Obj = coder.loadDeepLearningNetwork('yolov2ResNet50VehicleExample.mat');
end

% pass in input
[bboxes,~,labels] = yolov2Obj.detect(in,'Threshold',0.5);
outImg = in;

% convert categorical labels to cell array of character vectors for MATLAB
% execution
if coder.target('MATLAB')
    labels = cellstr(labels);
end

if ~(isempty(bboxes) && isempty(labels))
% Annotate detections in the image.
    outImg = insertObjectAnnotation(in,'rectangle',bboxes,labels);
end

コードを生成するには、MEX ターゲット向けのコード構成オブジェクトを作成し、ターゲット言語を C++ に設定します。関数 coder.DeepLearningConfig を使用して MKL-DNN 深層学習構成オブジェクトを作成します。そのオブジェクトをコード構成オブジェクトの DeepLearningConfig プロパティに割り当てます。入力のサイズを codegen コマンドへの引数として指定します。この例では、YOLO v2 ネットワークの入力層のサイズは [224,224,3] です。

cfg = coder.config('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('mkldnn');
codegen -config cfg yolov2_detection -args {ones(224,224,3,'uint8')} -report
Code generation successful: To view the report, open('codegen\mex\yolov2_detection\html\report.mldatx').

生成された MEX 関数の入力例での実行

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

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_detection_mex(in);
    depVideoPlayer(out);
    cont = ~isDone(videoFreader) && isOpen(depVideoPlayer); % Exit the loop if the video player figure window is closed
end

参考文献

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

参考

|

関連するトピック