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

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

Обзор

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

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

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

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

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 изображений. Многие из этих изображений прибывают из Автомобилей Калифорнийского технологического института 1 999 и 2 001 набор данных, доступный в Калифорнийском технологическом институте Вычислительный веб-сайт Видения, созданный Пьетро Пероной и используемый с разрешением. Каждое изображение содержит один или два помеченных экземпляра транспортного средства. Маленький набор данных полезен для исследования метода обучения 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 или Начало v3. Первая подсеть после сети извлечения признаков является сетью предложения по области (RPN), обученной сгенерировать объектные предложения - области в изображении, где объекты, вероятно, будут существовать. Вторая подсеть обучена предсказать фактический класс каждого объектного предложения.

Сеть извлечения признаков обычно является предварительно обученным CNN (для получения дополнительной информации смотрите Предварительно обученные Глубокие нейронные сети). Этот пример использует 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, Быстрым 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 верно. В противном случае загрузите предварительно обученную сеть.

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] Жэнь, S. K. Он, Р. Джершик и Дж. Сун. "Faster R-CNN: К Обнаружению объектов В реальном времени с Сетями Предложения по области". Транзакции IEEE Анализа Шаблона и Искусственного интеллекта. Издание 39, Выпуск 6, июнь 2017, стр 1137-1149.

[2] Girshick, R., Дж. Донахью, Т. Даррелл и Дж. Малик. "Богатые Иерархии Функции для Точного Обнаружения объектов и Семантической Сегментации". Продолжения 2 014 Конференций по IEEE по Компьютерному зрению и Распознаванию образов. Колумбус, OH, июнь 2014, стр 580-587.

[3] Girshick, R. "Быстрый R-CNN". Продолжения 2 015 Международных конференций IEEE по вопросам Компьютерного зрения. Сантьяго, Чили, декабрь 2015, стр 1440-1448.

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

[5] Уиджлингс, J. R. R. К. Э. А. ван де Сэйнд, Т. Джеверс и А. В. М. Смеулдерс. "Выборочный Поиск Алгоритма распознавания". Международный журнал Компьютерного зрения. Издание 104, Номер 2, сентябрь 2013, стр 154-171.

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

Функции

Похожие темы