Перейти к содержимому
Compvision.ru
kobaeugenea

Распознавание знака пешеходного перехода

Recommended Posts

Здравствуйте, пытаюсь научить каскадный классификатор распознавать знак пешеходного переход. Перепробовал уже множество вариантов, самый лучший пока такой. Это параметры для тренировки каскада:
-minhitrate 0.999
-maxFalseAlarmRate 0.4
Дальше 12 стадии обучаться не хочет, происходит переобучение.

Вот результаты:
тут он нашел знаки, они крупные и четкие

тут нет. изображение в оригинале 2800х2100 px поэтому списывать на то что знак мелкий не стоит 

тут тоже нет
Ниже прилагаю выборку для обучения. Пробовал из негативной выборки убирать другие знаки вообще, результат примерно тот же. Увеличивал выборку до 1500 позитивных и 3000 негативных изображения, на результат тоже особо не повлияло.

Не подскажете, что можно сделать, чтобы улучшить детектирование знака?

выборка.7z

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно попробовать сделать детектор на треугольный знак(все треугольные знаки в положительные образцы), а уже потом отфильтровывать нужный вам. Это если нет ошибок в параметрах детекции(минимальное окно, коэффициент и прочее)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А каким образом потом отфильтровывать среди найденных?
О каком коэффициент идет речь?

Минимальное окно  пробовал 16x16 и 20x20

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А без цвета, это принципиально ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не совсем понял о чем вы. То что картинки черно-белые? Я думал в opencv используется метод Виолы-Джонса в котором работают с черно-белыми изображениями, поэтому использовал именно черное-белые изображения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да нет, просто я подумал что можно искать по цвету, а после отсева по площади, по параллельности граней, еще каким нибудь признакам, уже подать вырезанные области на классификатор. SVM, нейронку, ну или какой нибудь еще для уточнения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хотел что-то подобное сделать, но столкнулся с проблемой. Когда подаю классификатору на распознавание просто вырезанный знак, без фона (даже из обучающей выборки давал ему) он его не распознают. То есть нужно всегда чтобы знак на каком-то фоне был, вырезку он вообще не распознает. Не знаете с чем это связано?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если приведете несколько примеров изображений и опишите что Вы пытались делать, может кто и сможет помочь.

Например посмотрите как здесь делают: https://rdmilligan.wordpress.com/2015/03/01/road-sign-detection-using-opencv-orb/ правда тоже Хааром детектировали, а вот дальше извлекали ORB дескрипторы и сравнивали с шаблоном.

Здесь еще проект с исходниками: https://sites.google.com/site/mcvibot2011sep/home 

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я как то смотрел https://www.robots.ox.ac.uk/~vgg/practicals/category-detection/index.html

Но там получался результат какой то не очень, даже с  hard negative mining.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Smorodov сказал:

Если приведете несколько примеров изображений и опишите что Вы пытались делать, может кто и сможет помочь.

Например посмотрите как здесь делают: https://rdmilligan.wordpress.com/2015/03/01/road-sign-detection-using-opencv-orb/ правда тоже Хааром детектировали, а вот дальше извлекали ORB дескрипторы и сравнивали с шаблоном.

Здесь еще проект с исходниками: https://sites.google.com/site/mcvibot2011sep/home 

Выборка с изображениями есть в первом посте. Проблема в том, что после обучения я брал изображения из позитивной выборки (уже вырезанное) и пускал по нему каскад, ничего не находилось. Если же например взять исходное изображение, откуда вырезался знак, то на нем все нормально определяется.

Это к проблеме о том, чтобы сначала находить область в которой может быть знак и только затем пускать по ней каскад.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
20 часов назад, kobaeugenea сказал:

А каким образом потом отфильтровывать среди найденных?
О каком коэффициент идет речь?

Минимальное окно  пробовал 16x16 и 20x20

Имеется в виду  scale_factor.

Про фильтрацию: взять любой дескриптор (hog тот же или просто значения яркости) и прогнать их через нейронную сеть или svm.

Если у вас есть цвет, то можно использовать не яркость, а компоненту цвета или насыщенности или их комбинацию (знак синий а фон серо зеленый).

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, iskees сказал:

Имеется в виду  scale_factor.

 

Кстати вы не можете объяснить что это за параметр? Я его не трогал, оставлял по умолчанию 1.1, так как до конца не понял для чего он нужен.
Параметр который изменяет размер входного изображения, но зачем это делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

поиск идет скользящим окном, размер этого окна начинается с min_size  у вас это 16, после прохода этим окном размер умножается  scale_factor и проход повторяется пока размер окна не достигнит max_size. чем меньше  scale_factor тем точнее поиск, но и медленнее соответственно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 06.02.2017 at 21:28, iskees сказал:

Можно попробовать сделать детектор на треугольный знак(все треугольные знаки в положительные образцы), а уже потом отфильтровывать нужный вам. Это если нет ошибок в параметрах детекции(минимальное окно, коэффициент и прочее)

 

В 07.02.2017 at 05:00, Smorodov сказал:

Да нет, просто я подумал что можно искать по цвету, а после отсева по площади, по параллельности граней, еще каким нибудь признакам, уже подать вырезанные области на классификатор. SVM, нейронку, ну или какой нибудь еще для уточнения.

Дело в том что я для себя уже выбрал Виолу-Джонса. Конечно можно сделать так чтобы для начала искалась нужная область, а потом это область уже полетит классификатору, но это не решит основную проблему. Если у меня на целом изображении не находит знак, то он не найдет его и на вырезке. И уже писал, что когда подаю на распознавание вырезанный знак, даже из тех которые он распознают на целом изображении, на вырезке он его не находит.

Спасибо за разъяснение параметра scale_factor. Не могли бы вы еще объяснить что означает minNeighbors?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

minNeighbors. Число минимальных объектов найденных в данной области. Т.Е. на один знак(область изображения) может откликнутся сразу несколько окон (+- несколько пикселей в сторону, разный масштаб), если этих откликов меньше чем minNeighbors то область отбрасывается. При значении 0 будут возращены все  варианты (на один знак может быть несколько пересекающихся областей). Грубо говоря  чем больше это значение, тем более параноидальным будет поиск и тем чаще он будет пропускать объекты, считая, что это ложное срабатывание.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Дорожный знак как только не пытались распозновать, но он очень хитрый зверь.

во первых его не получиться выделить влоб по цвету, так как его цвет может плыть в зависимости от освещённости, во вторыхх представление дорожного знака на кадре отличается по форме в соответсвии с расположением наблюдателя (косоугольная перспективная проекция) где квадрат превращается в ромб так что и Хаар мало что может. Во всяком случае у меня не получилось и я думаю тут ограничение самого алгоритма и не плохая натренированность.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поищите HOG+svm классификатор, он прекрасно справляется.

например: http://blog.dlib.net/2014/02/dlib-186-released-make-your-own-object.html

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 2/21/2018 at 19:58, Smorodov сказал:

Поищите HOG+svm классификатор, он прекрасно справляется.

например: http://blog.dlib.net/2014/02/dlib-186-released-make-your-own-object.html

 

Может я не знаю какихкто хитростей, но у меня не получается сделать боле мене универсальный классификатор для одного знака.

У меня есть видео снятое видерегистратором. Если сделать датасет для тренировочных и тестовых данных из скришотов этого видео (с нужными) знаками, то такой классификатор отлично потом распознаёт знак на данном видео. Но как только я пробую сделать тренировочную выборку из других источников, так всё по нулям.

Код взял из этого примера: https://github.com/sarthakkaingade/Road-Sign-Identification

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тут варианта два:

  1. не так обучаете
  2. не на том обучаете

Выкладывайте код и сами датасеты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, iskees сказал:

Тут варианта два:

  1. не так обучаете
  2. не на том обучаете

Выкладывайте код и сами датасеты.

Код по ссылке вверху. Я только Cmake file поправил, чтоб находил библиотеки.

Датасеты выкладывать не знаю какие. Я много там всего пробовал. :Журнал не вёл. Я готов сделать датасет по вашим рекомендациям.

В архиве свалка из того что пробовал.

universal.tar.xz

Если нужно, могу выложить код из гитхаба сюда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не смотрел как там в dlib устроено обучение этого классификатора, но судя по коду на вход подается набор изображений с указанием расположения целевых объектов.   

Положительные образцы для обучения это целевые объекты, отрицательные все остальные части изображения. 

Что бы это работало нужно:

  1. Что бы изображения были достаточно большие и целевой объект не занимал все изображение, а малую часть
  2. Образцов должно быть много, от 1000

Датасет можно отправить так же архивом но с файлом положения объектов. 

 

А вообще проект так себе. Проще взять да с 0 написать на том же питоне, ничего сложно там нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
16 минут назад, iskees сказал:

Не смотрел как там в dlib устроено обучение этого классификатора, но судя по коду на вход подается набор изображений с указанием расположения целевых объектов.   

Положительные образцы для обучения это целевые объекты, отрицательные все остальные части изображения. 

Что бы это работало нужно:

  1. Что бы изображения были достаточно большие и целевой объект не занимал все изображение, а малую часть
  2. Образцов должно быть много, от 1000

Датасет можно отправить так же архивом но с файлом положения объектов. 

 

А вообще проект так себе. Проще взять да с 0 написать на том же питоне, ничего сложно там нет.

Спасибо,  попробую. По вашей логике получается что осенний классификатор, не годиться для зимнего и в чём тогда преимущество по сравнению с методом сравнения с шаблоном, кроме самой классификации ? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если зимний объект отличается от летнего, то нужно что-бы в выборке были оба варианта. Но знаки не отличаются от времени года, а вот от времени суток очень даже за счет отражающих полос. 

HOG-SVM намного менее чувствителен к яркости (основан на  ее градиенте), менее чувствителен к искажениям и шуму. В целом между этими двумя методами пропасть в плоскости качества.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, iskees сказал:

Если зимний объект отличается от летнего, то нужно что-бы в выборке были оба варианта. Но знаки не отличаются от времени года, а вот от времени суток очень даже за счет отражающих полос. 

HOG-SVM намного менее чувствителен к яркости (основан на  ее градиенте), менее чувствителен к искажениям и шуму. В целом между этими двумя методами пропасть в плоскости качества.

Спасибо ОГРОМНОЕ! Вам и Smorodov.

Это между моим уровнм знаний в данной области и вашим чувствуется огромная пропасть. И как мне её преодалеть пока не придумал.

Вы кажется писали что не сложно запрограммировать SVM+HOG самому. HOG я ещё осилю, но от слов гипепрлоскость я как программист впадаю в ступор и программирование SVM для меня чёрная магия. Если дадите почитать чтото, будет здорово.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я имел ввиду писать не SVM и HOG, а взять уже готовую реализацию из opencv или dlib. Все что вам нужно там есть. Остается только написать код для  обучения и для последующей детекции . 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×