vision.CascadeObjectDetector Объект системы снабжен несколькими предварительно подготовленными классификаторами для обнаружения фронтальных граней, фасадов профиля, носов, глаз и верхней части тела. Однако этих классификаторов не всегда достаточно для конкретного применения. Компьютерное зрение Toolbox™ обеспечивает trainCascadeObjectDetector для обучения пользовательского классификатора.

Каскадный детектор объектов Computer Vision Toolbox может обнаруживать категории объектов, соотношение сторон которых существенно не изменяется. К объектам, чье соотношение сторон остается фиксированным, относятся лица, стоп-знаки и автомобили, просматриваемые с одной стороны.
vision.CascadeObjectDetector Системный объект обнаруживает объекты в изображениях, перемещая окно поверх изображения. Затем детектор использует каскадный классификатор, чтобы решить, содержит ли окно интересующий объект. Размер окна варьируется для обнаружения объектов в разных масштабах, но его соотношение сторон остаётся фиксированным. Детектор очень чувствителен к вращению вне плоскости, потому что соотношение сторон изменяется для большинства 3-D объектов. Таким образом, нужно тренировать детектор для каждой ориентации объекта. Тренировка одного детектора для работы со всеми ориентациями не сработает.
Каскадный классификатор состоит из этапов, где каждый этап представляет собой ансамбль слабых учеников. Слабые ученики являются простыми классификаторами, называемыми пнями принятия решений. Каждый этап обучается с использованием техники, называемой бустинг. Повышение дает возможность обучать высокоточный классификатор, принимая средневзвешенные решения, принятые слабыми учениками.
Каждый этап классификатора помечает область, определенную текущим расположением скользящего окна, как положительную или отрицательную. Положительное указывает на то, что объект найден, а отрицательное указывает на то, что объекты не найдены. Если метка отрицательна, классификация этой области завершена, и детектор переместит окно в следующее место. Если метка положительная, классификатор передает область на следующий этап. Детектор сообщает об объекте, найденном в текущем месте окна, когда конечный этап классифицирует область как положительную.
Этапы предназначены для максимально быстрого отбраковывания отрицательных проб. Предполагается, что подавляющее большинство окон не содержат интересующего объекта. И наоборот, истинные положительные результаты редки и заслуживают времени для проверки.
Истинный позитив возникает, когда положительный образец правильно классифицирован.
Ложноположительный результат возникает, когда отрицательный образец ошибочно классифицируется как положительный.
Ложный негатив возникает, когда положительный образец ошибочно классифицируется как отрицательный.
Чтобы хорошо работать, каждый этап в каскаде должен иметь низкую ложноотрицательную скорость. Если стадия неправильно помечает объект как отрицательный, классификация прекращается, и исправить ошибку невозможно. Однако каждый этап может иметь высокую ложноположительную скорость. Даже если детектор неправильно помечает объект как положительный, можно исправить ошибку на последующих этапах.
Общая ложноположительная скорость каскадного классификатора равна , где - ложноположительная скорость на этап в диапазоне (0 1), а - количество этапов. Аналогично, общая истинная положительная скорость равна , где - истинная положительная скорость на стадию в диапазоне (0 1]. Таким образом, добавление большего количества этапов снижает общую ложноположительную скорость, но также уменьшает общую истинную положительную скорость.
trainCascadeObjectDetectorОбучение каскадному классификатору требует набора положительных образцов и набора отрицательных изображений. Для использования в качестве положительных образцов необходимо предоставить набор положительных изображений с областями интересов. С помощью инструмента «Метка изображения» можно маркировать интересующие объекты ограничивающими прямоугольниками. Приложение Image Labeler выводит таблицу для положительных выборок. Необходимо также предоставить набор отрицательных изображений, на основе которых функция автоматически генерирует отрицательные пробы. Для достижения допустимой точности детектора задайте количество этапов, тип элемента и другие параметры функции.

Выберите параметры функции для оптимизации количества этапов, ложноположительной скорости, истинной положительной скорости и типа функций, используемых для обучения. При установке параметров учитывайте эти компромиссы.
| Состояние | Соображение |
|---|---|
| Большой тренировочный набор (в тысячах). | Увеличьте число этапов и установите более высокую ложноположительную скорость для каждого этапа. |
| Небольшой тренировочный набор. | Уменьшите количество этапов и установите более низкую ложноположительную скорость для каждого этапа. |
| Чтобы уменьшить вероятность пропуска объекта. | Увеличьте истинную положительную ставку. Тем не менее, высокая истинная положительная скорость может помешать вам достичь желаемой ложноположительной скорости на этап, что делает детектор более вероятным производить ложные обнаружения. |
| Чтобы уменьшить число ложных обнаружений. | Увеличение количества этапов или уменьшение частоты ложных аварийных сигналов на этап. |
Выберите функцию, подходящую для требуемого типа обнаружения объектов. trainCascadeObjectDetector поддерживает три типа функций: Haar, локальные двоичные шаблоны (LBP) и гистограммы ориентированных градиентов (HOG). Функции Haar и LBP часто используются для обнаружения лиц, поскольку они хорошо работают для представления тонких текстур. Функции HOG часто используются для обнаружения таких объектов, как люди и автомобили. Они полезны для захвата общей формы объекта. Например, в следующей визуализации элементов HOG можно увидеть контур велосипеда.

Возможно, вам потребуется запустить trainCascadeObjectDetector для настройки параметров используется несколько раз. Для экономии времени можно использовать функции LBP или HOG в небольшом подмножестве данных. Обучение детектора с использованием функций Haar занимает гораздо больше времени. После этого можно запустить функции Haar, чтобы увидеть, улучшается ли точность.
Чтобы легко создавать положительные образцы, можно использовать приложение Image Labeler. Приложение Image Labeler обеспечивает простой способ маркировки положительных образцов, интерактивно указывая прямоугольные области интересов (ROI).

Можно также указать положительные пробы вручную одним из двух способов. Одним из способов является указание прямоугольных областей на изображении большего размера. Регионы содержат интересующие объекты. Другой подход заключается в том, чтобы вырезать интересующий объект из изображения и сохранить его как отдельное изображение. Затем можно указать область, которая будет представлять собой все изображение. Можно также создать больше положительных выборок из существующих, добавив вращение или шум, или изменяя яркость или контрастность.
Отрицательные выборки явно не указаны. Вместо этого, trainCascadeObjectDetector функция автоматически генерирует отрицательные выборки из предоставленных пользователем отрицательных изображений, не содержащих интересующих объектов. Перед тренировкой каждого нового этапа функция запускает детектор, состоящий из этапов, уже обученных на отрицательных изображениях. Любые обнаруженные из этого изображения объекты являются ложными положительными, которые используются в качестве отрицательных выборок. Таким образом, каждый новый этап каскада обучается исправлению ошибок, допущенных предыдущими этапами.

По мере добавления дополнительных этапов общая частота ложноположительных результатов детектора уменьшается, что затрудняет генерирование отрицательных выборок. По этой причине полезно предоставить как можно больше негативных изображений. Чтобы повысить точность обучения, предоставьте отрицательные изображения, которые содержат фон, обычно связанный с интересующими объектами. Также включают отрицательные изображения, которые содержат объекты, похожие по внешнему виду на интересующие объекты. Например, если вы обучаетесь детектору стоп-знака, включите отрицательные изображения, которые содержат дорожные знаки и формы, похожие на стоп-знак.
Существует компромисс между меньшим количеством этапов с более низкой ложноположительной скоростью на этап или более этапов с более высокой ложноположительной скоростью на этап. Этапы с более низкой ложноположительной частотой являются более сложными, поскольку они содержат большее число слабых учащихся. На этапах с более высоким показателем ложноположительных результатов обучается меньше слабых учащихся. Как правило, лучше иметь большее количество простых стадий, потому что на каждой стадии общая ложноположительная скорость уменьшается экспоненциально. Например, если ложноположительная скорость на каждом этапе составляет 50%, то общая ложноположительная скорость каскадного классификатора с двумя этапами составляет 25%. С тремя этапами она становится 12,5% и так далее. Однако чем больше число этапов, тем больший объем данных обучения требуется классификатору. Также увеличение количества этапов увеличивает ложноотрицательную скорость. Это увеличение приводит к большему шансу отклонить положительный образец по ошибке. Установите ложноположительную скорость (FalseAlarmRate) и количество этапов, (NumCascadeStages) для получения приемлемого общего ложноположительного показателя. Затем вы можете настроить эти два параметра экспериментально.
Обучение иногда может завершиться рано. Например, предположим, что обучение прекращается после семи этапов, даже если для параметра количества этапов задано значение 20. Возможно, что функция не может генерировать достаточное количество отрицательных выборок. Если повторно запустить функцию и установить количество этапов равным семи, результат не будет одинаковым. Результаты между этапами различаются, поскольку количество положительных и отрицательных выборок, используемых для каждого этапа, пересчитывается для нового числа этапов.
Подготовка хорошего детектора требует тысяч тренировочных образцов. Обработка больших объемов данных обучения может занять несколько часов или даже дней. Во время обучения функция отображает время, затраченное на обучение каждого этапа, в окне команд MATLAB ®. Время обучения зависит от типа указанной функции. Использование функций Haar занимает гораздо больше времени, чем использование функций LBP или HOG.
trainCascadeObjectDetector функция автоматически определяет количество положительных выборок, используемых для обучения каждого этапа. Количество основано на общем количестве положительных выборок, предоставленных пользователем, и значениях TruePositiveRate и NumCascadeStages параметры.
Количество доступных положительных образцов, используемых для обучения каждого этапа, зависит от истинной положительной скорости. Скорость определяет, какой процент положительных выборок функция может классифицировать как отрицательный. Если выборка классифицируется как отрицательная на любом этапе, она никогда не достигает последующих этапов. Например, предположим, что вы установили TruePositiveRate кому 0.9и все доступные образцы используются для обучения первой ступени. При этом 10% положительных проб отбраковываются как негативы, и только 90% от общего количества положительных проб доступны для тренировки второго этапа. Если тренировки продолжаются, то каждый этап тренируется с меньшим количеством проб. Каждый последующий этап должен решать все более сложную проблему классификации с меньшим количеством положительных проб. С каждым этапом, получающим меньше выборок, более поздние этапы, вероятно, перевыполнят данные.
В идеале использовать одинаковое количество образцов для тренировки каждого этапа. Для этого количество положительных проб, используемых для обучения на каждом этапе, должно быть меньше общего количества имеющихся положительных проб. Единственным исключением является то, что при значении TruePositiveRate если общее количество положительных проб меньше 1, то никакие положительные пробы не отбраковываются как отрицательные.
Функция вычисляет количество положительных выборок для использования на каждом этапе по следующей формуле:
количество положительных выборок = floor(totalPositiveSamples / (1 + (NumCascadeStages - 1) * (1 - TruePositiveRate)))
TruePositiveRate. Уменьшение количества этапов также может работать, но такое уменьшение может также привести к более высокой общей частоте ложных аварийных сигналов. Функция вычисляет количество отрицательных выборок, используемых на каждом этапе. Этот расчет производится путем умножения количества положительных выборок, используемых на каждом этапе, на значение NegativeSamplesFactor.
Как и в случае положительных проб, нет гарантии, что рассчитанное количество отрицательных проб всегда доступно для конкретного этапа. trainCascadeObjectDetector функция генерирует отрицательные выборки из отрицательных изображений. Однако с каждым новым этапом общая частота ложных аварийных сигналов каскадного классификатора уменьшается, что снижает вероятность нахождения отрицательных выборок.
Обучение продолжается до тех пор, пока количество отрицательных образцов, доступных для обучения стадии, превышает 10% от расчетного числа отрицательных образцов. Если отрицательных проб недостаточно, обучение прекращается, и функция выдает предупреждение. Она выводит классификатор, состоящий из этапов, которые она обучала до этого момента. Когда обучение прекращается, лучший подход - добавить больше негативных образов. Кроме того, можно уменьшить количество этапов или увеличить ложноположительную скорость.
Обучение пятиступенчатого детектора стоп-сигнала
Обучение пятиступенчатого детектора стоп-знака с пониженной истинной положительной скоростью
Загрузите данные положительных выборок из файла MAT. Файл содержит таблицу, определяющую ограничивающие рамки для нескольких категорий объектов. Таблица была экспортирована из Image Labeler приложение.
Загрузить положительные пробы.
load('stopSignsAndCars.mat');Выберите ограничивающие рамки для стоп-знаков из таблицы.
positiveInstances = stopSignsAndCars(:,1:2);
Добавьте папку изображения к пути MATLAB.
imDir = fullfile(matlabroot,'toolbox','vision','visiondata',... 'stopSignImages'); addpath(imDir);
Укажите папку для отрицательных изображений.
negativeFolder = fullfile(matlabroot,'toolbox','vision','visiondata',... 'nonStopSigns');
Создание imageDatastore объект, содержащий отрицательные изображения.
negativeImages = imageDatastore(negativeFolder);
Обучите каскадный детектор объектов stopSignDetector.xml, используя функции HOG. ПРИМЕЧАНИЕ: Выполнение команды может занять несколько минут.
trainCascadeObjectDetector('stopSignDetector.xml',positiveInstances, ... negativeFolder,'FalseAlarmRate',0.1,'NumCascadeStages',5);
Automatically setting ObjectTrainingSize to [35, 32] Using at most 42 of 42 positive samples per stage Using at most 84 negative samples per stage --cascadeParams-- Training stage 1 of 5 [........................................................................] Used 42 positive and 84 negative samples Time to train stage 1: 0 seconds Training stage 2 of 5 [........................................................................] Used 42 positive and 84 negative samples Time to train stage 2: 0 seconds Training stage 3 of 5 [........................................................................] Used 42 positive and 84 negative samples Time to train stage 3: 2 seconds Training stage 4 of 5 [........................................................................] Used 42 positive and 84 negative samples Time to train stage 4: 6 seconds Training stage 5 of 5 [........................................................................] Used 42 positive and 17 negative samples Time to train stage 5: 9 seconds Training complete
Используйте только что обученный классификатор для обнаружения знака остановки в изображении.
detector = vision.CascadeObjectDetector('stopSignDetector.xml');Прочтите тестовый образ.
img = imread('stopSignTest.jpg');Обнаружить знак остановки.
bbox = step(detector,img);
Вставьте прямоугольники ограничительной рамки и верните помеченное изображение.
detectedImg = insertObjectAnnotation(img,'rectangle',bbox,'stop sign');
Отображение обнаруженного знака остановки.
figure; imshow(detectedImg);

Удалите каталог изображений из пути.
rmpath(imDir);