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. :)