В этом примере показано, как изменить предварительно обученную сеть MobileNet v2, чтобы создать сеть обнаружения объектов SSD.
Процедура, чтобы преобразовать предварительно обученную сеть в сеть SSD похожа на процедуру передачи обучения для классификации изображений:
Загрузите предварительно обученную сеть.
Выберите один или несколько слоев из предварительно обученной сети, чтобы использовать в извлечении признаков.
Удалите все слои после слоев извлечения признаков
Добавьте новые слои, чтобы поддержать задачу обнаружения объектов.
Загрузите предварительно обученную сеть MobileNet v2 использование mobilenetv2
. Это требует Модели Deep Learning Toolbox для пакета поддержки MobileNet v2 Network™. Если этот пакет поддержки не установлен, то функция обеспечивает ссылку на загрузку. После того, как вы загружаете сеть, преобразуете сеть в layerGraph
возразите так, чтобы можно было управлять слоями.
net = mobilenetv2(); lgraph = layerGraph(net);
Обновите сетевой входной размер, чтобы удовлетворить требования обучающих данных. Например, примите, что обучающие данные являются 300 300 изображениями RGB. Установите входной размер.
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;
Задайте поля привязки и количество классов объектов и используйте anchorBoxLayer, чтобы создать слой поля привязки.
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");
Добавьте и соедините слой слияния SSD с convClassification
слой.
lgraph = addLayers(lgraph,mergeClassification); lgraph = connectLayers(lgraph,"convClassification","mergeClassification/in1");
Создайте ssdMergeLayer
инициализированный количеством координатных смещений раньше совершенствовал положения поля привязки и количество слоев извлечения признаков.
numCoordinates = 4; mergeRegression = ssdMergeLayer(numCoordinates,numFeatureExtractionLayers,... "Name","mergeRegression");
Добавьте и соедините слой слияния SSD с convRegression
слой.
lgraph = addLayers(lgraph,mergeRegression); lgraph = connectLayers(lgraph,"convRegression","mergeRegression/in1");
Чтобы завершить ветвь классификации, создайте и присоедините softmax слой и фокальный слой потерь с гамма значением 2 и альфа-значением 0,25.
gamma = 2; alpha = 0.25; clsLayers = [ softmaxLayer("Name","softmax") focalLossLayer(gamma,alpha,"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)
Сеть SSD завершена и может быть обучена с помощью trainSSDObjectDetector
функция.