Daftar Isi:

Pengenalan Bintang Menggunakan Computer Vision (OpenCV): 11 Langkah (dengan Gambar)
Pengenalan Bintang Menggunakan Computer Vision (OpenCV): 11 Langkah (dengan Gambar)

Video: Pengenalan Bintang Menggunakan Computer Vision (OpenCV): 11 Langkah (dengan Gambar)

Video: Pengenalan Bintang Menggunakan Computer Vision (OpenCV): 11 Langkah (dengan Gambar)
Video: Computer Vision dan 4 contohnya 2024, November
Anonim
Pengenalan Bintang Menggunakan Computer Vision (OpenCV)
Pengenalan Bintang Menggunakan Computer Vision (OpenCV)

Instruksi ini akan menjelaskan kepada Anda cara membuat program visi komputer untuk secara otomatis mengidentifikasi pola bintang dalam gambar. Metode ini menggunakan pustaka OpenCV (Open-Source Computer Vision) untuk membuat serangkaian kaskade HAAR terlatih yang dapat digunakan untuk mengenali pola bintang tertentu. Meskipun panduan ini dalam konteks pengenalan pola bintang, proses OpenCV yang saya jelaskan juga dapat diterapkan ke aplikasi lain - jadi semoga bermanfaat!

Proyek ini dirangkum dalam video ini:

Mengapa saya menulis instruksi ini?

  1. Metode identifikasi pola bintang yang saya kembangkan, saya percaya memiliki potensi untuk diterapkan pada berbagai proyek astronomi amatir - apakah itu orientasi teleskop, klasifikasi gambar otomatis, atau bahkan akhirnya sensor bintang pada sumber terbuka atau CubeSat amatir.
  2. Ada banyak instruksi OpenCV yang bagus di sini, tetapi meskipun demikian saya merasa ini merupakan proses yang sangat sulit untuk dipelajari pada awalnya, jadi saya berharap panduan ini akan menjadi referensi yang baik bagi orang lain yang ingin melatih pengklasifikasi HAAR untuk OpenCV (tidak harus berhubungan dengan astronomi mungkin!).
  3. Saya sendiri bukan programmer terlatih, jadi proyek ini benar-benar mendorong pemahaman saya. Semoga dengan menulis Instructable ini, pembuat lain yang lebih berpengalaman akan terinspirasi untuk mengerjakan konsep ini dan berkontribusi pada GitHub dan instruksi ini melalui komentar di halaman ini.
  4. Astronomi amatir dan metode orientasi adalah minat besar saya, lihat instruksi saya sebelumnya yang menampilkan Arduino Star-Finder untuk Teleskop.

Foto sampul Instructable ini adalah konsep desain CubeSat 3U yang saya ikuti dalam desainnya. Saya menggunakannya untuk mengilustrasikan instruksi ini karena aplikasi asli dari sistem pengenalan bintang visi komputer adalah untuk sensor orientasi untuk CubeSats buatan amatir, menggunakan Kamera Raspberry Pi V2. Ada banyak aplikasi potensial lain dari pengenalan bintang visi komputer yang saya yakini, tetapi saya pikir ini yang paling keren!

Glosarium Kecil:

Belajar tentang visi komputer menjadi lebih lambat karena banyaknya istilah spesialis yang digunakan, jadi saya akan mendefinisikannya untuk kita di sini:

Cascade - Sebuah classifier dilatih untuk mengidentifikasi objek target tertentu.

Fiducial Marker - Sebuah penanda menambahkan titik referensi visual ke gambar.

HAAR - Fitur seperti Haar adalah jenis fitur gambar yang digunakan untuk pelatihan pengklasifikasi.

OpenCV - Open Source Computer Vision, perpustakaan alat visi komputer.

Stellarium - Perangkat lunak astronomi Open Source.

Langkah 1: Persyaratan

OpenCV adalah perpustakaan berbasis Linux, jadi meskipun mungkin untuk mengoperasikannya dengan baik di Windows, Anda akan lebih mudah menjalankannya di lingkungan Linux (ambil ini dari saya dan banyak hari mencoba untuk membuatnya bekerja sepenuhnya Jendela!). Sebagai percobaan, saya mengunduh dan menjalankan OpenCV pada Raspberry Pi 3B+ saya, yang berhasil, meskipun pelatihan pengklasifikasi adalah proses yang sangat intensif RAM, jadi jika Anda ingin melakukannya dengan kecepatan apa pun, rute yang disarankan adalah menyewa Server Virtual Linux (yang sebenarnya bisa sangat murah) selama beberapa hari/minggu/bulan dan gunakan itu sebagai lingkungan khusus untuk menjalankan pelatihan pengklasifikasi. Anda akan dapat mengontrol server dari PC Windows menggunakan klien SSH seperti Putty. Setelah kaskade dilatih menggunakan VPS, kaskade dapat diunduh ke PC Windows Anda, dan Python dapat digunakan untuk menjalankan program pengenalan gambar di lingkungan Windows.

Server Virtual Linux:

Server Virtual Linux (VPS) diperlukan untuk melakukan proses pelatihan kaskade HAAR. Awalnya saya menyewa server dengan RAM 8GB dan Ubuntu 16.04.6 (LTS) x64, dan kemudian server kedua untuk menggandakan kecepatan saya dapat melatih kaskade, meskipun Anda hanya memerlukan minimal satu

Perangkat lunak:

  • Stellarium - ini adalah perangkat lunak planetarium/astronomi virtual, tersedia gratis. Ini akan digunakan untuk mengumpulkan gambar bintang simulasi untuk digunakan dalam pengujian.
  • Putty - Ini adalah klien SSH yang digunakan untuk mengontrol VPS melalui baris perintah.
  • WinSCP - ini digunakan untuk melakukan transfer file dari PC Windows.

Langkah 2: Pengaturan VPS

Ada proses pengaturan kecil untuk mengaktifkan dan menjalankan VPS. Pertama kali mungkin perlu sedikit waktu untuk Anda, tetapi tidak terlalu rumit jika Anda mengikuti langkah-langkahnya dengan cermat. Tutorial ini adalah referensi yang bagus untuk saya, saya sarankan Anda membaca ini juga saat mengerjakan instruksi ini. Ini mencakup spesifikasi perintah linux baris demi baris, yang diperlukan untuk mengikuti surat itu.

Secara kasar, prosesnya melibatkan:

  1. Pembuatan server Linux dengan versi Ubuntu yang benar.
  2. Upgrade dan Update server.
  3. Pembuatan direktori ruang kerja, tempat OpenCV diinstal.
  4. Instalasi beberapa hal penting, yaitu compiler, berbagai library, dan binding Python.

Setelah tahap ini, Anda siap untuk mulai mempersiapkan proses pelatihan.

Langkah 3: Proses

Seluruh proses visi komputer menggunakan kaskade HAAR cukup membingungkan pada awalnya, jadi Langkah ini menjelaskan logika sedikit lebih detail:

Proses Dasar

  1. Ada kumpulan data gambar negatif, yang terdiri dari beberapa ribu gambar yang tidak berisi objek yang diinginkan. Ini perlu diunggah ke VPS.
  2. Sebuah gambar positif tunggal dibuat yang berisi objek yang menarik. Ini juga perlu diunggah ke VPS.
  3. Gambar positif tunggal terdistorsi, melengkung, diputar, dll., oleh serangkaian parameter yang dipilih dan dilapiskan pada pilihan gambar negatif. Ini adalah cara buatan untuk membuat kumpulan data positif yang besar dari satu gambar. (Untuk aplikasi dunia nyata lainnya, seperti mengidentifikasi kucing, Anda cukup menggunakan beberapa ribu gambar kucing, tetapi metode ini tidak selalu tepat jika Anda tidak memiliki kumpulan gambar positif yang begitu besar. Pendekatan artifisial yang digunakan di sini akan kurang efektif, tetapi itu adalah satu-satunya pilihan untuk kasus penggunaan seperti ini).
  4. Sebuah proses pelatihan dijalankan, yang bekerja secara bertahap. Setiap tahap akan melatih kaskade untuk mengidentifikasi fitur tipe HAAR yang berbeda dalam kumpulan gambar. Setiap tahap membutuhkan waktu lebih lama untuk diselesaikan, dan keefektifan pengklasifikasi meningkat setiap kali (juga dimungkinkan untuk berlatih berlebihan asal Anda tahu!).
  5. Kaskade terlatih tunggal akan dapat mencari objek target tunggal. Jika Anda ingin mengidentifikasi beberapa objek unik, Anda memerlukan kaskade terlatih untuk masing-masing objek. Dalam hal ini, saya melatih sekitar 50 kaskade yang berbeda untuk pola bintang yang unik, untuk membuat satu set yang dapat menutupi belahan langit utara.
  6. Terakhir, program deteksi digunakan yang menjalankan setiap kaskade set terhadap gambar input. Kaskade akan mencari objek target yang diberikan dalam gambar input.
  7. Jika berhasil, objek target akan diidentifikasi dalam gambar input.

n.b. jika digunakan dalam konteks orientasi satelit misalnya, gambar akan diambil menggunakan kamera onboard. Bintang paling terang dalam gambar itu akan diidentifikasi, dan penanda diletakkan di posisi itu. Gambar ini kemudian disajikan ke set kaskade terlatih, yang akan menguji untuk melihat apakah gambar input berisi salah satu objek target. Jika positif sejati terdeteksi, maka posisi sudut konstelasi yang diketahui ditemukan relatif terhadap sumbu badan satelit.

Langkah 4: Negatif dan Positif

Negatif

Aspek yang sangat penting dari pelatihan kaskade adalah memiliki kumpulan data gambar negatif sebesar mungkin. Kita berbicara ribuan, idealnya puluhan ribu gambar. Tidak peduli apa isinya, tujuannya hanya untuk memberikan berbagai informasi visual. Folder Pelatihan Pengklasifikasi berisi berbagai kumpulan data gambar negatif berbeda yang saya kompilasi. Awalnya ini hanya terdiri dari gambar bidang bintang yang disimulasikan yang diperoleh dari Stellarium, tetapi kemudian saya menambah kumpulan data dengan sebanyak mungkin gambar acak yang dapat saya temukan (ya, termasuk foto liburan saya …). Kumpulan data terbesar di sana mencakup hampir 9.000 gambar, yang merupakan yang terbesar yang pernah saya buat sejauh ini. Dengan menggunakan ini akan menghemat kompilasi Anda sendiri.

Positif

Gambar positif (yaitu pola bintang target yang akan dilatih untuk dikenali oleh kaskade) dimulai sebagai tangkapan layar dari pola bintang di Stellarium. Program python kemudian mengidentifikasi bintang paling terang dalam gambar, dan melapisi penanda (dijelaskan nanti dalam instruksi ini) ke posisi bintang ini. Gambar ini kemudian dikecilkan menjadi 50x50 piksel. Ini kecil, tetapi waktu pelatihan yang diperlukan untuk kaskade akan meningkat secara eksponensial seiring bertambahnya ukuran ini, jadi ini adalah kompromi yang baik antara kualitas dan waktu.

Langkah 5: Kontrol Stellarium

Kontrol Stellarium
Kontrol Stellarium
Kontrol Stellarium
Kontrol Stellarium

Folder Stellarium Scripts dari repositori GitHub berisi tiga program yang saya tulis untuk mengontrol penggunaan Stellarium. Untuk menggunakannya, letakkan di folder skrip folder instalasi Stellarium Anda. Untuk menjalankannya, Anda dapat membuka jendela skrip dari dalam menu Stellarium, atau hanya dengan mengklik dua kali pada program di folder skrip, yang akan meluncurkan Stellarium dan segera menjalankan program yang dipilih.

thesis_4 dan thesis_5 menangkap sekitar 2000 gambar masing-masing dari belahan bumi utara dan selatan. Ini digunakan untuk membentuk database gambar negatif, untuk melatih citra positif melawan. Perbedaan antara utara dan selatan adalah cara sederhana untuk memastikan bahwa pola bintang target (positif) tidak akan ada dalam kumpulan data negatif dengan melatih pola bintang belahan bumi utara terhadap kumpulan data gambar belahan langit selatan dan sebaliknya. (Jika gambar positif juga ada dalam dataset gambar negatif, itu akan mempengaruhi kualitas pengklasifikasi).

thesis_setup juga berguna - ini mengatur Stellarium agar sesuai untuk menangkap gambar - gambar yang digunakan untuk mensimulasikan pemandangan dari Luar Angkasa. Itu melakukan tindakan seperti menyembunyikan menu, garis kisi, label, dll secara otomatis untuk menghemat kebutuhan Anda setiap kali Anda ingin mengambil gambar.

Langkah 6: Manusia Roket

Manusia Roket
Manusia Roket

Kaskade pertama yang saya latih tidak dapat mengidentifikasi pola bintang dengan benar. Mereka sangat tidak dapat diandalkan dan sangat rentan terhadap kesalahan positif. Asumsi saya adalah bahwa secara efektif gambar bidang bintang dari Stellarium (pada dasarnya hanya titik putih pada latar belakang hitam) tidak mengandung informasi visual yang cukup untuk memuat fitur tipe HAAR yang cukup untuk pelatihan pengklasifikasi yang sukses. Saya pikir ini sudah larut malam, tetapi saya memutuskan untuk mencoba ide menulis program untuk secara otomatis menempatkan gambar kecil kecil di atas lokasi setiap bintang terang dalam gambar bidang bintang.

Elton

Ini adalah tes yang konyol, tetapi dengan menambahkan gambar kecil wajah Elton John ke setiap lokasi bintang terang, melatih pengklasifikasi terhadap gambar positif ini, dan kemudian menjalankan kaskade terhadap gambar asli, itu jauh lebih efektif untuk menemukan dengan benar. pola yang benar. Aku tahu aku menyukai sesuatu!

Langkah 7: Penanda Fiducial

Penanda Fiducial
Penanda Fiducial

Meskipun 'Eltons' membuktikan teorinya, saya membutuhkan penanda yang memiliki simetri rotasi penuh, sehingga pola bintang akan tampak sama tidak peduli pada orientasi apa itu disajikan. Saya menguji berbagai jenis penanda, dan menemukan bahwa jenis di kanan bawah paling efektif, dengan cincin hitam dan putih yang kontras. Program python yang disajikan dalam folder positif dari repo GitHub menunjukkan bagaimana bintang paling terang dalam gambar tertentu diidentifikasi, dan penanda ini secara otomatis dihamparkan di posisi tersebut. Kami sekarang telah membuat representasi dari pola bintang utama yang dapat dilatih.

Langkah 8: Menggunakan Cascades

Menggunakan Kaskade
Menggunakan Kaskade

Ketika Anda telah melatih serangkaian kaskade, Anda perlu tahu cara menggunakannya untuk mengidentifikasi objek dalam gambar!

Lihat folder Identifikasi Bintang di GitHub, di mana Anda akan menemukan program cascade_test19.py. Program yang diberi nama menarik ini mengambil serangkaian kaskade dari folder tertentu, dan menjalankan semuanya terhadap gambar input, dan melaporkan deteksi yang dilakukan. Fungsi 'detectMultiScale' adalah inti dari ini, dan dibutuhkan berbagai argumen yang menentukan proses deteksi. Mengubah ini sangat penting untuk kinerja pengklasifikasi kaskade, dan diskusi lebih lanjut tentang ini dapat ditemukan pada langkah berikut, di mana kita melihat bagaimana menghilangkan positif palsu.

Ini dapat diterapkan dalam sistem orientasi satelit dengan mengkorelasikan nilai piksel di tengah kotak pembatas dengan koordinat langit Ra/Des dari derai bintang yang diidentifikasi, dan kemudian mengkorelasikannya dengan perpindahan sudut dari pusat gambar (kamera sumbu). Dari sini, menggunakan pemahaman tentang distorsi lensa (diperkirakan dengan proyeksi gnomonik), sudut satelit dapat ditemukan hanya dari dua identifikasi positif.

Langkah 9: Bagaimana Tetap Positif Tentang Positif Palsu

Bagaimana Tetap Positif Tentang Positif Palsu
Bagaimana Tetap Positif Tentang Positif Palsu
Bagaimana Tetap Positif Tentang Positif Palsu
Bagaimana Tetap Positif Tentang Positif Palsu

Kedua gambar ini menunjukkan hasil pengujian rangkaian kaskade terhadap gambar yang identik, tetapi dengan parameter yang berbeda. Jelas, gambar pertama berisi identifikasi yang benar, tetapi juga sejumlah besar positif palsu, sedangkan gambar kedua hanya berisi identifikasi yang benar.

Program cascade_test19.py dalam folder Identifikasi Bintang dari repo GitHub menggunakan dua metode untuk mengurutkan hasil. Pertama, fungsi detectMultiScale menetapkan ukuran Miminum dan Maksimum hasil yang dapat ditemukan, yang masuk akal, sebagai perkiraan ukuran pola bintang target di dalam jendela (untuk lensa dan perbesaran yang diberikan - gambar Stellarium simulasi saya menggunakan properti dari Kamera Raspberry Pi V2) dikenal. Kedua, kode akan memilih hasil dengan kotak pembatas terbesar (dalam batas sebelumnya). Dalam pengujian, ini ditemukan benar-benar positif. Ketiga, program menetapkan 'levelWeights' minimum (secara efektif 'nilai kepercayaan') yang diperlukan untuk memperlakukan ID ini sebagai benar positif. Dengan metode ini, kaskade efektif untuk menemukan hasil yang benar.

Selain gambar bidang bintang, saya juga menguji ini terhadap gambar meja saya misalnya, kaskade pelatihan untuk mengidentifikasi buku catatan saya, mug, dll., untuk berlatih menghilangkan positif palsu. Metode di atas bekerja dengan baik dalam semua keadaan yang menggembirakan.

Langkah 10: Diskusi

Diskusi
Diskusi
Diskusi
Diskusi
Diskusi
Diskusi

Area untuk Peningkatan

Ini telah menjadi proyek yang kompleks bagi saya, dan benar-benar mendorong pemahaman saya tentang topik tersebut. Ini telah melibatkan total beberapa bulan pekerjaan hampir penuh waktu untuk mendapatkan proyek ke titik ini ketika saya dapat membagikannya dengan Anda, tetapi ada banyak pekerjaan yang harus dilakukan untuk meningkatkan kinerja metode ini. Seperti berdiri, itu dapat berfungsi dengan baik dalam batasan tertentu. Saya telah bekerja untuk mengidentifikasi area mana yang membutuhkan pekerjaan tambahan, dan mudah-mudahan dapat meluangkan waktu untuk menangani ini di bulan-bulan mendatang. Mereka:

Sudut - Ini adalah area yang kompleks, gagasan bahwa hasil pengklasifikasi harus rotasi invarian, yaitu, keandalan harus mengidentifikasi pola bintang target terlepas dari sudut di mana itu disajikan gambar yang berisi derai bintang target. Kaskade yang dilatih menggunakan gambar input pada satu orientasi tidak akan dapat mengidentifikasi gambar tersebut pada orientasi acak, sehingga varians sudut gambar positif harus dimasukkan ke dalam proses pelatihan untuk melatih kaskade yang dapat menerima rentang pada sudut input. Parameter 'maxzangle' dalam perintah pelatihan kaskade mengambil argumen dalam radian, yang mengontrol batas sudut bahwa gambar positif input akan dilapiskan pada gambar negatif yang disediakan, sehingga kumpulan gambar positif yang dihasilkan akan berisi rentang orientasi citra positif. Namun, karena maxzangle ini meningkat, rasio penerimaan (secara umum, kualitas) dari kaskade akan berkurang tajam. Saya percaya solusinya adalah melatih kaskade menggunakan basis data gambar negatif yang jauh lebih besar daripada yang saya gunakan untuk memastikan bahwa pengklasifikasi kaskade berkualitas baik dapat dibuat bahkan dengan menggunakan penyebaran orientasi yang besar.

Solusi potensial lainnya adalah melatih sejumlah kaskade untuk target tertentu, setiap kaskade mengatur bagian tertentu dari rotasi 360 derajat penuh. Dengan begitu kualitas setiap kaskade dapat dipertahankan pada tingkat yang tinggi, tetapi di sisi lain ini akan menghasilkan kaskade yang jauh lebih banyak, dan karenanya proses identifikasi akan lebih lambat.

Parameter 'levelWeight', yang merupakan nilai yang diberikan oleh fungsi 'detectMultiScale', dianalogikan dengan nilai kepercayaan pada deteksi yang telah dibuat. Mempelajari ini, grafik di atas dibuat, yang menunjukkan bagaimana kepercayaan identifikasi positif menurun tajam ketika orientasi gambar meningkat di kedua arah, membenarkan pemikiran bahwa ini adalah titik lemah.

Penempatan Piksel - Hal yang lebih sederhana, tetapi juga bermasalah adalah penempatan piksel, yang diilustrasikan oleh dua gambar berikut, menunjukkan tampilan gambar bintang yang diperbesar, sehingga piksel individu dari dua bintang dapat terlihat dengan jelas. Proses erosi yang digunakan dalam program untuk menghapus semua kecuali bintang paling terang dari gambar akan mempertahankan bintang pertama, dan membuang yang kedua, meskipun mereka memiliki kecerahan yang sama. Alasan untuk ini adalah bahwa bintang pertama berpusat pada sebuah piksel, sedangkan yang kedua tidak seperti itu. Fungsi erosi menghilangkan cincin konsentris piksel dari sekitar piksel pusat suatu grup, sehingga bintang pertama akan memiliki piksel pusat yang bertahan dari fungsi erosi, tetapi bintang kedua akan sepenuhnya dihapus dari gambar. Oleh karena itu penanda fiducial hanya akan ditempatkan pada bintang pertama, dan bukan bintang kedua. Hal ini akan menyebabkan ketidakkonsistenan yang berkaitan dengan bintang terang mana dalam bidang bintang tertentu yang akan menerima penanda (dan karenanya dibandingkan dengan pengklasifikasi terlatih) - oleh karena itu ada kemungkinan bahwa pengamatan positif yang benar tidak akan mungkin dilakukan.

Langkah 11: Kata Terakhir

Kata terakhir
Kata terakhir

Terima kasih telah membaca instruksi saya, saya harap Anda menemukan proyek ini menarik. Ini adalah proses yang sangat menarik untuk mengerjakannya, sudah lebih dari setahun sejak saya mulai mengerjakan konsepnya, dan saya terdorong oleh hasilnya hingga saat ini. Dari literatur yang saya baca, ini adalah konsep yang cukup orisinal, dan dengan pengembangan lebih lanjut pasti dapat diterapkan dalam berbagai aplikasi untuk astronomi amatir atau lebih.

Proyek ini adalah kurva pembelajaran yang curam bagi saya, jadi saya berharap beberapa pembaca dengan lebih banyak pengalaman pemrograman dapat terinspirasi untuk berkontribusi pada kelanjutan proyek melalui halaman GitHub, dan kami dapat terus mengembangkan alat sumber terbuka ini. Saya berharap untuk membaca komentar apa pun yang Anda miliki, tetapi tolong jangan terlalu banyak mengajukan pertanyaan yang sulit!

Tantangan Luar Angkasa
Tantangan Luar Angkasa
Tantangan Luar Angkasa
Tantangan Luar Angkasa

Runner Up dalam Tantangan Luar Angkasa

Direkomendasikan: