Pull to refresh

Comments 19

Но для выборки, в которой всего две сотни примеров, это неплохой результат.

200 примеров это ведь, вообще говоря, очень много. Странно что только треть кадров (субъективно) распозналась, как содержащие искомый объект.
В чем причина таких результатов — плохое обучение?
Т.к. с лицами детекторы Хаара работают хорошо.
Для лиц используется более нескольких тысяч примеров обычно. Плюс я не использовал максимальную сложность обучения (где-то два часа считало всего, а для тех же лиц обучение на неделю — это норма).
200 примеров не очень много. Всё-таки 3d объект. Я старался сделать кадры в разных проекциях + разный размер (хотя это немного спорное решение, не думаю, что это повысило сильно качество). Если сравнить размер итогового каскада для совы (46 Кб) и для лиц (около 1.5Мб), то видно, что для лиц сложность обучения на порядки выше.
Ещё, кстати, есть момент, что лица при обучении обычно фотографируют для идеальных условий, но полностью покрывая интересующую область детектирования (шаг поворота, освещение, размер). Тут такая методология не применялась.

В целом, ответ на вопрос думаю такой:
1) Для обучения использовал достаточно слабый набор алгоритмов, ускоряющих это самое обучение. Обучение не полное.
2) Для обучения использовалась база, не полностью описывающая все возможные сдвиги и повороты.
3) Тестирование делалась на фоне той же стены, на которой производилась съёмка отрицательной выборки. Есть шанс, что часть кадров с совой имеют слишком большое пересечение с отрицательной выборкой, поетому не распознаются.
Скажите, не было проблем с зависанием обучения каскада. К тому же у меня были вылеты после 6-9 прохода.
Да, были. Именно из-за них я абзац «Известные баги» вставил. Мне помогло увеличить размер выборки + чуть-чуть подвинуть пороги правильных обнаружений и ложных тревог.
Делал на выборке: 1к позитивов и 5к негативов, однако зависало, что-то с параметрами нужно шаманить я думаю.
Какая версия OpenCV? Просто последняя версия на порядки меньше глючила у меня. Плюс причины отказа писала.
У вас параметр numPos был меньше, ч ем число положительных примеров?
Да вот это я не учел. Ставил количество позитивов.
Спасибо за интересный материал!
Имеет ли смылс бинаризировать изображение (для уменьшения влияния теней и полутонов) и уже потом раскладывать в папки Good\Bad?
На мой взгляд не имеет. Каскад Хаара вычисляет признаки в интегральной картинке. В случае бинаризации на одном изображении тень на лице быть +1, а на соседнем изображении — 0. При интегрировании это даст достаточно много шумов.
А подсчёт признака в интегральном изображении, который Хаар делает сам по себе будет давать нормировку, при этом нормировка будет локальной, что заведомо лучше нормировки, которую сделает бинаризация.
Воспользуйтесь видео-потоком, как дополнительным источником для аналитического обучения.

Если между «узнаваниями» было меньше N кадров, они собираются, интерполируется перемещение найденного объекта (принимается, что оно линейное + погрешность), проверяется, что разница между изображением и вырезанным кадром не более D (объект не пропадал полностью из области из-за помех). При выполнении всех условий вырезанный кадр добавляется к позитивной выборке и используется для обучения.

Таким образом, точность узнавания будет прогрессивно расти, улучшая результаты с каждым полученным материалом.
Как развитие, Вы можете обеспечить узнавание объекта со всех сторон, добавив анализ изменения геометрии и перемещения контрольных точек, чтобы определить поворот объекта в пространстве. Тогда запомнив только «лицо» объекта, Ваша программа сможет обнаружить его вращение на кадре и ассоциировать найденные углы обзора на объект с самим объектом. Улучшить алгоритм можно будет распараллеливанием: один поток работает в режиме реального времени с видео-потоком, ведет анализ пропущенных кадров, остальные потоки анализируют кешированные последние N минут видео для поиска объекта с новыми полученными первым потоком знаниями: например, в случае быстрого поворота объекта в первых минутах видео нельзя было ассоциировать новое положение объекта с объектом, тогда «узнав» больше признаком в дальнейшем, можно будет вернуться к началу видео и разобрать пропущенные кадры после проведения повторного поиска.
Гхм:)
Да, я прекрасно знаю, как это делается… Но статья была как-бы не об этом:) К тому же при использовании штатного OpenCV-обучения пересчёт каскада невозможен. А с нуля да, можно, хотя наибольшую сложность там будет составлять именно написание такого алгоритма обучения, который может на ходу обучаться (но исходники того же predator где-то по интернетам бродили).
А для связи соседних кадров много можно способов использовать. Например тот, который я в своей позапрошлой статье упоминал — тоже неплохо работать будет. Хотя через оптический поток, конечно менее затратно по вычислениям будет.
Как лучше поступить: создать каскады для всех возможных видов объекта или сделать отдельный для вида спереди, сзади и т.д?
Лучше создавать отдельные каскады, насколько я понимаю теорию обучения AdaBoost. Явных ограничений там вроде нет, но всё-таки она затачивается на то, что есть две связанные области.
UFO just landed and posted this here
Хм. Да, наверное стоит чуть подробнее объяснить, как-то глаз за это не зацепился. Но там всё действительно просто. Достаточно полученный файл положить в папку с программой распознавания и всё будет работать. Сейчас до дома доберусь, опишу поподробнее.
А если стоит задача различать объекты примерно одной формы, но разного цвета? Какими средствами ее оптимально решать? Например, домофон, который пускает только белых людей, а негров нет (утрированно)?
Нужно смотреть под каждую конкретную задачу. Можно например работать в канале H пространства HSV. А с неграми очень просто. Выделяется сначала лицо, а потом по лицу анализируется цвет.
вы не могли бы обновить статью с упором на новый opencv, оптимизацию скорости обучения и обучения при разных степенях освещенности объекта?
Sign up to leave a comment.

Articles