Как мне найти Уолли с помощью Python?

84

Беззастенчиво прыгает на подножку :-)

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

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

На пляже

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

На международном семинаре IEEE 2009 г. по машинному обучению для обработки сигналов (MLSP 2009) они провели конкурс анализа данных: Где Уолли? . Данные обучения предоставляются в формате Matlab. Обратите внимание, что ссылки на этом веб-сайте мертвы, но данные (вместе с источником подхода, принятого Шоном Маклоуном и его коллегами, можно найти здесь (см. Ссылку на SCM). Похоже, с чего можно начать.

tdc
источник
7
Извините ... есть ли какая-нибудь программа, которая успешно находит Уолли на этой фотографии? Похоже, что у «настоящего» Уолдо нет никаких отличительных черт. Раньше у меня была та же самая книга Уолдо, и, насколько я помню, нужно было использовать какую-то подсказку на естественном языке, может быть, настоящий Уолдо не держит трость или что-то в этом роде. Я не понимаю, как можно было бы программно найти Уолли, не сумев предварительно заставить свою программу понимать подсказку на естественном языке.
AdamKG
Да вы правы, извините ... хотя это тоже будет интересная задача! Я переключил изображение на старый "На пляже", который также имеет полосы ... (есть еще одна причина для выбора этого изображения!)
tdc
Хотя это интересный вопрос, непонятно, о чем вы спрашиваете. Это реализация решения? Подсказка, какую библиотеку ML для Python использовать для этого?
Саймон Бергот
@Simon о полной реализации, вероятно, было бы слишком много, но скелет ответа (т.е. некоторые функции, не имеющие определений) было бы замечательно. Я даже не уверен, что загружу изображение в (хотя я видел это: stackoverflow.com/questions/94875/image-processing-in-python )
tdc

Ответы:

63

Вот реализация с махотами

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!

Луиспедро
источник
3
Я попробовал изображение пляжа, и оно не сработало :( Уолли был в топ-6 или 7 хитов, но это было не лучшее совпадение. Обработка действительно помогла, потому что я не мог найти его самостоятельно (с моим глаза) в то время как когда у меня была только куча маленьких областей, это было легко.
luispedro
у вас есть полный исходный код этого? у меня np не определено
кодируется
2

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

бутерброд
источник
2

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

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

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

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

ЛаскаФокс
источник
2
Если бы вы использовали C ++ и OpenCV, то решение на Python было бы максимально возможным. OpenCV можно использовать под Python.
Unapiedra
1

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

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

Потерянная душа
источник
1

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

  1. красно-белая полосатая рубашка
  2. темно-русые волосы под нарядной шапкой

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

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

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

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

поиск каштановых волос

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

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

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

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

Тадей Магайна
источник