Обучите детектор транспортного средства глубокого обучения

Этот пример показывает, как обучить детектор транспортного средства на основе зрения с помощью глубокого обучения.

Обзор

Обнаружение автомобиля с помощью компьютерного зрения является важным компонентом для отслеживания транспортных средств вокруг автомобиля , оборудованного датчиком. Способность обнаруживать и отслеживать транспортные средства требуется для многих автономных ведущих приложениях, таких как предупреждение столкновения, адаптивный круиз-контроль и поддержание автомобиля в полосе. Automated Driving Toolbox™ обеспечивает предварительно обученные детекторы транспортного средства (vehicleDetectorFasterRCNN (Automated Driving Toolbox) и vehicleDetectorACF (Automated Driving Toolbox)) для быстрого прототипирования. Однако предварительно обученные модели могут не подходить каждому приложению, требуя, чтобы вы тренировались с нуля. Этот пример показывает, как обучить детектор транспортного средства с нуля с помощью глубокого обучения.

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

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

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

doTrainingAndEval = false;
if ~doTrainingAndEval && ~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% данных для обучения. Остальное используйте для оценки.

rng(0)
shuffledIdx = randperm(height(vehicleDataset));
idx = floor(0.6 * height(vehicleDataset));
trainingDataTbl = vehicleDataset(shuffledIdx(1:idx),:);
testDataTbl = vehicleDataset(shuffledIdx(idx+1:end),:);

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

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

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

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

trainingData = combine(imdsTrain,bldsTrain);
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)

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

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

Сеть редукции данных обычно является предварительно обученной CNN (для получения дополнительной информации смотрите Pretrained Глубоких нейронных сетей). Этот пример использует ResNet-50 для редукции данных. Можно также использовать другие предварительно обученные сети, такие как MobileNet v2 или ResNet-18, в зависимости от требований вашего приложения.

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

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

  • Анкерные коробки

  • Сеть редукции данных

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

inputSize = [224 224 3];

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

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

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

    96    91
    68    65
   150   125
    38    29

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

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

featureExtractionNetwork = resnet50;

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

featureLayer = 'activation_40_relu';

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

numClasses = width(vehicleDataset)-1;

Создайте сеть обнаружения объектов Faster 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, Fast R-CNN и Faster R-CNN (Computer Vision Toolbox).

Увеличение количества данных

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

Использование 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));

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

data = read(trainingData);

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

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

Обучите Faster R-CNN

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

options = trainingOptions('sgdm',...
    'MaxEpochs',7,...
    'MiniBatchSize',1,...
    'InitialLearnRate',1e-3,...
    'CheckpointPath',tempdir);

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

if doTrainingAndEval
    % 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{1});
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));

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

if doTrainingAndEval
    detectionResults = detect(detector,testData,'MinibatchSize',4);
else
    % Load pretrained detector for the example.
    pretrained = load('fasterRCNNResNet50EndToEndVehicleExample.mat');
    detectionResults = pretrained.detectionResults;
end
    

Оцените детектор объектов с помощью средней метрики точности.

[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},[1 2]);
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] Ren, S., K. He, R. Gershick, and J. Sun. «Faster R-CNN: To Real-Time Обнаружения объектов with Области Opposition Networks». Транзакции IEEE Pattern Analysis и Machine Intelligence. Том 39, Выпуск 6, Июнь 2017, стр. 1137-1149.

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

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

[4] Zitnick, C. L., and P. Dollar. «Краевые рамки: определение местоположения предложений объектов с ребер». Европейская конференция по компьютерному зрению. Цюрих, Швейцария, сентябрь 2014, стр. 391-405.

[5] Uijlings, J. R. R., K. E. A. van de Sande, T. Gevers, and A. W. M. Smeulders. «Выборочный поиск для алгоритма распознавания». Международный журнал компьютерного зрения. Том 104, № 2, сентябрь 2013, стр. 154-171.

См. также

Функции

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте