Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

この例では、You Only Look Once (YOLO) v3 オブジェクト検出器用の CUDA® MEX を生成する方法を説明します。YOLO v3 は YOLO v2 を改良したもので、複数のスケールにおける検出を追加してより小さなオブジェクトを検出できるようになっています。学習で使用される損失関数は、境界ボックス回帰用の平均二乗誤差と、オブジェクト分類用のバイナリ交差エントロピーに分割されており、検出精度が向上しています。この例の YOLO v3 ネットワークは、COCO データセットで学習させました。この軽量版 YOLO v3 ネットワークは、YOLO v3 ネットワークの多数の畳み込み層を削減します。必要とする計算能力が少ないため、リアルタイムのオブジェクト検出により適しています。詳細については、YOLO v3 入門 (Computer Vision Toolbox)YOLO v3 深層学習を使用したオブジェクトの検出 (Computer Vision Toolbox)を参照してください。

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

必須

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

オプション

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

GPU 環境の検証

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

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

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

この例では、COCO データセットで学習させた事前学習済みの YOLO v3 オブジェクト検出ネットワークを使用します。オブジェクト検出器は、人、自転車、車など、80 種類の異なるオブジェクトを検出できます。YOLO v3 ネットワークを使用するには、アドオン エクスプローラーから Computer Vision Toolbox Model for YOLO v3 Object Detection をダウンロードしてインストールします。アドオンのインストールの詳細については、アドオンの取得と管理を参照してください。

ネットワークの名前を指定し、yolov3ObjectDetector オブジェクトを MAT ファイルに保存します。yolov3ObjectDetector オブジェクトを MAT ファイルに保存して続行します。

name = "tiny-yolov3-coco";
vehicleDetector =  yolov3ObjectDetector(name);
matFile = 'tinyyolov3coco.mat';
save(matFile,'vehicleDetector');
net = vehicleDetector.Network;
inputLayerSize = net.Layers(1).InputSize;
disp(vehicleDetector.ClassNames(1:5))
     person 
     bicycle 
     car 
     motorbike 
     aeroplane 

エントリポイント関数 tinyyolov3Detect

エントリポイント関数 tinyyolov3Detect は、イメージ入力を受け取り、イメージに対して検出器を実行します。この関数は、ネットワーク オブジェクトを tinyyolov3coco.mat ファイルから永続変数 yolov3Obj に読み込み、それ以降の検出呼び出し中に永続オブジェクトを再利用します。

type('yolov3Detect.m')

CUDA MEX の生成

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

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
inputArgs = {coder.typeof(uint8(0),inputLayerSize),coder.Constant(matFile)};

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

イメージでの生成 MEX のテスト

入力イメージを読み込みます。入力イメージに対して tinyyolov3cocoDetect_mex を呼び出し、検出結果を表示します。

im = imread('highway.png');
im = preprocess(vehicleDetector,im);
outputImage = yolov3Detect_mex(im,matFile);
imshow(outputImage);

ビデオでの生成 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,inputLayerSize(1:2));
    out = yolov3Detect_mex(in,matFile);
    step(depVideoPlayer, out);
    % Exit the loop if the video player figure window is closed
    cont = ~isDone(videoFreader) && isOpen(depVideoPlayer); 
end

gpucoder_YOLOv3_output.png

参考文献

1.Redmon, Joseph, and Ali Farhadi. "YOLOv3: An Incremental Improvement.” arXiv, April 8, 2018. http://arxiv.org/abs/1804.02767.

2.Lin, Tsung-Yi, Michael Maire, Serge Belongie, James Hays, Pietro Perona, Deva Ramanan, Piotr Dollár, and C. Lawrence Zitnick. “Microsoft COCO: Common Objects in Context.” In Computer Vision – ECCV 2014, edited by David Fleet, Tomas Pajdla, Bernt Schiele, and Tinne Tuytelaars, 8693:740–55. Cham: Springer International Publishing, 2014. https://doi.org/10.1007/978-3-319-10602-1_48.

参考

関数

オブジェクト

関連する例

詳細