trainRCNNObjectDetector

Обучите детектор объектов глубокого обучения R-CNN

Описание

пример

detector = trainRCNNObjectDetector(trainingData,network,options) обучает детектор объектов на основе R-CNN (областей со сверточными нейронными сетями). Функция использует глубокое обучение, чтобы обучить детектор обнаруживать несколько классов объектов.

Эта реализация R-CNN не обучает классификатор SVM для каждого класса объекта.

Эта функция требует, чтобы у вас были Deep Learning Toolbox™ и Statistics and Machine Learning Toolbox™. Рекомендуется также иметь Parallel Computing Toolbox™ для использования с CUDA®-активный NVIDIA® ГРАФИЧЕСКИЙ ПРОЦЕССОР. Для получения информации о поддерживаемых вычислительных возможностях смотрите Поддержку GPU by Release (Parallel Computing Toolbox).

detector = trainRCNNObjectDetector(___,Name,Value) возвращает detector объект с необязательными входными свойствами, заданными одним или несколькими Name,Value аргументы в виде пар.

detector = trainRCNNObjectDetector(___,'RegionProposalFcn',proposalFcn) опционально обучает детектор R-CNN с помощью пользовательской функции предложения области.

[detector,info] = trainRCNNObjectDetector(___) также возвращает информацию о процессе обучения, таком как потеря обучения и точность, для каждой итерации.

Примеры

свернуть все

Загрузите обучающие данные и слои сети.

load('rcnnStopSigns.mat', 'stopSigns', 'layers')

Добавьте директорию изображений к пути MATLAB.

imDir = fullfile(matlabroot, 'toolbox', 'vision', 'visiondata',...
  'stopSignImages');
addpath(imDir);

Установите сетевые опции обучения, чтобы использовать мини-пакет размером 32 для уменьшения использования графического процессора памяти. Опустите InitialLearningRate, чтобы уменьшить скорость изменения сетевых параметров. Это выгодно при подстройке предварительно обученной сети и препятствует тому, чтобы сеть изменялась слишком быстро.

options = trainingOptions('sgdm', ...
  'MiniBatchSize', 32, ...
  'InitialLearnRate', 1e-6, ...
  'MaxEpochs', 10);

Обучите детектор R-CNN. Обучение может занять несколько минут.

rcnn = trainRCNNObjectDetector(stopSigns, layers, options, 'NegativeOverlapRange', [0 0.3]);
*******************************************************************
Training an R-CNN Object Detector for the following object classes:

* stopSign

Step 1 of 3: Extracting region proposals from 27 training images...done.

Step 2 of 3: Training a neural network to classify objects in training data...

|=========================================================================================|
|     Epoch    |   Iteration  | Time Elapsed |  Mini-batch  |  Mini-batch  | Base Learning|
|              |              |  (seconds)   |     Loss     |   Accuracy   |     Rate     |
|=========================================================================================|
|            3 |           50 |         9.27 |       0.2895 |       96.88% |     0.000001 |
|            5 |          100 |        14.77 |       0.2443 |       93.75% |     0.000001 |
|            8 |          150 |        20.29 |       0.0013 |      100.00% |     0.000001 |
|           10 |          200 |        25.94 |       0.1524 |       96.88% |     0.000001 |
|=========================================================================================|

Network training complete.

Step 3 of 3: Training bounding box regression models for each object class...100.00%...done.

R-CNN training complete.
*******************************************************************

Протестируйте детектор R-CNN на тестовом изображении.

img = imread('stopSignTest.jpg');

[bbox, score, label] = detect(rcnn, img, 'MiniBatchSize', 32);

Отобразите самый сильный результат обнаружения.

[score, idx] = max(score);

bbox = bbox(idx, :);
annotation = sprintf('%s: (Confidence = %f)', label(idx), score);

detectedImg = insertObjectAnnotation(img, 'rectangle', bbox, annotation);

figure
imshow(detectedImg)

Удалите директорию изображений из пути.

rmpath(imDir);

Возобновите обучение детектора объектов R-CNN с помощью дополнительных данных. Чтобы проиллюстрировать эту процедуру, половина достоверных данных будет использоваться, чтобы первоначально обучить детектор. Затем обучение возобновляется с использованием всех данных.

Загрузите обучающие данные и инициализируйте опции обучения.

load('rcnnStopSigns.mat', 'stopSigns', 'layers')

stopSigns.imageFilename = fullfile(toolboxdir('vision'),'visiondata', ...
    stopSigns.imageFilename);

options = trainingOptions('sgdm', ...
    'MiniBatchSize', 32, ...
    'InitialLearnRate', 1e-6, ...
    'MaxEpochs', 10, ...
    'Verbose', false);

Обучите детектор R-CNN с фрагментом основной истины.

rcnn = trainRCNNObjectDetector(stopSigns(1:10,:), layers, options, 'NegativeOverlapRange', [0 0.3]);

Получите обученные слои сети от детектора. Когда вы передаете в массиве слоев сети, чтобы trainRCNNObjectDetector, они используются как есть для продолжения обучения.

network = rcnn.Network;
layers = network.Layers;

Возобновите обучение, используя все обучающие данные.

rcnnFinal = trainRCNNObjectDetector(stopSigns, layers, options);

Создайте детектор объектов R-CNN для двух классов объектов: собак и кошек.

objectClasses = {'dogs','cats'};

Сеть должна иметь возможность классифицировать как собак, кошек, так и «фоновый» класс в порядки, которые будут обучены с помощью trainRCNNObjectDetector. В этом примере добавляется единица для включения фона.

numClassesPlusBackground = numel(objectClasses) + 1;

Итоговый полносвязный слой сети определяет количество классов, которые может классифицировать сеть. Установите окончательный полносвязный слой с размером выхода, равным количеству классов плюс фонового класса.

layers = [ ...
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)        
    fullyConnectedLayer(numClassesPlusBackground);
    softmaxLayer()
    classificationLayer()];

Теперь эти слои сети могут использоваться для обучения детектора объектов двух классов R-CNN.

Создайте детектор объектов R-CNN и настройте его на использование сохраненной сетевой контрольной точки. Контрольная точка сети сохраняется каждую эпоху во время сетевого обучения, когда trainingOptions Параметр 'CheckpointPath' установлен. Контрольные точки сети применяются в случае неожиданного завершения сеанса обучения.

Загрузите обучающие данные знака стопа.

load('rcnnStopSigns.mat','stopSigns','layers')

Добавьте полный путь к файлам изображений.

stopSigns.imageFilename = fullfile(toolboxdir('vision'),'visiondata', ...
      stopSigns.imageFilename);

Установите 'CheckpointPath' с помощью trainingOptions функция.

checkpointLocation = tempdir;
options = trainingOptions('sgdm','Verbose',false, ...
    'CheckpointPath',checkpointLocation);

Обучите детектор объектов R-CNN с несколькими изображениями.

rcnn = trainRCNNObjectDetector(stopSigns(1:3,:),layers,options);

Загрузка сохраненной сетевой контрольной точки.

wildcardFilePath = fullfile(checkpointLocation,'convnet_checkpoint__*.mat');
contents = dir(wildcardFilePath);

Загружает одну из сетей контрольных точек.

filepath = fullfile(contents(1).folder,contents(1).name);
checkpoint = load(filepath);

checkpoint.net
ans = 

  SeriesNetwork with properties:

    Layers: [15×1 nnet.cnn.layer.Layer]

Создайте новый детектор объектов R-CNN и настройте его для использования сохраненной сети.

rcnnCheckPoint = rcnnObjectDetector();
rcnnCheckPoint.RegionProposalFcn = @rcnnObjectDetector.proposeRegions;

Установите сетевую точку на сохраненную сетевую контрольную точку.

rcnnCheckPoint.Network = checkpoint.net
rcnnCheckPoint = 

  rcnnObjectDetector with properties:

              Network: [1×1 SeriesNetwork]
           ClassNames: {'stopSign'  'Background'}
    RegionProposalFcn: @rcnnObjectDetector.proposeRegions

Входные параметры

свернуть все

Маркированные основные истины изображения, заданные как таблица с двумя или несколькими столбцами.

Если вы используете таблицу, таблица должна иметь два или более столбцов. Первый столбец таблицы должен содержать имена файлов изображений с путями. Изображения должны быть полутоновыми или truecolor (RGB), и они могут быть в любом формате, поддерживаемом imread. Каждый из остальных столбцов должен быть вектором камеры, который содержит M на 4 матрицы, которые представляют один класс объекта, такой как vehicle, flower или stop sign. Столбцы содержат двойные массивы с 4 элементами M ограничивающих прямоугольников в формате [x, y, width, height]. Формат задает положение верхнего левого угла и размер ограничивающего прямоугольника на соответствующем изображении. Чтобы создать таблицу основной истины, можно использовать приложение Image Labeler или Video Labeler app. Чтобы создать таблицу обучающих данных из сгенерированной основной истины, используйте objectDetectorTrainingData функция.

Имя табличной переменной задает имя класса объекта. Чтобы создать таблицу основной истины, используйте Image Labeler приложения. Коробки размером менее 32 на 32 не используются для обучения.

Сеть, заданная как SeriesNetwork (Deep Learning Toolbox), массив Layer (Deep Learning Toolbox) объекты, layerGraph (Deep Learning Toolbox) объект, или по имени сети. Сеть обучена классифицировать классы объектов, определенные в trainingData таблица. The SeriesNetwork (Deep Learning Toolbox), Layer (Deep Learning Toolbox), и layerGraph (Deep Learning Toolbox) объекты доступны в Deep Learning Toolbox.

  • Когда вы задаете сеть как SeriesNetwork, массив Layer объекты или по имени сети сеть автоматически преобразуется в сеть R-CNN путем добавления новых слоев классификации и регрессии для поддержки обнаружения объектов.

  • Массив Layer Объекты (Deep Learning Toolbox) должны содержать слой классификации, поддерживающий количество классов объектов и класс фона. Используйте этот тип входа, чтобы настроить скорости обучения для каждого слоя. Пример массива Layer (Deep Learning Toolbox) объекты:

    layers = [imageInputLayer([28 28 3])
            convolution2dLayer([5 5],10)
            reluLayer()
            fullyConnectedLayer(10)
            softmaxLayer()
            classificationLayer()];
    

  • Когда вы задаете сеть как SeriesNetwork, Layer массив, или сеть по имени, веса для свертки и полносвязных слоев инициализируются в 'narrow-normal'.

  • Имя сети должно быть одним из следующих допустимых имен сетей. Необходимо также установить соответствующее дополнение.

  • The LayerGraph объект должен быть допустимой сетью обнаружения объектов R-CNN. Можно также использовать LayerGraph объект для обучения пользовательской сети R-CNN.

Смотрите Начало работы с R-CNN, Fast R-CNN и Faster R-CNN, чтобы узнать больше о том, как создать сеть R-CNN.

Опции обучения, возвращенные trainingOptions (Deep Learning Toolbox) функция из Deep Learning Toolbox. Чтобы задать решатель и другие опции для сетевого обучения, используйте trainingOptions.

Примечание

trainRCNNObjectDetector не поддерживает следующие опции обучения:

  • The ValidationData, ValidationFrequency, или ValidationPatience опции

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: 'PositiveOverlapRange', [0.5 1].

Положительные коэффициенты обучающей выборки для диапазона перекрытия ограничивающего прямоугольника, заданная как разделенная запятой пара, состоящая из 'PositiveOverlapRange'и двухэлементный вектор. Вектор содержит значения в области значений [0,1]. Области предложения, которые перекрываются с основной истиной ограничивающими рамками в заданную область, используются в качестве положительных обучающих образцов.

Коэффициент перекрытия, используемый для обоих PositiveOverlapRange и NegativeOverlapRange определяется как:

area(AB)area(AB)


A и B являются ограничивающими рамками.

Отрицательные коэффициенты обучающей выборки для диапазона перекрытия ограничивающего прямоугольника, заданные как разделенная запятой пара, состоящее из 'NegativeOverlapRange'и двухэлементный вектор. Вектор содержит значения в области значений [0,1]. Области предложения, которые перекрываются с основной истиной ограничивающими рамками в заданную область, используются как отрицательные обучающие выборки.

Максимальное число предложений сильнейших областей для генерации обучающих выборок, заданная как разделенная запятой пара, состоящая из 'NumStrongestRegions'и целое число. Уменьшите это значение, чтобы ускорить время вычислений, хотя это снижает точность обучения. Чтобы использовать все предложения по областям, задайте это значение inf.

Пользовательский дескриптор функции предложения региона, заданная как разделенная запятой пара, состоящая из 'RegionProposalFcn'и имя функции. Если вы не задаете пользовательскую функцию предложения области, задайте вариант по умолчанию алгоритма Edge Boxes [3] rcnnObjectDetector, используется. Пользовательский proposalFcn должна иметь следующую функциональную форму:

 [bboxes,scores] = proposalFcn(I)

Вход, I, является изображением, заданным в groundTruth таблица. Функция должна возвращать прямоугольные ограничительные рамки в массиве M -by-4. Каждая строка bboxes содержит вектор с четырьмя элементами [x, y, width, height], который задает верхний левый угол и размер ограничивающего прямоугольника в пикселях. Функция должна также вернуть счет для каждого ограничивающего прямоугольника в векторе M -by-1. Более высокие счета указывают, что ограничивающий прямоугольник с большей вероятностью содержит объект. Эти счета используются для выбора самых сильных областей, которые можно задать в NumStrongestRegions.

Имя слоя регрессии коробки, заданное как разделенная разделенными запятой парами, состоящая из 'BoxRegressionLayer'и вектор символов. Допустимые значения 'auto' или имя слоя в вход сети. Активации выхода этого слоя используются как функции для обучения регрессионой модели для уточнения обнаруженных ограничивающих коробок.

Если имя 'auto', затем trainRCNNObjectDetector автоматически выбирает слой из входа сети в зависимости от типа входа сети:

  • Если вход network является SeriesNetwork или массив Layer объекты, затем функция выбирает последний слой свертки.

  • Если вход network является LayerGraphзатем функция выбирает источник последнего полностью подключенного слоя.

Выходные аргументы

свернуть все

Обученный детектор объектов на основе R-CNN, возвращенный как rcnnObjectDetector объект. Можно обучить детектор R-CNN обнаруживать несколько классов объектов.

Обучающая информация, возвращенная как структура со следующими полями. Каждое поле является числовым вектором с одним элементом на итерацию обучения. Значения, которые не были вычислены при определенной итерации, представлены NaN.

  • TrainingLoss - Потеря обучения при каждой итерации. Это комбинация классификации и регрессионных потерь, используемых для обучения сети R-CNN.

  • TrainingAccuracy - Точность обучающего набора при каждой итерации

  • BaseLearnRate - Скорость обучения на каждой итерации

Ограничения

  • Эта реализация R-CNN не обучает классификатор SVM для каждого класса объекта.

Совет

  • Чтобы ускорить предварительную обработку данных для обучения, trainRCNNObjectDetector автоматически создает и использует параллельный пул на основе параметров параллельных выборов. Для этого требуется Parallel Computing Toolbox.

  • VGG-16, VGG-19, ResNet-101 и Inception-ResNet-v2 являются большими моделями. Обучение с большими изображениями может привести к ошибкам «Out of Memory». Чтобы уменьшить эти ошибки, вручную измените размер изображений вместе с ограничивающими прямоугольными достоверными данными перед вызовом trainRCNNObjectDetector.

  • Эта функция поддерживает передачу обучения. Когда сеть вводится по имени, такому как 'resnet50', затем программное обеспечение автоматически преобразует сеть в действительную модель сети R-CNN на основе предварительно обученной resnet50 (Deep Learning Toolbox) модель. Кроме того, вручную задайте пользовательскую сеть R-CNN с помощью LayerGraph (Deep Learning Toolbox) извлечен из предварительно обученной сети DAG. См. «Создание сети обнаружения объектов R-CNN».

  • Используйте trainingOptions (Deep Learning Toolbox), чтобы включить или отключить подробную печать.

Ссылки

[1] Гиршик, Р., Дж. Донахью, Т. Даррелл и Дж. Малик. «Богатые иерархии функций для точного обнаружения объектов и семантической сегментации». Труды конференции IEEE по компьютерному зрению и распознаванию шаблонов. 2014, стр 580–587.

[2] Гиршик, Р. «Быстрый R-CNN». Материалы Международной конференции IEEE по компьютерному зрению. 2015, стр 1440–1448.

[3] Зитник, К. Лоуренс и П. Доллар. «Краевые рамки: определение местоположения предложений объектов с ребер». Computer Vision-ECCV, Springer International Publishing. 2014, стр 391–405.

Расширенные возможности

Введенный в R2016b