Обнаружение объектов Используя глубокое обучение YOLO v2

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

Обзор

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

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

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

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

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

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

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

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

% 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);
imshow(I)

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

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

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

Создайте Сеть обнаружения объектов YOLO v2

Сеть обнаружения объектов YOLO v2 может считаться наличием двух подсетей. Сеть выделения признаков, сопровождаемая сетью обнаружения.

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

Используйте функцию yolov2Layers, чтобы автоматически изменить предварительно обученную сеть ResNet-50 в сеть обнаружения объектов YOLO v2. yolov2Layers требует, чтобы вы задали несколько входных параметров, которые параметризовали сеть YOLO v2.

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

% Define the image input size.
imageSize = [224 224 3];

% Define the number of object classes to detect.
numClasses = width(vehicleDataset)-1;

Затем, задайте размер полей привязки. Поля привязки должны быть выбраны на основе шкалы и размера объектов в данных тренировки. Можно Оценить, что Поля Привязки Используя Кластеризацию определяют хороший набор полей привязки на основе данных тренировки. Используя эту процедуру, поля привязки для набора данных автомобиля:

anchorBoxes = [
    43 59
    18 22
    23 29
    84 109
];

Смотрите Поля Привязки для Обнаружения объектов для дополнительных деталей.

Наконец, задайте сеть и слой выделения признаков в той сети, чтобы использовать в качестве основания YOLO v2.

% Load a pretrained ResNet-50.
baseNetwork = resnet50;

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

% Specify the feature extraction layer.
featureLayer = 'activation_40_relu';

% Create the YOLO v2 object detection network. 
lgraph = yolov2Layers(imageSize,numClasses,anchorBoxes,baseNetwork,featureLayer);

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

Обратите внимание на то, что можно также создать пользовательский слой слоем сети YOLO v2. Разработайте Сеть обнаружения YOLO v2

Обучите Детектор Объекта YOLO v2

Чтобы использовать функцию trainYOLOv2ObjectDetector, установите doTraining на истину. В противном случае загрузите предварительно обученный детектор.

if doTraining
    
    % Configure the training options. 
    %  * Lower the learning rate to 1e-3 to stabilize training. 
    %  * Set CheckpointPath to save detector checkpoints to a temporary
    %    location. If training is interrupted due to a system failure or
    %    power outage, you can resume training from the saved checkpoint.
    options = trainingOptions('sgdm', ...
        'MiniBatchSize', 16, ....
        'InitialLearnRate',1e-3, ...
        'MaxEpochs',10,...
        'CheckpointPath', tempdir, ...
        'Shuffle','every-epoch');    
    
    % Train YOLO v2 detector.
    [detector,info] = trainYOLOv2ObjectDetector(vehicleDataset,lgraph,options);
else
    % Load pretrained detector for the example.
    pretrained = load('yolov2ResNet50VehicleExample.mat');
    detector = pretrained.detector;
end

Примечание: Этот пример, проверенный на Титане NVIDA™ X с 12 Гбайт памяти графического процессора. Если ваш графический процессор имеет меньше памяти, у можно закончиться память. Если это происходит, понизьте 'MiniBatchSize' с помощью функции trainingOptions. Обучение этой сети заняло приблизительно 5 минут с помощью этой настройки. Учебное время отличается в зависимости от оборудования, которое вы используете.

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

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

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

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

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

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

Первый шаг для оценки детектора должен собрать результаты обнаружения путем выполнения детектора на наборе тестов.

% 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.
    results.Boxes{i} = bboxes;
    results.Scores{i} = scores;
    results.Labels{i} = labels;
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
plot(recall,precision)
xlabel('Recall')
ylabel('Precision')
grid on
title(sprintf('Average Precision = %.2f', ap))

Генерация кода

Если детектор обучен и оценен, можно сгенерировать код для yolov2ObjectDetector с помощью GPU Coder™. Смотрите Генерацию кода для Обнаружения объектов Используя (GPU Coder) пример YOLO v2 для получения дополнительной информации.

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

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

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

Ссылки

[1] Redmon, Джозеф и Али Фархади. "YOLO9000: лучше, быстрее, более сильный". 2 017 конференций по IEEE по компьютерному зрению и распознаванию образов (CVPR). IEEE, 2017.