Soru Waldo'yu Mathematica ile nasıl bulurum?


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

Şimdiye dek sahip olduğum şey, görsel karmaşıklığı biraz karartma ile azaltan bir işlev. kırmızı olmayan renklerin bazıları:

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 yazarkasa göre):

Mathematica graphic


1511
2017-12-12 18:29


Menşei


Şimdi "Yazar kasa nerede?" Oyununu oynamalıyım. - abcd
@yoda - sol üst, tablonun köşesine yakın bir sürü ayakkabı, bir kasa ve Waldo. - Arnoud Buzing
Mathematica önerisi çeşitli nedenlerden dolayı kapatıldı, ancak bunu başarabilir ve çalıştırabiliriz. yeni bir tane. Eğer istersen yardımını isteriz. - rcollyer
Bilgisayar görüşmelerinde doktora öğrencisi olarak, sooo bunu bir çekim yapmak için cazip buluyor ... ama direnmem gerekiyor. Değere göre, Odaklı Degradeler + sürgülü pencere SVM Histogramı için giderdim bu Çok etkili çalışma (uyarı: pdf). - dimatura
"Nerde Wally">. < - Lightness Races in Orbit


Cevaplar:


Waldo'yu buldum!

waldo had been found

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];

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

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

kullanırım Binarize Görüntüdeki pikselleri yeterince yüksek bir korelasyonla seçmek ve bunları kullanarak vurgulamak için etraflarında beyaz bir daire çizmek Dilation

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

Seviye ile biraz oynamak zorunda kaldım. Seviye çok yüksekse, çok fazla yanlış pozitif seçilir.

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

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

1624
2017-12-12 19:32



@MikeBantegui Heike'ın çözümü harika olsa da, WhereIsWaldo fonksiyonu, genel bir çözüm olmadığı için. Heike, olumlu sonuçlar elde edebilmek için, seviyelerin etrafta 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" Bununla daha zor. - abcd
Bu görüntü daha zor: Waldo. Yine de, Waldos'un potansiyelini vurgulayabilecek bir şeye sahip olmanın hala yararlı olduğunu düşünüyorum ('kullanışlı' bazı tanımları için.) (Bu, iPhoto'nun bazen fotoğraf koleksiyonumuzda bir yüz olarak tanımlayacağı bazı şeyleri hatırlatıyor ...) - Brett Champion
Lütfen şu Meta gönderisine bakın: meta.stackexchange.com/questions/116401/... - Bill the Lizard
Nerede Waldo'nun kurallarını yanlış anlamış görünüyorsun. Bu Açıkça hile. - Stefan Kendall
Bu güzel bir hack olsa da, sadece işe yaramıyor. Manuel ayar gerektiriyor ve sadece bir görüntü üzerinde çalışıyor. Bunun neden bu kadar kararlı ve hatta bir cevap olarak seçildiğini anlamıyorum. Daha iyi çalışma yöntemleri ile cevap vermeye çalışmaktan başkalarını cesaretlendiriyor. - sam hocevar


Tahminimce "bunu yapmanın kurşun geçirmez bir yolu" (CIA'yı herhangi bir uydu görüntüsünde herhangi bir zamanda Waldo'yu bulmak, sadece çizgili bir görüntü gibi rakip elemanlar olmaksızın değil, tek bir görüntü). Boltzmann makinesi Waldo'nun birçok görüntüsünde - onun tüm varyasyonları otururken, ayakta duruyor, tıkalıyor, vb. gömlek, şapka, kamera ve tüm eserler. Büyük bir Waldos corpusuna ihtiyacınız yoktur (belki 3-5 yeterli olacaktır), ama ne kadar çok olursa o kadar iyi olur.

Bu, olasılıkların bulutlarını doğru düzenleme ne olursa olsun meydana gelen çeşitli unsurlara atayacaktır ve daha sonra ortalama nesne boyutunun ne olduğunu (parçalara ayırma yoluyla) kuracağını, kaynak görüntünün en çok bireysel insanları andıran nesnelerin hücrelerine parçalanmasını (olası oklüzyonlar ve poz değişiklikleri dikkate alarak) ) Ancak, Waldo resimleri genellikle aynı ölçekte bir çok insanı içerdiğinden, bu çok kolay bir görev olmalı, daha sonra eğitimli Boltzmann makinesinin bu bölümlerini beslemeli. Her birinin Waldo olma olasılığını verecektir. En yüksek olasılıkla bir tane alın.

OCR, ZIP kod okuyucular ve oklarsız el yazısı tanıma çalışmaları bu şekilde çalışır. Temel olarak, cevabın orada olduğunu biliyorsunuz, neye benzediğini daha çok veya daha az biliyorsunuz ve diğer her şey ortak unsurlara sahip olabilir, ama kesinlikle "o değil", yani "o değil" lerle uğraşmıyorsunuz, sadece "o" ların daha önce gördüğünüz "it" olasılığına bakın "(örneğin, ZIP kodlarında, sadece 1'ler için BM, sadece 2'ler, sadece 3'ler vb. Her makineye bir rakam girin ve en çok güvendiğiniz birini seçin. Bu, tüm sayıların tek bir sinir ağı öğrenme özelliklerinden çok daha iyi çalışır.


140
2017-12-12 20:25



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
Denemeden emin değilim, ancak yeterince büyük ve karmaşık bir sinir ağının HERHANGİ BİR ŞEY için yeterli olması gerekir. Özellikle nüks ile. Boltzmann makineleri, veri denizinde çok fazla miktarda verinin kendinden farklı olarak oldukça basit bir veri kümesini tanımak için çok ÇOK ÇOK çok şey yaparlar. - Gregory Klopper
Posta kodları her zaman Boltzmann makineleri ile okunur ve posta dağıtımının doğruluğu tavandan geçti. - Gregory Klopper


@GregoryKlopper'a katılıyorum sağ keyfi bir görüntüde Waldo'yu (veya herhangi bir ilgi nesnesini) bulmanın genel problemini çözmenin yolu, denetlenen bir makine öğrenimi sınıflandırıcıyı eğitmek olacaktır. Pek çok pozitif ve negatif etiketli örnek kullanarak, bir algoritma gibi Destek Vektör Makinesi, Artırılmış Karar Güdük veya Boltzmann Makine, bu sorun üzerinde yüksek doğruluk elde etmek için eğitilmiş olabilir. Mathematica, bu algoritmaları kendi içinde bile içerir. Makine Öğrenim Çerçevesi.

Bir Waldo sınıflandırıcısını eğitmekle ilgili iki zorluk şöyle olurdu:

  1. Doğru görüntü özelliklerinin belirlenmesi. Bu, Heike'nin cevabının yararlı olacağı yerdir: kırmızı bir filtre ve soyulmuş bir desen detektörü (ör. Dalgacık veya DCT ayrıştırma), ham pikselleri sınıflandırma algoritmasının öğrenebileceği bir formata 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ıştırma da gerekli olacaktır ... ancak bu, Waldo'nun her zaman kabaca aynı boyutta olması ve b) her görüntüde her zaman tam olarak bir kez sunulmasıyla daha kolay hale getirilir.
  2. Yeterli eğitim örnekleri elde etmek. SVM'ler, her bir sınıfın en az 100 örneği ile en iyi şekilde çalışır. Arttırmanın ticari uygulamaları (örneğin, dijital kameralarda yüz odaklı) milyonlarca pozitif ve negatif örnek üzerinde eğitilmiştir.

Hızlı Google görsel araması bazı iyi verileri ortaya koyuyor - bazı eğitim örneklerini toplayıp şu an kodları hazırlamaya gidiyorum!

Ancak, bir makine öğrenimi yaklaşımı (veya @iND tarafından önerilen kural tabanlı yaklaşım) bile, Waldos Ülkesi!


46
2018-04-01 01:23



Gerçek dünyada "Nerede Waldo" problemini çözmeye çalışan bir makine öğrenimine dayalı bilgisayarlı görme sistemi (yani, Flickr'da kalabalığın fotoğraflarında özel bir kişi bulma) geçen yıl Bilgisayarlı Görme ve Örüntü Tanıma konferansında sunuldu. Aynı sahnenin birden fazla fotoğrafını kullanarak 3D konum bilgisi ekleyerek biraz aldatıyorlar. - lubar
cs.washington.edu/homes/rahul/data/WheresWaldo.html - lubar
Oyla. Bunu okuduğumda da wavelet düşündüm. - davec


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

Yine de çizgiler üzerinde güvenmek için büyük bir kusur var. yalnız cevabı aydınlatmak için (kişisel olarak bir sorunum yok bir Manuel ayarlama). Bir örnek var (Brett Champion tarafından listelenmiştir, İşte), zaman zaman gömlek desenini kırdıklarını gösteren bir sunum yaptı. Böylece daha karmaşık bir desen olur.

Boşluk ilişkileri ile birlikte şekil kimliği ve renklerin bir yaklaşımını deneyeceğim. Yüz tanıma gibi, birbirinden belirli oranlarda geometrik desenler arayabilirsin. Uyarı, genellikle bu şekillerden bir veya daha fazlasının tıkanmasıdır.

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

Waldo'yu tanımlayan bir gömlek ve 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 resimde insanların yüksekliğini elde etmek için rastgele insanlar bulun. Görüntüdeki rastgele noktalardaki bir grup şeyin ortalama yüksekliğini ölçün (basit bir taslak, birkaç bireysel kişiyi üretecektir). Her şey birbirinden bazı standart sapma içinde değilse, şimdilik göz ardı edilir. Yüksekliklerin ortalamasını görüntünün yüksekliğine göre karşılaştırın. Oran çok büyükse (ör. 1: 2, 1: 4 veya benzer şekilde kapanırsa) tekrar deneyin. Örneklerin hepsinin birbirine oldukça yakın olduğundan emin olmak için 10 (?) Kez çalıştırın, bazı standart sapmaların dışındaki herhangi bir ortalama hariç. Mathematica'da mümkün mü?

Bu senin Waldo bedenin. Walso sıska, yani 5: 1 veya 6: 1 (ya da herneyse) ht: wd. Ancak, bu yeterli değildir. Waldo kısmen gizliyse, yükseklik değişebilir. Yani, ~ 2: 1 bir kırmızı-beyaz blok arıyoruz. Fakat daha fazla gösterge olmalı.

  1. Waldo'nun gözlükleri var. Kırmızı-beyazın üzerinde 0,5: 1 iki daire arayın.
  2. Mavi pantolon. Kırmızı-beyazın sonu ve ayaklarına olan mesafe arasındaki herhangi bir mesafe içinde aynı genişlikte mavi bir miktar. Tişörtü kısa giydiğini unutmayın, bu yüzden ayaklar çok yakın değildir.
  3. Şapka. Kırmızı-beyaz, kafasının iki katı kadar herhangi bir mesafe. Altında koyu renkli saç olması ve muhtemelen gözlük olması gerektiğini unutmayın.
  4. Uzun kollu. Ana kırmızı-beyazdan belli bir açıdan kırmızı-beyaz.
  5. Koyu saç.
  6. Ayakkabı rengi. Ben rengi bilmiyorum.

Bunlardan herhangi biri geçerli olabilir. Bunlar aynı zamanda resimlerdeki benzer insanlara karşı negatif kontrollerdir - örneğin # 2 kırmızı-beyaz önlük giyer (ayakkabılara çok yakın), # 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 vermek iyi sonuç verebilir.

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

Bu sonuçların saklanması, bir dizi meli İçinde Waldo var. Diğer tüm alanları hariç tutun (ör., Her alan için, ortalama kişi büyüklüğünde iki kat daha büyük bir daire seçin) ve ardından @Heike'ın kırmızı, vb.

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


Düzenle:

Bunu nasıl kodlayacağınıza dair düşünceler. . . Tüm alanları hariç tut, ama Waldo kırmızısı, kırmızı bölgeleri iskeletlendir ve onları tek bir noktaya indir. Waldo saç rengi, Waldo pantolonu, Waldo ayakkabı rengi için de aynısını yapın. Waldo ten rengi için, hariç tut, sonra taslağı bul.

Ardından, kırmızı olmayan, dilate (çok) tüm kırmızı alanları hariç tutun, sonra iskeletleyin ve kurulayın. Bu bölüm olası Waldo merkezlerinin 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ı (genişlemiş olanları değil) kullanarak, her alandaki çizgileri sayın. Doğru sayı varsa (dört, sağ?), Bu kesinlikle olası bir alandır. Değilse, sanırım bunu hariç tut (Waldo merkezi olarak..... Hala onun şapkası olabilir).

Ardından, yukarıda bir yüz şekli olup olmadığını, yukarıda bir saç noktası olup olmadığını, aşağıdaki pantolon noktasını, aşağıdaki ayakkabı noktalarını ve benzerlerini kontrol edin.

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


40
2018-01-10 09:36



Belki de aşina olduğunuz sistem / dilde bir kavram kanıtı gösterebilirsiniz. Bu ayrıca zorlukların nereden gelebileceği konusunda size bir fikir verecektir. - Szabolcs
Oh, sadece meydan okumayı olduğu gibi yaşıyorum. Bana sahildeki yürüyüşler ve akşam yemeği için giyinme arasında bir şeyler veriyor. - iND
Yani. . . Neden düşüşler? Bu, diğer spekülatif cevaplardan farklı mıdır? Bu sorunun daha ciddiye alınması gerektiği bir öneri mi? Ya da benim araştırmamda daha ciddi görünmem gerekiyor mu? Benim yaklaşımım aslında yanlış mı? - iND
Sizi reddetmedim ve düsünceler cevaplarin düsündügü cevaplar icin uygun degildir (yanlis vermedigi sürece). İndirimlerin en olası nedeni, (oldukça karmaşık bir sondaj) yaklaşımını denemediyseniz ve iyi bir çözüm bulmak, muhtemelen iyi bir deneysel deneyime sahip olacak ve pek çok fikri kararlaştıracaktır. Diğer spekülatif bir cevap bir genel Geçmişte benzer problemler için kullanılmış olan bir yöntem (başlangıç ​​noktası olarak) ve üzerinde çok iyi bir literatür var. Sadece ne olduğunu açıklamaya çalışıyorum. - Szabolcs
Açıklama için teşekkürler. Sanırım fikirlerin tarihine odaklanmıyorum. - iND


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

Kullandım şablon eşleme Waldo'yu bulmak için OpenCV'de kullanılabilir.

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

enter image description here

Sonra aradım cv2.matchTemplate() ile birlikte işlev normalleştirilmiş korelasyon katsayısı Kullanılan yöntem olarak. Aşağıda beyaz renkte gösterildiği gibi (üst sol bölgede bir yerlerde) yüksek bir olasılıkla büyük bir olasılıkla döndü:

enter image description here

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:

enter image description here


3
2018-04-11 11:11



SO'nın en ünlü görüntü işleme soruları ile uğraşmaya mı çalışıyorsunuz? ;) Senin çözümün güzel ve kolay ama a / sadece bu özel görüntü için çalışır ve b / önceden bulmak istediğiniz Waldo tam görüntüsünü gerektirir, sanırım soru herhangi bir "Nerede Waldo görüntü" gibi herhangi bir Waldo bulma hakkında olduğunu düşünüyorum Normal oyunu oynayacaksınız: önceden neye benzediğini bilmeden. Bu soru bir şekilde çok eğlenceli - Soltius
@Solitus ha tam olarak! Sadece bu görüntü için özellikle çalıştım. Farklı görüntüler için çalışıyor olsa da bir meydan okuma olurdu! - Jeru Luke