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

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

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

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

Выберите Feature Extraction Layer

Слой 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 функция.