YOLOX ネットワークを使用したプリント基板欠陥検出のためのコード生成
この例では、プリント基板 (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 展開
CUDA 対応の NVIDIA GPU ("必須")。
NVIDIA CUDA Toolkit およびドライバー ("オプション")。
NVIDIA TensorRT ライブラリ ("オプション")。
コンパイラおよびライブラリの環境変数。詳細については、サードパーティ ハードウェアおよび前提条件となる製品の設定 ("オプション") を参照してください。
メモ: 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.
参考
関数
coder.checkGpuInstall|codegen|coder.DeepLearningConfig|coder.loadDeepLearningNetwork|vision.loadYOLOXObjectDetector(Computer Vision Toolbox)
オブジェクト
coder.TensorRTConfig|coder.GpuCodeConfig|coder.gpuEnvConfig|yoloxObjectDetector(Computer Vision Toolbox)
トピック
- YOLOX ネットワークを使用したプリント基板の欠陥の検出 (Computer Vision Toolbox)
- YOLO v4 深層学習を使用したオブジェクト検出用のコード生成
- YOLO v3 深層学習ネットワークを使用したオブジェクト検出用のコード生成
- YOLO v2 を使用したオブジェクト検出のコードの生成
- オブジェクト検出のための YOLOX 入門 (Computer Vision Toolbox)