rcnnObjectDetector

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

Описание

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

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

При использовании detect или classifyRegions функции с rcnnObjectDetector, использование CUDA® включило NVIDIA®, который настоятельно рекомендован графический процессор. Графический процессор значительно уменьшает время вычисления. Использование графического процессора требует Parallel Computing Toolbox™. Для получения информации о поддерживаемом вычислите возможности, смотрите Поддержку графического процессора Релизом (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 для уменьшения использования памяти GPU. Понизьте 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

Введенный в R2017b