exponenta event banner

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

В этом примере показано, как обучить детектор объектов с помощью глубокого обучения и R-CNN (области со сверточными нейронными сетями).

Обзор

В этом примере показано, как обучить детектор объекта R-CNN обнаружению стоп-сигналов. R-CNN - это структура обнаружения объектов, которая использует сверточную нейронную сеть (CNN) для классификации областей изображения в пределах изображения [1]. Вместо классификации каждой области с использованием скользящего окна детектор R-CNN обрабатывает только те области, которые, вероятно, содержат объект. Это значительно снижает вычислительные затраты при запуске CNN.

Чтобы проиллюстрировать, как обучить детектор стоп-знака R-CNN, этот пример следует за процессом обучения передаче, который обычно используется в приложениях глубокого обучения. При обучении передаче в качестве отправной точки для решения новой задачи классификации или обнаружения используется сеть, обученная на большом наборе изображений, например ImageNet [2]. Преимущество использования этого подхода заключается в том, что предварительно обученная сеть уже усвоила богатый набор особенностей изображения, которые применимы к широкому диапазону изображений. Это обучение может быть перенесено на новую задачу путем точной настройки сети. Сеть настраивается путем небольших корректировок весов, так что представления элементов, полученные для исходной задачи, слегка корректируются для поддержки новой задачи.

Преимущество трансферного обучения заключается в сокращении количества изображений, необходимых для обучения, и времени обучения. Для иллюстрации этих преимуществ этот пример обучает детектору стоп-знака с использованием потока операций обучения передаче. Сначала CNN предварительно обучается с использованием набора данных CIFAR-10, который имеет 50 000 обучающих изображений. Затем этот предварительно обученный CNN отлаживается для обнаружения знака остановки с использованием всего 41 обучающего изображения. Без предварительной подготовки CNN, обучение детектора стоп-знака потребовало бы гораздо больше изображений.

Примечание.Для этого примера требуется программа Computer Vision Toolbox™, Toolbox™ обработки изображений, Toolbox™ глубокого обучения и Toolbox™ статистики и машинного обучения.

Для выполнения этого примера настоятельно рекомендуется использовать графический процессор NVIDIA™ с поддержкой CUDA. Для использования графического процессора требуется Toolbox™ параллельных вычислений. Сведения о поддерживаемых вычислительных возможностях см. в разделе Поддержка графического процессора по выпуску (Parallel Computing Toolbox).

Загрузить данные изображения CIFAR-10

Загрузите набор данных CIFAR-10 [3]. Этот набор данных содержит 50 000 обучающих изображений, которые будут использоваться для обучения CNN.

Загрузка CIFAR-10 данных во временный каталог

cifar10Data = tempdir;

url = 'https://www.cs.toronto.edu/~kriz/cifar-10-matlab.tar.gz';

helperCIFAR10Data.download(url,cifar10Data);

Загрузите CIFAR-10 учебные и тестовые данные.

[trainingImages,trainingLabels,testImages,testLabels] = helperCIFAR10Data.load(cifar10Data);

Каждое изображение представляет собой изображение 32x32 RGB, и имеется 50 000 обучающих образцов.

size(trainingImages)
ans = 1×4

          32          32           3       50000

CIFAR-10 имеет 10 категорий изображений. Перечислите категории изображений:

numImageCategories = 10;
categories(trainingLabels)
ans = 10×1 cell
    {'airplane'  }
    {'automobile'}
    {'bird'      }
    {'cat'       }
    {'deer'      }
    {'dog'       }
    {'frog'      }
    {'horse'     }
    {'ship'      }
    {'truck'     }

Несколько учебных изображений можно просмотреть с помощью следующего кода.

figure
thumbnails = trainingImages(:,:,:,1:100);
montage(thumbnails)

Создание сверточной нейронной сети (CNN)

CNN состоит из ряда уровней, где каждый уровень определяет конкретное вычисление. Toolbox™ Deep Learning предоставляет функциональные возможности для упрощения проектирования CNN. В этом примере для создания CNN используются следующие слои:

  • imageInputLayer - Слой ввода изображения

  • convolution2dLayer - 2D сверточный слой для сверточных нейронных сетей

  • reluLayer - Слой выпрямленного линейного блока (ReLU)

  • maxPooling2dLayer - Максимальный уровень объединения

  • fullyConnectedLayer - Полностью подключенный слой

  • softmaxLayer - слой Softmax

  • classificationLayer - Классификационный выходной слой для нейронной сети

Определенная здесь сеть аналогична сети, описанной в [4], и начинается с imageInputLayer. Входной уровень определяет тип и размер данных, которые может обрабатывать CNN. В этом примере CNN используется для обработки изображений CIFAR-10, которые представляют собой изображения 32x32 RGB:

% Create the image input layer for 32x32x3 CIFAR-10 images.
[height,width,numChannels, ~] = size(trainingImages);

imageSize = [height width numChannels];
inputLayer = imageInputLayer(imageSize)
inputLayer = 
  ImageInputLayer with properties:

                      Name: ''
                 InputSize: [32 32 3]
   Hyperparameters
          DataAugmentation: 'none'
             Normalization: 'zerocenter'
    NormalizationDimension: 'auto'
                      Mean: []

Затем определите средние уровни сети. Средние слои состоят из повторяющихся блоков сверточных, ReLU (выпрямленных линейных единиц) и пуловых слоев. Эти 3 слоя образуют основные строительные блоки сверточных нейронных сетей. Сверточные уровни определяют наборы весов фильтров, которые обновляются во время обучения сети. Уровень ReLU добавляет нелинейность к сети, что позволяет сети аппроксимировать нелинейные функции, которые отображают пиксели изображения на семантическое содержание изображения. Уровни объединения производят выборку данных по мере их прохождения по сети. В сети с большим количеством уровней уровни объединения должны использоваться скудно, чтобы избежать слишком ранней дискретизации данных в сети.

% Convolutional layer parameters
filterSize = [5 5];
numFilters = 32;

middleLayers = [
    
% The first convolutional layer has a bank of 32 5x5x3 filters. A
% symmetric padding of 2 pixels is added to ensure that image borders
% are included in the processing. This is important to avoid
% information at the borders being washed away too early in the
% network.
convolution2dLayer(filterSize,numFilters,'Padding',2)

% Note that the third dimension of the filter can be omitted because it
% is automatically deduced based on the connectivity of the network. In
% this case because this layer follows the image layer, the third
% dimension must be 3 to match the number of channels in the input
% image.

% Next add the ReLU layer:
reluLayer()

% Follow it with a max pooling layer that has a 3x3 spatial pooling area
% and a stride of 2 pixels. This down-samples the data dimensions from
% 32x32 to 15x15.
maxPooling2dLayer(3,'Stride',2)

% Repeat the 3 core layers to complete the middle of the network.
convolution2dLayer(filterSize,numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3, 'Stride',2)

convolution2dLayer(filterSize,2 * numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3,'Stride',2)

]
middleLayers = 
  9x1 Layer array with layers:

     1   ''   Convolution   32 5x5 convolutions with stride [1  1] and padding [2  2  2  2]
     2   ''   ReLU          ReLU
     3   ''   Max Pooling   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     4   ''   Convolution   32 5x5 convolutions with stride [1  1] and padding [2  2  2  2]
     5   ''   ReLU          ReLU
     6   ''   Max Pooling   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     7   ''   Convolution   64 5x5 convolutions with stride [1  1] and padding [2  2  2  2]
     8   ''   ReLU          ReLU
     9   ''   Max Pooling   3x3 max pooling with stride [2  2] and padding [0  0  0  0]

Более глубокая сеть может быть создана путем повторения этих 3 базовых уровней. Однако количество уровней объединения должно быть уменьшено, чтобы избежать преждевременной понижающей дискретизации данных. Понижающая выборка на ранних этапах сети отбрасывает информацию об изображении, которая полезна для обучения.

Конечные слои CNN обычно состоят из полностью соединенных слоев и слоя потерь софтмакс.

finalLayers = [
    
% Add a fully connected layer with 64 output neurons. The output size of
% this layer will be an array with a length of 64.
fullyConnectedLayer(64)

% Add an ReLU non-linearity.
reluLayer

% Add the last fully connected layer. At this point, the network must
% produce 10 signals that can be used to measure whether the input image
% belongs to one category or another. This measurement is made using the
% subsequent loss layers.
fullyConnectedLayer(numImageCategories)

% Add the softmax loss layer and classification layer. The final layers use
% the output of the fully connected layer to compute the categorical
% probability distribution over the image classes. During the training
% process, all the network weights are tuned to minimize the loss over this
% categorical distribution.
softmaxLayer
classificationLayer
]
finalLayers = 
  5x1 Layer array with layers:

     1   ''   Fully Connected         64 fully connected layer
     2   ''   ReLU                    ReLU
     3   ''   Fully Connected         10 fully connected layer
     4   ''   Softmax                 softmax
     5   ''   Classification Output   crossentropyex

Объедините входные, средние и конечные слои.

layers = [
    inputLayer
    middleLayers
    finalLayers
    ]
layers = 
  15x1 Layer array with layers:

     1   ''   Image Input             32x32x3 images with 'zerocenter' normalization
     2   ''   Convolution             32 5x5 convolutions with stride [1  1] and padding [2  2  2  2]
     3   ''   ReLU                    ReLU
     4   ''   Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     5   ''   Convolution             32 5x5 convolutions with stride [1  1] and padding [2  2  2  2]
     6   ''   ReLU                    ReLU
     7   ''   Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     8   ''   Convolution             64 5x5 convolutions with stride [1  1] and padding [2  2  2  2]
     9   ''   ReLU                    ReLU
    10   ''   Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    11   ''   Fully Connected         64 fully connected layer
    12   ''   ReLU                    ReLU
    13   ''   Fully Connected         10 fully connected layer
    14   ''   Softmax                 softmax
    15   ''   Classification Output   crossentropyex

Инициализируйте веса первого сверточного слоя, используя нормально распределенные случайные числа со стандартным отклонением 0,0001. Это помогает улучшить конвергенцию обучения.

layers(2).Weights = 0.0001 * randn([filterSize numChannels numFilters]);

Обучение CNN с использованием CIFAR-10 данных

Теперь, когда сетевая архитектура определена, она может быть обучена с использованием CIFAR-10 данных обучения. Сначала настройте алгоритм обучения сети с помощью trainingOptions функция. Сетевой обучающий алгоритм использует стохастический градиентный спуск с импульсом (SGDM) с начальной скоростью обучения 0,001. Во время обучения начальная скорость обучения снижается каждые 8 эпох (1 эпоха определяется как один полный проход через весь набор данных обучения). Алгоритм обучения выполняется в течение 40 эпох.

Обратите внимание, что в алгоритме обучения используется мини-пакет размером 128 изображений. При использовании графического процессора для обучения этот размер может потребоваться уменьшить из-за ограничений памяти на графическом процессоре.

% Set the network training options
opts = trainingOptions('sgdm', ...
    'Momentum', 0.9, ...
    'InitialLearnRate', 0.001, ...
    'LearnRateSchedule', 'piecewise', ...
    'LearnRateDropFactor', 0.1, ...
    'LearnRateDropPeriod', 8, ...
    'L2Regularization', 0.004, ...
    'MaxEpochs', 40, ...
    'MiniBatchSize', 128, ...
    'Verbose', true);

Обучение сети с помощью trainNetwork функция. Это интенсивный в вычислительном отношении процесс, который занимает 20-30 минут. Чтобы сэкономить время при выполнении этого примера, предварительно обученная сеть загружается с диска. Если вы хотите обучить сеть самостоятельно, установите doTraining переменная, показанная ниже, имеет значение true.

Обратите внимание, что CUDA-совместимый NVIDIA™ GPU настоятельно рекомендуется для обучения.

% A trained network is loaded from disk to save time when running the
% example. Set this flag to true to train the network.
doTraining = false;

if doTraining    
    % Train a network.
    cifar10Net = trainNetwork(trainingImages, trainingLabels, layers, opts);
else
    % Load pre-trained detector for the example.
    load('rcnnStopSigns.mat','cifar10Net')       
end

Проверка обучения работе с сетью CIFAR-10

После обучения сеть должна быть проверена на успешность обучения. Во-первых, быстрая визуализация весов фильтра первого сверточного слоя может помочь выявить любые непосредственные проблемы с обучением.

% Extract the first convolutional layer weights
w = cifar10Net.Layers(2).Weights;

% rescale the weights to the range [0, 1] for better visualization
w = rescale(w);

figure
montage(w)

Веса первого слоя должны иметь определенную структуру. Если веса все еще выглядят случайными, то это указывает на то, что сеть может потребовать дополнительного обучения. В этом случае, как показано выше, фильтры первого уровня изучили краеподобные признаки из CIFAR-10 обучающих данных.

Для полной проверки результатов обучения используйте данные теста CIFAR-10 для измерения точности классификации сети. Низкий балл указывает на необходимость дополнительного обучения или дополнительных данных обучения. Целью этого примера не обязательно является достижение 100% точности в тестовом наборе, а достаточно обучение сети для использования при обучении детектора объекта.

% Run the network on the test set.
YTest = classify(cifar10Net, testImages);

% Calculate the accuracy.
accuracy = sum(YTest == testLabels)/numel(testLabels)
accuracy = 0.7456

Дальнейшее обучение повысит точность, но это не нужно для целей обучения детектора объекта R-CNN.

Загрузка данных обучения

Теперь, когда сеть хорошо работает для задачи классификации CIFAR-10, подход обучения передачи может быть использован для точной настройки сети для обнаружения знака остановки.

Начните с загрузки данных об истинности земли для стоп-сигналов.

% Load the ground truth data
data = load('stopSignsAndCars.mat', 'stopSignsAndCars');
stopSignsAndCars = data.stopSignsAndCars;

% Update the path to the image files to match the local file system
visiondata = fullfile(toolboxdir('vision'),'visiondata');
stopSignsAndCars.imageFilename = fullfile(visiondata, stopSignsAndCars.imageFilename);

% Display a summary of the ground truth data
summary(stopSignsAndCars)
Variables:
    imageFilename: 41×1 cell array of character vectors
    stopSign: 41×1 cell
    carRear: 41×1 cell
    carFront: 41×1 cell

Учебные данные содержатся в таблице, содержащей имя файла изображения и метки окупаемости инвестиций для стоп-знаков, фронтов автомобилей и задолженностей. Каждая метка ROI представляет собой ограничивающую рамку вокруг объектов, представляющих интерес в изображении. Для обучения детектора стоп-знака необходимы только метки окупаемости инвестиций в стоп-знак. Знаки окупаемости инвестиций для передней и задней частей автомобиля должны быть удалены:

% Only keep the image file names and the stop sign ROI labels
stopSigns = stopSignsAndCars(:, {'imageFilename','stopSign'});

% Display one training image and the ground truth bounding boxes
I = imread(stopSigns.imageFilename{1});
I = insertObjectAnnotation(I,'Rectangle',stopSigns.stopSign{1},'stop sign','LineWidth',8);

figure
imshow(I)

Следует отметить, что в этом наборе данных имеется только 41 обучающий образ. Тренировка детектора объекта R-CNN с нуля с использованием только 41 изображения нецелесообразна и не дает надежного детектора стоп-знака. Поскольку детектор стоп-знака обучается путем точной настройки сети, которая была предварительно обучена на большем наборе данных (CIFAR-10 имеет 50 000 обучающих изображений), использование гораздо меньшего набора данных возможно.

Детектор знаков остановки поезда R-CNN

Наконец, обучите детектор объектов R-CNN с помощью trainRCNNObjectDetector(Панель инструментов компьютерного зрения). Входными данными для этой функции является таблица истинности земли, которая содержит изображения знака остановки, предварительно обученную сеть CIFAR-10 и варианты обучения. Обучающая функция автоматически модифицирует исходную CIFAR-10 сеть, которая классифицировала изображения на 10 категорий, в сеть, которая может классифицировать изображения на 2 класса: стоп-знаки и общий фоновый класс.

Во время обучения веса входной сети точно настраиваются с использованием исправлений изображения, извлеченных из данных истинности земли. Параметры «PositiveTalkedRange» и «NegativeTalkRange» управляют тем, какие исправления изображений используются для обучения. Положительные обучающие образцы - это те, которые перекрываются с полями истинности земли на 0,5-1,0, как измеряется пересечением ограничивающей рамки над метрикой объединения. Отрицательные обучающие образцы - это те, которые пересекаются по 0 с 0,3. Наилучшие значения для этих параметров должны выбираться путем тестирования обученного детектора на наборе проверки.

Для обучения R-CNN настоятельно рекомендуется использовать параллельный пул работников MATLAB для сокращения времени обучения. trainRCNNObjectDetector автоматически создает и использует параллельный пул на основе настроек параллельной настройки. Убедитесь, что использование параллельного пула включено до начала обучения.

Чтобы сэкономить время при выполнении этого примера, предварительно обученная сеть загружается с диска. Если вы хотите обучить сеть самостоятельно, установите doTraining переменная, показанная ниже, имеет значение true.

Обратите внимание, что CUDA-совместимый NVIDIA™ GPU настоятельно рекомендуется для обучения.

% A trained detector is loaded from disk to save time when running the
% example. Set this flag to true to train the detector.
doTraining = false;

if doTraining
    
    % Set training options
    options = trainingOptions('sgdm', ...
        'MiniBatchSize', 128, ...
        'InitialLearnRate', 1e-3, ...
        'LearnRateSchedule', 'piecewise', ...
        'LearnRateDropFactor', 0.1, ...
        'LearnRateDropPeriod', 100, ...
        'MaxEpochs', 100, ...
        'Verbose', true);
    
    % Train an R-CNN object detector. This will take several minutes.    
    rcnn = trainRCNNObjectDetector(stopSigns, cifar10Net, options, ...
    'NegativeOverlapRange', [0 0.3], 'PositiveOverlapRange',[0.5 1])
else
    % Load pre-trained network for the example.
    load('rcnnStopSigns.mat','rcnn')       
end

Тест детектора знака остановки R-CNN

Детектор объекта R-CNN теперь может использоваться для обнаружения стоп-знаков на изображениях. Опробуйте его на тестовом изображении:

% Read test image
testImage = imread('stopSignTest.jpg');

% Detect stop signs
[bboxes,score,label] = detect(rcnn,testImage,'MiniBatchSize',128)
bboxes = 1×4

   419   147    31    20

score = single
    0.9955
label = categorical categorical
     stopSign 

Объект R-CNN detect Метод (Computer Vision Toolbox) возвращает ограничивающие объект рамки, оценку обнаружения и метку класса для каждого обнаружения. Метки полезны при обнаружении нескольких объектов, например, знаков остановки, выхода или ограничения скорости. Оценки, которые находятся в диапазоне от 0 до 1, указывают на уверенность в обнаружении и могут быть использованы для игнорирования обнаружений с низкой оценкой.

% Display the detection results
[score, idx] = max(score);

bbox = bboxes(idx, :);
annotation = sprintf('%s: (Confidence = %f)', label(idx), score);

outputImage = insertObjectAnnotation(testImage, 'rectangle', bbox, annotation);

figure
imshow(outputImage)

Советы по отладке

Сеть, используемая в детекторе R-CNN, также может использоваться для обработки всего тестового изображения. Путем непосредственной обработки всего изображения, которое больше, чем размер входного сигнала сети, может быть сгенерирована 2-D тепловая карта классификационных показателей. Это полезное средство отладки, поскольку оно помогает идентифицировать элементы в образе, которые путают сеть, и может помочь получить представление об улучшении обучения.

% The trained network is stored within the R-CNN detector
rcnn.Network
ans = 
  SeriesNetwork with properties:

    Layers: [15×1 nnet.cnn.layer.Layer]

Извлеките activations от уровня softmax, который является 14-м уровнем в сети. Это оценки классификации, полученные сетью при сканировании изображения.

featureMap = activations(rcnn.Network, testImage, 14);

% The softmax activations are stored in a 3-D array.
size(featureMap)
ans = 1×3

    43    78     2

Третье измерение в featureMap соответствует классам объектов.

rcnn.ClassNames
ans = 2×1 cell
    {'stopSign'  }
    {'Background'}

Карта признаков знака остановки сохраняется в первом канале.

stopSignMap = featureMap(:, :, 1);

Размер выходного сигнала активации меньше входного изображения из-за операций понижающей дискретизации в сети. Чтобы создать лучшую визуализацию, измените размер stopSignMap к размеру входного изображения. Это очень грубое приближение, которое отображает активации в пикселы изображения и должно использоваться только в иллюстративных целях.

% Resize stopSignMap for visualization
[height, width, ~] = size(testImage);
stopSignMap = imresize(stopSignMap, [height, width]);

% Visualize the feature map superimposed on the test image. 
featureMapOnImage = imfuse(testImage, stopSignMap); 

figure
imshow(featureMapOnImage)

Знак остановки в тестовом изображении хорошо соответствует наибольшему пику активации сети. Это помогает проверить, что CNN, используемый в детекторе R-CNN, эффективно научился идентифицировать знаки остановки. Если бы были другие пики, это может указывать на то, что обучение требует дополнительных отрицательных данных, чтобы помочь предотвратить ложные положительные результаты. Если это так, то вы можете увеличить 'MaxEpochs' в trainingOptions и перетренировать.

Резюме

В этом примере показано, как обучить детектору объекта знака остановки R-CNN с помощью сети, обученной CIFAR-10 данным. Аналогичные шаги могут быть выполнены для обучения других детекторов объектов с использованием глубокого обучения.

Ссылки

[1] Гиршик, Р., Дж. Донахью, Т. Даррелл и Дж. Малик. «Богатые иерархии элементов для точного обнаружения объектов и семантической сегментации». Материалы Конференции IEEE 2014 года по компьютерному зрению и распознаванию образов. Columbus, OH, июнь 2014, стр. 580-587.

[2] Денг, Дж., У. Донг, Р. Сочер, Л.-Ж. Ли, К. Ли и Л. Фэй-Фэй. «ImageNet: крупномасштабная база данных иерархических образов». Материалы Конференции IEEE 2009 по компьютерному зрению и распознаванию образов. Майами, Флорида, июнь 2009 года, стр. 248-255.

[3] Крижевский, А. и Г. Хинтон. «Изучение нескольких слоев элементов из крошечных изображений». Магистерская диссертация. Университет Торонто, Торонто, Канада, 2009 год.

[4] https://code.google.com/p/cuda-convnet/

См. также

| | | | (Панель инструментов компьютерного зрения) | (Панель инструментов компьютерного зрения) | (Панель инструментов компьютерного зрения) | (Панель инструментов компьютерного зрения) | (Панель инструментов компьютерного зрения) | (Панель инструментов компьютерного зрения) | (Панель инструментов компьютерного зрения)

Связанные темы