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

Recommended Posts

Здравствуйте.

Не буду, как многие это делают, выспрашивать по частям вопросы вместо полного описания желаемого)

Сам я на Delphi пишу, и подобраться к OpenCV мешает отсутствие знаний в С/С+. Так что я обрывками только знаю информацию.

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

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

Просто иногда у мобов(врагов) шкала над ними всегда красная или зеленная, а сам враг всегда по середине этой надписи.

Но при таком подходе точность определения выше 72% не поднималась.

И я постоянно думал что программа распознающая мобов (врагов) была бы куда эффективнее.

Как я понял мне требуется касскадное обучение на каждого моба, что бы потом программа могла их выискивать? Или нет?

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

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

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


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

Здравствуйте.

Не мешало бы привести пару-тройку изображений с которыми Вы работаете.

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


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

Что то я текст расписал, а картинки запамятовал. Исправляюсь :)

Там 14 скринов. Вот хочется что бы отдельно паучки, летающие гады и человеко подобные определялись. :)

scr.zip

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


Ссылка на сообщение
Поделиться на других сайтах
Просто иногда у мобов(врагов) шкала над ними всегда красная или зеленная, а сам враг всегда по середине этой надписи

Что то не видно шкалы.

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


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

На скрине scr01 паук с красной полосой жизни вверху.

Вот я делал поиск этой красной полосы.

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

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

Т.е. я понимаю что для этого надо обучить программу, но пока я не знаю как и с какой стороны подойти к этому делу, особенно учитывая что в С/С++ я не программирую. Но черт с ним с С/С++, мне хотя бы принципы работы знать и понимать. И на сколько быстро вообще работало бы распознавание. И зависит ли скорость работы от количество разных образов которые я хочу искать или ищу.

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

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


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

Вот вроде отрисовал в фотожопе, желаемое.

схема

P.S. тут можно спойлеры вставлять и если да, то как?

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


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

У меня WOT на этот хостинг картинок злится, говорит зловаре там.

 [spoiler] spoiler [/spoiler]
 

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


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

Там просто ссылка на png.

WOT коммерческий проект, по $заказу вносит в черный список конкурирующие сайты.

Ну как бы там не было, приатачу файл сюда post-6997-0-87849100-1409579317_thumb.pn

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


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

Я для интереса делал как то бота для MMORPG, но он работал на перехвате пакетов.

В этом случае я бы сделал что:

1) уменьшил настройки графики (эффекты типа тумана, травы и прочей лишней красивости ) до минимума.

2) затем попытался бы найти контуры и отфильтровать их по площади.

3) рассчитать цветовую гистограмму того что внутри контура.

4) сравнил с гистограммами разных объектов и выявил наиболее близкий (он и будет результатом).

Картинки не очень простые для распознавания, так что то что я сказал выше, не так то просто будет сделать.

Можно идти немного другим путем.

1) подождать пока появится шкала.

2) инициализировать трекер на основе цветовых гистограмм и фильтра частиц (ну типа ка здесь http://blogs.oregonstate.edu/hess/code/particles/).

3) трекать.

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


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

С красной полосой вряд ли выйдет, она там такая не надежная, то может быть, то нет. То лагает, то нет. чаще я ее не вижу, чем вижу.

Шаги с 2-4 это я так понимаю не вариант с расспознованием по методу обучения, а другой путь?

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


Ссылка на сообщение
Поделиться на других сайтах
Шаги с 2-4 это я так понимаю не вариант с расспознованием по методу обучения, а другой путь?

Это зависит от того что проще реализовать.

Можно некоторые параметры задать вручную, можно собрать статистику (это уже относится к машинному обучению).

Гистограммы - это всего лишь статистические признаки множества пикселей (как например HOG,SIFT,SURF,FAST,углы,....).

На них можно обучить классификатор.

На вход классификатора (нейронная сеть, SVM, регрессия, .... ) подается гистограмма, на выходе класс объекта.

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


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

Админ, спасибо тебе что отвечаешь на все мои вопросы, я понимаю что со мной тяжело, учитывая мои пробелы в этой области.

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

И позволит ли описанный тобой метод определять несколько объектов сразу. Т.е. вдруг на картинке будет два комара, и паук. Все они будут "отловлены"?

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


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

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

Гистограмма, не зависит от точки зрения на объект, она зависит только от пропорций того или иного цвета в текстуре.

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

Гистограмма, в данном случае - "подпись" объекта.

Для обучения классификатора надо собрать пару сотен/тысяч обучающих пар (гистограмма - номер класса объекта).

При обучении классификатор выделит правила разделения объектов по классам по гистограмме.

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


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

1. А по скорости отработки что быстрее, поиск гистограмм или обученный хаартингом классификатор?

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

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


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

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

Поиск контуров работает заметно быстрее детектора Виолы-Джонса.

Скорость вычисления гистограммы, зависит от настроек, но тоже обычно не маленькая.

Основное время тут, скорее всего будет потреблять классификатор.

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

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

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


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

У меня игра запускается с разрешением 1280*720. По сути из них меня интересует только середина, где то 600 на 600 пикселей.

А как насчет варианта поиск заранее известной картинки? Т.е. если я сфоткаю с прозрачностью с нескольких ракурсов врага, а потом прогонять поиск по этим кадрам? Работает ли такой метод если размер объекта меняется (я могу быть и ближе к нему и дальше от него) и на сколько такой метод быстрее?

1) уменьшил настройки графики (эффекты типа тумана, травы и прочей лишней красивости ) до минимума.

2) затем попытался бы найти контуры и отфильтровать их по площади.

3) рассчитать цветовую гистограмму того что внутри контура.

4) сравнил с гистограммами разных объектов и выявил наиболее близкий (он и будет результатом).

Куда мне копать что бы выполнить все это? Под Делфи есть враппер. Я просматривал примеры, но е все они были мне ясны.

Какие примеры показывают как найти контуры, и отфильтровать их по площади (а что это значит отфильтровать по площади?) ?

Расчет гаммы проходит вручную. т.е.есть какое либо приложение где я могу показать объект гистограмму которого я хочу получить, и получить итог. Или же надо все из кода делать?

По четвертому пункту я так понимаю ты имеешь ввиду, сначала собрать кучу готовых гистограмм которые я получил, а потом именно с ними и сравнивать, так?

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


Ссылка на сообщение
Поделиться на других сайтах
А как насчет варианта поиск заранее известной картинки? Т.е. если я сфоткаю с прозрачностью с нескольких ракурсов врага, а потом прогонять поиск по этим кадрам? Работает ли такой метод если размер объекта меняется (я могу быть и ближе к нему и дальше от него) и на сколько такой метод быстрее?

Это поиск по шаблону (template matching), зависит от масштаба, с разными размерами не сработает. Обычно ищут на картинках в нескольких масштабах, работает при прогоне окном для всех размеров очень медленно.

С делфи самый наихудший вариант (беспросветный геморрой).

Даже C# и Java намного лучше.

Лучше всего C++.

В принципе, для экспериментов Matlab и Python тоже годятся.

Какие примеры показывают как найти контуры, и отфильтровать их по площади (а что это значит отфильтровать по площади?) ?

http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html

Фильтрация по площади значит, что отсеиваются объекты со слишком большой площадью контура (фоновые объекты) и слишком маленькой (шум).

Расчет гаммы проходит вручную. т.е.есть какое либо приложение где я могу показать объект гистограмму которого я хочу получить, и получить итог. Или же надо все из кода делать?

Гистограммы считать в из кода конечно.

По четвертому пункту я так понимаю ты имеешь ввиду, сначала собрать кучу готовых гистограмм которые я получил, а потом именно с ними и сравнивать, так?

Можно с ними сравнивать, такой классификатор называется "метод ближайшего соседа" (nearest neighbour). Но это не обязательно классификатор, который будет работать лучше всего.

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

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

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


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

Думал будет попроще с этой темой, оказалось как всегда - просто не бывает)))

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

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

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


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

Стопроцентного распознавания добиться будет очень сложно. Сложность быстро спадает при уменьшении точности. Так что перспектива есть.

PS: можно текстуры заменить на сплошные цвета, это должно облегчить задачу.

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


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

PS: можно текстуры заменить на сплошные цвета, это должно облегчить задачу.

))) Если я текстуры поменяю на сплошной цвет, то я конечно такую задачу осилю, даже по старинке. Найти цвет и загруппировать их не проблема, под warface делал такое. Программа за 40мс успевала такое проделать для картинке в 1280*960, а когда серединку только начал обрабатывать, а не всю картинку, то там сработка шла за 20мс.

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

P.S. прости что не по теме задаю вопрос, но мне как новичку который только собирается взяться за C++, требуется пинок в нужное русло. Подскажи в какой среде изучать и работать с С++? А то в инет капнул а там началось, то холивар, то чуть ли не в блокноте писать и т.д. Подскажи в какой IDE работать?

P.S.S. и спасибо за терпение и ответы на все мои вопросы.

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


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

Я использовал:

1) С++ Builder. Очень нравилось, сейчас не рекомендую. У них своя экосистема, и возникает много проблем с совместимостью.

2) Qt. Хорошая кросс-платформенная весчь, тоже довольно-таки своеобразная, имеет очень мощные библиотеки, но мне кажется с нее переходить на что-то другое будет проблематично. Я бы сказал, на любителя. Удобно разрабатывать GUI, чем-то напоминает борландовские RAD.

3) Я сейчас работаю в Visul Studio 2012.

Хороший отладчик, хорошая совместимость с большинством исходников, довольно надежный, много плагинов.

Так как с GUI в основном не заморачиваюсь, то по этому поводу сказать ничего не могу.

Пару раз делал, не чувствую в этом такого комфорта как в С++ Builder, но если напрячься, все получается.

4) Eclipse - кросс-платформенный, немного глючная штука, но в принципе работать можно, компилятор можно подцепить к ней практически любой, по умолчанию стоит GCC-шный. (В нем пишу под линуксом)

5) CodeBlocks - симпатичный, но не серьезный (больше для студенческих программок IMHO ), тоже GCC.

Я бы рекомендовал все-таки Visual Studio или Qt.

Они, кстати и вместе могут работать.

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


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

ок. Тогда на VS и сяду.

Спасибо еще раз за консультации и помощь. Буду апгрейдить себя)))

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


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

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

по этому случаю вспомнилось

006-167.jpg

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×