В этом примере показано, как изменить предварительно обученную сеть, чтобы создать сеть обнаружения объектов SSD.
Процедура преобразования предварительно обученной сети в сеть SSD аналогична процедуре обучения передаче для классификации изображений:
Загрузите предварительно обученную сеть.
Выберите один или несколько слоев из предварительно подготовленной сети для извлечения элементов.
Удаление всех слоев после слоев извлечения элементов
Добавление новых слоев для поддержки задачи обнаружения объектов.
Загрузка предварительно обученной сети, используемой mobilenetv2. Для этого необходим пакет поддержки «Deep Learning Toolbox Model» («Модель набора инструментов для глубокого обучения»), предназначенный для работы с Network™, выполняемой ПО StartNet v2 Если этот пакет поддержки не установлен, функция предоставляет ссылку для загрузки. После загрузки сети преобразуйте ее в layerGraph , чтобы можно было управлять слоями.
net = mobilenetv2(); lgraph = layerGraph(net);
Обновите размер сетевого ввода в соответствии с требованиями к данным обучения. Например, предположим, что данные обучения представляют собой изображения RGB размером 300 на 300. Задайте размер ввода.
imageInputSize = [300 300 3];
Затем создайте новый слой ввода изображения с тем же именем, что и исходный слой.
imgLayer = imageInputLayer(imageInputSize,"Name","input_1");
Замените старый слой ввода изображения новым слоем ввода изображения.
lgraph = replaceLayer(lgraph,"input_1",imgLayer);SSD предсказывает расположение объектов с помощью нескольких карт элементов. Как правило, для использования преимуществ многомасштабных функций выбираются слои извлечения элементов с различными размерами вывода. Вы можете использовать analyzeNetwork или приложение Deep Network Designer для определения размеров выходных данных слоев в сети. Следует отметить, что выбор оптимального набора слоев извлечения элементов требует эмпирической оценки.
Для краткости этот пример иллюстрирует использование слоя извлечения одного элемента. Задайте для слоя извлечения элемента значение "block_12_add".
featureExtractionLayer = "block_12_add";Затем удалите слои после слоя извлечения элемента. Для этого можно импортировать сеть в приложение Deep Network Designer, вручную удалить слои и экспортировать измененную сеть в рабочую область.
В этом примере загрузите измененную сеть, которая была добавлена в этот пример в качестве поддерживающего файла.
modified = load("mobilenetv2Block12Add.mat");
lgraph = modified.mobilenetv2Block12Add;Укажите поля привязки и число классов объектов, а затем используйте anchorAseLayer для создания слоя поля привязки.
numClasses = 5;
anchorBoxes = [
16 16
32 16
];
anchorBox = anchorBoxLayer(anchorBoxes,"Name","anchors");Прикрепите слой анкерного ящика к слою извлечения элемента.
lgraph = addLayers(lgraph,anchorBox); lgraph = connectLayers(lgraph,"block_12_add","anchors");
Создайте слой свертки, где число фильтров свертки равно numAnchors умножить на numClasses + 1. Дополнительный класс представляет фоновый класс.
numAnchors = size(anchorBoxes,1); numClassesPlusBackground = numClasses + 1; numClsFilters = numAnchors * numClassesPlusBackground; filterSize = 3; conv = convolution2dLayer(filterSize,numClsFilters,... "Name","convClassification",... "Padding","same");
Добавьте и подключите слой свертки к слою якорного ящика.
lgraph = addLayers(lgraph,conv); lgraph = connectLayers(lgraph,"anchors","convClassification");
Создайте слой свертки, где число фильтров свертки равно четырехкратному числу полей привязки.
numRegFilters = 4 * numAnchors; conv = convolution2dLayer(filterSize,numRegFilters,... "Name","convRegression",... "Padding","same");
Добавьте и подключите слой свертки к слою якорного ящика.
lgraph = addLayers(lgraph,conv); lgraph = connectLayers(lgraph,"anchors","convRegression");
Создание ssdMergeLayer инициализировано количеством классов и количеством слоев извлечения элементов.
numFeatureExtractionLayers = numel(featureExtractionLayer); mergeClassification = ssdMergeLayer(numClassesPlusBackground,numFeatureExtractionLayers,... "Name","mergeClassification");
Добавление и подключение уровня слияния твердотельных накопителей к convClassification слой.
lgraph = addLayers(lgraph,mergeClassification); lgraph = connectLayers(lgraph,"convClassification","mergeClassification/in1");
Создание ssdMergeLayer инициализировано количеством смещений координат, используемых для уточнения положений якорей привязки, и количеством слоев извлечения элемента.
numCoordinates = 4; mergeRegression = ssdMergeLayer(numCoordinates,numFeatureExtractionLayers,... "Name","mergeRegression");
Добавление и подключение уровня слияния твердотельных накопителей к convRegression слой.
lgraph = addLayers(lgraph,mergeRegression); lgraph = connectLayers(lgraph,"convRegression","mergeRegression/in1");
Чтобы завершить классификационную ветвь, создайте и присоедините уровень softmax и уровень фокальных потерь.
clsLayers = [
softmaxLayer("Name","softmax")
focalLossLayer("Name","focalLoss")
];
lgraph = addLayers(lgraph,clsLayers);
lgraph = connectLayers(lgraph,"mergeClassification","softmax");Чтобы завершить ветвь регрессии, создайте и присоедините слой регрессии поля.
reg = rcnnBoxRegressionLayer("Name","boxRegression"); lgraph = addLayers(lgraph,reg); lgraph = connectLayers(lgraph,"mergeRegression","boxRegression");
Использовать analyzeNetwork для проверки сети.
analyzeNetwork(lgraph)
Сеть твердотельных накопителей завершена и может быть обучена с помощью trainSSDObjectDetector функция.