В этом примере показано, как изменить предварительно обученную сеть 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
функция.