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®-enabled NVIDIA® с, вычисляют возможность 3.0 или выше.

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()];

Эти сетевые слои могут теперь использоваться, чтобы обучить детектор 2D объекта класса 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

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

свернуть все

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

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

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

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

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

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

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

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

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

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

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

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

Примечание

trainRCNNObjectDetector не поддерживает эти опции обучения:

  • Plots значение: 'training-progress'

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

  • OutputFcn опция.

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

Задайте дополнительные разделенные запятой пары 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'и имя функции. Если вы не указываете, что пользовательская функция предложения по области, вариант по умолчанию алгоритма Полей Ребра [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-based, возвращенный как 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 являются большими моделями. Обучение с большими изображениями может произвести "Из Памяти" ошибки. Чтобы смягчить эти ошибки, вручную измените размер изображений наряду с достоверными данными ограничительной рамки прежде, чем вызвать trainRCNNObjectDetector.

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

  • Используйте trainingOptions функция, чтобы включить или отключить многословную печать.

Ссылки

[1] Girshick, R., Дж. Донахью, Т. Даррелл и Дж. Малик. “Богатые Иерархии Функции для Точного Обнаружения объектов и Семантической Сегментации”. Продолжения Конференции по IEEE по Компьютерному зрению и Распознаванию образов. 2014, стр 580–587.

[2] Girshick, R. “Быстрый R-CNN”. Продолжения Международной конференции IEEE по вопросам Компьютерного зрения. 2015, стр 1440–1448.

[3] Zitnick, К. Лоуренс и П. Доллэр. “Поля ребра: Определение местоположения Объектных Предложений от Ребер”. Компьютерное-зрение-ECCV, Springer International Publishing. 2014, стр 391–405.

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

Введенный в R2017b