Создайте сеть обнаружения объектов SSD

В этом примере показано, как изменить предварительно обученную сеть MobileNet v2, чтобы создать сеть обнаружения объектов SSD.

Процедура, чтобы преобразовать предварительно обученную сеть в сеть SSD похожа на процедуру передачи обучения для классификации изображений:

  1. Загрузите предварительно обученную сеть.

  2. Выберите один или несколько слоев из предварительно обученной сети, чтобы использовать для извлечения признаков.

  3. Удалите все слои после слоев извлечения признаков

  4. Добавьте новые слои, чтобы поддержать задачу обнаружения объектов.

Загрузите предварительно обученную сеть

Загрузите предварительно обученную сеть 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);

Выберите Feature Extraction Layers

SSD предсказывает объектные местоположения с помощью нескольких карт функции. Как правило, вы выбираете слои извлечения признаков с различными выходными размерами, чтобы усилить преимущество многошкальных функций. Можно использовать analyzeNetwork функционируйте или приложение Deep Network Designer, чтобы определить выходные размеры слоев в сети. Обратите внимание на то, что выбор оптимального извлечения признаков набора слои требует эмпирической оценки.

Для краткости этот пример иллюстрирует использование один слой извлечения признаков. Установите слой извлечения признаков на "block_12_add".

featureExtractionLayer = "block_12_add";

Удалите слои после слоя извлечения признаков

Затем удалите слои после слоя извлечения признаков. Можно сделать так путем импорта сети в приложение Deep Network Designer, вручную удаления слоев и экспорта модифицированного сеть в рабочую область.

В данном примере загрузите модифицированную сеть, которая была добавлена к этому примеру как вспомогательный файл.

modified = load("mobilenetv2Block12Add.mat");
lgraph = modified.mobilenetv2Block12Add;

Присоедините AnchorBoxLayer

Задайте поля привязки и количество классов объектов и используйте anchorBoxLayer, чтобы создать слой поля привязки.

numClasses = 5;

anchorBoxes = [
    16 16
    32 16
    ];

anchorBox = anchorBoxLayer(anchorBoxes,"Name","anchors");

Присоедините слой поля привязки к слою извлечения признаков.

lgraph = addLayers(lgraph,anchorBox);
lgraph = connectLayers(lgraph,"block_12_add","anchors");

Создайте SSD ветвь Classifcation

Создайте слой свертки, где количество фильтров свертки равняется 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");

Создайте ветвь регрессии SSD

Создайте слой свертки, где количество фильтров свертки равняется количеству этих четырех раз полей привязки.

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");

Полная сеть обнаружения SSD

Чтобы завершить ветвь классификации, создайте и присоедините 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 функция.