Penghitungan Lebah Ras Neural Pi Neural Network

Diterbitkan 17 Mei 2018

Segera setelah memasang sarang, saya berpikir: "Saya ingin tahu bagaimana cara menghitung jumlah lebah yang datang dan pergi?"

Sebuah penelitian kecil menunjukkan: sejauh ini tidak ada yang muncul dengan sistem non-invasif yang baik untuk menyelesaikan masalah ini. Tetapi mungkin akan berguna jika memiliki informasi semacam itu untuk memeriksa kesehatan sarang.

Pertama, Anda perlu mengumpulkan sampel data. Raspberry Pi, kamera Pi standar, dan panel surya: peralatan sederhana ini cukup untuk merekam satu frame setiap 10 detik dan menyimpan 5000+ gambar per hari (dari 6 pagi hingga 9 malam).



Di bawah ini adalah contoh gambar ... Berapa banyak lebah yang bisa Anda hitung?



Apa sebenarnya pertanyaannya?


Kedua, perlu dirumuskan masalah apa yang seharusnya dilakukan jaringan saraf. Jika tugasnya adalah “menghitung lebah dalam gambar”, maka Anda dapat mencoba untuk mendapatkan nomor tertentu, tetapi ini sepertinya bukan pilihan yang paling mudah, dan melacak lebah secara individu di antara bingkai tidak memberikan kesenangan apa pun. Sebagai gantinya, saya memutuskan untuk fokus pada melokalisasi setiap lebah dalam gambar.

Pemeriksaan cepat untuk frame-by-frame detector standar tidak membuahkan hasil tertentu. Ini tidak mengherankan, terutama mengingat kepadatan lebah di sekitar pintu masuk sarang (petunjuk: mentransfer pelatihan tidak selalu berhasil), tetapi ini normal. Jadi, saya memiliki gambar yang sangat kecil, hanya satu kelas untuk mengenali objek dan tidak ada masalah khusus dengan kotak pembatas. Putuskan saja apakah ada lebah atau tidak. Solusi mana yang lebih sederhana?

v1: jaringan sepenuhnya convolutional "bee eat / not" pada sebuah fragmen


Percobaan cepat pertama adalah detektor "lebah dalam gambar adalah / tidak". Artinya, berapa probabilitas bahwa setidaknya ada satu lebah pada fragmen gambar ini. Untuk melakukan ini dalam bentuk jaringan yang sepenuhnya konvolusional pada potongan gambar yang sangat kecil berarti Anda dapat dengan mudah memproses data dalam resolusi penuh. Pendekatan itu tampaknya berhasil, tetapi gagal untuk area pintu masuk sarang dengan kepadatan lebah yang sangat tinggi.

v2: Gambar RGB → bitmap hitam dan putih


Saya segera menyadari bahwa masalahnya dapat direduksi menjadi masalah transformasi gambar. Pada input, sinyal kamera adalah RGB, dan pada output adalah gambar saluran tunggal di mana piksel "putih" menunjukkan pusat lebah.


Input RGB (fragmen) dan output saluran tunggal (fragmen)

Menandai


Langkah ketiga adalah menandai, yaitu, penugasan penunjukan. Tidak terlalu sulit untuk menggunakan aplikasi TkInter kecil untuk memilih / membatalkan pilihan lebah pada gambar dan menyimpan hasilnya dalam database SQLite. Saya menghabiskan banyak waktu untuk mengkonfigurasi alat ini dengan benar: siapa pun yang secara manual melakukan sejumlah besar penandaan akan mengerti saya: /

Nanti kita akan melihat, untungnya, bahwa dengan sejumlah besar sampel Anda bisa mendapatkan hasil yang cukup baik dengan metode semi-otomatis.

Model


Arsitektur jaringan cukup standar u-net.

  • jaringan convolutional sepenuhnya dilatih pada fragmen dengan resolusi setengah, tetapi bekerja pada gambar dengan resolusi penuh;
  • pengkodean adalah urutan empat konvolusi 3 × 3 dengan kelipatan 2
  • decoding - urutan perubahan ukuran di tetangga terdekat + lipat 3 × 3 dalam peningkatan 1 + melewatkan koneksi dari encoders;
  • lapisan konvolusi akhir 1 × 1 dengan langkah 1 dengan aktivasi fungsi sigmoid (yaitu, pilihan biner "lebah adalah / tidak" untuk setiap piksel).

Setelah beberapa percobaan empiris, saya memutuskan untuk kembali ke decoding dengan setengah resolusi. Sudah cukup.

Saya melakukan decoding dengan mengubah ukuran ke tetangga terdekat alih-alih memindahkan lebih banyak dari kebiasaan.

Jaringan dilatih oleh metode Adam dan terlalu kecil untuk menerapkan normalisasi batch . Desainnya ternyata sangat sederhana, sejumlah kecil filter sudah cukup.



Saya menerapkan metode augmentasi data standar, rotasi acak, dan distorsi warna. Pelatihan tentang fragmen berarti kita pada dasarnya mendapatkan varian pemotongan gambar secara acak. Saya tidak memutar gambar karena kamera selalu berdiri di satu sisi sarang.

Ada beberapa nuansa dalam prediksi keluaran postprocessing. Dengan hasil probabilistik, kami mendapatkan awan buram di mana ada lebah. Untuk mengubahnya menjadi gambar yang jelas satu piksel per lebah, saya menambahkan nilai ambang, dengan mempertimbangkan komponen terkait akun dan mendeteksi centroid menggunakan modul ukuran skimage . Semua ini harus dipasang secara manual dan dikonfigurasikan secara murni oleh mata, meskipun secara teoritis dapat ditambahkan ke ujung tumpukan sebagai elemen pembelajaran. Mungkin masuk akal untuk melakukannya di masa depan ... :)


Input, output mentah dan cluster centroid

Generalisasi beberapa hari


Dalam satu hari


Awalnya, percobaan dilakukan dengan gambar dalam waktu singkat satu hari. Ternyata menjadi mudah untuk mendapatkan model yang bagus dari data ini dengan sejumlah kecil gambar yang ditandai (sekitar 30).


Tiga sampel diterima pada hari pertama

Selama berhari-hari


Banyak hal menjadi lebih rumit ketika saya mulai mempertimbangkan periode yang lebih lama dari beberapa hari. Salah satu perbedaan utama adalah perbedaan dalam pencahayaan (waktu hari dan cuaca yang berbeda). Alasan lain adalah saya memasang kamera secara manual setiap hari, hanya menempel dengan Velcro. Perbedaan ketiga dan paling tak terduga adalah bahwa dengan pertumbuhan rumput, kuncup dandelion terlihat seperti lebah (yaitu, pada putaran pertama, model yang terlatih tidak melihat kuncup, dan kemudian mereka muncul dan memberikan aliran positif palsu yang terus menerus).

Sebagian besar masalah diselesaikan dengan augmentasi data, dan tidak satu masalah pun menjadi kritis. Secara umum, data tidak terlalu bervariasi. Ini bagus, karena memungkinkan Anda membatasi diri pada jaringan saraf sederhana dan skema pelatihan.


Sampel diperoleh dalam tiga hari

Contoh Peramalan


Gambar menunjukkan contoh perkiraan. Sangat menarik untuk dicatat bahwa ada lebih banyak lebah daripada gambar apa pun yang saya beri label secara manual. Ini adalah konfirmasi yang bagus bahwa pendekatan sepenuhnya convolutional dengan pembelajaran pada fragmen kecil benar-benar berfungsi.



Jaringan berfungsi dengan baik dalam berbagai pilihan. Saya kira latar belakang seragam membantu di sini, dan memulai jaringan pada beberapa sarang sewenang-wenang tidak akan memberikan hasil yang baik.


Dari kiri ke kanan: kepadatan tinggi di sekitar pintu masuk; lebah dari berbagai ukuran; lebah dengan kecepatan tinggi!

Trik Pelabelan


Pelatihan semi-terkontrol


Kemungkinan mendapatkan sejumlah besar gambar segera menyarankan gagasan menggunakan pelatihan semi-terkontrol.

Pendekatan yang sangat sederhana:

  1. Memotret 10.000 gambar.
  2. model_1 label 100 gambar dan model_1 pelatihan_1.
  3. Menggunakan model_1 untuk menandai 9900 gambar yang tersisa.
  4. Pelatihan model_2 pada 10.000 gambar "berlabel".

Hasilnya, model_2 menunjukkan hasil yang lebih baik daripada model_1 .

Berikut ini sebuah contoh. Perhatikan bahwa model_1 menunjukkan beberapa false positive (kiri tengah dan rumput) dan pemicu negatif palsu (lebah di sekitar pintu masuk ke sarang).


Kiri model_1, kanan model_2

Menandai dengan memperbaiki model yang buruk


Data tersebut juga merupakan contoh yang bagus tentang bagaimana memperbaiki model yang buruk lebih cepat daripada menandai dari awal ...

  1. Kami menandai 10 gambar dan melatih model.
  2. Kami menggunakan model untuk menandai 100 gambar berikutnya.
  3. Kami menggunakan alat menandai untuk memperbaiki tanda pada 100 gambar ini.
  4. Edukasi ulang model ini dalam 110 gambar.
  5. Kami ulangi ...

Ini adalah pola pembelajaran yang sangat umum, dan kadang-kadang memaksa Anda untuk merevisi alat pelabelan Anda sedikit.

Menghitung


Kemungkinan mendeteksi lebah berarti kita dapat menghitungnya! Dan untuk bersenang-senang, gambarlah grafis yang menyenangkan yang menunjukkan jumlah lebah di siang hari. Saya suka cara mereka bekerja sepanjang hari dan pulang sekitar jam 4 sore. :)



Output Raspberry Pi


Meluncurkan model pada Pi adalah bagian penting dari proyek ini.

Langsung pada besi Pi


Awalnya direncanakan untuk membekukan grafik TensorFlow dan menjalankannya langsung di Pi. Ini berfungsi tanpa masalah, tetapi hanya Pi yang mengambil hanya 1 gambar per detik. : /

Berjalan di Modul Komputasi Movidius


Saya sangat tertarik pada kesempatan untuk meluncurkan model pada Pi menggunakan Movidus Neural Compute Stick . Ini adalah gadget yang luar biasa.

Sayangnya, tidak ada yang terjadi: /. API untuk mengubah grafik TensorFlow ke format model internal mereka tidak mendukung metode decoding saya. Oleh karena itu, perlu untuk meningkatkan ukuran (upsizing), menggunakan dekonvolusi daripada mengubah ukuran pada tetangga terdekat. Tidak ada masalah selain fakta bahwa tidak ada yang terjadi. Ada banyak kesulitan kecil, karena bug yang berlipat ganda . Ketika sudah diperbaiki, Anda dapat kembali ke topik ini ...

Model v3: Gambar RGB → penghitungan lebah
Ini membawa saya ke versi ketiga dari model: dapatkah kita langsung beralih dari input RGB ke penghitungan lebah? Dengan cara ini kita akan menghindari masalah dengan operasi yang tidak didukung pada Movidus Neural Compute Stick, walaupun kecil kemungkinan hasilnya akan sebagus pada model centroid v2.

Pada awalnya saya takut untuk mencoba metode ini: Saya pikir itu akan membutuhkan lebih banyak pelabelan (ini bukan lagi sistem berbasis fragmen). Tapi! Memiliki model yang cukup baik dengan pencarian lebah, dan banyak data tidak bertanda, Anda dapat menghasilkan satu set data sintetik yang baik dengan menerapkan model v2 dan hanya menghitung jumlah deteksi.

Model seperti itu cukup mudah dipelajari dan memberikan hasil yang bermakna ... (meskipun masih tidak sebaik perhitungan sederhana dari centroid yang terdeteksi oleh model v2).

Jumlah lebah aktual dan prediksi dalam beberapa sampel uji
Yang asli40191615131211108764
v2 (centroid) prediktif3919161313141188764
perkiraan v3 (perhitungan sederhana)33.115.312.312.513.310,49.38.76.37.15.94.2

... sayangnya, model ini masih tidak berfungsi pada Neural Compute Stick (artinya, itu berfungsi, tetapi hanya memberikan hasil acak). Saya membuat beberapa laporan bug lagi dan lagi menunda gadget untuk kembali lagi nanti ... suatu hari ...

Apa selanjutnya


Seperti biasa, banyak hal kecil tetap ...

  • Peluncuran pada Neural Compute Stick (NCS); Sekarang kami sedang menunggu beberapa pekerjaan di pihak mereka ...
  • Port semuanya ke kamera JeVois bawaan . Saya sedikit mengacaukannya, tetapi pertama-tama saya ingin meluncurkan model di NCS. Saya ingin melacak lebah pada 120 FPS !!!
  • Lacak lebah di antara banyak bingkai / kamera untuk memvisualisasikan aliran optik.
  • Jelajahi lebih detail manfaat dari pendekatan semi-terkontrol dan latih model yang lebih besar untuk melabeli data untuk model yang lebih kecil.
  • Jelajahi fitur NCS; apa yang harus dilakukan dengan pengaturan hyperparameters?
  • Terus kembangkan versi kecil FarmBot untuk melakukan beberapa eksperimen genetik dengan semai CNC (mis. Sesuatu yang sama sekali berbeda).

Kode


Semua kode diterbitkan di Github .

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


All Articles