exponenta event banner

Создание сети обнаружения объектов YOLO v2

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

Процедура преобразования предварительно обученной сети в сеть YOLO v2 аналогична процедуре обучения передаче для классификации изображений:

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

  2. Выберите слой из предварительно подготовленной сети для извлечения элементов.

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

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

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

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

Создать подсеть обнаружения YOLO v2

Подсеть обнаружения состоит из групп последовательно соединенных уровней свертки, 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. Выходные данные слоя свертки предсказывают следующее для каждого якорного ящика:

  1. Вероятности класса объектов.

  2. Смещение положения x и y.

  3. Смещение ширины и высоты.

Укажите поля привязки и число классов и вычислите число фильтров для слоя свертки.

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.

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

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

lgraph = addLayers(lgraph,detectionLayers);
lgraph = connectLayers(lgraph,featureExtractionLayer,"yolov2Conv1");

Использовать analyzeNetwork(lgraph) для проверки сети и последующего обучения детектора объекта YOLO v2 с помощью trainYOLOv2ObjectDetector функция.