Як знайти Wally з Python?


83

Безсоромно стрибаючи на колесах :-)

Натхненний Як я можу знайти Уолдо з Mathematica та подальші дії Як знайти Уолдо з R , як нового користувача python, я хотів би побачити, як це можна зробити. Здається, що python більше підходить для цього, ніж R, і нам не потрібно турбуватися про ліцензії, як це було б з Mathematica або Matlab.

У прикладі, наведеному нижче, очевидно, просто використання смужок не буде працювати. Було б цікаво, якби простий підхід, заснований на правилах, міг би працювати для таких складних прикладів, як цей.

На пляжі

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

На Міжнародному семінарі IEEE 2009 року з НАВЧАННЯ МАШИН ДЛЯ ОБРОБКИ СИГНАЛІВ (MLSP 2009) вони провели конкурс з аналізу даних: Де Уоллі? . Дані про навчання подаються у форматі matlab. Зверніть увагу, що посилання на цьому веб-сайті мертві, але дані (разом із джерелом підходу, застосованого Шоном Маклуном та його колегами, можна знайти тут (див. Посилання SCM). Здається, це одне місце, з чого слід почати.


7
Вибачте ... чи є якась програма, яка успішно знаходить Вальдо на цій фотографії? Здається, немає ніяких відмітних рис «справжнього» Вальдо. Раніше я мав ту саму книгу Вальдо, і з того, що я пам’ятаю, була якась підказка на природній мові, яку потрібно було використати, можливо, що справжній Вальдо не тримав у руках тростини чи чогось іншого. Я не розумію, як ви могли програмно знайти Уолдо, не маючи попередньої можливості зрозуміти вашу програму підказкою природної мови.
— AdamKG

Так, ви маєте рацію, вибачте ... хоча це теж було б цікавим завданням! Я переключив зображення на старе "На пляжі", яке також має смужки ... (є ще одна причина для вибору цього зображення!)
— tdc

Хоча це питання цікаве, що ви просите, незрозуміло. Це реалізація рішення? Підказка, яку бібліотеку ML для python використовувати для цього?
— Саймон Бергот

@Simon про повну реалізацію, мабуть, було б багато чого запитати, але скелет відповіді (тобто деякі функції, у яких відсутні визначення) був би чудовим. Я навіть не впевнений, що завантажу зображення (хоча я це бачив: stackoverflow.com/questions/94875/image-processing-in-python )
— tdc

Відповіді:


63

Ось реалізація з 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)

І ми отримуємо Вальдо!


3
Я спробував зображення пляжу, і це не спрацювало дуже добре :( Уоллі був у 6-му чи 7-му хітах, але це не найкраще відповідало. Обробка допомогла, бо я не міг його знайти самостійно (з моїм очі), хоча коли у мене була лише купа маленьких регіонів, це було легко.
— luispedro

у вас є повний вихідний код до цього? я отримую np не визначено
— кодує

2

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


2

можливо, вам слід почати з розбиття проблеми на дві менші:

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

це ще дві дуже великі проблеми для вирішення ...

До речі, я б обрав c ++ та відкрив резюме, це, здається, набагато більше підходить для цього.


1
Якщо б використовували C ++ та OpenCV, тоді рішення в Python - це настільки ж можливе. OpenCV можна використовувати під Python.
— Unapiedra

1

Це неможливо, але дуже складно, тому що у вас насправді немає прикладу успішного поєдинку. Часто існує декілька станів (у цьому випадку більше прикладів пошуку креслень Уолліса), тоді ви можете подати кілька зображень у програму розпізнавання зображень і розглядати її як приховану марковську модель і використовувати щось на зразок алгоритму вітербі для умовиводу ( http: / /en.wikipedia.org/wiki/Viterbi_algorithm ).

Ось так я б підійшов до цього, але якщо припустити, що у вас є кілька зображень, ви можете надати йому приклади правильної відповіді, щоб він міг навчитися. Якщо у вас є лише одна фотографія, то мені шкода, що, можливо, вам потрібен інший підхід.


1

Я зрозумів, що є дві основні особливості, які майже завжди видно:

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

Тому я б зробив це наступним чином:

пошук сорочок у смужку:

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

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

пошук каштанового волосся

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

1

Ось рішення з використанням нейронних мереж, яке чудово працює.

Нейромережа навчається на кількох розв’язаних прикладах, які позначені обмежуючими рамками, що вказують, де Воллі з’являється на картині. Метою мережі є мінімізація помилок між передбачуваним полем та фактичним полем з даних навчання / перевірки.

Наведена вище мережа використовує Tensorflow Object Detection API для виконання тренінгів та прогнозів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.