vision.CascadeObjectDetector
Системный объект идет с несколькими предварительно обученными классификаторами для обнаружения лобных поверхностей, поверхностей профиля, носов, глаз и верхней части тела. Однако эти классификаторы не всегда достаточны для конкретного приложения. Computer Vision Toolbox™ обеспечивает trainCascadeObjectDetector
функция, чтобы обучить пользовательский классификатор.
Каскадный детектор объектов Computer Vision Toolbox может обнаружить категории объектов, соотношение сторон которых значительно не варьируется. Объекты, соотношение сторон которых остается фиксированным, включают поверхности, знаки Стоп и автомобили, просматриваемые с одной стороны.
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
поддержки три типа функций: Хаар, локальные бинарные шаблоны (LBP) и гистограммы ориентированных градиентов. Хаар и функции LBP часто используются, чтобы обнаружить поверхности, потому что они работают хорошо на представление структур прекрасной шкалы. Функции ПОЖИРАТЕЛЯ РЕСУРСОВ часто используются, чтобы обнаружить объекты, такие как люди и автомобили. Они полезны для получения полной формы объекта. Например, в следующей визуализации функций ПОЖИРАТЕЛЯ РЕСУРСОВ, вы видите схему велосипеда.
Вы можете должны быть запуститься trainCascadeObjectDetector
функционируйте многократно, чтобы настроить параметры. Чтобы сэкономить время, можно использовать LBP или функции ПОЖИРАТЕЛЯ РЕСУРСОВ на небольшом подмножестве данных. Обучение детектор с помощью функций Хаара берет намного дольше. После этого можно запустить функции Хаара, чтобы видеть, улучшается ли точность.
Чтобы создать положительные выборки легко, можно использовать приложение Image Labeler. Image Labeler обеспечивает простой способ пометить положительные выборки путем интерактивного определения прямоугольных видимых областей (ROIs).
Можно также задать положительные выборки вручную одним из двух способов. Один путь состоит в том, чтобы задать прямоугольные области в увеличенном изображении. Области содержат предметы интереса. Другой подход должен обрезать предмет интереса от изображения и сохранить его как отдельное изображение. Затем можно задать область, чтобы быть целым изображением. Можно также сгенерировать больше положительных выборок от существующих единиц путем добавления вращения или шума, или различной яркостью или контрастом.
Отрицательные выборки не заданы явным образом. Вместо этого trainCascadeObjectDetector
функция автоматически генерирует отрицательные выборки от предоставленных пользователями негативов, которые не содержат предметы интереса. Перед обучением каждый новый этап функция запускает детектор, состоящий из этапов, уже обученных на негативах. Любые объекты, обнаруженные от них, отображают, ложные положительные стороны, которые используются в качестве отрицательных выборок. Таким образом каждый новый этап каскада обучен откорректировать ошибки, сделанные предыдущими этапами.
Когда больше этапов добавляется, полные ложные положительные уменьшения уровня детектора, заставляя генерацию отрицательных выборок больше затруднить. Поэтому полезно предоставить как можно больше негативов. Чтобы улучшить учебную точность, предоставьте негативы, которые содержат фоны, обычно сопоставленные с предметами интереса. Кроме того, включайте негативы, которые содержат необъекты, похожие по внешности на предметы интереса. Например, если вы - обучение детектор знака Стоп, включаете негативы, которые содержат дорожные знаки, и формирует похожий на знак Стоп.
Существует компромисс между меньшим количеством этапов с более низким ложным положительным уровнем на этап или больше этапов с более высоким ложным положительным уровнем на этап. Этапы с более низким ложным положительным уровнем являются более комплексными, потому что они содержат большее количество слабых учеников. Этапы с более высоким ложным положительным уровнем содержат меньше слабых учеников. Обычно лучше иметь большее количество простых этапов, потому что на каждом этапе полный ложный положительный уровень уменьшается экспоненциально. Например, если ложный положительный уровень на каждом этапе составляет 50%, то полный ложный положительный уровень каскадного классификатора с двумя этапами составляет 25%. С тремя этапами это становится 12,5% и так далее. Однако, чем больше количество этапов, тем больше сумма обучающих данных классификатор требует. Кроме того, увеличение числа этапов увеличивает ложный отрицательный уровень. Это увеличение приводит к большему шансу отклонения положительной выборки по ошибке. Установите ложный положительный уровень (FalseAlarmRate
) и количество этапов, (NumCascadeStages
) дать к приемлемому полному ложному положительному уровню. Затем можно настроить эти два параметра экспериментально.
Обучение может иногда завершать работу рано. Например, предположите, что учебные остановки после семи этапов, даже при том, что вы определяете номер параметра этапов к 20. Возможно, что функция не может сгенерировать достаточно отрицательных выборок. Если при запуске функцию снова и определяете номер этапов к семь, вы не получаете тот же результат. Результаты между этапами отличаются, потому что количество положительных и отрицательных выборок, чтобы использовать для каждого этапа повторно вычисляется для нового количества этапов.
Обучение хороший детектор требует тысяч обучающих выборок. Большие суммы обучающих данных могут занять часы или даже дни к процессу. Во время обучения функция отображает время, которое потребовалось, чтобы обучить каждый этап в Командном окне MATLAB®. Учебное время зависит от типа функции, которую вы задаете. Используя Хаар функции берет намного дольше, чем использование функции ПОЖИРАТЕЛЯ РЕСУРСОВ или LBP.
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', использующим функции ПОЖИРАТЕЛЯ РЕСУРСОВ. ПРИМЕЧАНИЕ: команда может занять несколько минут, чтобы запуститься.
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);