rcnnObjectDetector

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

Описание

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

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

При использовании detect или функций classifyRegions с rcnnObjectDetector, использование CUDA® включило NVIDIA®, графический процессор с вычисляет возможность 3.0, или выше настоятельно рекомендован. Графический процессор значительно уменьшает время вычисления. Использование графического процессора требует Parallel Computing Toolbox™.

Создание

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

detector = trainRCNNObjectDetector(trainingData,...)

Свойства

развернуть все

Серийный сетевой объект, представляющий сверточную нейронную сеть (CNN), заданную как SeriesNetwork или DAGNetwork. Объект используется в детекторе 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()];

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