Pertanyaan Pengolahan Citra: Peningkatan Algoritma untuk Pengakuan 'Coca-Cola Can'


Salah satu proyek paling menarik yang saya kerjakan dalam beberapa tahun terakhir adalah proyek tentang pengolahan citra. Tujuannya adalah mengembangkan sistem agar dapat mengenali Coca-Cola 'kaleng' (perhatikan bahwa saya menekankan kata 'kaleng', Anda akan tahu mengapa dalam satu menit). Anda dapat melihat contoh di bawah ini, dengan dapat dikenali di persegi panjang hijau dengan skala dan rotasi.

Template matching

Beberapa kendala pada proyek:

  • Latar belakangnya bisa sangat bising.
  • Itu bisa bisa punya skala atau rotasi atau bahkan orientasi (dalam batas yang wajar).
  • Gambar bisa memiliki tingkat ketidakjelasan (kontur mungkin tidak sepenuhnya lurus).
  • Mungkin ada botol Coca-Cola dalam gambar, dan algoritme seharusnya hanya mendeteksi bisa!
  • Kecerahan gambar bisa sangat bervariasi (jadi Anda tidak dapat mengandalkan "terlalu banyak" pada deteksi warna).
  • Itu bisa bisa sebagian tersembunyi di sisi atau bagian tengah dan mungkin sebagian tersembunyi di balik botol.
  • Tidak mungkin ada bisa sama sekali dalam gambar, dalam hal ini Anda harus menemukan apa-apa dan menulis pesan yang mengatakan demikian.

Jadi Anda bisa berakhir dengan hal-hal rumit seperti ini (yang dalam hal ini algoritma saya benar-benar gagal):

Total fail

Saya melakukan proyek ini beberapa waktu yang lalu, dan sangat senang melakukannya, dan saya memiliki implementasi yang layak. Berikut beberapa detail tentang penerapan saya:

Bahasa: Selesai menggunakan C ++ OpenCV Perpustakaan.

Pra-pemrosesan: Untuk pra-pemrosesan gambar, yaitu mengubah gambar menjadi bentuk yang lebih baku untuk diberikan ke algoritme, saya menggunakan 2 metode:

  1. Mengubah domain warna dari RGB menjadi HSV dan memfilter berdasarkan "merah" warna, saturasi di atas ambang batas tertentu untuk menghindari warna seperti oranye, dan memfilter nilai rendah untuk menghindari nada gelap. Hasil akhirnya adalah gambar hitam dan putih biner, di mana semua piksel putih akan mewakili piksel yang cocok dengan ambang ini. Jelas masih ada banyak omong kosong dalam gambar, tetapi ini mengurangi jumlah dimensi yang harus Anda kerjakan. Binarized image 
  2. Noise filtering menggunakan median filtering (mengambil nilai median pixel dari semua tetangga dan mengganti pixel dengan nilai ini) untuk mengurangi noise.
  3. Menggunakan Canny Edge Detection Filter untuk mendapatkan kontur semua item setelah 2 langkah preseden. Contour detection

Algoritma: Algoritma itu sendiri saya pilih untuk tugas ini diambil dari ini buku mengagumkan tentang ekstraksi fitur dan dipanggil Generalized Hough Transform (Sangat berbeda dari Hough Transform biasa). Pada dasarnya mengatakan beberapa hal:

  • Anda dapat mendeskripsikan suatu objek dalam ruang tanpa mengetahui persamaan analitisnya (yang merupakan kasus di sini).
  • Ini tahan terhadap deformasi gambar seperti penskalaan dan rotasi, karena pada dasarnya akan menguji gambar Anda untuk setiap kombinasi faktor skala dan faktor rotasi.
  • Ini menggunakan model dasar (template) yang algoritma akan "belajar".
  • Setiap piksel yang tersisa dalam gambar kontur akan memilih piksel lain yang seharusnya menjadi pusat (dalam hal gravitasi) objek Anda, berdasarkan apa yang dipelajarinya dari model.

Pada akhirnya, Anda berakhir dengan peta panas suara, misalnya di sini semua piksel kontur kaleng akan memilih pusat gravitasinya, sehingga Anda akan memiliki banyak suara di piksel yang sama sesuai dengan pusat, dan akan melihat puncak di peta panas seperti di bawah ini:

GHT

Setelah Anda memilikinya, heuristik berbasis ambang sederhana dapat memberikan Anda lokasi piksel pusat, dari mana Anda dapat memperoleh skala dan rotasi dan kemudian merencanakan persegi panjang kecil Anda di sekitarnya (skala akhir dan faktor rotasi jelas akan relatif terhadap Anda template asli). Secara teori setidaknya ...

Hasil: Sekarang, sementara pendekatan ini berhasil dalam kasus-kasus dasar, itu sangat kurang di beberapa bidang:

  • ini sangat lambat! Saya tidak cukup menekankan ini. Hampir satu hari penuh diperlukan untuk memproses 30 gambar uji, jelas karena saya memiliki faktor skala yang sangat tinggi untuk rotasi dan terjemahan, karena beberapa kaleng sangat kecil.
  • Itu benar-benar hilang ketika botol berada di gambar, dan untuk beberapa alasan hampir selalu menemukan botol bukannya kaleng (mungkin karena botol lebih besar, sehingga memiliki lebih banyak piksel, sehingga lebih banyak suara)
  • Gambar kabur juga tidak bagus, karena suara berakhir dengan pixel di lokasi acak di sekitar pusat, sehingga berakhir dengan peta panas yang sangat bising.
  • Perbedaan dalam terjemahan dan rotasi dicapai, tetapi tidak dalam orientasi, yang berarti bahwa kaleng yang tidak langsung menghadap sasaran kamera tidak dikenali.

Bisakah Anda membantu saya meningkatkan kemampuan saya spesifik algoritma, menggunakan secara eksklusif OpenCV fitur, untuk menyelesaikan empat spesifik masalah yang disebutkan?

Saya berharap beberapa orang juga akan belajar sesuatu dari itu juga, setelah semua saya pikir tidak hanya orang yang bertanya yang harus belajar. :)


1390
2018-04-16 04:23


asal


Jawaban:


Pendekatan alternatif akan mengekstrak fitur (keypoints) menggunakan mengubah fitur skala-invarian (SIFT) atau Speeded Up Robust Features (BERSELANCAR).

Ini diimplementasikan dalam OpenCV 2.3.1.

Anda dapat menemukan contoh kode yang bagus menggunakan fitur di Features2D + Homography untuk menemukan objek yang dikenal

Kedua algoritme invarian ke skala dan rotasi. Karena mereka bekerja dengan fitur, Anda juga dapat menangani kemacetan (selama cukup keypoints terlihat).

Enter image description here

Sumber gambar: contoh tutorial

Prosesnya membutuhkan beberapa ratus ms untuk SIFT, SURF sedikit lebih cepat, tetapi tidak cocok untuk aplikasi real-time. ORB menggunakan CEPAT yang lebih lemah mengenai invarian rotasi.

Makalah asli


563
2018-04-16 05:17



Untuk mempercepat, saya akan mengambil keuntungan dari fakta bahwa Anda tidak diminta untuk menemukan gambar / objek yang sewenang-wenang, tetapi secara khusus satu dengan logo Coca-Cola. Hal ini penting karena logo ini sangat khas, dan harus memiliki karakteristik, tanda tangan skala-invariant dalam domain frekuensi, khususnya di saluran merah RGB. Artinya, pola bolak merah-ke-putih-ke-merah yang ditemui oleh garis pemindaian horizontal (dilatih pada logo yang sejajar secara horizontal) akan memiliki "ritme" yang khas saat melewati poros pusat dari logo. Ritme itu akan "mempercepat" atau "memperlambat" pada skala dan orientasi yang berbeda, tetapi akan tetap proporsional setara. Anda dapat mengidentifikasi / menetapkan beberapa lusin scanlines, baik secara horizontal maupun vertikal melalui logo dan beberapa lainnya secara diagonal, dalam pola starburst. Sebut ini "garis pemindaian tanda tangan."

Signature scan line

Mencari tanda tangan ini di gambar target adalah masalah sederhana untuk memindai gambar dalam strip horizontal. Carilah frekuensi tinggi di saluran merah (menunjukkan pindah dari daerah merah ke putih), dan sekali ditemukan, lihat apakah itu diikuti oleh salah satu frekuensi irama yang diidentifikasi dalam sesi pelatihan. Setelah kecocokan ditemukan, Anda akan langsung mengetahui orientasi dan lokasi scan-line pada logo (jika Anda melacak hal-hal tersebut selama pelatihan), jadi mengidentifikasi batas-batas logo dari sana adalah sepele.

Saya akan terkejut jika ini bukan algoritma linear-efisien, atau hampir begitu. Ini jelas tidak membahas diskriminasi botol kaleng Anda, tetapi setidaknya Anda akan memiliki logo Anda.

(Pembaruan: untuk pengenalan botol saya akan mencari coke (cairan coklat) yang bersebelahan dengan logo - yaitu, dalam botol. Atau, dalam kasus botol kosong, saya akan mencari topi yang akan selalu memiliki bentuk dasar, ukuran, dan jarak yang sama dari logo dan biasanya akan berwarna putih atau merah. Cari bentuk elips warna solid di mana topi harus jadilah, relatif terhadap logo. Tentu tidak mudah, tetapi tujuan Anda di sini adalah menemukan mudah satu cepat.)

(Sudah beberapa tahun sejak hari pemrosesan gambar saya, jadi saya menyimpan saran ini tingkat tinggi dan konseptual. Saya pikir itu mungkin sedikit perkiraan bagaimana mata manusia bisa beroperasi - atau setidaknya bagaimana otak saya melakukannya!)


331
2018-04-17 21:06



Masalah menyenangkan: ketika saya melirik gambar botol Anda, saya pikir itu juga bisa. Tapi, sebagai manusia, apa yang saya lakukan untuk membedakannya adalah bahwa saya kemudian menyadari itu juga sebuah botol ...

Jadi, untuk membedakan kaleng dan botol, bagaimana dengan hanya memindai botol terlebih dahulu? Jika Anda menemukannya, tutup labelnya sebelum mencari kaleng.

Tidak terlalu sulit untuk diterapkan jika Anda sudah melakukan kaleng. Kelemahan sebenarnya adalah menggandakan waktu pemrosesan Anda. (Tapi berpikir ke depan untuk aplikasi dunia nyata, Anda akan berakhir juga ingin melakukan botol ;-)


132
2018-04-16 05:03



Bukankah sulit bahkan bagi manusia untuk membedakan antara botol dan kaleng di gambar kedua (asalkan daerah transparan dari botol tersembunyi)?

Mereka hampir sama kecuali untuk wilayah yang sangat kecil (yaitu, lebar di bagian atas kaleng agak kecil sementara bungkus botol sama lebarnya, tapi sedikit perubahan kan?)

Hal pertama yang terlintas dalam pikiran saya adalah memeriksa bagian atas botol merah. Tetapi ini masih menjadi masalah, jika tidak ada bagian atas untuk botol, atau jika itu sebagian tersembunyi (seperti yang disebutkan di atas).

Hal kedua yang saya pikir adalah tentang transparansi botol. OpenCV memiliki beberapa cara untuk menemukan objek transparan dalam sebuah gambar. Periksa tautan di bawah ini.

Khususnya lihat ini untuk melihat seberapa akurat mereka mendeteksi kaca:

Lihat hasil implmentasi mereka:

Enter image description here

Mereka mengatakan itu adalah implementasi makalah "Kerangka Kontur Aktif Geodesik untuk Menemukan Kaca" oleh K. McHenry dan J. Ponce, CVPR 2006.

Ini mungkin membantu dalam kasus Anda sedikit, tetapi masalah muncul lagi jika botol diisi.

Jadi saya pikir di sini, Anda dapat mencari tubuh botol transparan terlebih dahulu atau untuk wilayah merah yang terhubung ke dua objek transparan di bagian lateral yang jelas adalah botol. (Saat bekerja idealnya, gambar seperti berikut.)

Enter image description here

Sekarang Anda dapat menghapus wilayah kuning, yaitu label botol dan menjalankan algoritma Anda untuk menemukan kaleng.

Pokoknya, solusi ini juga memiliki masalah yang berbeda seperti di solusi lainnya.

  1. Hanya bekerja jika botol Anda kosong. Dalam hal ini, Anda harus mencari wilayah merah antara dua warna hitam (jika cairan Coca Cola berwarna hitam).
  2. Masalah lain jika bagian transparan tertutup.

Tapi bagaimanapun, jika tidak ada masalah di atas dalam gambar, ini tampaknya menjadi cara yang lebih baik.


101
2018-04-18 23:02



Saya sangat suka Darren Cook dan jawaban penumpuk untuk masalah ini. Saya berada di tengah-tengah melemparkan pikiran saya ke komentar pada mereka, tapi saya percaya pendekatan saya terlalu berbentuk jawaban untuk tidak pergi dari sini.

Singkatnya, Anda telah mengidentifikasi suatu algoritma untuk menentukan bahwa logo Coca-Cola hadir di lokasi tertentu dalam ruang. Anda sekarang sedang mencoba menentukan, untuk orientasi yang sewenang-wenang dan faktor skala yang berubah-ubah, sebuah heuristik yang cocok untuk membedakan Coca-Cola kaleng dari objek lain, termasuk: botol-botol, billboard, iklan, dan Perlengkapan Coca-Cola semua terkait dengan logo ikon ini. Anda tidak memanggil banyak dari kasus-kasus tambahan ini dalam pernyataan masalah Anda, tetapi saya merasa mereka sangat penting bagi keberhasilan algoritme Anda.

Rahasianya di sini adalah menentukan fitur visual apa a bisa mengandung atau, melalui ruang negatif, fitur apa yang ada untuk produk Coke lain yang tidak ada untuk kaleng. Untuk itu, jawaban teratas saat ini membuat sketsa pendekatan dasar untuk memilih "dapat" jika dan hanya jika "botol" tidak diidentifikasi, baik oleh kehadiran tutup botol, cairan, atau heuristik visual serupa lainnya.

Masalahnya adalah ini rusak. Sebuah botol bisa, misalnya, kosong dan tidak ada topi, yang mengarah ke positif palsu. Atau, bisa jadi botol parsial dengan fitur tambahan hancur, memimpin lagi ke deteksi palsu. Tak perlu dikatakan, ini tidak elegan, juga tidak efektif untuk tujuan kita.

Untuk tujuan ini, kriteria seleksi yang paling benar untuk kaleng tampak sebagai berikut:

  • Apakah bentuk objek siluet, seperti Anda membuat sketsa dalam pertanyaan Anda, benar? Jika demikian, beri +1.
  • Jika kita mengasumsikan kehadiran cahaya alami atau buatan, apakah kita mendeteksi garis krom ke botol yang menandakan apakah ini terbuat dari aluminium? Jika demikian, beri +1.
  • Apakah kita menentukan bahwa sifat spekulatif objek sudah benar, relatif terhadap sumber cahaya kami (tautan video ilustratif di deteksi sumber cahaya)? Jika demikian, beri +1.
  • Bisakah kita menentukan properti lain tentang objek yang mengidentifikasi itu sebagai dapat, termasuk, tetapi tidak terbatas pada, gambar topologi condong pada logo, orientasi objek, penjajaran objek (misalnya, pada permukaan planar seperti meja atau dalam konteks kaleng lain), dan adanya tab penarik? Jika demikian, untuk masing-masing, +1.

Klasifikasi Anda mungkin terlihat seperti berikut:

  • Untuk setiap pertandingan kandidat, jika kehadiran logo Coca Cola terdeteksi, gambarlah batas abu-abu.
  • Untuk setiap pertandingan di atas +2, buat garis merah.

Ini secara visual menyoroti kepada pengguna apa yang terdeteksi, menekankan kelemahan positif yang mungkin, dengan benar, dideteksi sebagai kaleng hancur.

Deteksi masing-masing properti membawa kompleksitas waktu dan ruang yang sangat berbeda, dan untuk setiap pendekatan, pengaliran cepat http://dsp.stackexchange.com lebih masuk akal untuk menentukan algoritma yang paling tepat dan paling efisien untuk tujuan Anda. Maksud saya di sini adalah, murni dan sederhana, untuk menekankan hal itu mendeteksi apakah ada sesuatu yang dapat dengan membatalkan sebagian kecil ruang deteksi kandidat bukan solusi yang paling kuat atau efektif untuk masalah ini, dan idealnya, Anda harus mengambil tindakan yang sesuai.

Dan hei, selamat posting Berita Hacker! Secara keseluruhan, ini adalah pertanyaan yang sangat bagus layak publisitas yang diterimanya. :)


41
2018-04-22 22:56



Melihat bentuknya

Lihatlah bentuk merah dari kaleng / botol. Perhatikan bagaimana kaleng itu bisa sedikit meredup di bagian paling atas sedangkan label botolnya lurus. Anda dapat membedakan keduanya dengan membandingkan lebar bagian merah di sepanjang itu.

Melihat sorotan

Salah satu cara membedakan botol dan kaleng adalah bahannya. Sebuah botol terbuat dari plastik sedangkan kaleng terbuat dari logam aluminium. Dalam situasi yang cukup terang, melihat specularity akan menjadi salah satu cara untuk memberi tahu label botol dari label kaleng.

Sejauh yang saya tahu, begitulah cara manusia membedakan perbedaan kedua jenis label itu. Jika kondisi pencahayaan buruk, pasti ada beberapa ketidakpastian dalam membedakan keduanya. Dalam hal ini, Anda harus dapat mendeteksi keberadaan botol transparan / transparan itu sendiri.


35
2018-04-16 08:31



Silakan lihat di Zdenek Kalal Pelacak predator. Ini membutuhkan beberapa pelatihan, tetapi dapat secara aktif mempelajari bagaimana objek yang dilacak melihat orientasi dan skala yang berbeda dan melakukannya secara realtime!

Kode sumber tersedia di situsnya. Ini masuk MATLAB, tapi mungkin ada implementasi Java yang sudah dilakukan oleh anggota komunitas. Saya telah berhasil menerapkan kembali bagian pelacak TLD di C #. Jika saya ingat dengan benar, TLD menggunakan Ferns sebagai detektor keypoint. Saya menggunakan baik SURF atau SIFT sebagai gantinya (sudah disarankan oleh @stacker) untuk mendapatkan kembali objek jika itu hilang oleh pelacak. Umpan balik pelacak memudahkan pembuatan dengan waktu daftar dinamis dari template sift / surf yang dengan waktu memungkinkan reacquiring objek dengan presisi yang sangat tinggi.

Jika Anda tertarik dengan implementasi C # pelacak, jangan ragu untuk bertanya.


31
2018-04-17 20:56



Jika Anda tidak terbatas hanya pada kamera yang tidak berada dalam salah satu kendala Anda, barangkali Anda dapat berpindah menggunakan sensor jangkauan seperti Xbox Kinect. Dengan ini Anda dapat melakukan kedalaman dan warna berdasarkan segmentasi yang cocok dari gambar. Ini memungkinkan pemisahan objek lebih cepat dalam gambar. Anda kemudian dapat menggunakan pencocokan ICP atau teknik serupa untuk bahkan mencocokkan bentuk kaleng daripada hanya garis atau warnanya dan mengingat bahwa itu adalah silinder ini mungkin menjadi pilihan yang valid untuk orientasi apapun jika Anda memiliki pemindaian 3D sebelumnya dari target. Teknik-teknik ini seringkali cukup cepat terutama ketika digunakan untuk tujuan tertentu yang harus menyelesaikan masalah kecepatan Anda.

Juga saya bisa menyarankan, tidak harus untuk akurasi atau kecepatan tetapi untuk bersenang-senang Anda bisa menggunakan jaringan saraf yang terlatih pada gambar rona hue Anda untuk mengidentifikasi bentuk kaleng. Ini sangat cepat dan sering dapat mencapai hingga 80/90% akurat. Pelatihan akan menjadi sedikit proses yang panjang meskipun karena Anda harus secara manual mengidentifikasi kaleng di setiap gambar.


25
2018-04-16 04:54