Jak znaleźć Wally'ego w Pythonie?

84

Bezwstydnie skacząc za modą :-)

Zainspirowany Jak znaleźć Wally'ego w Mathematica i kontynuacją Jak znaleźć Wally'ego z R , jako nowy użytkownik Pythona chciałbym zobaczyć, jak można to zrobić. Wygląda na to, że Python byłby do tego lepiej przystosowany niż R i nie musimy martwić się o licencje, tak jak w przypadku Mathematica czy Matlab.

W przykładzie takim jak ten poniżej oczywiście zwykłe użycie pasków nie zadziała. Byłoby interesujące, gdyby proste podejście oparte na regułach można było zastosować do trudnych przykładów, takich jak ten.

Na plaży

Dodałem tag [machine-learning], ponieważ uważam, że poprawna odpowiedź będzie musiała korzystać z technik ML, takich jak podejście Restricted Boltzmann Machine (RBM) zalecane przez Gregory'ego Kloppera w oryginalnym wątku. W Pythonie jest dostępny kod RBM, który może być dobrym miejscem do rozpoczęcia, ale oczywiście do tego podejścia potrzebne są dane treningowe.

Podczas Międzynarodowych Warsztatów IEEE 2009 na temat UCZENIA MASZYNOWEGO DO PRZETWARZANIA SYGNAŁÓW (MLSP 2009) przeprowadzili konkurs analizy danych: gdzie jest Wally? . Dane szkoleniowe są dostarczane w formacie Matlab. Zwróć uwagę, że linki w tej witrynie są martwe, ale dane (wraz ze źródłem podejścia zastosowanego przez Seana McLoone i współpracowników można znaleźć tutaj (patrz link do SCM). Wydaje się, że jest to jedno miejsce do rozpoczęcia.

tdc
źródło
7
Przepraszam ... czy jest jakiś program, który pomyślnie znalazł Wally'ego na tym zdjęciu? Wydaje się, że nie ma żadnych wyróżniających cech „prawdziwego” Wally'ego. Kiedyś miałem tę samą książkę Wally’ego iz tego, co pamiętam, była pewna wskazówka w języku naturalnym, której należało użyć, może to, że prawdziwy Wally nie trzymał laski ani czegoś takiego. Nie rozumiem, jak można by programowo znaleźć Wally'ego bez uprzedniego zrozumienia przez program wskazówki w języku naturalnym.
AdamKG
Tak, masz rację, przepraszam ... chociaż to też byłoby interesujące zadanie! Zmieniłem obraz na stary „Na plaży”, który również ma paski ... (jest jeszcze jeden powód, dla którego
warto
Chociaż to pytanie jest interesujące, nie jest jasne, o co prosisz. Czy jest to wdrożenie rozwiązania? Podpowiedź, której biblioteki ML dla Pythona użyć do tego?
Simon Bergot
@Simon o kompletną implementację prawdopodobnie byłoby trochę za dużo, ale szkielet odpowiedzi (np. Brak definicji niektórych funkcji) byłby świetny. Nie jestem nawet pewien, czy załadowałbym obraz (chociaż widziałem to: stackoverflow.com/questions/94875/image-processing-in-python )
tdc

Odpowiedzi:

63

Oto implementacja z mahotami

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))

Podziel na kanały czerwony, zielony i niebieski. Lepiej jest użyć arytmetyki zmiennoprzecinkowej poniżej, więc konwertujemy na górze.

w = wfloat.mean(2)

w to kanał biały.

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

Stwórz wzór + 1, + 1, -1, -1 na osi pionowej. To jest koszula Wally'ego.

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

Splot z czerwonym minus biały. To da silną odpowiedź tam, gdzie jest koszula.

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

Poszukaj maksymalnej wartości i rozszerz ją, aby była widoczna. Teraz stonujemy cały obraz, z wyjątkiem regionu lub zainteresowania:

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

I dostajemy waldo!

luispedro
źródło
3
Wypróbowałem zdjęcie plaży i nie działało to zbyt dobrze :( Wally był w pierwszych 6 lub 7 trafieniach, ale nie było to najlepsze dopasowanie. Przetwarzanie pomogło, ponieważ nie mogłem go znaleźć samodzielnie (z moim oczy), podczas gdy gdy miałem tylko kilka małych regionów, było łatwo.
luispedro
czy masz pełny kod źródłowy tego? dostaję np. nie jest zdefiniowany
koduje
2

Możesz spróbować dopasować szablony, a następnie usunąć, które dało największe podobieństwo, a następnie użyć uczenia maszynowego, aby je zawęzić. Jest to również bardzo trudne, a przy dokładności dopasowania szablonu może po prostu zwrócić każdą twarz lub obraz podobny do twarzy. Myślę, że jeśli chcesz robić to konsekwentnie, będziesz potrzebować czegoś więcej niż tylko uczenia maszynowego.

kanapka
źródło
2

może powinieneś zacząć od rozbicia problemu na dwa mniejsze:

  1. stworzyć algorytm, który oddziela ludzi od tła.
  2. wytrenować klasyfikator sieci neuronowej z jak największą liczbą pozytywnych i negatywnych przykładów.

to wciąż są dwa bardzo duże problemy do rozwiązania ...

Przy okazji, wybrałbym c ++ i otwarte CV, wydaje się, że jest do tego bardziej odpowiedni.

WeaselFox
źródło
2
Gdyby używać C ++ i OpenCV, rozwiązanie w Pythonie jest tak samo możliwe. OpenCV może być używany pod Pythonem.
Unapiedra
1

Nie jest to niemożliwe, ale bardzo trudne, ponieważ tak naprawdę nie masz przykładu udanego meczu. Często występuje wiele stanów (w tym przypadku więcej przykładów rysunków Find Walleys), możesz następnie wprowadzić wiele obrazów do programu rekonfiguracji obrazu i traktować go jako ukryty model markowa i użyć czegoś takiego jak algorytm Viterbiego do wnioskowania ( http: / /en.wikipedia.org/wiki/Viterbi_algorithm ).

Tak podszedłbym do tego, ale zakładając, że masz wiele obrazów, możesz podać przykłady poprawnej odpowiedzi, aby mógł się nauczyć. Jeśli masz tylko jedno zdjęcie, przepraszam, że może być inne podejście, które musisz zastosować.

Zagubiona dusza
źródło
1

Zrozumiałem, że są dwie główne cechy, które są prawie zawsze widoczne:

  1. koszulę w czerwono-białe paski
  2. ciemnobrązowe włosy pod fantazyjną czapką

Więc zrobiłbym to w następujący sposób:

szukaj koszul w paski:

  • odfiltrowuje kolor czerwony i biały (z progami na przekonwertowanym obrazie HSV). To daje dwa obrazy masek.
  • dodaj je razem -> to główna maska ​​do wyszukiwania koszul w paski.
  • utwórz nowy obraz z całą odfiltrowaną czerwienią zamienioną na czystą czerwień (# FF0000) i całą odfiltrowaną bielą przekonwertowaną na czystą biel (#FFFFFF).
  • teraz skoreluj ten czysty czerwono-biały obraz z obrazem w paski (myślę, że wszystkie waldo mają całkiem idealne poziome paski, więc obracanie wzoru nie powinno być konieczne). Dokonaj korelacji tylko w wyżej wymienionej masce głównej.
  • spróbuj zgrupować skupienia, które mogły powstać z jednej koszuli.

Jeśli istnieje więcej niż jedna `` koszulka '', to znaczy więcej niż jedna grupa pozytywnej korelacji, poszukaj innych cech, takich jak ciemnobrązowe włosy:

szukaj brązowych włosów

  • odfiltruj konkretny brązowy kolor włosów za pomocą przekonwertowanego obrazu HSV i niektórych progów.
  • wyszukaj określony obszar na tym zamaskowanym obrazku - nie za duży i nie za mały.
  • teraz wyszukaj „obszar włosów”, który znajduje się tuż nad (wcześniej) wykrytą koszulą w paski i ma pewną odległość od środka koszuli.
Cyryla
źródło
1

Oto rozwiązanie wykorzystujące sieci neuronowe, które dobrze działa.

Sieć neuronowa jest uczona na kilku rozwiązanych przykładach, które są zaznaczone obwiedniami wskazującymi, gdzie na obrazku pojawia się Wally. Celem sieci jest zminimalizowanie błędu między przewidywanym pudełkiem a rzeczywistym pudełkiem z danych treningowych / walidacyjnych.

Powyższa sieć wykorzystuje interfejs API Tensorflow Object Detection do przeprowadzania szkoleń i prognozowania.

Tadej Magajna
źródło