Как приступить к поиску моделей плеера в COD с помощью OpenCV - PullRequest
7 голосов
/ 20 января 2011

Я пытаюсь создать программу, которая может найти человеческие фигуры в видеоигре игры "Call of Duty".Я составил список из 2200 отдельных изображений из этого видео, которые либо содержат человеческую фигуру, либо не содержат.Затем я попытался обучить нейронную сеть, чтобы определить разницу между двумя наборами изображений.

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

  1. Нейронные сети - это путь?Я читал, что они очень быстрые по сравнению с другими алгоритмами машинного обучения, и в конце концов я планирую использовать это с видео в реальном времени, и скорость очень важна.

  2. Какой самый лучший способпоиск фигур в рамке изображения для проверки на ANN?Я чувствую, что то, как я это делаю, не очень хорошо.Это определенно не очень быстро или точно.Это занимает около секунды на кадр изображения 960 x 540 и имеет низкую точность.

  3. Еще одна проблема, с которой я столкнулся, - это лучший способ построить вектор признаков для использования в качестве входных данных дляANN.В настоящее время я просто масштабирую все входные изображения до 25 x 50 пикселей и создаю вектор объектов, содержащий интенсивность каждого пикселя.Это очень большой вектор (1250 поплавков).Какие есть лучшие способы построения векторов объектов?

Для более подробного объяснения того, что я делаю здесь: CodAI: Computer Vision

РЕДАКТИРОВАТЬЯ бы хотел немного подробнее.Что является лучшим способом для расчета функций.Мне нужно уметь распознавать человеческую фигуру во многих разных позициях.Нужно ли создавать отдельные классификаторы для распознавания разницы между вертикальным, наклонным и склонным?

Ответы [ 4 ]

7 голосов
/ 20 января 2011

Эта проблема слишком сложна для обычного ANN.

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

Ваша лучшая ставка, вероятно, заключается в следующем:

6 голосов
/ 24 января 2011
  • Использование необработанных интенсивностей в качестве вектора признаков не будет работать 1 . Слишком много изменений, вызванных освещением и т. Д.
  • Хорошей особенностью для первого шага будет HOG. opencv 2.2 имеет версию детектора GPU (cuda), это быстро.
  • Нейронные сети, возможно, не лучший путь. Обычно вы используете SVM или повышение в качестве классификатора 2 . Дело не в том, что нейронные сети недостаточно мощны, а в том, что трудно правильно настроить параметры обучения. Слишком часто вы застреваете в локальных минимумах и т. Д.
  • Для склонных / приседающих / стоящих фигур вы определенно хотите использовать разные классификаторы и использовать их в смешанной модели.
  • Вы просили "лучший способ" - обнаружение человека, безусловно, не решенная проблема, поэтому никто не знает, как лучше всего. Известно, что все вышеперечисленное работает довольно хорошо.
  • Если вы хотите получить хороший результат, вы определенно хотите использовать свою конкретную цель, поэтому используйте эту возможность, чтобы попытаться обнаружить людей при исполнении служебных обязанностей. Диапазон позиций, которые вам нужно проверить, не является целым изображением, цифры будут находиться у земли. Это позволяет ускорить поиск и уменьшить количество ложных обнаружений. Если вы можете, уменьшите детализацию при рендеринге - меньше деталей означает меньше вариаций, что означает более легкую проблему обучения.

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

1 голос
/ 20 января 2011

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

Например, вы можете попытаться найти контур человеческой фигуры и рассчитать элементы на основе контура. OpenCV уже имеет некоторые функции для расчета характеристик контуров: Моменты , GetCentralMoment , NormalizedCentralMoment и т. Д. Тогда возникает вопрос: как сегментировать фигуры людей из фона? , так что их контур можно найти? Есть несколько способов решения этой проблемы, например, с помощью сегментации текстур.

Как только вы сможете решить проблему сегментации и рассчитать разумные функции, выбор алгоритма обучения не так уж важен. Но почему бы не попробовать несколько и посмотреть, что работает лучше всего? Взгляните на раздел Машинное обучение в документации OpenCV.

0 голосов
/ 24 января 2011

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

В зависимости от вашей цели, отслеживание игрока - это то, что не должно выполняться с помощью обработки изображений, поскольку оно может быть очень требовательным к процессору. Отслеживание моделей игроков внутри игры - это практика, обычно используемая для мошеннических приложений, и для этого требуется либо внедрить код в игровой процесс, либо быть посредником между игровым движком и графическим драйвером. Поскольку игровой клиент всегда знает, где находятся другие игроки (даже если вы их не видите), можно искать в памяти процесса координаты X, Y, Z игроков или перехватывать вызовы рендеринга графики в поисках места, где находится игрок модель будет отображаться на экране (что может быть немного сложнее, поскольку требует базового понимания OpenGL / DirectX и навыков отладки).

Я не уверен, что можно подробно описывать такие приемы в StackOverflow, но я скажу, что эта тема широко обсуждалась на нескольких реинжиниринговых / читерских форумах, таких как GameDeception .

...