rcnnObjectDetector

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

Описание

The rcnnObjectDetector объект обнаруживает объекты из изображения, используя детектор объектов R-CNN (области со сверточными нейронными сетями). Чтобы обнаружить объекты в изображении, передайте обученный детектор в detect функция. Чтобы классифицировать области изображения, передайте детектор в classifyRegions функция.

Использование rcnnObjectDetector требуется Statistics and Machine Learning Toolbox™ и Deep Learning Toolbox™.

При использовании detect или classifyRegions функции с rcnnObjectDetector, использование CUDA® enabled NVIDIA® Настоятельно рекомендуется использовать графический процессор. Графический процессор значительно сокращает время расчетов. Для использования графический процессор требуется Parallel Computing Toolbox™. Для получения информации о поддерживаемых вычислительных возможностях смотрите Поддержку GPU by Release (Parallel Computing Toolbox).

Создание

Создайте rcnnObjectDetector объект вызовом trainRCNNObjectDetector функция с обучающими данными (требует Deep Learning Toolbox).

detector = trainRCNNObjectDetector(trainingData,...)

Свойства

расширить все

Объект сети серии, представляющий сверточную нейронную сеть (CNN), заданный как SeriesNetwork (Deep Learning Toolbox) или DAGNetwork (Deep Learning Toolbox). Объект используется в детекторе R-CNN.

Пользовательский дескриптор функции предложения региона, заданная как имя функции. Пользовательская функция proposalFcn должна иметь следующую функциональную форму:

 [bboxes,scores] = proposalFcn(I)

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

Имена классов объектов, заданные как массив ячеек. Массив содержит имена классов объектов, для поиска которых был обучен детектор R-CNN.

Это свойство доступно только для чтения.

Имя слоя регрессии ограничивающего прямоугольника, заданное как вектор символов. Это свойство устанавливается во время обучения с использованием BoxRegressionLayer аргумент trainRCNNObjectDetector.

Функции объекта

detectОбнаружение объектов с помощью детектора глубокого обучения R-CNN
classifyRegionsКлассификация объектов в областях изображений с помощью детектора объектов R-CNN

Примеры

свернуть все

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

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

Введенный в R2016b