exponenta event banner

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

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

Глубокое обучение - это мощный метод машинного обучения, который можно использовать для обучения надежных детекторов объектов. Существует несколько методов глубокого обучения для обнаружения объектов, включая более быстрый R-CNN, и вы смотрите только один раз (YOLO) v2. В этом примере обучается более быстрый детектор транспортного средства R-CNN с помощью trainFasterRCNNObjectDetector функция. Дополнительные сведения см. в разделе Обнаружение объектов.

Загрузить предварительно обученный детектор

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

doTraining = false;
if ~doTraining && ~exist('fasterRCNNResNet50EndToEndVehicleExample.mat','file')
    disp('Downloading pretrained detector (118 MB)...');
    pretrainedURL = 'https://www.mathworks.com/supportfiles/vision/data/fasterRCNNResNet50EndToEndVehicleExample.mat';
    websave('fasterRCNNResNet50EndToEndVehicleExample.mat',pretrainedURL);
end

Загрузить набор данных

В этом примере используется небольшой маркированный набор данных, содержащий 295 изображений. Многие из этих изображений получены из наборов данных Caltech Cars 1999 и 2001, доступных на веб-сайте Caltech Computational Vision, созданном Пьетро Пероной и используемом с разрешения. Каждое изображение содержит один или два помеченных экземпляра транспортного средства. Небольшой набор данных полезен для изучения процедуры обучения Faster R-CNN, но на практике для обучения надежного детектора требуется больше маркированных изображений. Распакуйте изображения транспортного средства и загрузите данные об истинности грунта транспортного средства.

unzip vehicleDatasetImages.zip
data = load('vehicleDatasetGroundTruth.mat');
vehicleDataset = data.vehicleDataset;

Данные транспортного средства хранятся в таблице из двух столбцов, где первый столбец содержит пути к файлу изображения, а второй столбец содержит ограничивающие рамки транспортного средства.

Разбейте набор данных на обучающие, проверочные и тестовые наборы. Выберите 60% данных для обучения, 10% для проверки и остальные для тестирования обученного детектора.

rng(0)
shuffledIndices = randperm(height(vehicleDataset));
idx = floor(0.6 * height(vehicleDataset));

trainingIdx = 1:idx;
trainingDataTbl = vehicleDataset(shuffledIndices(trainingIdx),:);

validationIdx = idx+1 : idx + 1 + floor(0.1 * length(shuffledIndices) );
validationDataTbl = vehicleDataset(shuffledIndices(validationIdx),:);

testIdx = validationIdx(end)+1 : length(shuffledIndices);
testDataTbl = vehicleDataset(shuffledIndices(testIdx),:);

Использовать imageDatastore и boxLabelDatastore создание хранилищ данных для загрузки данных изображения и метки во время обучения и оценки.

imdsTrain = imageDatastore(trainingDataTbl{:,'imageFilename'});
bldsTrain = boxLabelDatastore(trainingDataTbl(:,'vehicle'));

imdsValidation = imageDatastore(validationDataTbl{:,'imageFilename'});
bldsValidation = boxLabelDatastore(validationDataTbl(:,'vehicle'));

imdsTest = imageDatastore(testDataTbl{:,'imageFilename'});
bldsTest = boxLabelDatastore(testDataTbl(:,'vehicle'));

Объединение хранилищ данных меток изображений и полей.

trainingData = combine(imdsTrain,bldsTrain);
validationData = combine(imdsValidation,bldsValidation);
testData = combine(imdsTest,bldsTest);

Отображение одного из обучающих изображений и наклеек.

data = read(trainingData);
I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)

Создание более быстрой сети обнаружения R-CNN

Более быстрая сеть обнаружения объектов R-CNN состоит из сети извлечения признаков, за которой следуют две подсети. Сеть извлечения функций обычно представляет собой предварительно обученный CNN, например ResNet-50 или Inception v3. Первой подсетью, следующей за сетью извлечения признаков, является сеть предложений области (RPN), обученная генерировать предложения объектов - области на изображении, где объекты, вероятно, существуют. Вторая подсеть обучена предсказывать фактический класс каждого предложения объекта.

Сеть извлечения функций обычно представляет собой предварительно обученный CNN (для получения более подробной информации см. Предварительно обученные нейронные сети (Deep Learning Toolbox)). В этом примере для извлечения элементов используются ResNet-50. Кроме того, в зависимости от требований приложения можно использовать другие предварительно обученные сети, такие как StartNet v2 или ResNet-18.

Использовать fasterRCNNLayers для создания более быстрой сети R-CNN, для которой автоматически предоставляется предварительно подготовленная сеть извлечения функций. fasterRCNNLayers требуется указать несколько входов для параметризации более быстрой сети R-CNN:

  • Размер сетевого входа

  • Якорные ящики

  • Сеть извлечения элементов

Сначала укажите размер сетевого входа. При выборе размера сетевого ввода учитывайте минимальный размер, необходимый для запуска самой сети, размер обучающих изображений и вычислительные затраты, понесенные при обработке данных выбранного размера. Если это возможно, выберите размер сетевого ввода, близкий к размеру обучающего изображения и превышающий размер ввода, требуемый для сети. Чтобы уменьшить вычислительные затраты на выполнение примера, укажите размер сетевого входа [224 224 3], который является минимальным размером, необходимым для запуска сети.

inputSize = [224 224 3];

Обратите внимание, что учебные изображения, используемые в этом примере, больше 224 на 224 и различаются по размеру, поэтому перед началом обучения необходимо изменить размер изображений на этапе предварительной обработки.

Далее используйте estimateAnchorBoxes оценить ящики привязки на основе размера объектов в данных обучения. Чтобы учесть изменение размеров изображений перед обучением, измените размер обучающих данных для оценки полей привязки. Использовать transform для предварительной обработки данных обучения, затем определите количество анкерных ящиков и оцените их.

preprocessedTrainingData = transform(trainingData, @(data)preprocessData(data,inputSize));
numAnchors = 3;
anchorBoxes = estimateAnchorBoxes(preprocessedTrainingData,numAnchors)
anchorBoxes = 3×2

    29    17
    46    39
   136   116

Дополнительные сведения о выборе полей привязки см. в разделах Оценка полей привязки из данных обучения (Computer Vision Toolbox™) и Поля привязки для обнаружения объектов.

Теперь используйте resnet50 для загрузки предварительно подготовленной модели ResNet-50.

featureExtractionNetwork = resnet50;

Выбрать 'activation_40_relu' в качестве слоя извлечения элементов. Этот слой извлечения элементов выводит карты элементов, которые понижаются в 16 раз. Эта величина понижающей дискретизации является хорошим компромиссом между пространственным разрешением и прочностью выделенных признаков, поскольку признаки, извлеченные далее вниз по сети, кодируют более сильные признаки изображения за счет пространственного разрешения. Выбор оптимального слоя извлечения элементов требует эмпирического анализа. Вы можете использовать analyzeNetwork для поиска имен других потенциальных слоев извлечения элементов в сети.

featureLayer = 'activation_40_relu';

Определите количество обнаруживаемых классов.

numClasses = width(vehicleDataset)-1;

Создайте более быструю сеть обнаружения объектов R-CNN.

lgraph = fasterRCNNLayers(inputSize,numClasses,anchorBoxes,featureExtractionNetwork,featureLayer);

Можно визуализировать сеть с помощью analyzeNetwork или Deep Network Designer из Deep Learning Toolbox™.

Если требуется дополнительный контроль над сетевой архитектурой Faster R-CNN, используйте Deep Network Designer для разработки сети обнаружения Faster R-CNN вручную. Дополнительные сведения см. в разделах Начало работы с R-CNN, Быстрый R-CNN и Более быстрый R-CNN.

Увеличение объема данных

Увеличение данных используется для повышения точности сети путем случайного преобразования исходных данных во время обучения. С помощью увеличения данных можно добавить большее разнообразие к обучающим данным без фактического увеличения количества маркированных обучающих образцов.

Использовать transform для увеличения обучающих данных путем случайного разворота изображения и связанных меток полей по горизонтали. Обратите внимание, что увеличение данных не применяется к данным тестирования и проверки. В идеале данные тестирования и проверки являются репрезентативными для исходных данных и остаются неизмененными для объективной оценки.

augmentedTrainingData = transform(trainingData,@augmentData);

Считывайте одно и то же изображение несколько раз и отображайте дополненные учебные данные.

augmentedData = cell(4,1);
for k = 1:4
    data = read(augmentedTrainingData);
    augmentedData{k} = insertShape(data{1},'Rectangle',data{2});
    reset(augmentedTrainingData);
end
figure
montage(augmentedData,'BorderSize',10)

Предварительные данные обучения

Предварительная обработка дополненных данных обучения и данных проверки для подготовки к обучению.

trainingData = transform(augmentedTrainingData,@(data)preprocessData(data,inputSize));
validationData = transform(validationData,@(data)preprocessData(data,inputSize));

Считывание предварительно обработанных данных.

data = read(trainingData);

Отображение изображения и ограничивающих прямоугольников.

I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)

Более быстрый поезд R-CNN

Использовать trainingOptions для указания параметров сетевого обучения. Набор 'ValidationData' к предварительно обработанным данным проверки. Набор 'CheckpointPath' во временное место. Это позволяет экономить частично обученные детекторы в процессе обучения. Если обучение прервано, например, из-за отключения питания или сбоя системы, вы можете возобновить обучение с сохраненной контрольной точки.

options = trainingOptions('sgdm',...
    'MaxEpochs',10,...
    'MiniBatchSize',2,...
    'InitialLearnRate',1e-3,...
    'CheckpointPath',tempdir,...
    'ValidationData',validationData);

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

if doTraining
    % Train the Faster R-CNN detector.
    % * Adjust NegativeOverlapRange and PositiveOverlapRange to ensure
    %   that training samples tightly overlap with ground truth.
    [detector, info] = trainFasterRCNNObjectDetector(trainingData,lgraph,options, ...
        'NegativeOverlapRange',[0 0.3], ...
        'PositiveOverlapRange',[0.6 1]);
else
    % Load pretrained detector for the example.
    pretrained = load('fasterRCNNResNet50EndToEndVehicleExample.mat');
    detector = pretrained.detector;
end

Этот пример был подтвержден графическим процессором Nvidia (TM) Titan X с 12 ГБ памяти. Обучение сети заняло примерно 20 минут. Время обучения зависит от используемого оборудования.

Для быстрой проверки запустите детектор на одном тестовом изображении. Убедитесь, что размер изображения совпадает с размером учебных изображений.

I = imread(testDataTbl.imageFilename{3});
I = imresize(I,inputSize(1:2));
[bboxes,scores] = detect(detector,I);

Просмотрите результаты.

I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
figure
imshow(I)

Оценка детектора с помощью тестового набора

Оцените обученный детектор объектов на большом наборе изображений для измерения производительности. Computer Vision Toolbox™ предоставляет функции оценки детекторов объектов для измерения общих метрик, таких как средняя точность (evaluateDetectionPrecision) и средние по журналу показатели промахов (evaluateDetectionMissRate). Для этого примера используйте метрику средней точности для оценки производительности. Средняя точность обеспечивает одно число, которое включает в себя способность детектора делать правильные классификации (точность) и способность детектора находить все соответствующие объекты (вспомним).

Примените к тестовым данным то же преобразование предварительной обработки, что и к учебным данным.

testData = transform(testData,@(data)preprocessData(data,inputSize));

Запустите детектор на всех тестовых изображениях.

detectionResults = detect(detector,testData,'MinibatchSize',4);   

Вычислите детектор объекта, используя метрику средней точности.

[ap, recall, precision] = evaluateDetectionPrecision(detectionResults,testData);

Кривая точности/отзыва (PR) показывает, насколько точен детектор при различных уровнях отзыва. Идеальная точность - 1 на всех уровнях отзыва. Использование большего количества данных может помочь повысить среднюю точность, но может потребовать больше времени на обучение. Постройте график кривой PR.

figure
plot(recall,precision)
xlabel('Recall')
ylabel('Precision')
grid on
title(sprintf('Average Precision = %.2f', ap))

Вспомогательные функции

function data = augmentData(data)
% Randomly flip images and bounding boxes horizontally.
tform = randomAffine2d('XReflection',true);
sz = size(data{1});
rout = affineOutputView(sz,tform);
data{1} = imwarp(data{1},tform,'OutputView',rout);

% Sanitize box data, if needed.
data{2} = helperSanitizeBoxes(data{2}, sz);

% Warp boxes.
data{2} = bboxwarp(data{2},tform,rout);
end

function data = preprocessData(data,targetSize)
% Resize image and bounding boxes to targetSize.
sz = size(data{1},[1 2]);
scale = targetSize(1:2)./sz;
data{1} = imresize(data{1},targetSize(1:2));

% Sanitize box data, if needed.
data{2} = helperSanitizeBoxes(data{2}, sz);

% Resize boxes.
data{2} = bboxresize(data{2},scale);
end

Ссылки

[1] Рен, С., К. Он, Р. Гершик и Дж. Сан. «Более быстрое обнаружение объектов R-CNN: на пути к реальному времени с помощью региональных сетей предложений». Транзакции IEEE анализа шаблонов и машинного интеллекта. Том 39, выпуск 6, июнь 2017 г., стр. 1137-1149.

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

[3] Гиршик, Р. «Быстрый R-CNN». Материалы Международной конференции IEEE 2015 по компьютерному зрению. Сантьяго, Чили, декабрь 2015 года, стр. 1440-1448.

[4] Цитник, К. Л. и П. Доллар. «Поля ребер: поиск предложений объектов из ребер». Европейская конференция по компьютерному зрению. Цюрих, Швейцария, сентябрь 2014 года, стр. 391-405.

[5] Уйлингс, Дж. Р. Р., К. Э. А. ван де Санде, Т. Геверс и А. В. М. Смеулдерс. «Выборочный поиск для распознавания объектов». Международный журнал компьютерного зрения. Том 104, номер 2, сентябрь 2013 г., стр. 154-171.

См. также

| | | | | | | | | | (глубоко изучение комплекта инструментов) | (инструментарий для глубокого обучения)

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