Pertanyaan Bagaimana cara menemukan Waldo dengan Mathematica?


Ini mengganggu saya selama akhir pekan: Apa cara yang baik untuk menyelesaikannya Dimana Waldo?  ['Wally' di luar Amerika Utara] teka-teki, menggunakan Mathematica (pengolahan gambar dan fungsi lainnya)?

Inilah yang saya miliki sejauh ini, sebuah fungsi yang mengurangi kompleksitas visual sedikit demi sedikit beberapa warna non-merah:

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

Dan contoh dari URL di mana ini 'berfungsi':

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

(Waldo adalah dengan mesin kasir):

Mathematica graphic


1511
2017-12-12 18:29


asal


Jawaban:


Saya telah menemukan Waldo!

waldo had been found

Bagaimana saya melakukannya

Pertama, saya menyaring semua warna yang tidak merah

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

Selanjutnya, saya menghitung korelasi gambar ini dengan pola hitam dan putih sederhana untuk menemukan transisi merah dan putih di baju.

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

saya menggunakan Binarize untuk memilih piksel dalam gambar dengan korelasi yang cukup tinggi dan menggambar lingkaran putih di sekelilingnya untuk menekankan penggunaannya Dilation

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

Saya harus bermain sedikit dengan level tersebut. Jika levelnya terlalu tinggi, terlalu banyak false positive yang dipilih.

Akhirnya saya menggabungkan hasil ini dengan gambar asli untuk mendapatkan hasil di atas

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

1624
2017-12-12 19:32



Tebakan saya pada "cara antipeluru untuk melakukan ini" (pikir CIA menemukan Waldo dalam citra satelit kapan saja, tidak hanya satu gambar tanpa elemen yang bersaing, seperti kemeja bergaris) ... Saya akan melatih Mesin Boltzmann pada banyak gambar Waldo - semua variasi dia duduk, berdiri, tersumbat, dll.; kemeja, topi, kamera, dan semua karya. Anda tidak membutuhkan korpus besar Waldos (mungkin 3-5 akan cukup), tetapi lebih banyak lebih baik.

Ini akan memberikan awan probabilitas ke berbagai elemen yang terjadi dalam pengaturan apa pun yang benar, dan kemudian menetapkan (melalui segmentasi) berapa ukuran objek rata-rata, memecah gambar sumber ke dalam sel objek yang paling menyerupai orang individu (mempertimbangkan kemungkinan oklusi dan perubahan pose ), tetapi karena gambar Waldo biasanya mencakup BANYAK orang di sekitar skala yang sama, ini harus menjadi tugas yang sangat mudah, kemudian memberi makan segmen ini dari mesin Boltzmann yang sudah dilatih sebelumnya. Ini akan memberi Anda kemungkinan masing-masing menjadi Waldo. Ambil satu dengan probabilitas tertinggi.

Ini adalah bagaimana OCR, pembaca kode ZIP, dan pengenalan tulisan tangan tanpa jari bekerja hari ini. Pada dasarnya Anda tahu jawabannya ada di sana, Anda tahu kurang lebih apa yang seharusnya terlihat, dan segala sesuatu yang lain mungkin memiliki unsur-unsur umum, tetapi pasti "bukan", jadi Anda tidak peduli dengan "tidak itu", Anda hanya melihat kemungkinan "itu" di antara semua kemungkinan "itu" yang pernah Anda lihat sebelumnya "(dalam kode ZIP misalnya, Anda akan melatih BM hanya untuk 1 detik, hanya 2 detik, hanya 3 detik, dll., lalu beri makan masing-masing digit ke setiap mesin, dan pilih salah satu yang paling percaya diri. Ini bekerja jauh lebih baik daripada fitur pembelajaran jaringan saraf tunggal dari semua angka.


140
2017-12-12 20:25



Saya setuju dengan @GregoryKlopper bahwa kanan cara untuk memecahkan masalah umum menemukan Waldo (atau objek yang menarik) dalam gambar yang sewenang-wenang adalah untuk melatih pengklasifikasi pembelajaran mesin yang diawasi. Menggunakan banyak contoh berlabel positif dan negatif, sebuah algoritma seperti Mendukung Mesin Vektor, Keputusan Tunggul Didongkrak atau Boltzmann Machine kemungkinan dapat dilatih untuk mencapai akurasi tinggi pada masalah ini. Matematik bahkan memasukkan algoritme ini ke dalam Kerangka Pembelajaran Mesin.

Dua tantangan dengan pelatihan penggolongan Waldo adalah:

  1. Menentukan transformasi fitur gambar yang tepat. Di sinilah jawaban @ Heike akan berguna: filter merah dan detektor pola dilucuti (misalnya, dekomposisi wavelet atau DCT) akan menjadi cara yang baik untuk mengubah piksel mentah menjadi format yang dapat dipelajari algoritma klasifikasi. Dekomposisi berbasis blok yang menilai semua subbagian gambar juga diperlukan ... tetapi ini dibuat lebih mudah oleh fakta bahwa Waldo adalah a) selalu kira-kira dengan ukuran yang sama dan b) selalu hadir tepat satu kali dalam setiap gambar.
  2. Mendapatkan contoh pelatihan yang cukup. SVM bekerja paling baik dengan setidaknya 100 contoh dari setiap kelas. Aplikasi komersial untuk meningkatkan (mis., Pemfokusan wajah dalam kamera digital) dilatih pada jutaan contoh positif dan negatif.

Cepat Pencarian gambar Google menghasilkan beberapa data yang bagus - Saya akan mencoba mengumpulkan beberapa contoh pelatihan dan mengkodekan ini sekarang!

Namun, bahkan pendekatan pembelajaran mesin (atau pendekatan berbasis aturan yang disarankan oleh @iND) akan berjuang untuk sebuah gambar seperti Land of Waldos!


46
2018-04-01 01:23



Saya tidak tahu Mathematica. . . sangat buruk. Tapi saya suka jawaban di atas, untuk sebagian besar.

Masih ada cacat besar dalam mengandalkan garis-garis sendirian untuk mengumpulkan jawabannya (saya pribadi tidak punya masalah dengan satu penyesuaian manual). Ada sebuah contoh (yang didaftar oleh Brett Champion, sini) disajikan yang menunjukkan bahwa mereka, kadang-kadang, memecah pola baju. Jadi itu menjadi pola yang lebih rumit.

Saya akan mencoba pendekatan bentuk id dan warna, bersama dengan hubungan spasial. Sama seperti pengenalan wajah, Anda bisa mencari pola geometris pada rasio tertentu dari satu sama lain. Peringatan adalah bahwa biasanya satu atau lebih dari bentuk-bentuk itu tersumbat.

Dapatkan keseimbangan putih pada gambar, dan merahkan keseimbangan merah dari gambar. Saya percaya Waldo selalu bernilai / warna yang sama, tetapi gambarnya mungkin berasal dari pindaian, atau salinan buruk. Kemudian selalu mengacu pada susunan warna yang sebenarnya adalah Waldo: merah, putih, coklat gelap, biru, peach, {warna sepatu}.

Ada pola baju, dan juga celana, kacamata, rambut, wajah, sepatu dan topi yang menggambarkan Waldo. Juga, relatif terhadap orang lain dalam gambar, Waldo berada di sisi yang kurus.

Jadi, temukan orang acak untuk mendapatkan ketinggian orang di pic ini. Ukur tinggi rata-rata sekumpulan benda pada titik-titik acak dalam gambar (garis sederhana akan menghasilkan cukup banyak orang individu). Jika setiap hal tidak dalam standar deviasi satu sama lain, mereka diabaikan untuk saat ini. Bandingkan tinggi rata-rata dengan tinggi gambar. Jika rasio terlalu besar (mis., 1: 2, 1: 4, atau sama dekat), coba lagi. Jalankan 10 (?) Kali untuk memastikan bahwa sampel semua cukup berdekatan, tidak termasuk rata-rata yang ada di luar beberapa standar deviasi. Dimungkinkan dalam Mathematica?

Ini ukuran Waldo Anda. Walso itu kurus, jadi Anda mencari sesuatu 5: 1 atau 6: 1 (atau apa pun) ht: wd. Namun, ini tidak cukup. Jika Waldo tersembunyi sebagian, tingginya bisa berubah. Jadi, Anda mencari blok merah-putih yang ~ 2: 1. Tetapi harus ada lebih banyak indikator.

  1. Waldo punya kacamata. Cari dua lingkaran 0,5: 1 di atas merah-putih.
  2. Celana biru. Setiap jumlah biru pada lebar yang sama dalam jarak antara ujung merah-putih dan jarak ke kakinya. Perhatikan bahwa dia memakai kemejanya pendek, sehingga kakinya tidak terlalu dekat.
  3. Topi. Merah-putih ada jarak hingga dua kali bagian atas kepalanya. Perhatikan bahwa itu harus memiliki rambut hitam di bawah, dan mungkin kacamata.
  4. Lengan panjang. merah-putih di beberapa sudut dari merah-putih utama.
  5. Rambut hitam.
  6. Warna sepatu. Saya tidak tahu warnanya.

Salah satu dari mereka bisa berlaku. Ini juga merupakan pemeriksaan negatif terhadap orang yang mirip dalam foto - mis., # 2 meniadakan mengenakan celemek merah-putih (terlalu dekat dengan sepatu), # 5 menghilangkan rambut berwarna terang. Juga, bentuk hanya satu indikator untuk masing-masing tes ini. . . warna saja dalam jarak tertentu dapat memberikan hasil yang baik.

Ini akan mempersempit area untuk diproses.

Menyimpan hasil ini akan menghasilkan satu set area yang harus punya Waldo di dalamnya. Kecualikan semua area lainnya (misalnya, untuk setiap area, pilih lingkaran dua kali lebih besar dari ukuran rata-rata orang), lalu jalankan proses yang @Heole ditata dengan menghapus semua kecuali merah, dan seterusnya.

Setiap pemikiran tentang cara mengkodekan ini?


Edit:

Pemikiran tentang cara mengkodekan ini. . . mengecualikan semua area tetapi Waldo merah, skeletonize area merah, dan memangkas mereka ke satu titik. Lakukan hal yang sama untuk rambut Waldo coklat, Waldo celana biru, warna sepatu Waldo. Untuk warna kulit Waldo, kecualikan, kemudian cari garis besarnya.

Selanjutnya, kecualikan non-red, dilate (banyak) semua area merah, lalu skeletonize dan prune. Bagian ini akan memberikan daftar kemungkinan titik pusat Waldo. Ini akan menjadi penanda untuk membandingkan semua bagian warna Waldo lainnya.

Dari sini, dengan menggunakan area merah skeletonized (bukan yang melebar), hitung garis di setiap area. Jika ada nomor yang benar (empat, kan?), Ini pasti area yang mungkin. Jika tidak, saya kira hanya mengecualikannya (sebagai pusat Waldo ... mungkin masih menjadi topinya).

Kemudian periksa apakah ada bentuk wajah di atas, titik rambut di atas, titik celana di bawah, poin sepatu di bawah, dan seterusnya.

Belum ada kode - masih membaca dokumen.


40
2018-01-10 09:36



Saya memiliki solusi cepat untuk menemukan Waldo menggunakan OpenCV.

Saya menggunakan pencocokan template fungsi tersedia di OpenCV untuk menemukan Waldo.

Untuk melakukan ini diperlukan suatu template. Jadi saya memotong Waldo dari gambar aslinya dan menggunakannya sebagai templat.

enter image description here

Selanjutnya saya menelepon cv2.matchTemplate() berfungsi bersama dengan koefisien korelasi dinormalisasi sebagai metode yang digunakan. Ini mengembalikan probabilitas tinggi di satu wilayah seperti yang ditunjukkan dalam warna putih di bawah (di suatu tempat di wilayah kiri atas):

enter image description here

Posisi wilayah probabilitas tertinggi ditemukan menggunakan cv2.minMaxLoc() fungsi, yang kemudian saya gunakan untuk menggambar persegi panjang untuk menyoroti Waldo:

enter image description here


3
2018-04-11 11:11