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 以外のビルドについて、この例では以下の要件も適用されます。
NVIDIA CUDA Toolkit。
NVIDIA cuDNN ライブラリ。
コンパイラおよびライブラリの環境変数。詳細については、サードパーティ ハードウェアと前提条件となる製品の設定を参照してください。
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')
function outImg = yolov3Detect(in,matFile) % Copyright 2021-2022 The MathWorks, Inc. persistent yolov3Obj; if isempty(yolov3Obj) yolov3Obj = coder.loadDeepLearningNetwork(matFile); end % Call to detect method [bboxes,~,labels] = yolov3Obj.detect(in,Threshold = 0.6); % Convert categorical labels to cell array of charactor vectors labels = cellstr(labels); % Annotate detections in the image. outImg = insertObjectAnnotation(in,'rectangle',bboxes,labels);
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 = VideoReader(videoFile); depVideoPlayer = vision.DeployableVideoPlayer('Size','Custom','CustomSize',[640 480]);
ビデオ入力をフレームごとに読み取り、検出器を使用してビデオ内の車両を検出します。
cont = hasFrame(videoFreader); while cont I = readFrame(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 = hasFrame(videoFreader) && isOpen(depVideoPlayer); end
参考文献
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.
参考
関数
オブジェクト
coder.gpuConfig
|coder.gpuEnvConfig
|coder.TensorRTConfig
|coder.CuDNNConfig
|dlarray
(Deep Learning Toolbox) |dlnetwork
(Deep Learning Toolbox)
関連する例
- YOLO v3 深層学習を使用したオブジェクトの検出 (Computer Vision Toolbox)