Mathematica ile Waldo'yu nasıl bulabilirim?


1542

Bu hafta sonu beni rahatsız ediyordu: Nerede Waldo'ları çözmek için iyi bir yol nedir ? Mathematica (görüntü işleme ve diğer işlevler) kullanarak [ Kuzey Amerika dışında 'Wally' bulmacaları?

Şimdiye kadar sahip olduğum şey, bazı kırmızı olmayan renkleri karartmak suretiyle görsel karmaşıklığı biraz azaltan bir işlev:

whereIsWaldo[url_] := Module[{waldo, waldo2, waldoMask},
    waldo = Import[url];
    waldo2 = Image[ImageData[
        waldo] /. {{r_, g_, b_} /;
          Not[r > .7 && g < .3 && b < .3] :> {0, 0,
          0}, {r_, g_, b_} /; (r > .7 && g < .3 && b < .3) :> {1, 1,
          1}}];
    waldoMask = Closing[waldo2, 4];
    ImageCompose[waldo, {waldoMask, .5}]
]

Ve bunun 'çalıştığı' bir URL örneği:

whereIsWaldo["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"]

(Waldo yazar kasaya aittir):

Orijinal görüntü

Mathematica grafiği


31
@yoda - sol üstte, çok sayıda ayakkabı içeren masa, yazar kasa ve Waldo masanın köşesine yakın.
Arnoud Buzing

8
Bilgisayar vizyonunda doktora öğrencisi olarak ben de bunu denemek istedim ama direnmek zorundayım. Ne kadar değerli olduğu için, bu çok etkili çalışmada olduğu gibi Yönlendirilmiş Degradelerin Histogramı + sürgülü pencere SVM'sine giderdim (uyarı: pdf).
dimatura

54
" Wally nerede ." <
Yörüngedeki Hafiflik Yarışları

2
Soruyu diğer dilleri de destekleyecek şekilde değiştirebilir miyiz? Matlab ile yapmayı düşündüm
Andrey Rubshtein

2
@ArnoudBuzing: Sorunuzda, içinde en beyaz olan seçime bakarak Waldo'yu bulabilirsiniz. : /
Tamara Wijsman

Yanıtlar:


1640

Waldo'yu buldum!

waldo bulundu

Nasıl yaptım

İlk olarak, kırmızı olmayan tüm renkleri filtreliyorum

waldo = Import["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"];
red = Fold[ImageSubtract, #[[1]], Rest[#]] &@ColorSeparate[waldo];

Sonra, gömleğin içindeki kırmızı ve beyaz geçişleri bulmak için bu görüntünün basit bir siyah-beyaz desenle korelasyonunu hesaplıyorum.

corr = ImageCorrelate[red, 
   Image@Join[ConstantArray[1, {2, 4}], ConstantArray[0, {2, 4}]], 
   NormalizedSquaredEuclideanDistance];

Kullandığım Binarizeyeterince yüksek korelasyon ile görüntüdeki piksellerin dışarı almak ve bunları kullanarak bunları vurgulamak etrafında beyaz bir daire çizmek içinDilation

pos = Dilation[ColorNegate[Binarize[corr, .12]], DiskMatrix[30]];

Seviyeyle biraz oynamam gerekiyordu. Seviye çok yüksekse, çok fazla sayıda yanlış pozitif seçilir.

Sonunda yukarıdaki sonucu elde etmek için bu sonucu orijinal görüntü ile birleştiriyorum

found = ImageMultiply[waldo, ImageAdd[ColorConvert[pos, "GrayLevel"], .5]]

52
@MikeBantegui Heike'nin çözümü harika olsa WhereIsWaldoda, genel bir çözüm olmadığı için bir işleve paketlemek kadar hızlı olmazdım . Heike, pozitif çıkmadan önce seviyelerin oynanması gerektiğine dikkat çekti. Ne demek istediğimi görmek için, paketlenmiş işlevinizi olduğu gibi deneyin. "http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/AtTheBeach.jpg"Bu daha zor.
abcd

17
Bu görüntü daha hileli: Waldo . Yine de, potansiyel Waldos'u vurgulayabilecek bir şeye sahip olmanın hala yararlı olduğunu düşünüyorum (bazı 'yararlı' tanımı için.) (Bu bana iPhoto'nun bazen fotoğraf koleksiyonumuzda bir yüz olarak tanımlayacağı şeyleri hatırlatıyor ...)
Brett Champion

33
Lütfen bu Meta gönderiye
Bill the Lizard

155
Waldo'nun Nerede'nin kurallarını yanlış anlamış görünüyorsunuz. Bu açıkça aldatıyor.
Stefan Kendall

91
Bu güzel bir hack olsa da, işe yaramaz. Manuel ayarlama gerektirir ve yalnızca bir görüntü üzerinde çalışır. Bunun neden onaylandığını ve hatta bir cevap olarak seçildiğini anlamıyorum. Başkalarının daha iyi çalışma yöntemleriyle cevap vermeye çalışmasını bile teşvik etmez.
sam hocevar

144

"Bunu yapmanın kurşun geçirmez bir yolundaki" tahminim (CIA'nın herhangi bir uydu görüntüsünde Waldo'yu her zaman bulmayı düşünüyorum, çizgili gömlekler gibi rakip unsurlar olmadan tek bir görüntü değil) ... Boltzmann makinesini eğitiyordum birçok görüntüsünde - oturma, ayakta durma, tıkalı vb. tüm varyasyonları; gömlek, şapka, kamera ve tüm işler. Waldos'un büyük bir cesedine ihtiyacınız yoktur (belki 3-5 yeterli olacaktır), ancak daha fazlası daha iyidir.

Bu, doğru düzenleme ne olursa olsun çeşitli öğelere olasılık bulutları atayacak ve daha sonra ortalama bir nesne boyutunun ne olduğunu (segmentasyon yoluyla) belirleyecek, kaynak görüntüyü bireysel insanlara en çok benzeyen nesnelerin hücrelerine parçalayacaktır (olası oklüzyonlar ve poz değişiklikleri dikkate alınarak) ), ancak Waldo resimleri genellikle aynı ölçekte çok sayıda insan içerdiğinden, bu çok kolay bir görev olmalı, daha sonra önceden eğitilmiş Boltzmann makinesinin bu segmentlerini besleyin. Size her birinin Waldo olma olasılığını verecektir. En yüksek olasılıkla bir tane alın.

OCR, ZIP kodu okuyucuları ve inatçı el yazısı tanıma bugün böyle çalışıyor. Temel olarak cevabın orada olduğunu biliyorsunuz, az ya da çok neye benzemesi gerektiğini biliyorsunuz ve diğer her şeyin ortak unsurları olabilir, ama kesinlikle "değil", bu yüzden "değil" lerle uğraşmazsınız, daha önce gördüğünüz tüm "olası" seçenekler arasında "bu" olma olasılığına bakın (örneğin posta kodlarında BM'yi yalnızca 1s, sadece 2s, sadece 3s vb. her makineye rakam ekleyin ve en güvenilir olanı seçin.


13
Bunun için sadece düz sinir ağları yeterli değil mi? Ayrıca wikipedia makalesi Boltzmann makinelerinin pratik olmadığını iddia ediyor.
GClaramunt

2
Denemeden emin değilim, ama yeterince büyük ve yeterince karmaşıksa, HERHANGİ BİR şey için sinir ağı yeterli olmalıdır. Özellikle tekrarlarla. Boltzmann makineleri, kendisinden farklı bir veri denizinde yüksek miktarda gürültü ile oldukça basit bir veri kümesini tanımak için ÇOK ÇOK ÇOK iyi yapar.
Gregory Klopper

14
Posta kodları her zaman Boltzmann makineleriyle okunur ve posta dağıtımının doğruluğu çatıdan geçer.
Gregory Klopper

47

@GregoryKlopper ile, Waldo'yu (veya ilgilenilen herhangi bir nesneyi) keyfi bir görüntüde bulmanın genel yolunu çözmenin doğru bir yolun denetimli bir makine öğrenimi sınıflandırıcısı yetiştirmek olduğuna katılıyorum . Pozitif ve negatif etiketli birçok örnek kullanarak, Destek Vektör Makinesi , Artırılmış Karar Güdük veya Boltzmann Makinesi gibi bir algoritma bu sorun üzerinde yüksek doğruluk elde etmek için eğitilebilir. Mathematica, bu algoritmaları Makine Öğrenim Çerçevesinde bile içerir .

Bir Waldo sınıflandırıcısının eğitimi ile ilgili iki zorluk şöyle olacaktır:

  1. Doğru görüntü özellik dönüşümünü belirleme. @ Heike'ın cevabı faydalı olacaktır: kırmızı bir filtre ve soyulmuş bir desen detektörü (örn. Dalgacık veya DCT ayrışması) ham pikselleri sınıflandırma algoritmasının öğrenebileceği bir biçime dönüştürmenin iyi bir yolu olacaktır. Görüntünün tüm alt bölümlerini değerlendiren blok tabanlı bir ayrışma da gerekli olacaktır ... ancak bu, Waldo'nun a) her zaman kabaca aynı boyutta olması ve b) her görüntüde her zaman tam olarak bir kez bulunmasıyla daha kolay hale gelir.
  2. Yeterli eğitim örneklerinin alınması. SVM'ler her sınıftan en az 100 örnekle en iyi sonucu verir. Ticari artırma uygulamaları (örn. Dijital kameralarda yüze odaklanma) milyonlarca olumlu ve olumsuz örnek üzerinde eğitilmiştir.

Hızlı bir Google görsel araması bazı iyi verileri ortaya çıkarır - bazı eğitim örneklerini toplamaya ve şu anda kodlamaya devam edeceğim!

Bununla birlikte, bir makine öğrenme yaklaşımı (veya @iND tarafından önerilen kural tabanlı yaklaşım) bile Waldos Ülkesi gibi bir imaj için mücadele edecektir !


Bilgisayar Vizyonu ve Örüntü Tanıma konferansında geçen yıl gerçek dünyada "Nerede Waldo" problemini çözmeye çalışan makine öğrenimi tabanlı bir bilgisayar görme sistemi (yani Flickr'daki kalabalık fotoğraflarda belirli bir kişiyi bulmak) sunuldu. Aynı sahnenin birden fazla fotoğrafını kullanarak bazı 3B konum bilgileri ekleyerek biraz hile yapıyorlar.
lubar

41

Mathematica'yı tanımıyorum. . . çok kötü. Ama çoğunlukla yukarıdaki cevabı seviyorum.

Yine de cevabı çözmek için sadece çizgilere güvenen büyük bir kusur var (kişisel olarak bir manuel ayarlamayla ilgili bir sorunum yok ). Zaman zaman gömlek desenini kırdıklarını gösteren bir örnek ( burada Brett Champion tarafından listelenmiştir ) sunulmaktadır. Böylece daha karmaşık bir model haline gelir.

Uzaysal ilişkilerle birlikte şekil kimliği ve renk yaklaşımını denerdim. Yüz tanımaya çok benzer şekilde, birbirlerinden belirli oranlarda geometrik desenler arayabilirsiniz. Uyarı, genellikle bu şekillerin bir veya daha fazlasının tıkalı olmasıdır.

Görüntü üzerinde beyaz bir denge elde edin ve görüntüden kırmızı bir denge çekin. Waldo'nun her zaman aynı değer / renk tonu olduğuna inanıyorum, ancak görüntü bir taramadan veya kötü bir kopyadan olabilir. O zaman daima Waldo'nun gerçekte olduğu bir dizi renge bakın: kırmızı, beyaz, koyu kahverengi, mavi, şeftali, {ayakkabı rengi}.

Bir gömlek deseni ve ayrıca Waldo'yu tanımlayan pantolon, gözlük, saç, yüz, ayakkabı ve şapka var. Ayrıca, görüntüdeki diğer insanlara göre Waldo sıska tarafta.

Yani, bu fotoğraftaki insanların yüksekliğini elde etmek için rastgele insanlar bulun. Görüntüdeki rastgele noktalarda bir grup şeyin ortalama yüksekliğini ölçün (basit bir anahat oldukça az sayıda bireysel insan üretecektir). Her şey birbirinden standart bir sapma içinde değilse, şimdilik göz ardı edilir. Ortalama yüksekliklerin görüntünün yüksekliği ile karşılaştırın. Oran çok büyükse (örneğin, 1: 2, 1: 4 veya benzer şekilde yakınsa), tekrar deneyin. Bazı standart sapmaların dışındaki herhangi bir ortalama hariç, numunelerin birbirine oldukça yakın olduğundan emin olmak için 10 (?) Kez çalıştırın. Mathematica'da mümkün mü?

Bu sizin Waldo bedeniniz. Walso sıska, bu yüzden 5: 1 veya 6: 1 (veya her neyse) ht: wd. Ancak bu yeterli değildir. Waldo kısmen gizlenmişse yükseklik değişebilir. Yani, ~ 2: 1 kırmızı-beyaz bir blok arıyorsunuz. Ancak daha fazla gösterge olmalı.

  1. Waldo'nun gözlükleri var. Kırmızı-beyazın 0,5: 1 üzerinde iki daire arayın.
  2. Mavi pantolon. Kırmızı-beyazın ucu ile ayaklarına olan mesafe arasındaki herhangi bir mesafede aynı genişlikte herhangi bir miktarda mavi. Gömleğini kısa giydiğine dikkat edin, bu yüzden ayaklar çok yakın değildir.
  3. Şapka. Kırmızı-beyaz, başının iki katına kadar herhangi bir mesafe. Aşağıdaki koyu saçlara ve muhtemelen gözlüklere sahip olması gerektiğini unutmayın.
  4. Uzun kollu. kırmızı-beyaz ana kırmızı-beyaz bir açıyla.
  5. Koyu saç.
  6. Ayakkabı rengi. Rengi bilmiyorum.

Bunlardan herhangi biri geçerli olabilir. Bunlar aynı zamanda resimdeki benzer insanlara karşı negatif kontrollerdir - örneğin # 2 kırmızı-beyaz önlük (ayakkabılara çok yakın) giyen negatifler, # 5 açık renkli saçları ortadan kaldırır. Ayrıca, şekil bu testlerin her biri için sadece bir göstergedir. . . belirtilen mesafe içinde tek başına renk iyi sonuçlar verebilir.

Bu işlem yapılacak alanları daraltacaktır.

Bu sonuçların saklanması , içinde Waldo olması gereken bir dizi alan üretecektir . Diğer tüm alanları hariç tutun (örneğin, her alan için ortalama kişi boyutunun iki katı büyüklükte bir daire seçin) ve ardından @Heike'nin kırmızı hariç tümünü kaldırarak ortaya koyduğu işlemi çalıştırın.

Bunu nasıl kodlayacağınız hakkında bir fikriniz var mı?


Düzenle:

Bunu nasıl kodlayacağınız üzerine düşünceler. . . Waldo kırmızı hariç tüm alanları hariç tutun, kırmızı alanları iskeletleyin ve tek bir noktaya indirin. Waldo saç kahverengi, Waldo pantolon mavi, Waldo ayakkabı rengi için de aynısını yapın. Waldo ten rengi için dışlayın, ardından anahattı bulun.

Ardından, kırmızı olmayanları hariç tutun, tüm kırmızı alanları genişletin (çok fazla), sonra iskeletleyin ve budama yapın. Bu bölüm olası Waldo merkez noktalarının bir listesini verecektir. Bu, diğer tüm Waldo renk bölümlerini karşılaştırmak için işaretleyici olacaktır.

Buradan, iskeletlenmiş kırmızı alanları (dilate olanları değil) kullanarak, her alandaki çizgileri sayın. Doğru sayı varsa (dört, değil mi?), Bu kesinlikle olası bir alandır. Değilse, sanırım sadece hariç tut (Waldo merkezi olarak ... hala onun şapkası olabilir).

Ardından, yukarıda bir yüz şekli, yukarıda bir saç noktası, pantolonun altında, ayakkabıların altında vb.

Henüz kod yok - hala dokümanları okuyor.


8
Belki de bildiğiniz sistem / dilde bir kavram kanıtı gösterebilirsiniz. Bu aynı zamanda zorlukların nereye gelebileceği konusunda da bir fikir verecektir.
Szabolcs

1
Oh, sadece meydan okuyor gibi duruyorum. Bana sahilde yürüyüşler ve akşam yemeği için giyinme arasında bir şey verir.
iND

1
Yani. . . neden inişler? Bu, buradaki diğer spekülatif cevaptan nasıl farklı? Bu, bu sorunun daha ciddiye alınması gerektiğine dair bir öneri mi? Yoksa araştırmamda daha ciddi görünmem gerektiğini mi? Benim yaklaşımım aslında yanlış mı?
iND

3
Seni küçümsemedim ve downvotes'un (yanlış bilgi vermedikçe) dürüst cevap verme girişimleri için uygun olduğunu düşünmüyorum. Aşağı oyların en olası nedeni, (oldukça karmaşık sondaj) yaklaşımını denemediğiniz ve iyi bir çözüm bulmanın muhtemelen iyi miktarda pratik deney yapması ve birçok fikri ortadan kaldırmasıdır. Diğer spekülatif cevap , geçmişte benzer problemler için kullanılan genel bir yöntemi (başlangıç ​​noktası olarak) önermektedir ve üzerinde iyi bir literatür vardır. Sadece ne olduğunu anlatmaya çalışıyorum.
Szabolcs

Açıklama için teşekkürler. Sanırım fikirlerin tarihine odaklanmıyorum.
iND

2

Waldo'yu OpenCV kullanarak bulmak için hızlı bir çözümüm var.

Waldo'yu bulmak için OpenCV'de bulunan şablon eşleme fonksiyonunu kullandım .

Bunu yapmak için bir şablona ihtiyaç vardır. Bu yüzden Waldo'yu orijinal görüntüden kırptım ve şablon olarak kullandım.

resim açıklamasını buraya girin

Daha sonra cv2.matchTemplate()işlevi kullanılan yöntem olarak normalleştirilmiş korelasyon katsayısı ile birlikte çağırdım . Aşağıda beyaz olarak gösterildiği gibi tek bir bölgede yüksek bir olasılık döndürdü (sol üst bölgede bir yerde):

resim açıklamasını buraya girin

Olası en yüksek bölgenin konumu, cv2.minMaxLoc()daha sonra Waldo'yu vurgulamak için dikdörtgeni çizmek için kullandığım işlev kullanılarak bulundu :

resim açıklamasını buraya girin


7
SO'nun en ünlü görüntü işleme sorularını çözmeye mi çalışıyorsunuz? ;) Çözümünüz güzel ve kolaydır, ancak a / sadece bu belirli görüntü için çalışır ve b / önceden bulmak istediğiniz Waldo'nun tam görüntüsüne ihtiyaç duyarken, sorunun herhangi bir "Waldo görüntüsü nerede" gibi herhangi bir Waldo bulmakla ilgili olduğunu düşünüyorum. normal oyunu oynarsınız: önceden nasıl göründüğünü bilmeden.
Zaten

@Solitus tam olarak !!! Sadece bu görüntü için çalıştım. Farklı görüntüler için çalışmak zor olsa da !!
Jeru Luke
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.