Bagaimana saya bertemu OpenCV atau mencari ColorChecker

Saya telah belajar di pusat CS di Novosibirsk untuk tahun kedua. Sebelum masuk, saya sudah memiliki pekerjaan di TI - saya bekerja sebagai analis di Yandex, tetapi saya ingin mengembangkan lebih lanjut, mencari tahu sesuatu di luar tugas saat ini, dan, atas saran seorang kolega, saya memasuki pusat CS. Dalam artikel ini saya ingin berbicara tentang latihan yang saya lalui saat belajar.

Pada awal semester pertama, kami ditawari beberapa proyek. Perhatian saya langsung terpikat pada sebuah proyek yang disebut "Metode untuk menilai warna butir dari foto." Topik ini disarankan oleh para spesialis dari Institute of Cytology and Genetics dari SB RAS, tetapi proyek itu sendiri lebih terkait dengan analisis dan pemrosesan gambar daripada dengan biologi. Saya memilihnya karena saya tertarik dengan pembelajaran mesin dan pengenalan pola dan saya ingin berlatih di bidang ini.

Inti dari proyek


Ada aplikasi SeedCounter yang dirancang untuk menghitung dan mengukur ukuran butir gandum dari foto hingga ahli agronomi bebas dari pekerjaan yang membosankan dan rutin dalam menghitung dan menganalisis biji-bijian. Saya perlu mempelajari kemungkinan menentukan warna biji-bijian dari foto dan mengimplementasikannya dalam aplikasi sehingga biji-bijian dapat dibagi menjadi kelas yang bermakna. Kelas yang diperoleh dapat sesuai, misalnya, dengan konten zat yang bermanfaat bagi manusia.

Contoh foto sebelum dan sesudah kalibrasi:



Tampaknya mengambil dan memahami warna biji-bijian dari sebuah foto adalah tugas yang sederhana, terutama jika sudah ada algoritma untuk menemukan biji-bijian itu sendiri. Namun, warna yang diperoleh sangat tergantung pada pencahayaan dan kamera memperkenalkan distorsi sendiri. Akibatnya, warna yang diperoleh memiliki sedikit hubungan dengan sifat butir itu sendiri. Oleh karena itu, tujuan utamanya adalah untuk mendapatkan warna biji-bijian yang dikalibrasi, yaitu seperti mereka akan berada dalam kondisi pemotretan yang ideal.

Untuk menyesuaikan warna, kami menggunakan palet referensi yang disebut ColorChecker. ColorChecker terletak di bingkai yang sama dengan butir, warnanya sudah diketahui sebelumnya. Aplikasi harus memilih konversi gambar sedemikian rupa sehingga warna pada ColorChecker sedekat mungkin dengan warna referensi yang dikenal.

Artinya, tugas itu dibagi menjadi tiga subtugas:

  • menemukan ColorChecker pada gambar,
  • perhitungan konversi warna dan menerapkannya pada gambar,
  • pemisahan butir sesuai dengan warna yang diperoleh.

Kemajuan kerja


Pertama-tama, kami mencari algoritma pencarian ColorChecker yang sudah diterapkan - itu ditemukan dalam paket macduff gratis. Saya mencobanya pada gambar uji, ternyata buruk: bahkan dengan sedikit pergantian ColorChecker, hanya sedikit kotak palet yang dikenali. Setelah itu saya mulai mencari metode pencarian lain di mana orientasinya tidak penting. Ternyata ada metode yang digunakan untuk tugas yang lebih umum untuk menemukan objek arbitrer - itu didasarkan pada pemilihan titik karakteristik pada gambar dan membandingkannya dengan templat. Semua komponen yang diperlukan sudah ada di OpenCV, jadi tidak sulit untuk mengimplementasikannya.

Untuk menyoroti poin karakteristik di OpenCV, kami menggunakan beberapa algoritma: keduanya dipatenkan (SIFT / SURF) dan gratis (ORB / FAST). Awalnya, metode ini bekerja cukup baik dengan opsi yang dipatenkan, tetapi sangat lambat, yang sangat penting ketika digunakan pada perangkat seluler. Mereka juga tidak ada dalam versi standar perpustakaan, yang dapat menyebabkan kesulitan saat porting ke Android. Saat menggunakan opsi yang lebih cepat, kualitas pengakuan turun.

Untuk meningkatkan kualitas pengakuan, saya melihat contoh-contoh di mana algoritma salah. Dalam kebanyakan kasus, algoritme menemukan perkiraan lokasi ColorChecker, tetapi tidak secara akurat menentukan wilayahnya. Karena penentuan daerah titik dari mana warna diambil untuk kalibrasi yang tidak akurat, mereka tidak jatuh ke dalam kotak palet yang benar, masing-masing, warna dipulihkan secara tidak benar. Untuk memperbaikinya, saya mencoba menjalankan kembali algoritma, mendapatkan perkiraan awal yang tidak akurat, dan juga secara empiris menggeser titik-titik yang digunakan untuk kalibrasi, ke arah kotak yang diinginkan. Setelah itu, kualitas metode meningkat dan menjadi dapat diterima, bahkan untuk algoritma yang awalnya lemah, tetapi cepat:
AlgoritmaAkurasiWaktu kerja
Selancar75%2,8
83% (+ 8%)14-an
SIFT88%3.4s
96% (+ 8%)15-an
Cepat65%0,5-an
93% (+ 28%)1.5s
ORB56%0.4s
79% (+ 23%)1s

Untuk kalibrasi, saya menggunakan regresi kuadrat terkecil sederhana: baik linier dalam warna dan dalam pesanan lebih tinggi. Dengan demikian, muncul pertanyaan: bagaimana memilih yang terbaik dari beberapa model. Metrik berdasarkan kedekatan warna dengan standar memberikan hasil yang beragam: gambar yang dikalibrasi dengan baik menggunakan kriteria formal mungkin terlihat tidak alami dari sudut pandang manusia. Gambar di bawah ini menunjukkan contoh efek seperti itu. Sebagai ilustrasi, alih-alih biji-bijian, saya mengambil sepotong umbi kentang, karena umbinya lebih besar, dan kita bisa lebih baik melihat distorsi warna. Kami mencoba mengubah metrik, tetapi pada akhirnya kami memutuskan bahwa lebih baik untuk mengevaluasi model kalibrasi dengan pengaruhnya pada hasil tugas akhir - pemisahan biji-bijian.

Irisan umbi kentang, dari kiri ke kanan: sebelum kalibrasi, setelah kalibrasi dengan regresi dari urutan pertama, kedua dan ketiga.



Selanjutnya, perlu untuk mengumpulkan dataset yang akan memeriksa kualitas pencarian dan kalibrasi ColorChecker, dan juga memecahkan masalah pemisahan butir dengan warna. Untuk melakukan ini, kami mengambil sampel butiran varietas yang berbeda dan memotretnya di berbagai perangkat, dengan sumber pencahayaan berbeda: baik buatan maupun di siang hari. Setelah itu, saya menjalankan semua gambar melalui algoritma kalibrasi dan mengumpulkan warna biji-bijian, algoritma untuk mengenali biji-bijian diberikan kepada saya siap. Saya harus melakukan lebih dari satu iterasi dari proses ini: pengakuan pada gambar berkualitas buruk tidak selalu bekerja dengan baik, saya harus memilih heuristik tambahan untuk menyaring sampah.

Pada akhirnya, ternyata mengumpulkan dataset, kualitas yang saya senangi. Saya meresmikan masalah pemisahan biji-bijian sebagai berikut: sembilan tingkatan butir dibagi menjadi tiga kelas (putih, merah dan ungu), masing-masing butir harus diklasifikasikan berdasarkan warna dalam salah satu dari tiga kelas. Saya mencoba metode klasifikasi sederhana seperti KNN dan pengklasifikasi linier, tetapi gagal mendapatkan akurasi yang baik. Namun, bahkan ketika dilihat dengan mata, sudah jelas bahwa kelas-kelas tersebut saling berpotongan kuat dan tidak ada permukaan pemisah yang jelas di antara mereka.

Ringkasan


Hasil utama dari pekerjaan ini adalah algoritma pencarian ColorChecker, yang bekerja dengan cepat dan dengan kualitas yang baik, dan kalibrasi warna olehnya. Ini bisa bermanfaat tidak hanya untuk biji-bijian. Misalnya, dimungkinkan untuk menerapkannya dalam tugas menganalisis telinga gandum.

Saya juga memeriksa kemungkinan menilai butir berdasarkan warna - Saya tidak bisa mendapatkan akurasi tinggi di sini, bahkan dengan bantuan kalibrasi.

Tetapi hasil yang paling penting adalah bahwa saya memperoleh pengalaman dalam memecahkan masalah yang tidak ada algoritma siap pakai diletakkan di rak, dan saya menemukan sendiri area yang menarik dari visi komputer, yang, saya harap, saya akan temui di masa depan.

Source: https://habr.com/ru/post/id437450/


All Articles