Main Content

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

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

この例では、You Only Look Once v4 (YOLO v4) オブジェクト検出器用のスタンドアロン CUDA® 実行可能ファイルを生成する方法を示します。この例では、ネットワーク層を少なくした軽量バージョンの YOLO v4 ネットワークを使用します。特徴ピラミッド ネットワークをネックとして使用し、2 つの YOLO v4 検出ヘッドを備えています。ネットワークは、COCO データセットで学習させました。YOLO v4 オブジェクト検出ネットワークの詳細については、YOLO v4 入門 (Computer Vision Toolbox)およびyolov4ObjectDetector (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);

事前学習済みのネットワークの読み込み

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

ネットワークの名前を指定し、ネットワークを MAT ファイルに保存します。

name = "tiny-yolov4-coco";
vehicleDetector =  yolov4ObjectDetector(name);
save('tinyyolov4coco.mat','vehicleDetector');
net = vehicleDetector.Network;
disp(vehicleDetector)
  yolov4ObjectDetector with properties:

             Network: [1×1 dlnetwork]
         AnchorBoxes: {2×1 cell}
          ClassNames: {80×1 cell}
           InputSize: [416 416 3]
    PredictedBoxType: 'axis-aligned'
           ModelName: 'tiny-yolov4-coco'

テスト用の交通量ビデオのダウンロード

モデルをテストするには、MathWorks® の Web サイトからビデオ ファイルをダウンロードします。ファイルのサイズは約 40 MB です。

if ~exist('./downtown_short.mp4', 'file')
	url = 'https://www.mathworks.com/supportfiles/gpucoder/media/downtown_short.mp4';
	websave('downtown_short.mp4', url);
end

エントリポイント関数 tinyyolov4cocoDetect

エントリポイント関数 tinyyolov4Detect は、tinyyolov4coco.mat ファイルの深層学習ネットワークを使用して、ビデオ ファイルに対して検出器を実行します。この関数は、ネットワーク オブジェクトを tinyyolov4coco.mat ファイルから永続変数 yolov4Obj に読み込み、それ以降の検出呼び出し中に永続オブジェクトを再利用します。次に、ビデオ ファイル リーダーを設定して入力ビデオを読み取り、ビデオ プレーヤーを作成してビデオと出力の検出を表示します。

type('tinyyolov4cocoDetect.m')
function tinyyolov4cocoDetect()
%#codegen

%   Copyright 2022 The MathWorks, Inc.

persistent yolov4Obj;

if isempty(yolov4Obj)
    yolov4Obj = coder.loadDeepLearningNetwork('tinyyolov4coco.mat');
end

% Read the input video and create a video player
videoFile = 'downtown_short.mp4';

videoFreader = vision.VideoFileReader(videoFile, 'VideoOutputDataType', 'uint8');
depVideoPlayer = vision.DeployableVideoPlayer();

cont = ~isDone(videoFreader);
while cont
    I = step(videoFreader);
    in = imresize(I, [416,416]);
    % Call to detect method
    [bboxes, ~, labels] = detect(yolov4Obj, in, Threshold = 0.3);
    
    % Convert categorical labels to cell array of charactor vectors
    labels = cellstr(labels);
    
    % Annotate detections in the image.
    outImg = insertObjectAnnotation(in, 'rectangle', bboxes, labels);

    step(depVideoPlayer, outImg); % display video
    cont = ~isDone(videoFreader); 
%     pause(0.05); % adjust frame rate
end

実行可能ファイルの生成

エントリポイント関数の CUDA 実行可能コードを生成するには、GPU コード構成オブジェクトを作成し、ターゲット言語を C++ に設定します。関数 coder.DeepLearningConfig を使用して CuDNN 深層学習構成オブジェクトを作成し、それを GPU コード構成オブジェクトの DeepLearningConfig プロパティに割り当てます。次に、codegen コマンドを実行します。

cfg = coder.gpuConfig('exe');
cfg.GenerateExampleMain = 'GenerateCodeAndCompile';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');

codegen -config cfg tinyyolov4cocoDetect -report
Code generation successful: View report

スタンドアロン コードの実行

生成されたスタンドアロン実行可能ファイルを実行すると、検出結果がフレームごとに表示されます。

参考文献

[1] Bochkovskiy, Alexey, Chien-Yao Wang, and Hong-Yuan Mark Liao. “YOLOv4: Optimal Speed and Accuracy of Object Detection.” arXiv, April 22, 2020. http://arxiv.org/abs/2004.10934.

[2] Redmon, Joseph, Santosh Divvala, Ross Girshick, and Ali Farhadi. “You Only Look Once: Unified, Real-Time Object Detection.” In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 779–88. Las Vegas, NV, USA: IEEE, 2016. https://doi.org/10.1109/CVPR.2016.91.

[3] 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, 740–55. Lecture Notes in Computer Science. Cham: Springer International Publishing, 2014. https://doi.org/10.1007/978-3-319-10602-1_48.

参考

関数

オブジェクト

関連する例

詳細