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

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

Обзор

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

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

Чтобы узнать больше, смотрите, что Обнаружение объектов использует Глубокое обучение (Computer Vision Toolbox).

Примечание: Этот пример требует Deep Learning Toolbox™. Parallel Computing Toolbox™ рекомендуют обучаться, детектор с помощью CUDA-способного графического процессора NVIDIA™ с вычисляют возможность 3.0.

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

Этот пример использует предварительно обученный детектор, чтобы позволить примеру запускаться, не имея необходимость ожидать обучения завершиться. Если вы хотите обучить детектор с функцией trainFasterRCNNObjectDetector, установите переменную doTrainingAndEval на истину. В противном случае загрузите предварительно обученный детектор.

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

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

Этот пример использует набор данных небольшого транспортного средства, который содержит 295 изображений. Каждое изображение содержит один или два маркированных экземпляра автомобиля. Небольшой набор данных полезен для исследования Более быстрого метода обучения R-CNN, но на практике, более маркированные изображения необходимы, чтобы обучить устойчивый детектор.

% Unzip vehicle dataset images.
unzip vehicleDatasetImages.zip

% Load vehicle dataset ground truth.
data = load('vehicleDatasetGroundTruth.mat');
vehicleDataset = data.vehicleDataset;

Наземные данные об истине хранятся в таблице. Первый столбец содержит путь к файлам изображений. Остальные столбцы содержат метки ROI для автомобилей.

% Display first few rows of the data set.
vehicleDataset(1:4,:)
ans =

  4×2 table

             imageFilename               vehicle
    _______________________________    ____________

    'vehicleImages/image_00001.jpg'    [1×4 double]
    'vehicleImages/image_00002.jpg'    [1×4 double]
    'vehicleImages/image_00003.jpg'    [1×4 double]
    'vehicleImages/image_00004.jpg'    [1×4 double]

Отобразите одно из изображений от набора данных, чтобы понять тип изображений, которые это содержит.

% Add the fullpath to the local vehicle data folder.
vehicleDataset.imageFilename = fullfile(pwd, vehicleDataset.imageFilename);

% Read one of the images.
I = imread(vehicleDataset.imageFilename{10});

% Insert the ROI labels.
I = insertShape(I, 'Rectangle', vehicleDataset.vehicle{10});

% Resize and display image.
I = imresize(I,3);
figure
imshow(I)

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

% Set random seed to ensure example training reproducibility.
rng(0);

% Randomly split data into a training and test set.
shuffledIdx = randperm(height(vehicleDataset));
idx = floor(0.6 * height(vehicleDataset));
trainingData = vehicleDataset(shuffledIdx(1:idx),:);
testData = vehicleDataset(shuffledIdx(idx+1:end),:);

Сконфигурируйте опции обучения

trainFasterRCNNObjectDetector обучает детектор на четырех шагах. Первые два шага обучают предложение по области и сети обнаружения, используемые в Более быстром R-CNN. Итоговые два шага комбинируют сети от первых двух шагов, таким образом, что одна сеть создается для обнаружения [1]. Задайте сетевые опции обучения для всех шагов с помощью trainingOptions.

% Options for step 1.
options = trainingOptions('sgdm', ...
    'MaxEpochs', 5, ...
    'MiniBatchSize', 1, ...
    'InitialLearnRate', 1e-3, ...
    'CheckpointPath', tempdir);

Свойство 'MiniBatchSize' установлено в 1, потому что набор данных автомобиля имеет изображения с различными размерами. Препятствование тому, чтобы они были обработаны в пакетном режиме вместе для обработки. Выберите MiniBatchSize, больше, чем 1, если учебные изображения являются всеми одинаковыми размер, чтобы уменьшать учебное время.

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

Обучите более быстрый R-CNN

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

Этот пример использует предварительно обученный ResNet-50 для выделения признаков. Другие предварительно обученные сети, такие как MobileNet v2 или ResNet-18 могут также использоваться в зависимости от требований к приложению. Функция trainFasterRCNNObjectDetector автоматически добавляет подсети, требуемые для обнаружения объектов. Можно также создать пользовательскую сеть Faster R-CNN. Смотрите Создают Более быструю Сеть Обнаружения объектов R-CNN (Computer Vision Toolbox).

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

if doTrainingAndEval

    % Train Faster R-CNN detector.
    %  * Use 'resnet50' as the feature extraction network.
    %  * Adjust the NegativeOverlapRange and PositiveOverlapRange to ensure
    %    training samples tightly overlap with ground truth.
    [detector, info] = trainFasterRCNNObjectDetector(trainingData, 'resnet50', options, ...
        'NegativeOverlapRange', [0 0.3], ...
        'PositiveOverlapRange', [0.6 1]);
else
    % Load pretrained detector for the example.
    pretrained = load('fasterRCNNResNet50VehicleExample.mat');
    detector = pretrained.detector;
end

% Note: This example verified on an NVIDIA(TM) Titan X with 12 GB of GPU
% memory. Training this network took approximately 10 minutes using this setup.
% Training time varies depending on the hardware you use.

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

% Read a test image.
I = imread(testData.imageFilename{1});

% Run the detector.
[bboxes, scores] = detect(detector, I);

% Annotate detections in the image.
I = insertObjectAnnotation(I, 'rectangle', bboxes, scores);
figure
imshow(I)

Оцените детектор Используя набор тестов

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

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

if doTrainingAndEval
    % Create a table to hold the bounding boxes, scores, and labels output by
    % the detector.
    numImages = height(testData);
    results = table('Size',[numImages 3],...
        'VariableTypes',{'cell','cell','cell'},...
        'VariableNames',{'Boxes','Scores','Labels'});

    % Run detector on each image in the test set and collect results.
    for i = 1:numImages

        % Read the image.
        I = imread(testData.imageFilename{i});

        % Run the detector.
        [bboxes, scores, labels] = detect(detector, I);

        % Collect the results.
        % Collect the results.
        results.Boxes{i} = bboxes;
        results.Scores{i} = scores;
        results.Labels{i} = labels;
    end
else
    % Load pretrained detector for the example.
    pretrained = load('fasterRCNNResNet50VehicleExample.mat');
    results = pretrained.results;
end

% Extract expected bounding box locations from test data.
expectedResults = testData(:, 2:end);

% Evaluate the object detector using average precision metric.
[ap, recall, precision] = evaluateDetectionPrecision(results, expectedResults);

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

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

Сводные данные

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

Чтобы узнать больше о глубоком обучении, смотрите, что Обнаружение объектов использует Глубокое обучение (Computer Vision Toolbox).

Ссылки

[1] Жэнь, Shaoqing, и др. "Более быстрый R-CNN: К Обнаружению объектов В реальном времени с Сетями Предложения по области". Усовершенствования в Нейронных Системах обработки информации. 2015.

Смотрите также

Функции

Похожие темы