メインコンテンツ

YOLOX ネットワークを使用したプリント基板欠陥検出のためのコード生成

R2023b 以降

この例では、プリント基板 (PCB) 内の欠陥を検出、位置推定、および分類できる You Only Look Once X (YOLOX) オブジェクト検出器のコードを生成する方法を示します。

この例では、Intel® CPU 上で動作し、Intel Math Kernel Library for Deep Neural Networks (MKL-DNN) を使用する MEX 関数を生成します。GPU Coder™ ライセンスがある場合は、YOLOX 検出器ネットワーク用の CUDA® MEX を生成することもできます。生成された CUDA MEX は、NVIDIA GPU 向けの高性能推論ライブラリである NVIDIA® TensorRT™ を利用します。

この例では、Computer Vision Toolbox™ の "YOLOX ネットワークを使用したプリント基板の欠陥の検出" の例で使用されている、事前学習済みの YOLOX ネットワークを使用します。詳細については、YOLOX ネットワークを使用したプリント基板の欠陥の検出 (Computer Vision Toolbox)を参照してください。YOLOX の詳細については、オブジェクト検出のための YOLOX 入門 (Computer Vision Toolbox)を参照してください。

サードパーティの前提条件

このリストは、この例で生成される MEX 関数に必要なハードウェアおよびソフトウェアの前提条件を示しています。スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では追加の要件があります。

CPU 展開

  • Intel Advanced Vector Extensions 2 (Intel AVX2) 命令をサポートする Intel プロセッサ ("必須")。

  • Intel Math Kernel Library for Deep Neural Networks (MKL-DNN) ("オプション")。

  • サポートされているコンパイラとライブラリのバージョンについては、深層学習に MATLAB Coder を使用するための前提条件 ("オプション") を参照してください。

GPU 展開

メモ: MEX 以外のビルドでは、すべてのオプション要件を満たさなければなりません。

事前学習済み YOLOX 検出器のダウンロード

この例では、YOLOX オブジェクト検出器の事前学習済みバージョンを使用します。ファイルのサイズは約 19 MB です。MathWorks® の Web サイトからファイルをダウンロードします。

trainedPCBDefectDetectorNet_url = "https://ssd.mathworks.com/supportfiles/"+ ...
     "vision/data/trainedPCBDefectDetectorYOLOX.zip";
downloadTrainedNetwork(trainedPCBDefectDetectorNet_url,pwd);
Downloading pretrained network.
This can take several minutes to download...
Done.
matFile = "trainedPCBDefectDetectorYOLOX.mat";
load(matFile);

YOLOX 検出器

YOLOX オブジェクト検出器 [1] は、ベース ネットワークとして CSP-DarkNet-53 を使用し、PCB 欠陥データ セット [2][3] を使用して再学習させています。YOLOX ネットワークは、6 種類の欠陥 (ホール欠損、欠け、断線、短絡、突起、残銅) を検出できます。

disp(detector);
  yoloxObjectDetector with properties:

                 ClassNames: {6×1 cell}
                  InputSize: [800 800 3]
    NormalizationStatistics: [1×1 struct]
                  ModelName: 'tiny-coco'

yoloXDetect エントリポイント関数

yoloXDetect エントリポイント関数は、trainedPCBDefectDetectorYOLOX.mat ファイルの深層学習ネットワークを使用し、入力イメージに対して検出器を実行します。エントリポイント関数は、以下の操作を実行します。

  • myDetector という名前の永続変数を定義します。永続変数により、yoloXDetect 関数への後続の呼び出し中にネットワーク オブジェクトが再構築および再読み込みされるのを防ぎます。

  • vision.loadYOLOXObjectDetector (Computer Vision Toolbox)関数を使用して、ファイル trainedYoloxObjectDetector.mat 内の検出器を myDetector 変数に読み込みます。

  • 検出器を使用して、入力テスト イメージ img 上のオブジェクトの境界ボックス、スコア、およびラベルを検出します。

type("yoloXDetect.m")
function [bboxes,scores,labels] = yoloXDetect(image,matFile)

% Copyright 2023 The MathWorks, Inc.

persistent myDetector;

if isempty(myDetector)
    myDetector = vision.loadYOLOXObjectDetector(matFile);
end

% Call to detect method
[bboxes,scores,labels] = detect(myDetector,image,Threshold = 0.6, ...
    AutoResize = 1);

yoloXDetect エントリポイント関数の評価

yoloXDetect エントリポイント関数を評価し、結果を表示します。この例では既定で、サンプル イメージとして 01_missing_hole_01.jpg を使用します。このイメージでは、PCB にホール欠損があります。

sampleImage = imread("01_missing_hole_01.jpg");
sampleImage = imresize(sampleImage,[400 800]);
[bboxes,~,labels] = yoloXDetect(sampleImage,matFile);
labels = cellstr(labels);
defectsImage = insertObjectAnnotation(sampleImage,"rectangle",bboxes,labels);
imshow(defectsImage)
title("Predicted Defects - MATLAB Simulation")

MEX 関数の生成

yoloXDetect エントリポイント関数用の MEX 関数を生成するには、MEX ターゲット用のコード構成オブジェクトを作成し、ターゲット言語を C++に設定します。coder.DeepLearningConfig関数を使用して MKL-DNN 深層学習構成オブジェクトを作成し、それをコード構成オブジェクトの DeepLearningConfig プロパティに割り当てます。

cfg = coder.config("mex");
cfg.TargetLang = "C++";
cfg.DeepLearningConfig = coder.DeepLearningConfig("mkldnn");
inputArgs = {coder.typeof(uint8(0),[inf inf 3],[1 1 0]),coder.Constant(matFile)};
codegen -config cfg -args inputArgs yoloXDetect -report
Code generation successful: View report

CPU での PCB 欠陥検出の実行

生成された MEX ファイル yoloXDetect_mex を呼び出すことで、テスト イメージ内の境界ボックス、ラベル、およびクラス固有の信頼度スコアを予測します。

[bboxes,~,labels] = yoloXDetect_mex(sampleImage,matFile);

結果を表示します。

labels = cellstr(labels);
defectsImage = insertObjectAnnotation(sampleImage,"rectangle",bboxes,labels);
imshow(defectsImage)
title("Predicted Defects - CPU MEX")

CUDA MEX の生成

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

cfg = coder.gpuConfig("mex");
cfg.TargetLang = "C++";
cfg.DeepLearningConfig = coder.DeepLearningConfig("tensorrt");
inputArgs = {coder.typeof(uint8(0),[inf inf 3],[1 1 0]),coder.Constant(matFile)};
codegen -config cfg -args inputArgs yoloXDetect -report
Code generation successful: View report

GPU での PCB 欠陥検出の実行

生成された MEX ファイル yoloXDetect_mex を呼び出すことで、テスト イメージ内の境界ボックス、ラベル、およびクラス固有の信頼度スコアを予測します。

[bboxes,~,labels] = yoloXDetect_mex(sampleImage,matFile);

結果を表示します。

labels = cellstr(labels);
defectsImage = insertObjectAnnotation(sampleImage,"rectangle",bboxes,labels);
imshow(defectsImage)
title("Predicted Defects - CUDA MEX")

参考文献

[1] Ge, Zheng, Songtao Liu, Feng Wang, Zeming Li, and Jian Sun. "YOLOX: Exceeding YOLO Series in 2021", arXiv, August 6, 2021. https://arxiv.org/abs/2107.08430.

[2] Huang, Weibo, and Peng Wei. "A PCB Dataset for Defects Detection and Classification." Preprint, submitted January 23, 2019. https://arxiv.org/abs/1901.08204.

[3] PCB-DATASET. Accessed December 20, 2022. https://github.com/Ironbrotherstyle/PCB-DATASET.

参考

関数

オブジェクト

トピック