Salah satu proyek paling menarik yang saya kerjakan dalam beberapa tahun terakhir adalah proyek tentang pemrosesan gambar . Tujuannya adalah untuk mengembangkan sistem agar dapat mengenali 'kaleng' Coca-Cola (perhatikan bahwa saya menekankan kata 'kaleng', Anda akan mengerti mengapa dalam satu menit). Anda dapat melihat sampel di bawah ini, dengan dapat dikenali dalam persegi panjang hijau dengan skala dan rotasi.
Beberapa kendala pada proyek:
- Latar belakang bisa sangat bising.
- Can dapat memiliki skala atau rotasi atau bahkan orientasi apa pun (dalam batas yang wajar).
- Gambar dapat memiliki beberapa tingkat ketidakjelasan (kontur mungkin tidak sepenuhnya lurus).
- Mungkin ada botol Coca-Cola di gambar, dan algoritme seharusnya hanya mendeteksi kaleng !
- Kecerahan gambar bisa sangat bervariasi (sehingga Anda tidak bisa mengandalkan "terlalu banyak" pada deteksi warna).
- The kaleng bisa sebagian tersembunyi di sisi atau tengah dan mungkin sebagian tersembunyi di balik botol.
- Mungkin tidak ada yang bisa sama sekali dalam gambar, dalam hal ini Anda harus menemukan apa-apa dan menulis pesan yang mengatakannya.
Jadi Anda bisa berakhir dengan hal-hal rumit seperti ini (yang dalam hal ini algoritme saya benar-benar gagal):
Saya melakukan proyek ini beberapa waktu lalu, dan sangat senang melakukannya, dan saya memiliki implementasi yang layak. Berikut ini beberapa detail tentang implementasi saya:
Bahasa : Dilakukan dalam C ++ menggunakan pustaka OpenCV .
Pra-pemrosesan : Untuk pra-pemrosesan gambar, yaitu mengubah gambar menjadi bentuk yang lebih mentah untuk diberikan kepada algoritma, saya menggunakan 2 metode:
- Mengubah domain warna dari RGB ke HSV dan menyaring berdasarkan rona "merah", saturasi di atas ambang batas tertentu untuk menghindari warna seperti oranye, dan penyaringan bernilai rendah untuk menghindari nada gelap. Hasil akhirnya adalah gambar hitam 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.
- Pemfilteran noise menggunakan pemfilteran median (mengambil nilai piksel median dari semua tetangga dan mengganti piksel dengan nilai ini) untuk mengurangi noise.
- Menggunakan Canny Edge Detection Filter untuk mendapatkan kontur semua item setelah 2 langkah sebelumnya.
Algoritma : Algoritma itu sendiri yang saya pilih untuk tugas ini diambil dari buku yang luar biasa ini tentang ekstraksi fitur dan disebut Generalized Hough Transform (sangat berbeda dari Hough Transform biasa). Pada dasarnya dikatakan beberapa hal:
- Anda dapat mendeskripsikan objek di ruang tanpa mengetahui persamaan analitisnya (yang terjadi 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.
- Ia menggunakan model dasar (templat) yang akan "dipelajari" algoritma.
- Setiap piksel yang tersisa dalam gambar kontur akan memilih piksel lain yang konon akan menjadi pusat (dalam hal gravitasi) objek Anda, berdasarkan apa yang dipelajari dari model.
Pada akhirnya, Anda berakhir dengan peta panas suara, misalnya di sini semua piksel kontur kaleng akan memilih untuk pusat gravitasinya, sehingga Anda akan memiliki banyak suara dalam piksel yang sama sesuai dengan pusat, dan akan melihat puncak di peta panas seperti di bawah ini:
Setelah Anda memilikinya, heuristik berbasis ambang batas sederhana dapat memberi Anda lokasi piksel tengah, dari mana Anda dapat memperoleh skala dan rotasi dan kemudian plot 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 bekerja dalam kasus-kasus dasar, itu sangat kurang di beberapa bidang:
- Ini sangat lambat ! Saya tidak cukup menekankan hal ini. Hampir satu hari penuh diperlukan untuk memproses 30 gambar uji, jelas karena saya memiliki faktor penskalaan yang sangat tinggi untuk rotasi dan terjemahan, karena beberapa kaleng sangat kecil.
- Itu benar-benar hilang ketika botol ada dalam gambar, dan untuk beberapa alasan hampir selalu menemukan botol alih-alih kaleng (mungkin karena botol lebih besar, sehingga memiliki lebih banyak piksel, sehingga lebih banyak suara)
- Gambar fuzzy juga tidak bagus, karena suara berakhir dalam 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.
Dapatkah Anda membantu saya meningkatkan algoritma spesifik saya , menggunakan fitur OpenCV eksklusif , untuk menyelesaikan empat masalah spesifik yang disebutkan?
Saya harap beberapa orang juga akan belajar sesuatu dari itu, setelah semua saya pikir tidak hanya orang yang bertanya harus belajar. :)
sumber
Jawaban:
Pendekatan alternatif adalah mengekstraksi fitur (keypoint) menggunakan transformasi fitur invarian skala (SIFT) atau Fitur Mempercepat Kuat (SURF).
Ini diimplementasikan dalam OpenCV 2.3.1.
Anda dapat menemukan contoh kode yang bagus menggunakan fitur di Features2D + Homografi untuk menemukan objek yang dikenal
Kedua algoritme tersebut tidak berbeda dengan penskalaan dan rotasi. Karena mereka bekerja dengan fitur, Anda juga dapat menangani oklusi (selama cukup banyak penekanan tombol yang terlihat).
Sumber gambar: contoh tutorial
Pemrosesan membutuhkan beberapa ratus ms untuk SIFT, SURF sedikit lebih cepat, tetapi tidak cocok untuk aplikasi waktu nyata. ORB menggunakan FAST yang lebih lemah terkait invarian rotasi.
Koran-koran asli
sumber
Untuk mempercepat, saya akan mengambil keuntungan dari fakta bahwa Anda tidak diminta untuk menemukan gambar / objek yang berubah-ubah, tetapi secara khusus menggunakan logo Coca-Cola. Ini penting karena logo ini sangat khas, dan harus memiliki karakteristik, tanda-skala invarian dalam domain frekuensi, khususnya di saluran merah RGB. Dengan kata lain, pola bolak-balik antara merah-ke-putih-ke-merah yang ditemui oleh garis pemindaian horizontal (dilatih pada logo yang selaras secara horizontal) akan memiliki "ritme" yang khas saat melewati poros tengah logo. Ritme itu akan "mempercepat" atau "memperlambat" pada skala dan orientasi yang berbeda, tetapi akan tetap setara secara proporsional. Anda dapat mengidentifikasi / menetapkan beberapa lusin scanlines tersebut, baik secara horizontal dan vertikal melalui logo dan beberapa lagi secara diagonal, dalam pola starburst. Sebut ini "garis pindai tanda tangan."
Mencari tanda tangan ini di gambar target adalah masalah sederhana memindai gambar dalam strip horizontal. Carilah frekuensi tinggi di saluran merah (yang mengindikasikan bergerak dari daerah merah ke yang putih), dan sekali ditemukan, lihat apakah itu diikuti oleh salah satu ritme frekuensi yang diidentifikasi dalam sesi pelatihan. Setelah kecocokan ditemukan, Anda akan langsung mengetahui orientasi garis pindai dan lokasi di logo (jika Anda melacak hal-hal itu selama pelatihan), jadi mengidentifikasi batas-batas logo dari sana sepele.
Saya akan terkejut jika ini bukan algoritma linear-efisien, atau hampir jadi. Ini jelas tidak membahas diskriminasi botol kaleng Anda, tetapi setidaknya Anda akan memiliki logo Anda.
(Pembaruan: untuk pengenalan botol, saya akan mencari kokas (cairan coklat) yang berdekatan dengan logo - yaitu di dalam botol. Atau, dalam kasus botol kosong, saya akan mencari tutup yang selalu memiliki bentuk dasar yang sama, ukuran, dan jarak dari logo dan biasanya akan semua putih atau merah. Mencari bentuk elips warna solid di mana topi harus , relatif terhadap logo. Tidak mudah tentu saja, tetapi tujuan Anda di sini adalah untuk menemukan mudah yang cepat .)
(Sudah beberapa tahun sejak hari pemrosesan gambar saya, jadi saya menyimpan saran ini tingkat tinggi dan konseptual. Saya pikir ini mungkin sedikit mendekati bagaimana mata manusia dapat beroperasi - atau setidaknya bagaimana otak saya!)
sumber
Masalah yang menyenangkan: ketika saya melirik gambar botol Anda, saya pikir itu juga bisa. Tapi, sebagai manusia, apa yang saya lakukan untuk mengatakan perbedaannya adalah saya kemudian memperhatikan bahwa itu juga sebuah botol ...
Jadi, untuk membedakan kaleng dan botol, bagaimana kalau hanya memindai botol dulu? Jika Anda menemukannya, tutup label sebelum mencari kaleng.
Tidak terlalu sulit untuk diterapkan jika Anda sudah melakukan kaleng. Kelemahan sebenarnya adalah dua kali lipat waktu pemrosesan Anda. (Tapi berpikir ke depan untuk aplikasi dunia nyata, Anda akhirnya ingin melakukan botol ;-)
sumber
Bukankah sulit bagi manusia untuk membedakan antara botol dan kaleng pada gambar kedua (asalkan wilayah transparan botol disembunyikan)?
Mereka hampir sama kecuali untuk wilayah yang sangat kecil (yaitu, lebar di bagian atas kaleng agak kecil sementara pembungkus botol memiliki lebar yang sama di seluruh, tetapi perubahan kecil kan?)
Hal pertama yang terlintas di benak saya adalah memeriksa botol merah. Tapi itu masih menjadi masalah, jika tidak ada tutup botol, atau jika sebagian tersembunyi (seperti yang disebutkan di atas).
Hal kedua yang saya pikirkan adalah tentang transparansi botol. OpenCV memiliki beberapa karya untuk menemukan objek transparan dalam gambar. Periksa tautan di bawah ini.
Notulen Rapat OpenCV 2012-03-19
Notulen Rapat OpenCV Catatan Menit 2012-02-28
Terutama lihat ini untuk melihat seberapa akurat mereka mendeteksi kaca:
Lihat hasil implementasi mereka:
Mereka mengatakan itu adalah implementasi dari makalah "Kerangka Kerja 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 transparan botol pertama atau untuk wilayah merah yang terhubung ke dua benda transparan lateral yang jelas botol. (Saat bekerja idealnya, gambar sebagai berikut.)
Sekarang Anda dapat menghapus wilayah kuning, yaitu label botol dan menjalankan algoritma Anda untuk menemukan kaleng.
Lagi pula, solusi ini juga memiliki masalah yang berbeda seperti pada solusi lainnya.
Tapi bagaimanapun, jika tidak ada masalah di atas dalam gambar, ini tampaknya menjadi cara yang lebih baik.
sumber
Saya sangat suka jawaban Darren Cook dan stacker untuk masalah ini. Saya berada di tengah-tengah melemparkan pikiran saya ke dalam komentar tentang itu, tetapi saya percaya pendekatan saya terlalu berbentuk jawaban untuk tidak pergi dari sini.
Singkatnya, Anda telah mengidentifikasi algoritma untuk menentukan bahwa logo Coca-Cola hadir di lokasi tertentu di luar angkasa. Anda sekarang mencoba untuk menentukan, untuk orientasi sewenang-wenang dan faktor skala sewenang-wenang, yang cocok heuristik untuk membedakan Coca-Cola kaleng dari benda-benda lain, termasuk: botol , billboard , iklan , dan Coca-Cola perlengkapan semua yang berhubungan dengan logo ikonik ini. Anda tidak menyebut banyak dari kasus-kasus tambahan ini dalam pernyataan masalah Anda, tetapi saya merasa mereka penting untuk keberhasilan algoritma Anda.
Rahasianya di sini adalah menentukan fitur visual apa yang bisa berisi atau, melalui ruang negatif, fitur apa yang ada untuk produk Coke lain yang tidak ada untuk kaleng. Untuk itu, jawaban teratas saat ini menggambarkan pendekatan dasar untuk memilih "bisa" jika dan hanya jika "botol" tidak teridentifikasi, baik dengan adanya tutup botol, cairan, atau heuristik visual serupa lainnya.
Masalahnya adalah ini rusak. Sebuah botol bisa, misalnya, kosong dan tidak memiliki tutup, yang mengarah ke positif palsu. Atau, itu bisa berupa botol parsial dengan fitur tambahan hancur, mengarah lagi ke deteksi palsu. Tidak perlu dikatakan, ini tidak elegan, juga tidak efektif untuk tujuan kita.
Untuk tujuan ini, kriteria pemilihan kaleng yang paling benar adalah sebagai berikut:
Klasifikasi Anda kemudian akan terlihat seperti berikut:
Ini secara visual menyoroti kepada pengguna apa yang terdeteksi, menekankan kelemahan positif yang mungkin, dengan benar, dideteksi sebagai kaleng hancur.
Deteksi setiap properti membawa kompleksitas waktu dan ruang yang sangat berbeda, dan untuk setiap pendekatan, akses cepat ke http://dsp.stackexchange.com lebih dari cukup untuk menentukan algoritma yang paling benar dan paling efisien untuk keperluan Anda. Maksud saya di sini adalah, murni dan sederhana, untuk menekankan bahwa mendeteksi jika sesuatu adalah suatu kaleng dengan membatalkan sebagian kecil dari ruang deteksi kandidat bukanlah solusi yang paling kuat atau efektif untuk masalah ini, dan idealnya, Anda harus mengambil tindakan yang sesuai demikian.
Dan hei, selamat atas posting Hacker News! Secara keseluruhan, ini adalah pertanyaan yang cukup hebat layak publisitas yang diterimanya. :)
sumber
Melihat bentuk
Ambil melihat bentuk bagian merah kaleng / botol. Perhatikan bagaimana kaleng meruncing sedikit di bagian paling atas sedangkan label botol lurus. Anda dapat membedakan antara keduanya dengan membandingkan lebar bagian merah di sepanjang itu.
Melihat highlight
Salah satu cara untuk membedakan antara botol dan kaleng adalah bahannya. Botol terbuat dari plastik sedangkan kaleng terbuat dari logam aluminium. Dalam situasi yang cukup terang, melihat specularity akan menjadi salah satu cara untuk mengatakan label botol dari label kaleng.
Sejauh yang saya tahu, itulah cara manusia membedakan perbedaan antara dua jenis label. Jika kondisi pencahayaan buruk, pasti ada ketidakpastian dalam membedakan keduanya. Dalam hal ini, Anda harus dapat mendeteksi keberadaan botol transparan / bening itu sendiri.
sumber
Silakan lihat pelacak Predator Zdenek Kalal . Ini membutuhkan beberapa pelatihan, tetapi dapat secara aktif mempelajari bagaimana objek yang dilacak melihat berbagai orientasi dan skala dan melakukannya secara realtime!
Kode sumber tersedia di situsnya. Itu ada di MATLAB , tapi mungkin ada implementasi Java yang sudah dilakukan oleh anggota komunitas. Saya telah berhasil mengimplementasikan kembali bagian pelacak TLD di C #. Jika saya ingat dengan benar, TLD menggunakan Ferns sebagai pendeteksi titik kunci. Saya menggunakan SURF atau SIFT sebagai gantinya (sudah disarankan oleh @stacker) untuk mendapatkan kembali objek jika hilang oleh pelacak. Umpan balik pelacak membuatnya mudah dibuat dengan waktu daftar dinamis dari template pengayakan / penelusuran yang dengan waktu memungkinkan untuk mendapatkan kembali objek dengan presisi sangat tinggi.
Jika Anda tertarik dengan implementasi C # saya dari pelacak, jangan ragu untuk bertanya.
sumber
Jika Anda tidak terbatas hanya pada kamera yang tidak berada di salah satu kendala Anda, mungkin Anda dapat beralih menggunakan sensor rentang seperti Xbox Kinect . Dengan ini, Anda dapat melakukan segmentasi yang cocok berdasarkan kedalaman dan warna gambar. Ini memungkinkan pemisahan objek yang lebih cepat dalam gambar. Anda kemudian dapat menggunakan pencocokan ICP atau teknik serupa bahkan untuk mencocokkan bentuk kaleng daripada hanya garis atau warna dan mengingat bahwa itu silinder, ini mungkin merupakan opsi yang valid untuk orientasi apa pun jika Anda memiliki pemindaian 3D target sebelumnya. Teknik-teknik ini seringkali cukup cepat terutama ketika digunakan untuk tujuan tertentu yang harus menyelesaikan masalah kecepatan Anda.
Saya juga bisa menyarankan, tidak harus untuk akurasi atau kecepatan tetapi untuk bersenang-senang Anda bisa menggunakan jaringan saraf terlatih pada gambar tersegmentasi rona Anda untuk mengidentifikasi bentuk kaleng. Ini sangat cepat dan seringkali bisa akurat hingga 80/90%. Pelatihan akan menjadi sedikit proses yang panjang karena Anda harus mengidentifikasi kaleng di setiap gambar secara manual.
sumber
Saya akan mendeteksi persegi panjang merah: RGB -> HSV, filter merah -> gambar biner, tutup (melebarkan lalu mengikis, dikenal sebagai
imclose
di matlab)Kemudian lihat melalui persegi panjang dari terbesar ke terkecil. Persegi panjang yang memiliki persegi panjang yang lebih kecil dalam posisi / skala yang diketahui dapat dihilangkan (dengan asumsi proporsi botol konstan, persegi panjang yang lebih kecil akan menjadi tutup botol).
Ini akan meninggalkan Anda dengan persegi panjang merah, maka Anda harus entah bagaimana mendeteksi logo untuk mengetahui apakah mereka persegi panjang merah atau kaleng kokas. Suka OCR, tetapi dengan logo yang dikenal?
sumber
Ini mungkin ide yang sangat naif (atau mungkin tidak bekerja sama sekali), tetapi dimensi semua kaleng kokas sudah diperbaiki. Jadi mungkin jika gambar yang sama berisi kaleng dan botol maka Anda dapat membedakannya berdasarkan pertimbangan ukuran (botol akan menjadi lebih besar). Sekarang karena kedalaman yang tidak ada (mis. Pemetaan 3D ke pemetaan 2D), kemungkinan botolnya terlihat menyusut dan tidak ada perbedaan ukuran. Anda dapat memulihkan beberapa informasi mendalam menggunakan pencitraan stereo dan kemudian memulihkan ukuran aslinya.
sumber
Hmm, saya benar-benar berpikir saya ke sesuatu (ini seperti pertanyaan paling menarik yang pernah - jadi akan memalukan untuk tidak terus mencoba menemukan jawaban "sempurna", meskipun yang dapat diterima telah ditemukan) .. .
Setelah Anda menemukan logo, masalah Anda setengah selesai. Maka Anda hanya perlu mencari tahu perbedaan antara apa yang ada di sekitar logo. Selain itu, kami ingin melakukan sesedikit mungkin. Saya pikir ini sebenarnya bagian yang mudah ini ...
Apa yang ada di sekitar logo? Untuk kaleng, kita bisa melihat logam, yang terlepas dari efek pencahayaan, tidak berubah apa pun dalam warna dasarnya. Selama kita tahu sudut labelnya, kita bisa tahu apa yang langsung di atasnya, jadi kita melihat perbedaannya:
Di sini, apa yang di atas dan di bawah logo sepenuhnya gelap, warnanya konsisten. Relatif mudah dalam hal itu.
Di sini, apa yang di atas dan di bawah ini ringan, tetapi tetap konsisten dalam warna. Ini semua-perak, dan semua-perak logam tampaknya cukup langka, serta warna perak pada umumnya. Selain itu, ia berada dalam celah tipis dan cukup dekat dengan merah yang telah diidentifikasi sehingga Anda dapat melacak bentuknya untuk seluruh panjangnya untuk menghitung persentase dari apa yang dapat dianggap sebagai cincin logam kaleng. Sungguh, Anda hanya perlu sebagian kecil dari itu di mana saja di sepanjang kaleng untuk mengatakan itu adalah bagian dari itu, tetapi Anda masih perlu menemukan keseimbangan yang memastikan itu bukan hanya botol kosong dengan sesuatu logam di belakangnya.
Dan akhirnya, yang rumit. Tapi tidak terlalu rumit, setelah kita hanya pergi dengan apa yang bisa kita lihat langsung di atas (dan di bawah) pembungkus merah. Ini transparan, yang berarti akan menunjukkan apa pun yang ada di belakangnya. Itu bagus, karena benda-benda yang ada di belakangnya tidak mungkin memiliki warna yang sama konsistennya dengan logam bundar perak kaleng. Mungkin ada banyak hal berbeda di belakangnya, yang akan memberi tahu kita bahwa itu adalah botol kosong (atau diisi dengan cairan bening), atau warna yang konsisten, yang dapat berarti bahwa itu diisi dengan cairan atau bahwa botol itu hanya di depan sebuah warna solid. Kami bekerja dengan apa yang paling dekat dengan bagian atas dan bawah, dan kemungkinan warna yang tepat berada di tempat yang tepat relatif ramping. Kita tahu itu botol, karena tidak punya elemen visual kunci kaleng,
(yang terakhir adalah yang terbaik yang dapat saya temukan dari botol coca cola kosong yang besar - yang menarik tutup DAN cincin berwarna kuning, menunjukkan bahwa kemerahan tutup mungkin tidak boleh diandalkan)
Dalam keadaan langka di mana warna perak yang sama ada di belakang botol, bahkan setelah abstraksi plastik, atau botol entah bagaimana diisi dengan warna cairan perak yang sama, kita dapat kembali pada apa yang secara kasar dapat kita perkirakan sebagai bentuk perak - yang seperti yang saya sebutkan, berbentuk lingkaran dan mengikuti bentuk kaleng. Tetapi meskipun saya tidak memiliki pengetahuan tertentu dalam pemrosesan gambar, itu terdengar lambat. Lebih baik lagi, mengapa tidak menyimpulkan ini dengan sekali memeriksa di sekitar sisi logo untuk memastikan tidak ada warna perak yang sama di sana? Ah, tapi bagaimana jika ada warna perak yang sama di belakang kaleng? Kemudian, kita memang harus lebih memperhatikan bentuk, melihat bagian atas dan bawah kaleng lagi.
Tergantung pada bagaimana sempurna semua ini perlu, itu bisa sangat lambat, tapi saya kira konsep dasar saya adalah untuk memeriksa hal-hal termudah dan terdekat terlebih dahulu. Pergi dengan perbedaan warna di sekitar bentuk yang sudah cocok (yang tampaknya bagian paling sepele dari ini sih) sebelum pergi ke upaya mengusahakan bentuk elemen lainnya. Untuk daftar itu, begini:
Jika Anda tidak dapat melakukan ini, itu mungkin berarti bagian atas dan bawah kaleng tertutup, dan satu-satunya hal yang mungkin bisa digunakan manusia untuk membuat perbedaan antara kaleng dan botol adalah oklusi dan refleksi. dari kaleng, yang akan menjadi pertempuran yang jauh lebih sulit untuk diproses. Namun, untuk melangkah lebih jauh, Anda bisa mengikuti sudut kaleng / botol untuk memeriksa lebih banyak sifat seperti botol, menggunakan teknik pemindaian semi-transparan yang disebutkan dalam jawaban lain.
Mimpi buruk tambahan yang menarik mungkin termasuk kaleng yang dengan nyaman duduk di belakang botol pada jarak tertentu sehingga logam itu kebetulan muncul di atas dan di bawah label, yang masih akan gagal selama Anda memindai sepanjang merah. label - yang sebenarnya lebih merupakan masalah karena Anda tidak mendeteksi kaleng di mana Anda bisa, dibandingkan dengan mempertimbangkan bahwa Anda sebenarnya mendeteksi botol, termasuk kaleng secara tidak sengaja. Gelasnya setengah kosong, dalam hal ini!
Sebagai penafian, saya tidak memiliki pengalaman dalam atau tidak pernah berpikir tentang pemrosesan gambar di luar pertanyaan ini, tetapi sangat menarik sehingga membuat saya berpikir cukup mendalam tentang hal itu, dan setelah membaca semua jawaban lain, saya menganggap ini mungkin cara termudah dan paling efisien untuk menyelesaikannya. Secara pribadi, saya senang saya tidak benar - benar harus memikirkan pemrograman ini!
EDIT
Selain itu, lihat gambar yang saya lakukan di MS Paint ... Ini benar-benar mengerikan dan tidak lengkap, tetapi berdasarkan bentuk dan warna saja, Anda dapat menebak apa yang mungkin terjadi. Pada dasarnya, ini adalah satu-satunya hal yang perlu diganggu oleh pemindaian. Ketika Anda melihat bentuk yang sangat khas dan kombinasi warna yang begitu dekat, apa lagi yang mungkin terjadi? Bit yang saya tidak lukis, latar belakang putih, harus dianggap "sesuatu yang tidak konsisten". Jika latar belakangnya transparan, gambar itu bisa menembus hampir semua gambar lain dan Anda masih bisa melihatnya.
sumber
Saya tidak mengetahui OpenCV tetapi melihat masalah secara logis saya pikir Anda dapat membedakan antara botol dan dapat dengan mengubah gambar yang Anda cari yaitu Coca Cola. Anda harus memasukkan sampai bagian atas kaleng karena jika ada lapisan perak di atas coca cola dan dalam kasus botol tidak akan ada lapisan perak tersebut.
Tetapi jelas algoritma ini akan gagal dalam kasus-kasus di mana tutup kaleng disembunyikan, tetapi dalam kasus seperti itu bahkan manusia tidak akan dapat membedakan antara keduanya (jika hanya bagian botol coca cola / kaleng yang terlihat)
sumber
Saya suka tantangan dan ingin memberikan jawaban, yang memecahkan masalah, saya pikir.
Deteksi topi adalah masalah lain. Ini bisa rumit atau sederhana. Jika saya jadi Anda, saya hanya akan memeriksa histogram warna di ROI untuk keputusan sederhana.
Tolong, berikan umpan balik jika saya salah. Terima kasih.
sumber
Saya terlambat beberapa tahun dalam menjawab pertanyaan ini. Dengan keadaan mutakhir yang didorong oleh CNN dalam 5 tahun terakhir saya tidak akan menggunakan OpenCV untuk melakukan tugas ini sekarang! ( Saya tahu Anda secara khusus menginginkan fitur OpenCv dalam pertanyaan ) Saya merasakan algoritma deteksi objek seperti Faster-RCNNs, YOLO, SSD dll. Akan memecahkan masalah ini dengan margin yang signifikan dibandingkan dengan fitur OpenCV. Jika saya menangani masalah ini sekarang (setelah 6 tahun !!) Saya pasti akan menggunakan Faster-RCNN .
sumber
Saya suka pertanyaan Anda, terlepas dari apakah itu di luar topik atau tidak: P
Selain yang menarik; Saya baru saja menyelesaikan subjek di tingkat saya di mana kami membahas robotika dan visi komputer. Proyek kami untuk semester ini sangat mirip dengan yang Anda gambarkan.
Kami harus mengembangkan robot yang menggunakan Xbox Kinect untuk mendeteksi botol dan kaleng kokas dengan orientasi apa pun dalam berbagai kondisi pencahayaan dan lingkungan. Solusi kami melibatkan penggunaan band pass filter pada saluran Hue dalam kombinasi dengan transformasi hough circle. Kami dapat sedikit membatasi lingkungan (kami dapat memilih di mana dan bagaimana menempatkan robot dan sensor Kinect), jika tidak, kami akan menggunakan transformasi SIFT atau SURF.
Anda dapat membaca tentang pendekatan kami pada posting blog saya tentang topik :)
sumber
Ada banyak deskriptor warna yang digunakan untuk mengenali objek, makalah di bawah ini membandingkan banyak dari mereka. Mereka sangat kuat ketika dikombinasikan dengan SIFT atau SURF. SURF atau SIFT saja tidak terlalu berguna dalam gambar coca cola karena mereka tidak mengenali banyak poin minat, Anda memerlukan informasi warna untuk membantu. Saya menggunakan BIC (Klasifikasi Border / Interior Pixel) dengan SURF dalam sebuah proyek dan bekerja sangat baik untuk mengenali objek.
Deskriptor warna untuk pengambilan gambar Web: studi banding
sumber
Pembelajaran yang mendalam
Kumpulkan setidaknya beberapa ratus gambar yang berisi kaleng cola, beri catatan kotak pembatas di sekitar mereka sebagai kelas positif, termasuk botol cola dan produk cola lainnya label kelas negatif serta objek acak.
Kecuali Anda mengumpulkan dataset yang sangat besar, lakukan trik menggunakan fitur pembelajaran mendalam untuk dataset kecil. Idealnya menggunakan kombinasi Support Vector Machines (SVM) dengan jaring saraf yang dalam.
Setelah Anda memasukkan gambar ke model pembelajaran mendalam yang sebelumnya telah dilatih (misalnya GoogleNet), alih-alih menggunakan lapisan keputusan (akhir) jaringan saraf untuk melakukan klasifikasi, gunakan data lapisan sebelumnya sebagai fitur untuk melatih pengklasifikasi Anda.
OpenCV dan Google Net: http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html
OpenCV dan SVM: http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
sumber
Anda memerlukan program yang mempelajari dan meningkatkan akurasi klasifikasi secara organik dari pengalaman.
Saya akan menyarankan pembelajaran mendalam, dengan pembelajaran mendalam ini menjadi masalah sepele.
Anda dapat melatih kembali model awal v3 di Tensorflow:
Cara Melatih Kembali Lapisan Akhir Inception untuk Kategori Baru .
Dalam hal ini, Anda akan melatih jaringan saraf convolutional untuk mengklasifikasikan objek sebagai coca cola dapat atau tidak.
sumber
Sebagai alternatif dari semua solusi bagus ini, Anda dapat melatih classifier Anda sendiri dan menjadikan aplikasi Anda tangguh terhadap kesalahan. Sebagai contoh, Anda dapat menggunakan Pelatihan Haar , memberikan sejumlah gambar positif dan negatif yang baik dari target Anda.
Dapat bermanfaat untuk mengekstrak hanya kaleng dan dapat dikombinasikan dengan deteksi objek transparan.
sumber
Ada paket visi komputer yang disebut HALCON dari MVTec yang demo bisa memberikan ide-ide algoritma yang baik. Ada banyak contoh yang mirip dengan masalah Anda yang bisa Anda jalankan dalam mode demo dan kemudian lihat operator dalam kode dan lihat bagaimana menerapkannya dari operator OpenCV yang ada.
Saya telah menggunakan paket ini untuk dengan cepat membuat prototipe algoritma kompleks untuk masalah seperti ini dan kemudian menemukan cara mengimplementasikannya menggunakan fitur OpenCV yang ada. Khususnya untuk kasus Anda, Anda dapat mencoba menerapkan di OpenCV fungsionalitas yang tertanam dalam operator find_scaled_shape_model . Beberapa operator menunjuk ke makalah ilmiah tentang implementasi algoritma yang dapat membantu untuk mengetahui bagaimana melakukan sesuatu yang serupa di OpenCV. Semoga ini membantu...
sumber
Jika Anda tertarik untuk menjadi realtime, maka yang Anda butuhkan adalah menambahkan filter pra-pemrosesan untuk menentukan apa yang akan dipindai dengan tugas berat. Filter pra-pemrosesan yang sangat cepat, sangat real-time, yang memungkinkan Anda memindai hal-hal yang lebih mungkin menjadi kaleng coca-cola daripada sebelum beralih ke hal-hal yang lebih rapuh adalah sesuatu seperti ini: cari gambar untuk patch terbesar warna yang toleransi tertentu jauh dari
sqrt(pow(red,2) + pow(blue,2) + pow(green,2))
kaleng coca-cola Anda. Mulailah dengan toleransi warna yang sangat ketat, dan turunkan hingga toleransi warna yang lebih lunak. Kemudian, ketika robot Anda kehabisan waktu yang ditentukan untuk memproses bingkai saat ini, ia menggunakan botol yang ditemukan saat ini untuk keperluan Anda. Harap dicatat bahwa Anda harus mengubah warna RGBsqrt(pow(red,2) + pow(blue,2) + pow(green,2))
untuk mendapatkannya dengan benar.Juga, ini akan tampak sangat bodoh, tetapi apakah Anda memastikan untuk mengaktifkan
-oFast
optimisasi kompiler ketika Anda mengkompilasi kode C Anda?sumber
Mungkin terlambat bertahun-tahun, tetapi toh teori untuk dicoba.
Rasio pembatas persegi panjang wilayah logo merah dengan dimensi keseluruhan botol / kaleng berbeda. Dalam kasus Can, harus 1: 1, sedangkan akan berbeda dalam botol (dengan atau tanpa tutup). Ini harus membuatnya mudah untuk membedakan keduanya.
Pembaruan: Lengkungan horizontal dari wilayah logo akan berbeda antara Can dan Bottle karena perbedaan ukuran masing-masing. Ini bisa berguna secara khusus jika robot Anda perlu mengambil kaleng / botol, dan Anda memutuskan pegangan yang sesuai.
sumber
Hal pertama yang akan saya cari adalah warna - seperti RED, ketika melakukan deteksi mata Merah dalam gambar - ada rentang warna tertentu untuk dideteksi, beberapa karakteristik tentang hal itu mempertimbangkan area sekitarnya dan seperti jarak terpisah dari mata lain jika memang terlihat dalam gambar.
1: Karakteristik pertama adalah warna dan Merah sangat dominan. Setelah mendeteksi Coca Cola Red ada beberapa item menarik 1A: Seberapa besar area merah ini (apakah itu jumlah yang cukup untuk membuat penentuan kaleng benar atau tidak - 10 piksel mungkin tidak cukup), 1B: Apakah mengandung warna Label - "Coca-Cola" atau gelombang. 1B1: Apakah ada cukup untuk mempertimbangkan probabilitas tinggi bahwa itu adalah label.
Item 1 adalah jenis jalan pintas - pra-proses jika ingus itu ada di gambar - lanjutkan.
Jadi jika itu yang terjadi maka saya dapat memanfaatkan segmen gambar saya dan mulai mencari lebih banyak zoom keluar dari area yang dimaksud sedikit - pada dasarnya melihat wilayah sekitarnya / tepi ...
2: Diberikan ID area gambar di atas dalam 1 - verifikasi titik-titik [tepi] sekitarnya dari item yang dimaksud. A: Apakah ada apa yang tampak sebagai kaleng atas atau bawah - perak? B: Sebuah botol mungkin terlihat transparan, tetapi mungkin sebuah meja kaca - jadi apakah ada meja kaca / rak atau area transparan - jika demikian ada beberapa kemungkinan yang keluar. Botol MUNGKIN memiliki topi merah, mungkin tidak, tetapi harus berbentuk sekrup atas / ulir botol, atau tutup. C: Bahkan jika ini gagal A dan B masih bisa menjadi parsial-can .. Ini lebih kompleks ketika parsial karena botol parsial / parsial mungkin terlihat sama, sehingga lebih banyak pemrosesan pengukuran tepi wilayah Merah ke tepi .. botol kecil mungkin memiliki ukuran yang serupa ..
3: Setelah analisis di atas, ketika saya akan melihat huruf dan logo wave - karena saya dapat mengarahkan pencarian saya untuk beberapa huruf dalam kata-kata Karena Anda mungkin tidak memiliki semua teks karena tidak memiliki semua bisa, gelombang akan menyelaraskan pada titik-titik tertentu dengan teks (jarak bijaksana) sehingga saya bisa mencari probabilitas itu dan tahu huruf mana yang harus ada pada titik gelombang jarak x.
sumber
Ini adalah proyek lama yang saya kerjakan. Gambar MAP sangat mudah digunakan dengan javascript. Saya menawarkan objek, Anda membacanya dan tahu cara menggunakannya. Kami tidak membutuhkan JQuery dan sistem lain untuk menggunakan gambar MAP.
sumber