tutorial docs : SAR Target Classification using Deep Learning
script github : https://github.com/Junepp/Matlab-Study/blob/main/radar/s01_sar_target.mlx
개요 (배경 지식)
MSTAR 데이터셋을 활용해 간단한 CNN Classification network를 학습한 뒤 평가해보는 비교적 간단한 예제입니다.
MSTAR(Moving and Stationary Target Acquisition and Recognition) 데이터셋은 미국 공군 연구실에서 배포한 데이터로 SAR로 수집한 보병 전투 차량, 장갑차, 탱크 등의 이미지 총 8688장으로 이뤄져있습니다.
SAR은 "Synthetic Aperture Radar"의 약자로 한국어로는 "합성 개구 레이다"입니다. 항공기 또는 위성에 탑재되어 시간차를 두고 발사한 레이다파의 반사 시간 차를 이용해 지상을 관측하는 레이다의 일종입니다. 주로 멈춰있는 타겟을 움직이는 레이다로 관찰합니다.
코드 리뷰
함수 선언
보편적인 프로그래밍 언어와 달리 매트랩에서는 함수 선언부가 코드의 가장 뒤에 위치하게됩니다.
하지만 코드 리뷰를 위해 사용되는 2개의 함수를 가장 앞 부분에서 소개하겠습니다.
1. helperDownloadMSTARTargetData
출력 경로와 데이터URL을 입력받아 MSTAR 데이터를 다운로드/압축 해제 해주는 함수입니다. 특별한 부분은 없습니다.
function helperDownloadMSTARTargetData(outputFolder,DataURL)
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
2. createNetwork
간단한 CNN 네트워크를 반환하는 함수입니다. (함수의 리턴을 첫 줄에 layers = 으로 적는 matlab의 문법이 눈에 띄네요)
공식 튜토리얼에서는 (conv - relu - conv - batch normalization - relu - maxpooling) 총 6개의 레이어로 이루어진 블록을 4개 사용하였지만 쿨링 기능이 없는 맥북 에어가 너무 힘들어해 4번째 블록을 생략하고 마지막 블록에서의 채널 수를 512 > 256으로 바꿔 진행하였습니다.
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)
% SKIP 4TH block
% convolution2dLayer(3,256,'Padding','same')
% reluLayer
% convolution2dLayer(3,256,'Padding','same')
% batchNormalizationLayer
% reluLayer
% maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(6,256) % output 512 to 256
reluLayer
dropoutLayer(0.5)
fullyConnectedLayer(256) % 512 to 256
reluLayer
fullyConnectedLayer(8)
softmaxLayer
classificationLayer
];
end
데이터 다운로드, 압축 해제, 로딩
% Download and Unzip
outputFolder = pwd;
dataURL = ['https://ssd.mathworks.com/supportfiles/radar/data/' ...
'MSTAR_TargetData.tar.gz'];
helperDownloadMSTARTargetData(outputFolder,dataURL);
% Load
sarDatasetPath = fullfile(pwd,'Data');
imds = imageDatastore(sarDatasetPath, ...
'IncludeSubfolders',true,'LabelSource','foldernames');
데이터 셔플
rng은 난수 생성기이고 0은 시드 값 입니다. 실험의 재현을 위한 옵션으로 보입니다.
rng(0)
imds = shuffle(imds);
데이터 관찰 및 집계
데이터의 형태가 2차원 이미지임을 보아선 raw data가 아닌 전처리를 거친 데이터로 보입니다.
figure
for i = 1:20
subplot(4,5,i)
img = read(imds);
imshow(img)
title(imds.Labels(i))
sgtitle('Sample training images')
end
labelCount = countEachLabel(imds)
학습 준비
- input size, train-valid-test ratio 명시
- data split
- augmentation (=resize)
% define input size
imgSize = [128,128,1];
% define train-valid-test ratio
trainingPct = 0.8;
validationPct = 0.1;
% data split
[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,...
trainingPct,validationPct,'randomize');
% augmentation (=resize)
auimdsTrain = augmentedImageDatastore(imgSize, imdsTrain);
auimdsValidation = augmentedImageDatastore(imgSize, imdsValidation);
auimdsTest = augmentedImageDatastore(imgSize, imdsTest);
네트워크 생성
사전 정의해둔 createNetwork 함수를 이용합니다.
layers = createNetwork(imgSize);
options = trainingOptions('sgdm', ...
'InitialLearnRate',0.001, ...
'MaxEpochs',3, ...
'Shuffle','every-epoch', ...
'MiniBatchSize',32,... % 48 to 32
'ValidationData',auimdsValidation, ...
'ValidationFrequency',15, ...
'Verbose',false, ...
'CheckpointPath',tempdir,...
'Plots','training-progress');
Trian & Validation
맥북을 위해 네트워크 내 블록을 생략하고 배치 사이즈를 줄였는데 튜토리얼의 검증 정확도 97.24% 보다 약간 높게 나왔습니다.
net = trainNetwork(auimdsTrain,layers,options)
Test - Accuracy 산출
accuracy = 0.9862로 나왔습니다. 이 역시 튜토리얼의 0.9827보다 소폭 상승했습니다.
YPred = classify(net,auimdsTest);
YTest = imdsTest.Labels;
accuracy = sum(YPred == YTest)/numel(YTest)
Test - Confusion matrix 시각화
figure
cm = confusionchart(YPred, YTest);
cm.RowSummary = 'row-normalized';
cm.Title = 'SAR Target Classification Confusion Matrix';
마무리
첫 matlab 튜토리얼이자 코드 리뷰를 진행해보았습니다.
파이썬과 유사한 문법, 스크립트 기반 방식을 가져서 그런지 그렇게 낯설지 않았습니다.
데이터 로드, 학습, 시각화 등 많은 부분이 자동화가 되어있어 간단한 기초 연구에는 파이썬보다 더 적합하다는 생각도 들었습니다. 하지만 자동화가 잘 되있다는 장점은 커스텀이 어렵다는 단점이 될 수도 있기 때문에 조금 더 써봐야 알 것 같습니다.
'Radar & Matlab' 카테고리의 다른 글
레이더 펄스압축 (0) | 2023.09.25 |
---|---|
MATLAB 스터디 - IQ 신호 생성 (0) | 2023.09.22 |
레이더 데이터 큐브 (0) | 2023.09.21 |
레이더 빔포밍에 대해서 (1) | 2023.09.20 |
MATLAB 스터디 아카이브 (0) | 2023.09.15 |