Этот пример показывает, как обучить объектный детектор с помощью метода глубокого обучения под названием Более быстрый R-CNN (области со Сверточными Нейронными сетями).
Глубокое обучение является мощным методом машинного обучения, который автоматически изучает функции изображений учебных устойчивых объектных детекторов. Существует несколько методов для обнаружения объектов с помощью глубокого обучения, таких как Более быстрый R-CNN и вы только смотрите однажды (YOLO) v2. Этот пример обучает Более быстрый детектор автомобиля R-CNN с помощью функции trainFasterRCNNObjectDetector
.
Обнаружение объектов с помощью Глубокого обучения (Computer Vision Toolbox)
Примечание: Этот пример требует 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 состоит из сети выделения признаков, сопровождаемой двумя подсетями. Сеть выделения признаков обычно является предварительно обученным CNN, таким как ResNet-50 или Начало v3. Первая подсеть после сети выделения признаков является сетью предложения по области (RPN), обученной сгенерировать объектные предложения (объект или фон). Вторая подсеть обучена предсказать фактический класс каждого предложения (автомобиль или человек).
Этот пример использует предварительно обученный ResNet-50 для выделения признаков. Другие предварительно обученные сети, такие как MobileNet v2 или ResNet-18 могут также использоваться в зависимости от требований к приложению. Функция trainFasterRCNNObjectDetector
автоматически добавляет подсети, требуемые для обнаружения объектов. Вы многие также Создают Более быструю Сеть Обнаружения объектов 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
). Здесь, средняя метрика точности используется. Средняя точность обеспечивает один номер, который включает способность детектора сделать правильные классификации (точность) и способность детектора найти все соответствующие объекты (отзыв).
Первый шаг для оценки детектора должен собрать результаты обнаружения путем выполнения детектора на наборе тестов.
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))
Этот пример показал, как обучить детектор автомобиля с помощью Более быстрого R-CNN. Можно выполнить подобные шаги, чтобы обучить детекторы дорожным знакам, пешеходам или другим объектам.
[1] Жэнь, S. K. Он, Р. Джершик и Дж. Сун. "Более быстрый 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. К. Э. А. ван де Сэйнд, Т. Джеверс и А. В. М. Смеулдерс. "Выборочный Поиск Алгоритма распознавания. Международный журнал "_ Компьютера Vision_. Издание 104, Номер 2, сентябрь 2013, стр 154-171.
detect
| evaluateDetectionMissRate
| evaluateDetectionPrecision
| fastRCNNObjectDetector
| fasterRCNNObjectDetector
| insertObjectAnnotation
| rcnnObjectDetector
| trainFastRCNNObjectDetector
| trainFasterRCNNObjectDetector
| trainNetwork
| trainRCNNObjectDetector
| trainingOptions