Как мне найти Wally с Python? - PullRequest
       1

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

80 голосов
/ 13 января 2012

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

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

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

At the beach

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

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

Ответы [ 6 ]

58 голосов
/ 07 ноября 2012

Вот реализация с 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 голосов
/ 16 января 2012

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

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

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

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

2 голосов
/ 13 января 2012

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

1 голос
/ 12 декабря 2017

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

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

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

1 голос
/ 07 ноября 2012

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

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

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

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

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

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

искать коричневые волосы

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

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

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

...