В этом примере показано, как изменить предварительно обученную сеть, чтобы создать сеть обнаружения объектов YOLO v2.
Процедура преобразования предварительно обученной сети в сеть YOLO v2 аналогична процедуре обучения передаче для классификации изображений:
Загрузите предварительно обученную сеть.
Выберите слой из предварительно подготовленной сети для извлечения элементов.
Удалите все слои после слоя извлечения элемента.
Добавление новых слоев для поддержки задачи обнаружения объектов.
Загрузка предварительно обученной сети, используемой mobilenetv2. Для этого необходим пакет поддержки «Deep Learning Toolbox Model» («Модель набора инструментов для глубокого обучения»), предназначенный для работы с Network™, выполняемой ПО StartNet v2 Если этот пакет поддержки не установлен, функция предоставляет ссылку для загрузки. После загрузки сети преобразуйте ее в layerGraph чтобы можно было управлять слоями.
net = mobilenetv2(); lgraph = layerGraph(net);
Обновите размер сетевого ввода в соответствии с требованиями к данным обучения. Например, предположим, что данные обучения представляют собой изображения RGB размером 300 на 300. Задайте размер ввода.
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 функция.