5G 信号および LTE 信号を識別するための深層学習によるスペクトル センシング
この例では、スペクトル監視のために、深層学習を使用してセマンティック セグメンテーション ネットワークに学習させる方法を示します。スペクトル監視の用途の 1 つは、スペクトル占有率を特徴付けることです。この例のニューラル ネットワークは、広帯域スペクトログラムに含まれる 5G NR および LTE の信号を識別するように学習させます。
はじめに
コンピューター ビジョンでは、セマンティック セグメンテーション手法を使用して、イメージまたはビデオ内のオブジェクトとその位置を識別します。無線信号処理において、対象オブジェクトは無線信号であり、オブジェクトの位置は信号が占める周波数と時間です。この例では、セマンティック セグメンテーション手法を無線信号に適用して、広帯域スペクトログラムに含まれるスペクトル コンテンツを識別します。
これ以降では、次を行います。
学習信号を生成します。
セマンティック セグメンテーション ネットワークを使用して、5G NR および LTE の信号を時間と周波数で識別します。ネットワークにゼロから学習させるか、事前学習済みのネットワークに転移学習を適用するかを選択できます。
合成信号を使用して学習済みネットワークをテストします。
SDR を使用し、無線 (OTA) 信号でネットワークをテストします。
関連する無線用 AI の例
この例は、次の完全な深層学習ワークフローの一部として使用します。
Capture and Label NR and LTE Signals for AI Training (Wireless Testbench)の例では、SDR を使用して 5G NR および LTE の信号の帯域幅をスキャン、キャプチャ、およびラベル付けする方法を示します。
この例では、広帯域スペクトログラムで 5G NR および LTE の信号を識別するためにセマンティック セグメンテーション ネットワークに学習させる方法を示します。
Identify LTE and NR Signals from Captured Data Using SDR and Deep Learning (Wireless Testbench)の例では、深層学習で学習させたセマンティック セグメンテーション ネットワークを使用して、SDR でキャプチャした無線データから NR および LTE の信号を識別する方法を示します。
上記の例の目的とするワークフローを図に示します。
学習データの生成
深層学習ドメインにおける無線信号の利点の 1 つは、信号が合成されるという事実です。また、信頼性の高いチャネルや RF 劣化モデルも用意されています。その結果、信号を収集して手動でラベル付けする代わりに、5G Toolbox™ を使用して 5G NR 信号を生成したり、LTE Toolbox™ の関数を使用して LTE 信号を生成したりできます。これらの信号を標準仕様のチャネル モデルに渡して、学習データを作成できます。
5G NR または LTE の信号のみを含むフレームをネットワークに学習させ、対象の帯域内でこれらの信号の周波数をランダムにシフトします。各フレームの長さは 40 ms で、持続時間は 40 サブフレームです。ネットワークは、5G NR または LTE の信号がフレーム時間全体で同じ帯域を占有することを前提としています。ネットワーク性能をテストするには、対象の帯域内のランダムな個別の帯域で 5G NR 信号と LTE 信号の両方を含むフレームを作成します。
61.44 MHz のサンプル レートを使用します。このレートは、最新の標準信号のほとんどを処理するのに十分であり、低コストのソフトウェア無線 (SDR) システムには、このレートでサンプリングして、約 50 MHz の有用な帯域幅を提供するものがあります。より広い帯域を監視するには、サンプル レートを上げ、学習フレームを再生成して、ネットワークに再学習させます。
関数 helperSpecSenseTrainingData
を使用して学習フレームを生成します。この関数は、関数 helperSpecSenseNRSignal
を使用して 5G NR 信号を生成し、関数 helperSpecSenseLTESignal
を使用して LTE 信号を生成します。次の表に、5G NR の可変信号パラメーターを示します。
次の表に、LTE の可変信号パラメーターを示します。
関数nrCDLChannel
(5G Toolbox)とlteFadingChannel
(LTE Toolbox)を使用して、チャネル劣化要因を追加します。チャネル構成の詳細については、関数 helperSpecSenseTrainingData
を参照してください。次の表に、チャネル パラメーターを示します。
関数 helperSpecSenseTrainingData
は、関数 helperSpecSenseSpectrogramImage
を使用して、複素ベースバンド信号からスペクトログラム イメージを作成します。4096 の FFT 長を使用してスペクトログラムを計算します。128×128 の RGB イメージを生成します。このイメージ サイズを使用することで、学習時に十分な大きさのイメージのバッチをメモリに収めながら、時間と周波数で十分な解像度を提供できます。GPU に十分なメモリがない場合は、イメージのサイズを小さくするか、学習バッチのサイズを小さくすることができます。
trainingDataSource
変数は、学習データをダウンロードするか生成するかを決定します。[Use downloaded data] を選択すると、学習データがダウンロードされます。[Generate training data] を選択すると、学習データが最初から生成されます。コンピューターの構成によっては、データの生成に数時間かかる場合があります。Intel® Xeon® W-2133 CPU @ 3.60GHz を搭載した PC を使用し、Parallel Computing Toolbox™ を使用して 6 つのワーカーで並列プールを作成する場合、学習データの生成に約 1 時間かかります。ネットワークに学習させるには、[Train network now] を選択します。このプロセスは、同じ PC と NVIDIA® Titan V GPU で約 8 分かかります。ネットワークの学習をスキップするには、[Use trained network] を選択します。代わりに、この例では学習済みネットワークをダウンロードします。
信号の各セットから 900 フレームを使用します。(5G NR のみ、LTE のみ、5G NR と LTE の両方)。システム パラメーターが取りうる値の数を増やす場合は、学習フレームの数を増やします。
imageSize
をイメージ サイズの cell 配列に設定します。指定したサイズごとに学習イメージのセットを生成します。この例では、128×128 の RGB イメージを使用して、セマンティック セグメンテーション ネットワークにゼロから学習させます。256×256 のイメージを使用して、事前学習済みのセマンティック セグメンテーション ネットワークに転移学習を適用します。
ダウンロードされる学習データには、LTE、5G、および 250 MHz 帯域にまたがる未知の信号のキャプチャ データ、前処理データ、ラベル付きデータも含まれます。詳細については、Capture and Label NR and LTE Signals for AI Training (Wireless Testbench)の例を参照してください。
imageSize = {[256 256], [128 128]}; % pixels sampleRate = 61.44e6; % Hz numSubFrames = 40; % corresponds to 40 ms frameDuration = numSubFrames*1e-3; % seconds trainDirRoot = fullfile(pwd,"TrainingData"); classNames = ["Noise" "NR" "LTE" "Unknown"]; trainingDataSource = "Downloaded data"; trainNow = false; useCapturedData = true; if trainingDataSource == "Generated data" numFramesPerStandard = 900; saveChannelInfo = false; helperSpecSenseTrainingData(numFramesPerStandard,classNames,imageSize, ... trainDirRoot,numSubFrames,sampleRate,saveChannelInfo); end
深層ニューラル ネットワークの選択
セマンティック セグメンテーション ネットワークにゼロから学習させるか、事前学習済みのセマンティック セグメンテーション ネットワークに転移学習を適用するかを選択できます。
カスタム ネットワークにゼロから学習させるには、
baseNetwork
を "custom" に設定します。カスタム ネットワークには、128×128 の RGB イメージを学習させます。転移学習を適用するには、
baseNetwork
を目的の事前学習済みのネットワーク アーキテクチャに設定します。事前学習済みのネットワークには、256×256 の RGB イメージを学習させます。
baseNetwork = 'custom'; if strcmp(baseNetwork,"custom") trainDir = fullfile(trainDirRoot,'128x128'); imageSize = [128 128]; else trainDir = fullfile(trainDirRoot,'256x256'); %#ok imageSize = [256 256]; end
選択に基づいて、学習データと学習済みネットワークのいずれかまたはその両方をダウンロードします。
helperSpecSenseDownloadData(trainingDataSource,trainNow,useCapturedData, ...
baseNetwork,imageSize)
Starting download of data files from: https://www.mathworks.com/supportfiles/spc/SpectrumSensing/SpectrumSensingTrainingData128x128.zip Extracting files. Extract complete. Files already exist. Skipping download and extract. Starting download of data files from: https://www.mathworks.com/supportfiles/spc/SpectrumSensing/SpectrumSensingCapturedData128x128.zip Extracting files. Extract complete.
学習データの読み込み
関数imageDatastore
を使用して、5G NR と LTE の信号のスペクトログラムを含む学習イメージを読み込みます。関数 imageDatastore
では、大規模なイメージ コレクションをディスクから効率的に読み込むことができます。スペクトログラム イメージは .png ファイルに保存されます。
folders = trainDir; if useCapturedData folders = [folders,fullfile(trainDir,"captured")]; end imds = imageDatastore(folders,FileExtensions=".png");
関数pixelLabelDatastore
(Computer Vision Toolbox)を使用して、スペクトログラムのピクセル ラベル イメージ データを読み込みます。各ピクセルは、"NR"、"LTE"、"Noise"、または "Unknown" のいずれかとしてラベル付けされます。ピクセル ラベル データストアは、ピクセル ラベル データとラベル ID をクラス名マッピングにカプセル化します。ピクセル ラベルは .hdf ファイルに保存されます。
numClasses = length(classNames); pixelLabelID = floor((0:numClasses-1)/(numClasses-1)*255); pxdsTruthLTENR = pixelLabelDatastore(folders,classNames,pixelLabelID,... FileExtensions=".hdf");
データセット統計の解析
学習データセット内のクラス ラベルの分布を確認するには、関数countEachLabel
(Computer Vision Toolbox)を使用してクラス ラベルごとにピクセル数をカウントし、クラスごとにピクセル カウントをプロットします。
tbl = countEachLabel(pxdsTruthLTENR); frequency = tbl.PixelCount/sum(tbl.PixelCount); figure bar(1:numel(classNames),frequency) grid on xticks(1:numel(classNames)) xticklabels(tbl.Name) xtickangle(45) ylabel("Frequency")
観測値の数がすべてのクラスで等しいことが理想的です。ただし、無線信号では、学習セット内のクラスが不平衡になるのが一般的です。5G NR 信号は、LTE 信号よりも帯域幅が広く、背景がノイズで埋め尽くされる可能性があります。優勢なクラスに学習が偏るため、クラスごとの観測数の不平衡が学習プロセスに悪影響を及ぼす可能性があります。クラス加重を使用したクラスのバランス調整のセクションでは、クラス加重を使用して、クラスごとの観測数の不平衡によって生じる偏りを緩和します。
学習セット、検証セット、およびテスト セットの準備
深層ニューラル ネットワークは、データセットの信号イメージの 80% を学習に使用し、イメージの 10% を検証に使用し、イメージの 10% をテストに使用します。関数 helperSpecSensePartitionData
は、イメージとピクセル ラベルのデータを学習セット、検証セット、およびテスト セットにランダムに分割します。
[imdsTrain,pxdsTrain,imdsVal,pxdsVal,imdsTest,pxdsTest] = ...
helperSpecSensePartitionData(imds,pxdsTruthLTENR,[80 10 10]);
cdsTrain = combine(imdsTrain,pxdsTrain);
cdsVal = combine(imdsVal,pxdsVal);
cdsTest = combine(imdsTest,pxdsTest);
変換を適用して、イメージとピクセル ラベル データを目的のサイズに変更します。
cdsTrain = transform(cdsTrain, @(data)preprocessTrainingData(data,imageSize)); cdsVal = transform(cdsVal, @(data)preprocessTrainingData(data,imageSize)); cdsTest = transform(cdsTest, @(data)preprocessTrainingData(data,imageSize));
深層ニューラル ネットワークの学習
ネットワークにゼロから学習させるか、転移学習を適用するかを選択できます。
シンプルなセマンティック セグメンテーション ネットワークの設計
このセクションでは、シンプルなセマンティック セグメンテーション ネットワークを設計します。代わりに事前学習済みネットワークで転移学習を使用する場合は、このセクションをスキップして、転移学習に事前学習済みのネットワークを使用に進むことができます。
セマンティック セグメンテーション ネットワークの共通パターンでは、畳み込み層と ReLU 層の間でイメージをダウンサンプリングした後、入力サイズを一致させるために出力をアップサンプリングする必要があります。このプロセス中、ネットワークはセグメント化するクラスの特定のセットに対して最適化されている非線形フィルターを使用して演算を実行します。
まず、入力イメージ層を定義します。
inputSize = [imageSize(1) imageSize(2) 3]; imgLayer = imageInputLayer(inputSize);
次に、畳み込み層と ReLU 層で構成されるダウンサンプリング ネットワークを定義します。畳み込み層の出力サイズが入力サイズと同じになるように、畳み込み層のパディングが選択されています。これによって、ネットワークで処理を進める間、ほとんどの層間の入力サイズと出力サイズが変わらないため、ネットワークが作成しやすくなります。
ダウンサンプリングは、最大プーリング層を使用して実行されます。'Stride
' パラメーターを 2 に設定することで、入力を 2 の係数でダウンサンプリングする最大プーリング層を作成します。
filterSize = 3; numFilters = 128; conv = convolution2dLayer(filterSize,numFilters,'Padding',1); relu = reluLayer(); poolSize = 2; maxPoolDownsample2x = maxPooling2dLayer(poolSize,'Stride',2);
畳み込み層、ReLU 層および最大プール層を積み重ねて、その入力を 16 分の 1 にダウンサンプリングするネットワークを作成します。
downsamplingLayers = [ conv relu maxPoolDownsample2x conv relu maxPoolDownsample2x conv relu maxPoolDownsample2x conv relu maxPoolDownsample2x ];
次に、アップサンプリング ネットワークを作成します。アップサンプリングは、転置畳み込み層 (一般的には "deconv" または "逆畳み込み" 層とも呼ばれる) を使用して実行されます。転置畳み込みがアップサンプリングに使用されている場合、アップサンプリングとフィルター処理が同時に実行されます。
2 でアップサンプリングする転置畳み込み層を作成します。
filterSize = 4; transposedConvUpsample2x = transposedConv2dLayer(filterSize,numFilters, ... 'Stride',2,'Cropping',1);
出力サイズが入力サイズの 2 倍になるよう 'Cropping' パラメーターが 1 に設定されています。
転置畳み込み層と ReLU 層を積み重ねます。この層のセットへの入力は 16 倍にアップサンプリングされます。
upsamplingLayers = [ transposedConvUpsample2x relu transposedConvUpsample2x relu transposedConvUpsample2x relu transposedConvUpsample2x relu ];
最終的な層のセットは、ピクセル分類の作成を行います。これらの最終層は、入力イメージと同じ空間次元 (高さと幅) を持つ入力を処理します。ただし、チャネル数 (3 番目の次元) は大きく、最後の転置畳み込み層フィルター数と同じになります。この 3 つ目の次元を、セグメント化するクラス数まで絞り込む必要があります。これを実行するには、フィルターの数がクラス数 (ここでは 3) と一致する 1 行 1 列の畳み込み層を使用します。
入力特徴マップの 3 番目の次元をクラス数まで結合する畳み込み層を作成します。
conv1x1 = convolution2dLayer(1,numClasses);
この 1 行 1 列の畳み込み層の後に、ソフトマックス層と分類層が続きます。これらの 2 つの層が結合されて、各イメージ ピクセルのカテゴリカル ラベルが予測されます。
finalLayers = [ conv1x1 softmaxLayer() ];
すべての層を積み重ねて、セマンティック セグメンテーション ネットワークを完成させます。
layers = [ imgLayer downsamplingLayers upsamplingLayers finalLayers ];
転移学習に事前学習済みのネットワークを使用
ネットワークにゼロから学習させる代わりに、一般的なセマンティック セグメンテーション ネットワークに転移学習を適用できます。
転移学習を適用するには、関数deeplabv3plus
(Computer Vision Toolbox)を使用してセマンティック セグメンテーション ニューラル ネットワークを作成します。ベース ネットワークとしてresnet50
(Deep Learning Toolbox)を選択し (baseNetwork
の値を設定)、入力イメージ サイズ (時間軸と周波数軸を表すために使用されるピクセル数) とクラス数を指定します。Deep Learning Toolbox™ Model for ResNet-50 Network サポート パッケージがインストールされていない場合、関数によってアドオン エクスプローラーに必要なサポート パッケージへのリンクが表示されます。サポート パッケージをインストールするには、リンクをクリックして、[インストール] をクリックします。コマンド ラインで resnet50
と入力して、インストールが正常に終了していることを確認します。必要なサポート パッケージがインストールされている場合、関数によってdlnetwork オブジェクトを使用した予測の実行 (Deep Learning Toolbox)オブジェクトが返されます。
if ~strcmp(baseNetwork,"custom") layers = deeplabv3plus([256 256],numel(classNames),baseNetwork);%#ok end
クラス加重を使用したクラスのバランス調整
学習セット内のクラスのバランスがとれていない場合、学習を改善するために、クラス加重を使用してクラスのバランスを調整することができます。前に関数 countEachLabel
で計算したピクセル ラベルのカウントを使用して、中央頻度のクラスの重みを計算します。
imageFreq = tbl.PixelCount ./ tbl.ImagePixelCount; classWeights = median(imageFreq) ./ imageFreq; classWeights = classWeights/(sum(classWeights)+eps(class(classWeights)));
学習オプションの選択
関数trainingOptions
(Deep Learning Toolbox)を使用して学習を構成し、モーメンタム項付き確率的勾配降下 (SGDM) 最適化アルゴリズムおよび SGDM に使用されるハイパーパラメーターを指定します。ネットワークから最高のパフォーマンスを得るために、実験マネージャー (Deep Learning Toolbox)を使用して学習オプションを最適化できます。
mbs = 40; opts = trainingOptions("sgdm",... MiniBatchSize = mbs,... MaxEpochs = 20, ... LearnRateSchedule = "piecewise",... InitialLearnRate = 0.02,... LearnRateDropPeriod = 10,... LearnRateDropFactor = 0.1,... ValidationData = cdsVal,... ValidationPatience = 5,... Shuffle="every-epoch",... OutputNetwork = "best-validation-loss",... Plots = 'training-progress');
結合された学習データ ストア cdsTrain
を使用してネットワークに学習させます。結合された学習データ ストアには、単一の信号フレームと真のピクセル ラベルが含まれます。加重クロスエントロピー損失と共にカスタム正規化を使用して、学習中にネットワークを更新します。損失関数crossentropy
(Deep Learning Toolbox)を使用してカスタム損失関数 lossFunction を定義し、カスタム正規化を適用します。
if trainNow [net,trainInfo] = trainnet(cdsTrain,layers, ... @(ypred,ytrue) lossFunction(ypred,ytrue,classWeights),opts); save(sprintf('myNet_%s_%s',baseNetwork, ... datetime('now',format='yyyy_MM_dd_HH_mm')), 'net') else net = loadNetworkFromMATFile(baseNetwork); %#ok end
深層ニューラル ネットワークのテスト
5G NR 信号と LTE 信号の両方を含む信号を使用して、ネットワーク信号の識別性能をテストします。関数semanticseg
(Computer Vision Toolbox)を使用して、テスト データ セット内のスペクトログラム イメージのピクセル推定値を取得します。関数evaluateSemanticSegmentation
(Computer Vision Toolbox)を使用してさまざまなメトリクスを計算し、セマンティック セグメンテーションの結果の品質を評価します。
dataDir = fullfile(trainDir,"LTE_NR"); imdsLTENR = imageDatastore(dataDir,FileExtensions=".png"); pxdsResultsLTENR = semanticseg(imdsLTENR,net,MinibatchSize=mbs,WriteLocation=tempdir, ... Classes=classNames); pxdsTruthLTENR = pixelLabelDatastore(dataDir,classNames,pixelLabelID,... FileExtensions=".hdf"); metrics = evaluateSemanticSegmentation(pxdsResultsLTENR,pxdsTruthLTENR);
すべてのテスト フレームの正規化混同行列をプロットします。
cm = confusionchart(metrics.ConfusionMatrix.Variables, ... classNames, Normalization='row-normalized'); cm.Title = 'Confusion Matrix - Synthetic';
学習データの生成セクションで、取得したデータを使用することを選択した場合、取得したデータのみを使用してテストします。
if useCapturedData capturedIdx = contains(imdsTest.Files,'captured'); imdsTestCaptured = subset(imdsTest,capturedIdx); pxdsTestCaptured = subset(pxdsTest,capturedIdx);
テスト セット内のキャプチャ データを含むフレームのみを考慮して、同じプロセスを繰り返します。
pxdsResultsCaptured = semanticseg(imdsTestCaptured,net,MinibatchSize=mbs,WriteLocation=tempdir, ...
Classes=classNames);
metrics = evaluateSemanticSegmentation(pxdsResultsCaptured,pxdsTestCaptured);
正規化混同行列を再プロットします。
cm = confusionchart(metrics.ConfusionMatrix.Variables, ... classNames, Normalization="row-normalized"); cm.Title = "Normalized Confusion Matrix";
混同行列は、ネットワークが NR 信号をノイズまたは未知の信号と混同していることを示しています。キャプチャ信号を調べると、ファイル プレフィックス CF3550 のキャプチャ信号の SNR が非常に低く、ネットワークが信号をうまく識別できていないことがわかります。
CF3550Indices = contains(imdsTestCaptured.Files,'CF3550'); idx = find(CF3550Indices,1); rcvdSpectrogram = readimage(imdsTestCaptured,idx); trueLabels = readimage(pxdsTestCaptured,idx); predictedLabels = readimage(pxdsResultsCaptured,idx); figure helperSpecSenseDisplayResults(rcvdSpectrogram,trueLabels,predictedLabels, ... classNames,250e6,0,frameDuration)
キャプチャ データを使用 (ただし、CF3550 フレームは除外) してテストします。
imdsTestCaptured2 = subset(imdsTestCaptured,~CF3550Indices);
pxdsTestCaptured2 = subset(pxdsTestCaptured,~CF3550Indices);
pxdsResultsCaptured2 = semanticseg(imdsTestCaptured2,net,MinibatchSize=mbs,WriteLocation=tempdir, ...
Classes=classNames);
metrics = evaluateSemanticSegmentation(pxdsResultsCaptured2,pxdsTestCaptured2);
正規化混同行列を再プロットします。
figure cm = confusionchart(metrics.ConfusionMatrix.Variables, ... classNames, Normalization="row-normalized"); cm.Title = "Normalized Confusion Matrix"; end
NR 検出率が 99% を超えるようになりました。
スペクトログラムに含まれる 5G NR 信号および LTE 信号の識別
キャプチャ信号の受信スペクトル、真のラベル、および予測ラベルを可視化します。
if useCapturedData signals = find(~CF3550Indices); numSignals = length(signals); idx = 13; rcvdSpectrogram = readimage(imdsTestCaptured,signals(idx)); trueLabels = readimage(pxdsTestCaptured,signals(idx)); predictedLabels = readimage(pxdsResultsCaptured,signals(idx)); else numSignals = length(imdsLTENR.Files); idx = 14; rcvdSpectrogram = readimage(imdsLTENR,idx); trueLabels = readimage(pxdsTruthLTENR,idx); predictedLabels = readimage(pxdsResultsLTENR,idx); end figure helperSpecSenseDisplayResults(rcvdSpectrogram,trueLabels,predictedLabels, ... classNames,250e6,0,frameDuration) figure helperSpecSenseDisplayIdentifiedSignals(rcvdSpectrogram,predictedLabels, ... classNames,250e6,0,frameDuration)
SDR を使用してキャプチャしたデータのテスト
SDR を使用した無線信号キャプチャを使用して、学習済みネットワークの性能をテストします。近くの基地局を見つけて、識別したい信号の帯域をカバーするようにラジオの中心周波数を調整します。この例では、中心周波数を 2.35 GHz に設定します。少なくとも 1 つの ADALM-PLUTO 無線機があり、Communication Toolbox Support Package for ADALM-PLUTO Radio がインストールされている場合は、コードの以下のセクションを実行できます。ADALM-PLUTO 無線機にアクセスできない場合のために、この例では、キャプチャ信号と学習済みネットワークを使用して実施したテストの結果を示しています。
Wireless Testbench の例Identify LTE and NR Signals from Captured Data Using SDR and Deep Learning (Wireless Testbench)を使用して、広帯域信号でテストします。
runSDRSection = false; if helperIsPlutoSDRInstalled() radios = findPlutoRadio(); if length(radios) >= 1 runSDRSection = true; else disp("At least one ADALM-PLUTO radios is needed. Skipping SDR test.") end else disp("Communications Toolbox Support Package for Analog Devices ADALM-PLUTO Radio not found.") disp("Click Add-Ons in the Home tab of the MATLAB toolstrip to install the support package.") disp("Skipping SDR test.") end if runSDRSection % Set up PlutoSDR receiver rx = sdrrx('Pluto'); rx.CenterFrequency = 2.35e9; rx.BasebandSampleRate = sampleRate; rx.SamplesPerFrame = frameDuration*rx.BasebandSampleRate; rx.OutputDataType = 'single'; rx.EnableBurstMode = true; rx.NumFramesInBurst = 1; Nfft = 4096; overlap = 10; meanAllScores = zeros([imageSize numel(classNames)]); segResults = zeros([imageSize 10]); for frameCnt=1:10 rxWave = rx(); rxSpectrogram = helperSpecSenseSpectrogramImage(rxWave,Nfft,sampleRate,imageSize); [segResults(:,:,frameCnt),scores,allScores] = semanticseg(rxSpectrogram,net); meanAllScores = (meanAllScores*(frameCnt-1) + allScores) / frameCnt; end release(rx) [~,predictedLabels] = max(meanAllScores,[],3); figure helperSpecSenseDisplayResults(rxSpectrogram,[],predictedLabels,classNames,... sampleRate,rx.CenterFrequency,frameDuration) figure freqBand = helperSpecSenseDisplayIdentifiedSignals(rxSpectrogram,predictedLabels,... classNames,sampleRate,rx.CenterFrequency,frameDuration) else figure imshow('lte_capture_result1.png') figure imshow('lte_capture_result2.png') figure imshow('nr_capture_result1.png') figure imshow('nr_capture_result2.png') end
まとめとその他の調査
学習済みネットワークは、実際の基地局からの 2 つの取得例を含む 5G NR と LTE の信号を区別できます。ネットワークは、取得されたすべての信号を正しく識別できない場合があります。このような場合、より典型的な合成信号を生成するか無線信号を取得し、それらを学習セットに含めて、学習データを強化します。初期状態はランダムなので、異なるネットワークでは学習後に取得される結果がここで説明した結果と異なる可能性があります。
ネットワーク構造が異なると、検出の精度も異なります。次の表は、カスタム、ResNet-18、MobileNetv2、および ResNet-50 (それぞれ 140 万、2060 万、4390 万、および 4690 万の学習可能パラメーターをもつ) の検出精度の結果を示しています。検出精度の結果は、テスト セット全体に対するもの、合成信号のみに対するもの、およびキャプチャ信号のみに対するものです。全体テストとキャプチャのみのテストには、テスト セットからの信号が含まれます。合成テストには、学習には使用されない、LTE_NR ディレクトリ内の生成信号が含まれます。ネットワークの複雑度が増すと精度は向上します。しかし、学習可能なパラメーターが 1/20 未満であるこのカスタム ネットワークでは、MobileNetv2 と比較して、キャプチャした NR 信号の検出精度が約 10% しか低下していません。
Identify LTE and NR Signals from Captured Data Using SDR and Deep Learning (Wireless Testbench)の例を使用し、学習済みネットワークを使用して LTE および 5G NR の信号を識別することができます。
スペクトルのより広い帯域を監視する必要がある場合は、sampleRate
を増やし、学習データを再生成し、Capture and Label NR and LTE Signals for AI Training (Wireless Testbench)の例を使用して信号をキャプチャし、ネットワークに再学習させます。
サポート関数
function data = preprocessTrainingData(data, imageSize) % Resize the training image and associated pixel label image. data{1} = imresize(data{1},imageSize); data{2} = imresize(data{2},imageSize); end function net = loadNetworkFromMATFile(baselineNetwork) switch baselineNetwork case "custom" net = load("specSenseTrainedNetCustom.mat",'net'); case "resnet18" net = load("specSenseTrainedNetResnet18.mat",'net'); case "resnet50" net = load("specSenseTrainedNetResnet50.mat",'net'); case "mobilenetv2" net = load("specSenseTrainedNetMobileNetv2.mat",'net'); otherwise error("Unknown baseline network: " + baselineNetwork) end net = net.net; end function loss = lossFunction(ypred,yactual,weights) % Compute weighted cross-entropy loss. cdim = find(dims(ypred) == 'C'); loss = crossentropy(ypred,yactual,weights,WeightsFormat="C",NormalizationFactor="none"); wn = shiftdim(weights(:)',-(cdim-2)); wnT = extractdata(yactual).*wn; normFac = sum(wnT(:))+eps('single'); loss = loss/normFac; end
参考
featureInputLayer
(Deep Learning Toolbox) | fullyConnectedLayer
(Deep Learning Toolbox) | reluLayer
(Deep Learning Toolbox) | softmaxLayer
(Deep Learning Toolbox) | pixelLabelDatastore
(Computer Vision Toolbox) | countEachLabel
(Computer Vision Toolbox)
関連するトピック
- MATLAB による深層学習 (Deep Learning Toolbox)