В этом примере показано, как изменить предварительно обученную сеть MobileNet v2, чтобы создать сеть обнаружения объектов YOLO v2.
Процедура, чтобы преобразовать предварительно обученную сеть в сеть YOLO v2 похожа на процедуру передачи обучения для классификации изображений:
Загрузите предварительно обученную сеть.
Выберите слой из предварительно обученной сети, чтобы использовать для извлечения признаков.
Удалите все слои после слоя извлечения признаков.
Добавьте новые слои, чтобы поддержать задачу обнаружения объектов.
Загрузите предварительно обученную сеть 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")
imgLayer = ImageInputLayer with properties: Name: 'input_1' InputSize: [300 300 3] Hyperparameters DataAugmentation: 'none' Normalization: 'zerocenter' NormalizationDimension: 'auto' Mean: []
Замените старый входной слой изображений на новый входной слой изображений.
lgraph = replaceLayer(lgraph,"input_1",imgLayer);
Слой YOLO v2 извлечения признаков является самым эффективным, когда выходная ширина функции и высота между в 8 и 16 раз меньше, чем входное изображение. Этот объем субдискретизации является компромиссом между качеством выходной функции и пространственным разрешением. Можно использовать analyzeNetwork
функционируйте или приложение Deep Network Designer, чтобы определить выходные размеры слоев в сети. Обратите внимание на то, что выбор оптимального слоя извлечения признаков требует эмпирической оценки.
Установите слой извлечения признаков на "block_12_add".
Выходной размер этого слоя приблизительно в 16 раз меньше, чем входной размер изображения 300 300.
featureExtractionLayer = "block_12_add";
Затем удалите слои после слоя извлечения признаков. Можно сделать так путем импорта сети в приложение Deep Network Designer, вручную удаления слоев и экспорта модифицированной сети в рабочую область.
В данном примере загрузите модифицированную сеть, которая была добавлена к этому примеру как вспомогательный файл.
modified = load("mobilenetv2Block12Add.mat");
lgraph = modified.mobilenetv2Block12Add;
Подсеть обнаружения состоит из групп последовательно связанной свертки, ReLU и слоев нормализации партии. Эти слои сопровождаются yolov2TransformLayer
и yolov2OutputLayer
.
Во-первых, создайте две группы последовательно связанной свертки, ReLU и слои нормализации партии. Установите размер фильтра слоя свертки на 3х3 и количество фильтров совпадать с количеством каналов в слое извлечения признаков выход. Задайте "same"
дополнение в слое свертки, чтобы сохранить входной размер.
filterSize = [3 3]; numFilters = 96; detectionLayers = [ convolution2dLayer(filterSize,numFilters,"Name","yolov2Conv1","Padding", "same", "WeightsInitializer",@(sz)randn(sz)*0.01) batchNormalizationLayer("Name","yolov2Batch1") reluLayer("Name","yolov2Relu1") convolution2dLayer(filterSize,numFilters,"Name","yolov2Conv2","Padding", "same", "WeightsInitializer",@(sz)randn(sz)*0.01) batchNormalizationLayer("Name","yolov2Batch2") reluLayer("Name","yolov2Relu2") ]
detectionLayers = 6x1 Layer array with layers: 1 'yolov2Conv1' Convolution 96 3x3 convolutions with stride [1 1] and padding 'same' 2 'yolov2Batch1' Batch Normalization Batch normalization 3 'yolov2Relu1' ReLU ReLU 4 'yolov2Conv2' Convolution 96 3x3 convolutions with stride [1 1] and padding 'same' 5 'yolov2Batch2' Batch Normalization Batch normalization 6 'yolov2Relu2' ReLU ReLU
Затем создайте итоговый фрагмент подсети обнаружения, которой следовал за слоем свертки yolov2TransformLayer
и yolov2OutputLayer
. Выход слоя свертки предсказывает следующее для каждого поля привязки:
Вероятности класса объекта.
Местоположение X и Y возмещено.
Ширина и высота возмещены.
Задайте поля привязки и количество классов и вычислите количество фильтров для слоя свертки.
numClasses = 5; anchorBoxes = [ 16 16 32 16 ]; numAnchors = size(anchorBoxes,1); numPredictionsPerAnchor = 5; numFiltersInLastConvLayer = numAnchors*(numClasses+numPredictionsPerAnchor);
Добавьте convolution2dLayer
, yolov2TransformLayer
, и yolov2OutputLayer
к подсети обнаружения.
detectionLayers = [ detectionLayers convolution2dLayer(1,numFiltersInLastConvLayer,"Name","yolov2ClassConv",... "WeightsInitializer", @(sz)randn(sz)*0.01) yolov2TransformLayer(numAnchors,"Name","yolov2Transform") yolov2OutputLayer(anchorBoxes,"Name","yolov2OutputLayer") ]
detectionLayers = 9x1 Layer array with layers: 1 'yolov2Conv1' Convolution 96 3x3 convolutions with stride [1 1] and padding 'same' 2 'yolov2Batch1' Batch Normalization Batch normalization 3 'yolov2Relu1' ReLU ReLU 4 'yolov2Conv2' Convolution 96 3x3 convolutions with stride [1 1] and padding 'same' 5 'yolov2Batch2' Batch Normalization Batch normalization 6 'yolov2Relu2' ReLU ReLU 7 'yolov2ClassConv' Convolution 20 1x1 convolutions with stride [1 1] and padding [0 0 0 0] 8 'yolov2Transform' YOLO v2 Transform Layer YOLO v2 Transform Layer with 2 anchors 9 'yolov2OutputLayer' YOLO v2 Output YOLO v2 Output with 2 anchors
Присоедините подсеть обнаружения к сети извлечения признаков.
lgraph = addLayers(lgraph,detectionLayers);
lgraph = connectLayers(lgraph,featureExtractionLayer,"yolov2Conv1");
Используйте analyzeNetwork(lgraph)
проверять сеть и затем обучать детектор объектов YOLO v2 с помощью trainYOLOv2ObjectDetector
функция.