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)

  • MKLDNN CPU Support を参照して MKL-DNN ライブラリをサポートするプロセッサのリストの確認

  • MATLAB® Coder™ (C++ コード生成用)

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

  • Deep Learning Toolbox™ (DAGNetwork オブジェクトを使用するため)

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

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

この例は、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 
labels = cellstr(labels);


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.

参考

(MATLAB Coder) | (MATLAB Coder)

関連するトピック