Как найти Wally с Python?

Бесстыдно прыгая на подножку: -)

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

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

At the beach

Я добавил тег [machine-learning], поскольку, по моему мнению, правильный ответ будет иметь применение методов ML, таких как подход Ограниченного Больцмана (RBM), предложенный Грегори Клоппером в оригинальной теме. Существует некоторый код RBM, доступный в python, который может быть хорошим местом для начала, но, очевидно, для этого подхода необходимы данные обучения.

На 2009 IEEE International Workshop по ОБУЧЕНИЮ МАШИНЫ ДЛЯ ОБРАБОТКИ СИГНАЛОВ (MLSP 2009) они провели Конкурс анализа данных: где Wally?. Данные обучения предоставляются в формате Matlab. Обратите внимание, что ссылки на этом веб-сайте мертвы, но данные (наряду с источником подхода, принятого Sean McLoone и его коллегами здесь (см. ссылку SCM). Кажется, что нужно начать с одного места.

Ответ 1

Здесь реализована реализация с mahotas

from pylab import imshow
import numpy as np
import mahotas
wally = mahotas.imread('DepartmentStore.jpg')

wfloat = wally.astype(float)
r,g,b = wfloat.transpose((2,0,1))

Разделить на красный, зеленый и синий каналы. Лучше использовать арифметику с плавающей запятой, поэтому мы конвертируем вверху.

w = wfloat.mean(2)

w - белый канал.

pattern = np.ones((24,16), float)
for i in xrange(2):
    pattern[i::4] = -1

Создайте шаблон + 1, + 1, -1, -1 на вертикальной оси. Это рубашка.

v = mahotas.convolve(r-w, pattern)

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

mask = (v == v.max())
mask = mahotas.dilate(mask, np.ones((48,24)))

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

wally -= .8*wally * ~mask[:,:,None]
imshow(wally)

И мы получаем waldo!

Ответ 2

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

Ответ 3

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

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

это все еще две очень большие проблемы для решения...

Кстати, я бы выбрал С++ и открыл CV, кажется, гораздо более подходит для этого.

Ответ 4

Это не невозможно, а очень сложно, потому что у вас действительно нет примера успешного матча. Часто существует несколько состояний (в данном случае, больше примеров рисунков находки для книжек), затем вы можете загружать несколько изображений в программу повторного преобразования изображений и рассматривать ее как скрытую марковскую модель и использовать что-то вроде алгоритма viterbi для вывода (http://en.wikipedia.org/wiki/Viterbi_algorithm).

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

Ответ 5

Я понял, что есть две основные функции, которые почти всегда видны:

  • красно-белая полосатая рубашка.
  • темно-коричневые волосы под причудливым колпачком

Итак, я сделал бы это следующим образом:

поиск полосатых рубашек:

  • отфильтруйте красный и белый цвет (с порогами на преобразованном в HSV изображении). Это дает вам два изображения маски.
  • добавьте их вместе → что основная маска для поиска полосатых рубашек.
  • создайте новое изображение со всеми отфильтрованными красными, преобразованными в чистый красный (# FF0000), и весь отфильтрованный белый цвет преобразуется в чистый белый (#FFFFFF).
  • теперь коррелирует это чистое бело-белое изображение с образцом рисунка полосы (я думаю, что у всех waldo есть совершенно идеальные горизонтальные полосы, поэтому вращение рисунка не должно быть необходимым). Сделайте корреляцию только внутри указанной основной маски.
  • попытайтесь собрать вместе кластеры, которые могли быть получены из одной рубашки.

Если есть несколько "рубашек", скажем, более чем одного кластера положительной корреляции, найдите другие функции, такие как темно-каштановые волосы:

поиск коричневых волос

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

Ответ 6

Вот решение, использующее нейронные сети, которые прекрасно работают.

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

В приведенной выше сети используется API обнаружения объектов Tensorflow для обучения и прогнозирования.