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

Я добавил тег [machine-learning], поскольку я считаю, что правильный ответ должен будет использовать методы ML, такие как ограниченный подход Boltzmann Machine (RBM), защищенный Грегори Клоппером в исходном потоке. Есть некоторые код RBM доступен в python что может быть хорошим местом для начала, но, очевидно, подготовки данных, необходимых для этот подход.
на 2009 IEEE International Workshop on MACHINE LEARNING FOR SIGNAL PROCESSING (MLSP 2009) управлял конкурс по анализу данных: Где Уолли?. Обучающие данные предоставляются в формате matlab. Обратите внимание, что ссылки на этом веб-сайте мертвы, но данные (вместе с источником подхода, принятого Шон Маклун и коллеги можно найти здесь (см. ссылку SCM). Похоже на одно место начать.
6 ответов:
вот реализация с 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)и мы получаем
!
вы можете попробовать сопоставление шаблонов, а затем снять, что вызвало наибольшее сходство, а затем использовать машинное обучение, чтобы сузить его больше. Это также очень сложно, и с точностью сопоставления шаблонов он может просто возвращать каждое лицо или изображение, похожее на лицо. Я думаю, вам нужно больше, чем просто машинное обучение, если вы надеетесь сделать это последовательно.
может быть, вы должны начать с разбиения задачи на две более мелкие:
- создать алгоритм, который отделяет людей от фона.
- обучите классификатор нейронной сети с как можно большим количеством положительных и отрицательных примеров.
Это все-таки две очень большие проблемы для решения...
кстати, я бы выбрал c++ и открыл CV, кажется, гораздо больше подходит для этого.
Это не невозможно, но очень трудно, потому что у тебя нет примера успешного матча. Часто существует несколько состояний (в этом случае больше примеров чертежей find walleys), затем вы можете передать несколько изображений в программу повторной обработки изображений и рассматривать ее как скрытую модель Маркова и использовать что-то вроде алгоритма Витерби для вывода (http://en.wikipedia.org/wiki/Viterbi_algorithm).
вот как я бы подошел к этому, но предполагая у вас есть несколько изображений, которые вы можете дать ему примеры правильного ответа, чтобы он мог учиться. Если у вас есть только одна фотография, то мне жаль, что там может быть другой подход, который вам нужно принять.
Я понял, что есть две основные особенности, которые почти всегда видны:
- красно-белая полосатая рубашка
- темно-каштановые волосы под причудливой шапки
Так что я бы сделал это следующим образом:
поиск полосатых рубашек:
- отфильтруйте красный и белый цвет (с порогами на преобразованном изображении HSV). Это дает вам два изображения маски.
- добавьте их вместе -вот основная маска для поиска полосатых рубашек.
- создайте новое изображение со всеми отфильтрованными красными, преобразованными в чистый красный (#FF0000), и все отфильтрованные белые, преобразованные в чистый белый (#FFFFFF).
- Теперь соотнесите это чистое красно-белое изображение с изображением узора полосы (я думаю, что все waldo имеют довольно идеальные горизонтальные полосы, поэтому вращение узора не должно быть необходимым). Сделайте корреляцию только внутри вышеупомянутой основной маски.
- пытаться вместе кластеры, которые могли бы быть результатом один рубашки.
Если есть более одной "рубашки", чтобы сказать, более одного кластера положительной корреляции, поиск других особенностей, таких как темно-каштановые волосы:
поиск каштановых волос
- отфильтруйте определенный коричневый цвет волос, используя преобразованное изображение HSV и некоторые пороги.
- поиск определенной области в этом замаскированном изображении - не слишком большой и не слишком маленький.
- Теперь найдите "область волос", которая находится чуть выше (до) обнаруженной полосатой рубашки и имеет определенное расстояние до центра рубашки.
вот решение С помощью нейронных сетей, которые прекрасно работают.
нейронная сеть обучается на нескольких решенных примерах, которые отмечены ограничивающими рамками, указывающими, Где Уолли появляется на картинке. Цель сети состоит в том, чтобы минимизировать ошибку между предсказанным полем и фактическим полем из данных обучения/проверки.
сеть выше использует Tensorflow Object Detection API для выполнения обучения и прогнозирования.
!
Comments