В этом примере показано, как изменить предварительно обученную сеть 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 слой и фокальный слой потерь.
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)
Сеть SSD завершена и может быть обучена с помощью trainSSDObjectDetector
функция.