ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

この例では、Computer Vision Toolbox™ からの YOLO v2 深層学習を使用したオブジェクトの検出 (Computer Vision Toolbox) の例について CUDA® コードを生成する方法を説明します。

必要条件

  • Compute Capability 3.2 以上の CUDA 対応 NVIDIA® GPU。

  • NVIDIA CUDA ツールキットおよびドライバー。

  • NVIDIA cuDNN ライブラリ v7 以上。

  • OpenCV 3.1.0 ライブラリ (ビデオ読み取りとイメージ表示操作用)。

  • コンパイラおよびライブラリの環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細は、サードパーティ製品を参照してください。環境変数の設定は、前提条件となる製品の設定を参照してください。

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

  • GPU Coder™ (CUDA コードを生成するため)。

  • GPU Coder Interface for Deep Learning Libraries サポート パッケージ。このサポート パッケージをインストールするには、アドオン エクスプローラーを使用します。

GPU 環境の検証

関数 coder.checkGpuInstall を使用し、この例を実行するのに必要なコンパイラおよびライブラリが適切に設定されていることを検証します。coder.checkGpuInstall('gpu','codegen','cudnn','quiet');

事前学習済みの DAGNetwork の取得

net = getYOLOv2();

この DAG ネットワークには、畳み込み層、ReLU 層、バッチ正規化層に加えて、YOLO v2 変換層や YOLO v2 出力層など、150 個の層が含まれています。ネットワークのすべての層を表示するには、コマンド net.Layers を使用します。

net.Layers

関数 'yolov2_detect' について

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

type('yolov2_detect.m')
function outImg = yolov2_detect(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
% setup. When the function is called subsequent times, the same object is reused 
% to call detection on inputs, thus avoiding reconstructing and reloading the
% network object.
persistent yolov2Obj;

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

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

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

関数 'yolov2_detect' の MEX コード生成の実行

設計ファイル yolov2_detect.m から CUDA コードを生成するには、MEX ターゲットの GPU コード構成オブジェクトを作成し、ターゲット言語を C++ に設定します。関数 coder.DeepLearningConfig を使用して CuDNN 深層学習構成オブジェクトを作成し、それを GPU コード構成オブジェクトの DeepLearningConfig プロパティに割り当てます。サイズが [360,480,3] の入力を指定して codegen コマンドを実行します。この値は YOLOv2 の入力層サイズに対応します。

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg yolov2_detect -args {ones(224,224,3,'uint8')} -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);
    step(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."2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR).IEEE, 2017.