Этот пример показывает создание и обучение простой Нейронной сети свертки (CNN) классифицировать цели РСА с помощью глубокого обучения.
Глубокое обучение является мощным методом, который может использоваться, чтобы обучить устойчивый классификатор. Это показало свою эффективность в разнообразных областях в пределах от анализа изображения к обработке естественного языка. В общем случае эти разработки имеют огромный потенциал для анализа данных РСА и обработки. Главная цель для обработки изображений РСА была обнаружением объектов и классификацией, которая называется Автоматическим целевым распознаванием (ATR). Здесь, простой CNN используется, чтобы обучить и классифицировать цели РСА с помощью Deep Learning Toolbox™.
Deep Learning Toolbox служит основой для разработки и реализации глубоких нейронных сетей с алгоритмами, предварительно обученными моделями и приложениями.
Этот пример демонстрирует как к:
Набор данных Download.
Загрузите и анализируйте данные изображения.
Разделение и увеличение данных.
Определение сетевой архитектуры.
Обучение сети.
Предсказание меток новых данных и вычисляет точность классификации.
Чтобы проиллюстрировать этот рабочий процесс, набор данных Moving и Stationary Target Acquisition и Recognition (MSTAR) Mixed Targets, опубликованный Научно-исследовательской лабораторией Военно-воздушных сил [1], используется. Набор данных доступен для скачивания здесь. Наша цель состоит в том, чтобы разработать модель, чтобы классифицировать наземные цели на основе формирования изображений РСА.
Этот пример использует целевой набор данных MSTAR, содержащий 8 688 изображений РСА от 7 наземных транспортных средств и калибровочной цели. Данные были собраны с помощью датчика X-полосы в режиме центра внимания с 1-футовым разрешением. Тип используемой цели является BMP2 (Боевая машина Пехоты), BTR70 (бронируемый автомобиль), и T72 (бак). Изображения были получены под двумя различными углами депрессии 15 градусов и 17 градусов с 190 ~ 300 версий другого аспекта. Это полное покрытие аспекта более чем 360 градусов.
Загрузите набор данных с данного URL с помощью helperDownloadMSTARTargetData
функция помощника. Размер набора данных составляет 28 Мбайт.
outputFolder = pwd; dataURL = ['https://ssd.mathworks.com/supportfiles/radar/data/' ... 'MSTAR_TargetData.tar.gz']; helperDownloadMSTARTargetData(outputFolder,dataURL);
В зависимости от вашего Интернет-соединения может занять время процесс загрузки. Код приостанавливает выполнение MATLAB®, пока процесс загрузки не завершен. В качестве альтернативы можно загрузить набор данных на локальный диск с помощью веб-браузера и извлечь файл. Если вы делаете так, замените outputFolder переменную в коде к местоположению загруженного файла.
Загрузите данные изображения РСА как datastore изображений. imageDatastore
автоматически помечает изображения на основе имен папок и хранит данные как imageDatastore
объект. Datastore изображений позволяет вам сохранить большие данные изображения, включая данные, которые не умещаются в памяти, и эффективно считать пакет изображений во время обучения CNN.
sarDatasetPath = fullfile(pwd,'Data'); imds = imageDatastore(sarDatasetPath, ... 'IncludeSubfolders',true,'LabelSource','foldernames');
Набор данных MSTAR содержит датчик, возвращается из 7 наземных транспортных средств и калибровочной цели. Оптические изображения и изображения РСА для этих 8 целей показывают ниже
Исследуйте datastore путем случайного отображения некоторых изображений чипа.
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
Label Count
________ _____
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
разделяет datastore imds
в три новых хранилища данных, imdsTrain, imdsValidation
, и imdsTest
. При этом это рассматривает различное количество изображений различных классов, так, чтобы обучение, валидация и наборы тестов имели ту же пропорцию каждого класса.
trainingPct = 0.8; validationPct = 0.1; [imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,... trainingPct,validationPct,'randomize');
Изображения в datastore не имеют сопоставимого размера. Чтобы обучить изображения с сетью, размер изображения должен совпадать с размером входного слоя сети. Вместо того, чтобы изменить размер изображений вручную, используйте augmentedImageDatastore
, который автоматически изменит размер изображений прежде, чем передать их в сеть. augmentedImageDatastore
может также использоваться, чтобы применить преобразования, такие как вращение, отражение или масштабирование, к входным изображениям. Это полезно, чтобы помешать сети сверхсоответствовать к данным.
auimdsTrain = augmentedImageDatastore(imgSize, imdsTrain); auimdsValidation = augmentedImageDatastore(imgSize, imdsValidation); auimdsTest = augmentedImageDatastore(imgSize, imdsTest);
Задайте архитектуру CNN с помощью createNetwork
функция помощника.
layers = createNetwork(imgSize);
После определения сетевой архитектуры используйте trainingOptions
задавать опции обучения. Обучите сеть с помощью стохастического градиентного спуска с импульсом (SGDM) с начальной скоростью обучения 0,001. Определите максимальный номер эпох к 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');
Обучите сеть с помощью архитектуры, заданной layers
, обучающие данные и опции обучения. По умолчанию, trainNetwork
использует графический процессор, если вы доступны (требует Parallel Computing Toolbox™, и CUDA® включил графический процессор с, вычисляют возможность 3.0 или выше). Для получения информации о поддерживаемом вычислите возможности, смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox). В противном случае это использует центральный процессор. Можно также задать среду выполнения при помощи 'ExecutionEnvironment'
аргумент пары "имя-значение" trainingOptions
.
График процесса обучения показывает мини-пакетную потерю, точность и потерю валидации с точностью. Для получения дополнительной информации о графике процесса обучения смотрите Процесс обучения Глубокого обучения Монитора. Точность является процентом изображений, которые сеть классифицирует правильно.
net = trainNetwork(auimdsTrain,layers,options);
Учебный процесс отображен в изображении выше. Темно-синяя линия на верхнем графике указывает на точность модели на обучающих данных, в то время как черная пунктирная линия указывает на точность модели на данных о валидации (отдельный от обучения). Точность валидации составляет больше чем 97% для классификатора с восемью классами. Кроме того, обратите внимание, что точность валидации и учебная точность подобны. Когда учебная точность намного выше, чем точность валидации, модель сверхсоответствует (i.e. запоминание) обучающие данные.
Предскажите метки данных о валидации с помощью обучившего сеть и вычислите итоговую точность. Точность является частью меток, которые сеть предсказывает правильно.
YPred = classify(net,auimdsTest); YTest = imdsTest.Labels; accuracy = sum(YPred == YTest)/numel(YTest)
accuracy = 0.9666
Тестовая точность очень близко к точности валидации, вселяя веру в прогнозирующей способности модели.
Используйте матрицу беспорядка, чтобы изучить поведение классификации модели более подробно. Сильная центральная диагональ представляет точные предсказания. Идеально, маленькие случайным образом расположенные значения от диагонали ожидается. Большие значения от диагонали могли указать на определенные сценарии, где модель борется.
figure cm = confusionchart(YPred, YTest); cm.RowSummary = 'row-normalized'; cm.Title = 'SAR Target Classification Confusion Matrix';
Из этих восьми классов модель, кажется, борется больше всего с правильной классификацией ZSU-23/4. ZSU-23/4 и 2S1 имеют очень похожие изображения РСА, и следовательно некоторый misclassification обученной моделью наблюдается. Однако это все еще может достигнуть больше, чем 90%-я точность для класса.
Этот пример демонстрирует, как создать и обучить CNN классифицировать цели РСА, полученные из базы данных MSTAR. Обучивший сеть достиг точности 96,7% в целом и 90% для ZSU-23/4 целевого класса.
Функциональный createNetwork
берет в качестве входа входной размер изображений imgSize
и возвращает нейронную сеть свертки. Смотрите ниже для описания того, что делает каждый тип слоя.
Отобразите Входной Слой, который - imageInputLayer то, где вы задаете размер изображения. Эти числа соответствуют высоте, ширине и размеру канала. Данные изображения РСА состоят из полутоновых изображений, таким образом, размер канала (цветовой канал) равняется 1. Для цветного изображения размер канала равняется 3, соответствуя значениям RGB. Вы не должны переставлять данные потому что trainNetwork
, по умолчанию, переставляет данные в начале обучения. trainNetwork
может также автоматически переставить данные в начале каждой эпохи во время обучения.
Сверточный Слой В сверточном слое, первым аргументом является filterSize
, который является высотой и шириной фильтров учебное функциональное использование при сканировании вдоль изображений. В этом примере номер 3 указывает, что размер фильтра имеет размер 3х3. Можно задать различные размеры для высоты и ширины фильтра. Второй аргумент является количеством фильтров, numFilters
, который является количеством нейронов, которые соединяются с той же областью входа. Этот параметр определяет количество карт функции. Используйте 'Padding'
пара "имя-значение", чтобы добавить дополнение во вход показывает карту. Для сверточного слоя шагом по умолчанию 1, 'same'
дополнение гарантирует, что пространственный выходной размер совпадает с входным размером. Можно также задать шаг и скорости обучения для этого использования слоя аргументы пары "имя-значение" convolution2dLayer.
Слой Нормализации партии. Слоя Нормализации партии. нормирует активацию и распространение градиента через сеть, делая сетевое обучение более легкой задачей оптимизации. Используйте слои нормализации партии. между сверточными слоями и нелинейностью, такой как слои ReLU, чтобы ускорить сетевое обучение и уменьшать чувствительность к сетевой инициализации. Используйте batchNormalizationLayer, чтобы создать слой нормализации партии.
Слой ReLU слой нормализации партии. сопровождается нелинейной функцией активации. Наиболее распространенная функция активации является исправленным линейным модулем (ReLU). Используйте reluLayer, чтобы создать слой ReLU.
Слои Max Pooling Layer Convolutional (с функциями активации) иногда сопровождаются операцией субдискретизации, которая уменьшает пространственный размер карты функции и удаляет избыточную пространственную информацию. Субдискретизация позволяет увеличить число, просачивается более глубокие сверточные слои, не увеличивая необходимое количество расчета на слой. Один способ проредить использует макс. объединение, которое вы создаете использование maxPooling2dLayer. Макс. слой объединения возвращает максимальные значения прямоугольных областей входных параметров, заданных первым аргументом, poolSize
. В этом примере размер прямоугольной области [2,2]. 'Stride'
аргумент пары "имя-значение" задает размер шага, который берет учебная функция, когда это сканирует вдоль входа.
Полносвязный слой сверточные и прореживающие слои сопровождается одним или несколькими полносвязными слоями. Как его имя предполагает, полносвязный слой является слоем, в котором нейроны соединяются со всеми нейронами в предыдущем слое. Этот слой сочетает все функции, изученные предыдущими слоями через изображение, чтобы идентифицировать большие шаблоны. Последний полносвязный слой сочетает функции, чтобы классифицировать изображения. Поэтому OutputSize
параметр в последнем полносвязном слое равен количеству классов в целевых данных. В этом примере выходной размер равняется 10, соответствуя этим 10 классам. Используйте fullyConnectedLayer, чтобы создать полносвязный слой.
Слой Softmax softmax функция активации нормирует выход полносвязного слоя. Выход softmax слоя состоит из положительных чисел, которые суммируют одному, который может затем использоваться в качестве вероятностей классификации слоем классификации. Создайте softmax слой с помощью функции softmaxLayer после последнего полносвязного слоя.
Слой классификации последний слой является слоем классификации. Этот слой использует вероятности, возвращенные softmax функцией активации для каждого входа, чтобы присвоить вход одному из взаимоисключающих классов и вычислить потерю. Чтобы создать слой классификации, используйте classificationLayer.
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 classificationLayer % Classification 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. https://www.sdms.afrl.af.mil/index.php? collection=mstar