exponenta event banner

rcnnObjectDetector

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

Описание

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

Использование rcnnObjectDetector требуются Toolbox™ статистики и машинного обучения и Toolbox™ глубокого обучения.

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

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 Установлен параметр CheckStartPath. Сетевые контрольные точки полезны в случае неожиданного завершения сеанса обучения.

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

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

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

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

Установите параметр «CheckstartPath» с помощью 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