Jump to content
Compvision.ru
kobaeugenea

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

Recommended Posts

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

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

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

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

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

выборка.7z

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

  • Like 1

Share this post


Link to post
Share on other sites
1 час назад, Smorodov сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
20 часов назад, kobaeugenea сказал:

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

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

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

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

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

  • Like 1

Share this post


Link to post
Share on other sites
1 час назад, iskees сказал:

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
В 06.02.2017 at 21:28, iskees сказал:

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

 

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

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

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

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

Share this post


Link to post
Share on other sites

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

  • Like 1

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites
В 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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
2 минуты назад, iskees сказал:

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

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

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

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

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

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

universal.tar.xz

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites
16 минут назад, iskees сказал:

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

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

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

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

  • Like 1

Share this post


Link to post
Share on other sites
3 часа назад, iskees сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×