The vision.CascadeObjectDetector
Системный объект поставляется с несколькими предварительно обученными классификаторами для обнаружения лобных граней, профильных граней, носов, глаз и верхней части тела. Однако эти классификаторы не всегда являются достаточными для конкретного применения. Computer Vision Toolbox™ обеспечивает trainCascadeObjectDetector
функция для обучения пользовательского классификатора.
Каскадный детектор объектов Computer Vision Toolbox может обнаруживать категории объектов, соотношение сторон которых не сильно варьируется. Объекты, соотношение сторон которых остается фиксированным, включают лица, стоповые знаки и автомобили, просматриваемые с одной стороны.
The vision.CascadeObjectDetector
Системный объект обнаруживает объекты в изображениях путем скольжения окна над изображением. Затем детектор использует каскадный классификатор, чтобы решить, содержит ли окно интересующий объект. Размер окна изменяется, чтобы обнаружить объекты в разных шкалах, но его соотношение сторон остается фиксированным. Детектор очень чувствителен к повороту вне плоскости, потому что соотношение сторон изменяется для большинства 3-D объектов. Таким образом, необходимо обучить детектор для каждой ориентации объекта. Обучение одного детектора для обработки всех ориентаций не сработает.
Каскадный классификатор состоит из этапов, где каждый этап представляет собой ансамбль слабых учащихся. Слабыми учениками являются простые классификаторы, называемые decision stumps. Каждый этап обучается с использованием метода, называемой бустинг. Boosting предоставляет возможность обучать высокоточный классификатор, принимая взвешенное среднее значение решений, принимаемых слабыми учащимися.
Каждый этап классификатора помечает область, заданную текущим местоположением скользящего окна, как положительную или отрицательную. Positive указывает, что объект был найден, а negative указывает, что объекты не были найдены. Если метка отрицательная, классификация этой области завершена, и детектор перемещает окно в следующее место. Если метка положительная, классификатор передает область на следующий этап. Детектор сообщает об объекте, найденном в активном окне месте, когда заключительный этап классифицирует область как положительную.
Этапы предназначены для того, чтобы отбраковывать отрицательные выборки как можно быстрее. Предположение состоит в том, что подавляющее большинство окон не содержат объекта интереса. И наоборот, истинные срабатывания редки и стоит потратить время на проверку.
true positive происходит, когда положительная выборка правильно классифицирована.
false positive происходит, когда отрицательная выборка ошибочно классифицируется как положительная.
false negative происходит, когда положительная выборка ошибочно классифицируется как отрицательная.
Чтобы работать хорошо, каждый этап в каскаде должен иметь низкую ложноотрицательную частоту. Если этап неправильно помечает объект как отрицательный, классификация останавливается, и вы не можете исправить ошибку. Однако каждый этап может иметь высокую ложноположительную частоту. Даже если детектор неправильно помечает необъект как положительный, можно исправить ошибку на последующих этапах.
Общая ложноположительная скорость каскадного классификатора , где - ложноположительная частота на этап в области значений (0 1), и количество этапов. Точно так же общий истинный положительный темп , где - истинная положительная скорость на этап в области значений (0 1]. Таким образом, добавление большего количества этапов уменьшает общую ложноположительную частоту, но также уменьшает общую истинную положительную частоту.
trainCascadeObjectDetector
Для обучения классификатора каскадов требуется набор положительных выборок и набор отрицательных изображений. Вы должны предоставить набор положительных изображений с необходимыми областями, заданными для использования в качестве положительных выборок. Можно использовать Image Labeler для маркировки интересующих объектов ограничивающими рамками. Image Labeler выводит таблицу, которая используется для положительных выборок. Вы также должны предоставить набор отрицательных изображений, из которых функция автоматически генерирует отрицательные выборки. Чтобы достичь приемлемой точности детектора, установите количество каскадов, тип признака и другие параметры функции.
Выберите параметры функции для оптимизации количества этапов, ложноположительной скорости, истинной положительной скорости и типа функций, используемых для обучения. Когда вы устанавливаете параметры, примите во внимание эти компромиссы.
Состояние | Фактор |
---|---|
Большой набор обучающих данных (в тысячах). | Увеличьте количество каскадов и установите более высокую ложноположительную частоту для каждого каскада. |
Небольшой набор обучающих данных. | Уменьшите количество каскадов и установите более низкую ложноположительную частоту для каждого каскада. |
Чтобы уменьшить вероятность пропуска объекта. | Увеличьте истинную положительную скорость. Однако высокая истинная положительная частота может помешать вам достичь желаемой ложноположительной частоты на стадию, что делает детектор с большей вероятностью производит ложные обнаружения. |
Чтобы уменьшить количество ложных обнаружений. | Увеличьте количество каскадов или уменьшите частоту ложных предупреждений на каскад. |
Выберите функцию, которая подходит для типа обнаружения объектов, которые вам нужны. trainCascadeObjectDetector
поддерживает три типа функций: Haar, локальные двоичные шаблоны (LBP) и гистограммы ориентированных градиентов (HOG). Функции Haar и LBP часто используются для обнаружения лиц, потому что они хорошо работают для представления мелкомасштабных текстур. Функции HOG часто используются для обнаружения таких объектов, как люди и автомобили. Они полезны для захвата общей формы объекта. Например, в следующей визуализации функций HOG можно увидеть контур велосипеда.
Возможно, вам потребуется запустить trainCascadeObjectDetector
функция несколько раз, чтобы настроить параметры. Чтобы сэкономить время, можно использовать функции LBP или HOG на небольшом подмножестве данных. Обучение детектора с помощью функций Haar занимает гораздо больше времени. После этого можно запустить функции Haar, чтобы увидеть, улучшается ли точность.
Чтобы легко создать положительные выборки, можно использовать Image Labeler приложения. Image Labeler обеспечивает простой способ маркировки положительных выборок путем интерактивного определения прямоугольных видимых областей (ROIs).
Можно также задать положительные выборки вручную одним из двух способов. Один из способов - задать прямоугольные области на большем изображении. Эти области содержат интересующие вас объекты. Другой подход - вырезать из изображения объект интереса и сохранить его как отдельное изображение. Затем можно задать область, которая будет целым изображением. Можно также сгенерировать больше положительных выборок из существующих таковых путем добавления вращения или шума или путем изменения яркости или контрастности.
Отрицательные выборки явным образом не указаны. Вместо этого, 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);