メインコンテンツ

深層学習を使用した SAR ターゲット分類

R2021b 以降

この例では、深層学習を使用して SAR ターゲットを分類するための、シンプルな畳み込みニューラル ネットワークの作成と学習を行う方法を示します。

深層学習は、ロバストな分類器に学習させるために使用できる強力な手法です。その有効性は、イメージ解析から自然言語処理まで、多様な分野で実証されています。これらの発展は、SAR データ解析および SAR 技術全般にとって大きな可能性を秘めており、徐々に現実のものとなりつつあります。SAR 関連のアルゴリズムにおける長年の主要な課題は、オブジェクト検出と分類であり、これは自動標的認識 (ATR) と呼ばれています。ここでは、Deep Learning Toolbox™ を使用し、シンプルな畳み込みニューラル ネットワークを使用して SAR ターゲットの学習と分類を行いました。

Deep Learning Toolbox は、アルゴリズム、事前学習済みモデル、およびアプリを使って、深層ニューラル ネットワークを設計および実装するためのフレームワークを提供します。

この例では、以下を実行する方法を示します。

  • データ セットのダウンロード。

  • イメージ データの読み込みと解析。

  • データの分割と拡張。

  • ネットワーク アーキテクチャの定義。

  • ネットワークの学習。

  • 新しいデータのラベルの予測と分類精度の計算。

このワークフローを説明するために、米国空軍研究所が公開した移動および静止目標捕捉および認識 (MSTAR) Mixed Targets データセットを使用します [1]。ここでの目標は、SAR イメージに基づいて地上ターゲットを分類するモデルを開発することです。

データ セットのダウンロード

この例では、7 台の地上車両から取得した 8688 枚の SAR イメージとキャリブレーション ターゲットが格納されている、MSTAR ターゲット データセットを使用します。データは、X バンド センサーのスポットライト モードを使用し、1 フィートの分解能で収集されました。使用したターゲットの種類は、BMP2 (歩兵戦闘車)、BTR70 (装甲車)、および T72 (戦車) です。イメージは、15 度と 17 度の 2 つの異なる俯角で撮影されており、190 ~ 300 の異なる縦横比のバージョンがあり、360 度全方位をカバーしています。これら 3 種類のターゲットとその複製ターゲットの光学イメージと SAR イメージを、下の図に示します。

この例の終わりに定義されている helperDownloadMSTARTargetData 補助関数を使用して、指定された URL からデータセットをダウンロードします。データ セットのサイズは 28 MiB です。

outputFolder = pwd;
dataURL = ['https://ssd.mathworks.com/supportfiles/radar/data/' ...
    'MSTAR_TargetData.tar.gz'];
helperDownloadMSTARTargetData(outputFolder,dataURL);

インターネット接続の速度によっては、ダウンロード プロセスに時間がかかることがあります。このコードは、ダウンロード プロセスが完了するまで、MATLAB® の実行を一時停止します。または、Web ブラウザーを使用してデータ セットをローカル ディスクにダウンロードし、ファイルを抽出することもできます。その場合は、コード内の outputFolder 変数を、ダウンロードしたファイルの場所に変更します。

イメージ データの読み込みと解析

SAR イメージ データをイメージ データストアとして読み込みます。imageDatastoreはフォルダー名に基づいてイメージに自動的にラベルを付け、データを imageDatastore オブジェクトとして保存します。イメージ データストアを使用すると、メモリに収まらないデータなどの大きなイメージ データを格納し、畳み込みニューラル ネットワークの学習中にイメージをバッチ単位で効率的に読み取ることができます。

sarDatasetPath = fullfile(pwd,'Data');
imds = imageDatastore(sarDatasetPath, ...
    'IncludeSubfolders',true,'LabelSource','foldernames');

MSTAR データセットには、7 台の地上車両とキャリブレーション ターゲットからの SAR リターンが含まれています。これら 8 つのターゲットの光学イメージと SAR イメージを以下に示します。

いくつかのチップ イメージをランダムに表示して、データストアを調べてみましょう。

rng(0)
figure
% Shuffle the datastore.
imds = shuffle(imds);
for i = 1:20
    subplot(4,5,i)
    img = read(imds);
    imshow(img)
    title(imds.Labels(i))
    sgtitle('Sample training images')
end

imds 変数には、イメージと、各イメージに関連付けられたカテゴリ ラベルが含まれています。ラベルはイメージ ファイルのフォルダー名から自動的に割り当てられます。countEachLabel を使用して、カテゴリごとのイメージ数を集計します。

labelCount = countEachLabel(imds)
labelCount=8×2 table
         2S1    1164
      BRDM_2    1415
      BTR_60     451
          D7     573
       SLICY    2539
         T62     572
      ZIL131     573
    ZSU_23_4    1401

最初に、ネットワーク入力サイズを指定します。ネットワークの入力サイズを選択する際は、システムのメモリ制約と、学習時に発生する計算コストを考慮します。

imgSize = [128,128,1];

学習、検証、テスト用のデータストア オブジェクトの作成

データを学習セット、検証セット、テスト セットに分割します。データセットの 80% を学習に、10% を学習中のモデル検証に、10% を学習後のテストに使用します。splitEachLabel は、データストア imdsimdsTrainimdsValidation、および imdsTest という 3 つの新しいデータストアに分割します。その際、クラスごとにイメージ数が異なることを考慮し、学習セット、検証セット、およびテスト セットにおいて、各クラスのイメージの割合が同じになるようにします。

trainingPct = 0.8;
validationPct = 0.1;
[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,...
    trainingPct,validationPct,'randomize');

データ拡張

データストア内のイメージのサイズは一定ではありません。イメージをネットワークに学習させるには、イメージのサイズがネットワークの入力層のサイズと一致していなければなりません。イメージのサイズ変更を自分で行う代わりに、augmentedImageDatastore を使用できます。これは、イメージをネットワークに渡す前に自動的にサイズ変更します。augmentedImageDatastore は、入力イメージに対して回転、反転、スケーリングなどの変換を適用するためにも使用できます。これは、データに対するネットワークの過適合を防ぐのに役立ちます。

auimdsTrain = augmentedImageDatastore(imgSize, imdsTrain);
auimdsValidation = augmentedImageDatastore(imgSize, imdsValidation);
auimdsTest = augmentedImageDatastore(imgSize, imdsTest);

ネットワーク アーキテクチャの定義

畳み込みニューラル ネットワーク アーキテクチャを定義します。

layers = createNetwork(imgSize);

ネットワークの学習

ネットワーク構造を定義した後、trainingOptions (Deep Learning Toolbox)を使用して学習オプションを指定します。初期学習率を 0.001 としたモーメンタム項付き確率的勾配降下法 (SGDM) を使用して、ネットワークに学習させます。エポックの最大数を 3 に設定します。エポックとは、学習データ セット全体の完全な学習サイクルのことです。検証データと検証頻度を指定して、学習中にネットワークの精度を監視します。すべてのエポックでデータをシャッフルします。学習データでネットワークに学習させ、学習中に一定の間隔で検証データに対してその精度を計算します。検証データは、ネットワークの重みの更新には使用されません。'CheckpointPath' を一時的な場所に設定します。これにより、学習プロセス中に部分的に学習させた検出器を保存できます。停電やシステム障害などで学習が中断された場合に、保存したチェックポイントから学習を再開できます。

options = trainingOptions('sgdm', ...
    'InitialLearnRate',0.001, ...
    'MaxEpochs',3, ...
    'Shuffle','every-epoch', ...
    'MiniBatchSize',48,...
    'ValidationData',auimdsValidation, ...
    'ValidationFrequency',15, ...
    'Verbose',false, ...
    'CheckpointPath',tempdir,...
    'Plots','training-progress',...
    'Metrics','accuracy');

layers、学習データ、および学習オプションによって定義されたアーキテクチャを使用して、ネットワークに学習させます。既定では、trainnet は利用可能な GPU がある場合にそれを使用します (Parallel Computing Toolbox™、および CUDA® に対応した Compute Capability 3.0 以上の GPU が必要)。サポートされている Compute Capability の詳細については、リリースごとの GPU サポート (Parallel Computing Toolbox) を参照してください。そうでない場合は CPU が使用されます。trainingOptions の名前と値のペアの引数 'ExecutionEnvironment' を使用して、実行環境を指定することもできます。

学習の進行状況プロットには、ミニバッチの損失と精度、および検証の損失と精度が表示されます。学習の進行状況プロットの詳細は、深層学習における学習の進行状況の監視 (Deep Learning Toolbox)を参照してください。損失はクロスエントロピー損失です。精度は、ネットワークによって正しく分類されるイメージの割合です。

net = trainnet(auimdsTrain,layers,"crossentropy",options);

学習プロセスは上のイメージに示されています。上のプロットの濃い青色の線は、学習データに対するモデルの精度を示し、黒い破線は、検証データ (学習データとは別) に対するモデルの精度を示しています。検証精度は 90% を十分に超えており、8 クラス分類器としては非常に優秀です。さらに、検証精度と学習精度がほぼ同じであることに注目してください。これは、ロバストな分類器が得られていることを示しています。学習精度が検証精度よりも大幅に高い場合、モデルは学習データに対して過適合 (つまり丸暗記) を起こしています。

テスト イメージの分類と精度の計算

学習済みのネットワークを使用して検証データのラベルを予測し、最終的な精度を計算します。精度とは、ネットワークによって予測が正しく行われるラベルの割合です。

classNames = unique(imds.Labels);
scores = minibatchpredict(net,auimdsTest);
YPred = scores2label(scores,classNames);
YTest = imdsTest.Labels;

accuracy = sum(YPred == YTest)/numel(YTest)
accuracy = 
0.9827

テスト精度は検証精度と非常に近く、モデルの予測能力は信頼できるといえます。

混同行列を使用することで、モデルの分類動作をより詳細に調査することができます。中心の対角線が強調されているほど、予測精度が高いことを示します。対角線以外には、小さくランダムな値が現れていることが理想的です。対角線外に大きな値がある場合、モデルの機能を阻害する特定のシナリオがあることを示している可能性があります。

figure
cm = confusionchart(YTest,YPred);
cm.RowSummary = 'row-normalized';
cm.Title = 'SAR Target Classification Confusion Matrix';

8 つのクラスの中で、モデルは ZSU-23/4 を正しく分類することに最も苦戦しているようです。ZSU-23/4 と 2S1 の SAR イメージは非常に似ているため、学習済みモデルによる誤分類がいくつか見られます。しかし、それでもこのクラスに対して 90% 以上の精度を達成することができています。

補助関数

関数 createNetwork は、入力イメージ サイズ imgSize を入力として受け取り、畳み込みニューラル ネットワークを返します。各層タイプの機能については、以下の説明を参照してください。

イメージ入力層imageInputLayer (Deep Learning Toolbox)には、イメージ サイズを指定します。これらの数値は、高さ、幅、およびチャネル サイズに対応します。SAR イメージ データはグレースケール イメージで構成されるため、チャネル サイズ (カラー チャネル) は 1 です。カラー イメージの場合、RGB 値に対応してチャネル サイズは 3 になります。データは、trainnet により既定で学習の開始時にシャッフルされるため、シャッフルの必要はありません。学習時の各エポックの開始時にも、trainnet によりデータは自動的にシャッフルされます。

畳み込み層 — 畳み込み層の最初の引数は filterSize です。これは、イメージのスキャン時に学習関数によって使用されるフィルターの高さと幅を示します。この例では、3 という数字によってフィルター サイズが 3 x 3 であることを示しています。フィルターの高さと幅には異なるサイズを指定できます。2 つ目の引数 numFilters はフィルターの数です。これは、入力の同じ領域に結合するニューロンの数を示します。このパラメーターによって、特徴マップの数が決定されます。名前と値のペア 'Padding' を使用して、入力の特徴マップにパディングを追加します。既定のストライドが 1 の畳み込み層の場合、'same' パディングによって空間の出力サイズが入力サイズと同じになります。convolution2dLayer (Deep Learning Toolbox)の名前と値のペアの引数を使用して、この層のストライドと学習率を定義することもできます。

バッチ正規化層 — バッチ正規化層は、ネットワークを通じて伝播される活性化と勾配を正規化します。これにより、ネットワークの学習は簡単な最適化問題になります。畳み込み層の間にあるバッチ正規化層と、ReLU 層などの非線形性を使用して、ネットワークの学習速度を上げ、ネットワークの初期化に対する感度を下げます。batchNormalizationLayer (Deep Learning Toolbox) を使用して、バッチ正規化層を作成します。

ReLU 層 — バッチ正規化層の後に非線形活性化関数が続きます。最も一般的な活性化関数は、正規化線形ユニット (ReLU) です。reluLayer (Deep Learning Toolbox) を使用して、ReLU 層を作成します。

最大プーリング層 — 畳み込み層 (と活性化関数) の後で、ダウンサンプリング処理を行うことがあります。これにより、特徴マップの空間サイズが縮小され、冗長な空間情報が削除されます。ダウンサンプリングでは、層ごとに必要な計算量を増やさずに、より深い畳み込み層のフィルターの数を増やすことができます。ダウンサンプリングの 1 つの方法が最大プーリングの使用です。これは、maxPooling2dLayer (Deep Learning Toolbox) を使用して作成します。最大プーリング層は、最初の引数 poolSize によって指定された、入力の矩形領域の最大値を返します。この例では、矩形領域のサイズは [2,2] です。名前と値のペアの引数 'Stride' は、入力に沿ってスキャンするときに学習関数が取るステップ サイズを指定します。

全結合層 — 畳み込み層とダウンサンプリング層の後には、1 つ以上の全結合層を配置します。その名前からわかるように、全結合層はニューロンが前の層のすべてのニューロンに結合している層です。この層は、前の層によってイメージ全体で学習されたすべての特徴を組み合わせて、より大きなパターンを特定します。最後の全結合層は、これらの特徴を組み合わせてイメージを分類します。そのため、最後の全結合層の OutputSize パラメーターは、ターゲット データのクラスの数と等しくなります。この例では、10 個のクラスに対応して、出力サイズが 10 になっています。fullyConnectedLayer (Deep Learning Toolbox) を使用して、全結合層を作成します。

ソフトマックス層 — 最後の層はソフトマックス活性化層です。ソフトマックス活性化関数は、全結合層の出力を正規化します。ソフトマックス層の出力は合計が 1 になる正の数値で構成されており、分類の確率として使用できます。最後の全結合層の後に関数 softmaxLayer (Deep Learning Toolbox) を使用してソフトマックス層を作成します。

function layers = createNetwork(imgSize)
    layers = [
        imageInputLayer([imgSize(1) imgSize(2) 1])      % Input Layer
        convolution2dLayer(3,32,'Padding','same')       % Convolution Layer
        reluLayer                                       % Relu Layer
        convolution2dLayer(3,32,'Padding','same')
        batchNormalizationLayer                         % Batch normalization Layer
        reluLayer
        maxPooling2dLayer(2,'Stride',2)                 % Max Pooling Layer
        
        convolution2dLayer(3,64,'Padding','same')
        reluLayer
        convolution2dLayer(3,64,'Padding','same')
        batchNormalizationLayer
        reluLayer
        maxPooling2dLayer(2,'Stride',2)
        
        convolution2dLayer(3,128,'Padding','same')
        reluLayer
        convolution2dLayer(3,128,'Padding','same')
        batchNormalizationLayer
        reluLayer
        maxPooling2dLayer(2,'Stride',2)
    
        convolution2dLayer(3,256,'Padding','same')
        reluLayer
        convolution2dLayer(3,256,'Padding','same')
        batchNormalizationLayer
        reluLayer
        maxPooling2dLayer(2,'Stride',2)
    
        convolution2dLayer(6,512)
        reluLayer
        
        dropoutLayer(0.5)                               % Dropout Layer
        fullyConnectedLayer(512)                        % Fully connected Layer.
        reluLayer
        fullyConnectedLayer(8)
        softmaxLayer                                    % Softmax Layer
        ];
end

function helperDownloadMSTARTargetData(outputFolder,DataURL)
% Download the data set from the given URL to the output folder.

    radarDataTarFile = fullfile(outputFolder,'MSTAR_TargetData.tar.gz');
    
    if ~exist(radarDataTarFile,'file')
        
        disp('Downloading MSTAR Target data (28 MiB)...');
        websave(radarDataTarFile,DataURL);
        untar(radarDataTarFile,outputFolder);
    end
end

参考文献

[1] MSTAR Dataset. https://www.sdms.afrl.af.mil/index.php?collection=mstar