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

Алгоритм сегментации по принципу скользящего окна и вычисление контраста

Recommended Posts

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

Имеем объект, границы которого нам известны. Необходимо скользящим окном передвигаться по границе всего объекта для вычисления ( "среднего цвета?", "разности контраста?" ли еще чего ) в заданной области окна, между объектом и фоном. При удовлетворении условия "большой разности цвета" границ объекта и фона, применяем алгоритм floodfill с заданным порогом, внутри скользящего окна, тем самым удаляя фон с изображения.

Таким образом, алгоритм позволит отделить от фона границу объекта с высоким контрастом, не затронув границу с низким контрастом ( например градиент на нижней границе риуснка )

Объяснил как смог. Мне интересно вычисление значения для алгоритма floodfill, на основе чего оно будет вычисляться?

Без имени-1 копия.JPG

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


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

Чем-то похоже на билатеральный фильтр

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


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

Да, сильно смахивает на edge preserving smoothing группу алгоритмов по определению.

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

Есть еще selectiveGaussian пощупать можно в gimp, оптимизированные исходники там-же, если по простому, то создается маска, выделяющая точки которые более чем на заданный порог отличаются от всех точек скользящего окна, также создается обычное размытое изображение, и последним шагом пиксели исходного изображения по маске заменяются на пиксели размытого изображения. Параметры метода: величина порога, и размер скользящего окна (размер окрестности).

 

По поводу фильтров еще есть такая популярная картинка, BLF это билатеральный фильтр, WLS это взвешенные наименьшие квадраты оба фильтра есть в OpenCV. WLS - аналог вроде называется FastGlobalSmootherFilter и находится в файле contrib/modules/ximgproc/src/fgs_filter contrib.

Скриншот 2017-03-02 11.28.34.png

Ну и для коллекции: https://github.com/soundsilence/ImageSmoothing

 

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


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

Секция floodfill

Цитата

С помощью FloodFill (заливка или метод «наводнения») можно выделить однородные по цвету регионы. Для этого нужно выбрать начальный пиксель и задать интервал изменения цвета соседних пикселей относительно исходного

https://habrahabr.ru/company/intel/blog/266347/

 

т.е. в floodfill используется просто < max pixel difference или попадание в range который видимо строится на базе изначального seed'a.

 

А вам надо в каждом окошке свой порог?

 

Какая изначальная задача уточнить границу?

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


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

Smorodov, cпасибо за материалы!

Задача состоит в уточнении границы, да, и как конечный результат - улучшения качества сегментации.

К примеру имеем изображение пропущенное через нейронку. Размер изображения на входе ~ 200*300. Размер реально используемого изображения 1500. При ресайзе сегментированной сетью маски до значения 1500 пикселей, получается очень хороший зубчатый эффект. На примере розовым цветом залита область, сегментированная сетью; под данной областью располагается исходное изображение ( или вокруг данной области, кому как удобнее ). Как видно, бинаризацией в данном случае проблему не решить, а вот floodfill справляется очень хорошо. Проверял реализацией magickEaser в Photoshop с низким интервалом.

Вот я и подумал, что скользящим окном можно было бы как-нибудь улучшить результат.

test.JPG

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


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

Ну так бы и сказали :)

Вот сюда попробуйте фотки загрузить и посмотреть результат: http://www.robots.ox.ac.uk/~szheng/crfasrnndemo (почему то у меня открывается только через tor браузер).

А вот исходники этой радости: https://github.com/torrvision/crfasrnn

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


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

У меня на работе вот этот сайт с форумом открывается только через тор сеть:o

А эту сетку давненько видел, да. Скачивал пользовался. Они вроде на imageNet картинках обучали. Результаты хуже моих в разы, но если обобщить базу человеков с моей небольшой базой человеков, может быть лучше результат. 

К тому же сетка там рекурсивная что ли. В отличие от segnet, где одни только свертки и пулы.

Не знаю, такую сеть вообще можно легко переделать под нужный размер картинок?

Ну а вообще мы отошли от темы:) мне ведь не новая сетка нужна, а способ улучшить качество постобработки после текущей.

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


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

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

При крепил результат Matting, на входе trimap и изображение, на выходе маска.

Тут правда и обычный порог хорошо справится, но другие пример искать долго :)

Скриншот 2017-03-03 11.25.50.png

А вот, кстати нашел:

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

  • Like 1

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


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

Можно тупо попиксельную классификацию попробовать.

Репа несколько не доделанная:

https://github.com/mrgloom/Simple-skin-detection

 

Датасет есть?

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


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

Что то мне кажется что тут сегментация по цвету не прокатит, на примере автора вопроса даже участков кожи-то нет.

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


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

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

Имеется ввиду делить на 2 класса background/foreground, а не skin/non-skin.

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


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

Сейчас GrabCut и используется в качестве основного алгоритма сегментации после сетки. Но даже grabcut не спасает от "артефактов" ресайза. Дополнительно использую детектор кожи. Так же использую порог, который срабатывает в окрестности 5 пикселей от границы изображения; и если повезет с полностью светлым фоном, будет захвачена граница изображения, которую сеть из-за ресайза не захватила. 

Разброс снимков большой. Могут быть изображения с высоким контрастом на белом фоне, так и зашумленные лишними предметами. Соответственно на каждый метод найдутся свои плюсы и недостатки.
Детектор кожи к примеру любит активироваться на напольное покрытие или бежевые стены, что не очень радует. 
При использовании порога - отличный результат будет получен на фото 00094, но на 00338 получим кашу в нижней части изображения, да и тень еще скорее всего захватим; в итоге получиться "переуточнение" границ, что тоже не хорошо.

Matting Посмотрю, интересно.

00064.jpg

00094.jpg

00338.jpg

00507.jpg

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


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

Smorodov, код работоспособный, отлично. Только вот на i5 4600 "я съел еще этих мягких булок да выпил чаю - много чаю" Имеется способ оптимизировать код? Или сразу переписывать на cuda?

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


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

Я говорил что метод тяжелый :) . У меня вообще прямолинейный реализован, тупо решает систему уравнений как есть. 

Есть разные оптимизации, но почти все будут требовать много ресурсов .

Вот список: http://www.alphamatting.com/eval_25.php 

Все равно на CUDA будет лучше.

Еще можете попробовать robust matting: main.cpp но он тоже не быстрый 8 сек для 500x500 на Core i-7-4790.

Кстати, на нейронке тоже есть (и датасет автор обещает выслать :) ): http://www.cse.cuhk.edu.hk/leojia/projects/automatting/index.html

  • Like 1

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


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

Может я eigen собрал не правильно? На core i5 всегда при запуске работает 1 поток. Как это исправить?

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


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

Да вроде его и собирать то не нужно, заголовки включил и ладно.

Вот тут посмотрите: https://eigen.tuxfamily.org/dox/TopicMultiThreading.html 

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


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

Да, это все пробовал, и переменную импортировал в bash_profile. Все равно при запуске всегда пишет 1 поток. По нагрузке видно, что активно работает только одно ядро.

Я тут подумал вот о чем, ребята http://www.cse.cuhk.edu.hk/leojia/projects/automatting/index.html использовали заранее заготовленную усредненную маску. Так как у них там изображения однотипны. А если подавать сети на обучение маску конкретного примера, так как в моем случае изображения не однотипны?

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


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

Сейчас GrabCut и используется в качестве основного алгоритма сегментации после сетки. Но даже grabcut не спасает от "артефактов" ресайза. Дополнительно использую детектор кожи. Так же использую порог, который срабатывает в окрестности 5 пикселей от границы изображения; и если повезет с полностью светлым фоном, будет захвачена граница изображения, которую сеть из-за ресайза не захватила. 

Разброс снимков большой. Могут быть изображения с высоким контрастом на белом фоне, так и зашумленные лишними предметами. Соответственно на каждый метод найдутся свои плюсы и недостатки.
Детектор кожи к примеру любит активироваться на напольное покрытие или бежевые стены, что не очень радует. 
При использовании порога - отличный результат будет получен на фото 00094, но на 00338 получим кашу в нижней части изображения, да и тень еще скорее всего захватим; в итоге получиться "переуточнение" границ, что тоже не хорошо.

Matting Посмотрю, интересно.

00064.jpg

00094.jpg

00338.jpg

00507.jpg

Результат сегментации моей программой без применения OpenCV, нейронных сетей и различных библиотек в векторном формате *.svg. Время обработки менее 1 сек на на AMD 1800+. Результат без подбора коэффициентов получили результаты 2 фотографий. Сегменты можно просмотреть с помощью CoralDraw предварительно разгруппировав объект. Результаты:

00094.svg

00338.svg

P.S. Результат такой не красивый, т.к. введены ограничения на площадь сегмента и мелкие сегменты просто отбрасываются, чтобы не получился слишком большой svg файл.

Изменено пользователем 2expres
добавил постскриптум

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


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

Результат сегментации моей программой без применения OpenCV, нейронных сетей и различных библиотек в векторном формате *.svg. Время обработки менее 1 сек на на AMD 1800+. Результат без подбора коэффициентов получили результаты 2 фотографий. Сегменты можно просмотреть с помощью CoralDraw предварительно разгруппировав объект. Результаты:

00094.svg

00338.svg

P.S. Результат такой не красивый, т.к. введены ограничения на площадь сегмента и мелкие сегменты просто отбрасываются, чтобы не получился слишком большой svg файл.

Интересный эффект. Похоже чем то на meanShift. Только грубее.

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


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

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

Я не знаю что такое  meanShif. За сколько времени он обрабатывает данные фотографии?

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


Ссылка на сообщение
Поделиться на других сайтах
В 03.03.2017 at 15:22, mrgloom сказал:

Можно тупо попиксельную классификацию попробовать.

Репа несколько не доделанная:

https://github.com/mrgloom/Simple-skin-detection

 

Датасет есть?

А что за информация в skin_no_skin.txt?

59 минут назад, 2expres сказал:

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

Я не знаю что такое  meanShif. За сколько времени он обрабатывает данные фотографии?

Что Вы будете делать с большим количеством сегментов, при "реалистичной" сегментации? Как вы их обьедените, если задача стоит не в детектировании объекта, а точной попиксельной сегментации?

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


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

Что говорит теория на этот счет. Проводилась сегментация одних и тех же фотографий разными людьми вручную. В результате получали различные сегменты. Получить однозначную сегментацию на реальных изображениях часто не представляется возможным. Мое мнение, что вначале должна производится предварительная сегментация, которая дает большое количество сегментов. Таким образом мы резко уменьшаем объем информации по сравнению с растровым изображением, а следующий этап обработки - объединение и возможные комбинации этих сегментов между собой для индентификации объектов.

Формальную сегментацию и векторизацию я выполнил. А вот со вторым этапом есть только смутные идеи. Так же имею недостаток теории на этот предмет, буду благодарен если подскажете, что можно почитать из теории (только не OpenCV, т.к. строю быстродействующие программы).

 

Изменено пользователем 2expres
Mean shift почитаю. Спасибо

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


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

Как варианты могут быть интересны: 

Кривые рассеяния:

https://habrahabr.ru/post/156903/#first_unread

http://lcs.ios.ac.cn/~guofu/files/vectorization/SparseImageCurves.pdf

Суперпиксели:

http://ivrl.epfl.ch/research/superpixels

 

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


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

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

del.png.d8075297f9db9d65e32a1e17b1995fd8.png

Исходное изображение

del1.PNG.83dbd44523d08495b6d5ab56000e2b62.PNG

Результат фильтра Соболя

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

del.svg - результат в .svg. Сегментация моей программой. Можно рассмотреть CoralDraw предварительно разгруппировав. Море (верхняя часть) выделяется одним большим сегментом, дельфин состоит из небольшого количества сегментов. Нужна вторая часть программы, которая бы комбинировала эти сегменты и сравнивала с базой данных, для автоматического определения объекта. Нужна информация именно на этот предмет.

Суперпиксели, они не столько сжимают информацию, как моя программа и что с ними делать после их получения?

 

  • Like 1

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


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

Да кривых рассеяния важно именно что там после рендеринга получается картинка очень близкая к исходному растру. А хранить нужно только эти самые кривые. Почему привел ? потому что это метод уменьшения избыточности изображения.

Сеперпиксели также позволяют уменьшить размерность задачи и поводить сегментацию изображения по меньшему количеству элементов. Можно провести каскадное преобразование или пропустить через классификатор и получить метки объектов. 

 

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×