Hari baik untuk semua
Raspberry kecil adalah hal yang hebat. Saya menggunakan Raspberry Zero W dalam beberapa proyek selama enam bulan terakhir. Disuap oleh kesederhanaan pembuatan prototipe dan penggulingan berbagai ide. Dan sekarang ada pertanyaan opsional: apakah perangkat ini akan menarik jaringan konvolusional penuh? [Spoiler - tarik, tetapi ada nuansa lucu]. Siapa yang peduli dengan topik - selamat datang di kucing. Perhatian, akan ada banyak kucing!

Mengapa jaringan saraf Raspberry?
Entah bagaimana saya mengumpulkan jebakan video sederhana tentang Raspbery Zero W untuk mengamati kehidupan malam binatang (terutama kucing) di negara ini. Kode itu sederhana dan bekerja dengan cukup baik. Untuk deteksi video-foto, kamera dengan penerangan IR digunakan seperti
ini "Raspberry Pi Night Version Camera" .

Inti dari kode ini adalah untuk mengambil dua frame berturut-turut, membandingkan piksel demi piksel, dan jika jumlah piksel yang diubah lebih besar dari nilai ambang tertentu, mulailah merekam video 10 detik. Saya tidak akan memberikan teks kode pada posting ini, jika seseorang tertarik, tulis di komentar, saya bisa memasukkannya sebagai berikut. Fitur utama adalah untuk mendapatkan dua frame yang akan dibandingkan dalam 0,2 detik, setidaknya untuk menangkap peristiwa cepat. Nah, cepat bandingkan frame ini, tentu saja.
Kemudian muncul ide untuk mengencangkan jaringan saraf sederhana ke algoritma sehingga akan mungkin untuk menentukan objek dalam bingkai yang ditangkap dan mulai merekam video hanya jika kelas objek ditentukan dengan andal. Ini berpotensi menghilangkan positif palsu dari perangkap video. Ini terjadi dari objek bergerak (misalnya, rumput atau cabang) atau dari pencahayaan tajam adegan kamera (cahaya di jendela menyala atau lampu padam, misalnya).
Kotak apa yang akan diletakkan di Raspberry?
Untungnya, di bawah Python pra-instal (dalam kasus saya ini adalah 3.5.3) dan OpenCV tersedia secara luas (saya menggunakan 3.4.3), Anda dapat meletakkan hampir semua grid. Sayangnya, karena kemampuan komputasi perangkat yang terbatas, daftar pilihannya kecil. Bahkan, Anda hanya dapat memilih dari opsi "ringan":
1. SqueezeNet (kode sampel di
sini ).
2. YOLO Tiny (di
sini ).
3. MobileNet-SSD (di
sini ).
4. MobileNet_v1_224 (ada
video yang fantastis
tentang pengoperasian detektor objek pada kisi ini ).
Dalam semua kasus ini, ia menyuap kesempatan untuk menggunakan model yang sudah dilatih sebelumnya tentang kumpulan data yang solid, sehingga menghilangkan semua kepedihan dan kekhawatiran dari kumpulan data independen dan pelatihan selanjutnya dari jaringan saraf pada mereka.
Pemohon No. 1 terinspirasi oleh
akurasi pengakuan tinggi yang diklaim dengan ukuran faktor bobot yang sederhana. Selain itu, pencarian singkat di Internet menghasilkan blog yang sangat bagus,
Adrian Rosebrock , yang mengomentari kode secara terperinci dan menjelaskan beberapa opsi untuk menerapkan pembelajaran mendalam tentang Raspberry.
Kode
dari sini digunakan untuk menguji kemampuan SqueezeNet. Penulis mengirimkan bobot dan representasi tekstual dari model ke email setelah mengisi formulir di situs. Omong-omong, jika Anda belum menginstal OpenCV, Anda dapat menemukan algoritme tindakan di blognya. Plus, ada contoh "overclocking" kode untuk mempercepat waktu kerja model dan banyak lagi. Hormati Adrian, sumber yang sangat keren.
Baiklah, mari kita jalankan kodenya dan dapatkan hasil yang menakjubkan pada gambar pertama!

Kucing dalam gambar didefinisikan sebagai Persia dengan probabilitas 99%. Faktanya, dia bukan orang Persia, tetapi orang Inggris Longhair atau Highlander. Namun untuk model dengan kisaran 1000 kelas, bisa dibilang, bidiklah. Untuk kenyamanan, saya menempatkan hasil utama dari jaringan saraf langsung di foto. Ini adalah 5 kelas yang paling memungkinkan, yang pertama adalah yang paling mungkin, yang kedua adalah yang paling signifikan berikutnya, dan seterusnya.
Omong-omong, model menghitung kelas objek pada Zero saya selama 6,5 ββdetik. Jika Anda yakin dengan data Adrian, perhitungan pada Raspberry Pi B + pada gambar yang diberikan di posnya (foto tempat penata rambut, kobra dan ubur-ubur) akan memakan waktu sekitar 0,92 detik. Saya rela percaya bahwa versi lengkap Raspberry memiliki 4 core dalam prosesor. Saya percaya semua orang tahu bahwa Zero hanya memiliki satu (((
Tampaknya Anda harus melupakan tentang mendefinisikan kelas objek secara real time pada Zero. Ngomong-ngomong, aku harus mengakui bahwa sedetik waktu untuk mengerjakan model pada Pi "penuh" juga bukan impian utama.
Tapi mari kita lanjutkan pengujian model.

Kucing itu mengubah posisi tubuh dan kehilangan sebanyak 7% dari mantan "Persia" -nya). Tapi ini lelucon, tentu saja, secara umum, karya modelnya sangat bagus. Di tempat inilah mungkin untuk menyelesaikan, tetapi saya ingin sedikit menyulitkan tugas model. Ayo terus berlatih di ... kucing. Tapi kami akan mengumpulkan bingkai di mana kucing tidak duduk dalam pose klasik, tetapi tidur, misalnya. Jadi ayo pergi.

Dalam gambar ini, kucing didefinisikan sebagai Angora, tetapi ini tidak akurat. Rupanya dari kenyataan bahwa dia terganggu oleh permintaan obsesif untuk meninggalkan wastafel. Ya, jaringan saraf itu salah, ya, pada akhirnya siapa yang tidak kebetulan?

Ternyata bola sepak yang halus tinggal di rumah saya) Ya, kebetulan orang-orang sama sekali tidak seperti yang terlihat pada pandangan pertama. Pertarungan kucing dan jaringan saraf mengambil giliran serius.

Wow Sekarang dia adalah serak Siberia. Sesuatu memberitahuku bahwa kucing itu masih menghitung)

Tampaknya salah satu dari keduanya jelas-jelas terjatuh dan ini jelas bukan kucing. Sekarang didefinisikan oleh jaringan saraf sebagai spindle (meskipun hanya sebesar 8,5%), masih ada opsi bahwa itu adalah beagle, orca, python berbatu atau sigung. Bukan kucing, tapi perempuan adalah misteri!

Ayo! Ini masih orca! Ya, ya, mamalia laut dari ordo cetacean. Untuk beberapa alasan, saya mengingat garis-garis dari masa kanak-kanak yang jauh:
"Tidak ada urutan dalam kisah ini,
Ini kesalahan, salah ketik! Seseorang
Melawan semua aturan
Dalam dongeng, dia mengatur ulang surat-surat itu,
Diangkut
"KIT" pada "CAT",
"CAT" di "KIT", sebaliknya! ".
Gong berbunyi, wasit menghentikan pertarungan)

Di babak kedua, kucing, dengan mengenakan kacamata yang licik, lolos ke bulldog Boston dengan probabilitas 34%. Atau untuk orang Prancis. Tampaknya jaringan saraf belum sepenuhnya pulih dari kekalahan di babak pertama)

Ya akhirnya! Kucing didefinisikan sebagai siam dengan probabilitas sebanyak 66%! Bravo, SqueezeNet! Serius, tampaknya dalam dataset asli, foto-foto tidak berbohong, tetapi kucing duduk menang. Berbohong kebanyakan adalah anjing)

Kemampuan kucing untuk mengambil bentuk kotak membingungkan bahkan bagi manusia, apalagi jaringan saraf. Perendaman dalam kotak mengurangi akurasi pengenalan sebanyak 40%.

Jadi, begitu ... Dan ini, tampaknya, pada umumnya merupakan penerimaan yang dilarang. Mouse komputer yang terletak di sebelah kucing benar-benar membingungkan jaringan saraf. Sekarang kucing kami adalah tikus! )
Jadi, seluruh jaringan saraf disajikan dengan 11 foto kucing, di mana hanya 5 yang diidentifikasi dengan benar.Selain itu, dengan probabilitas lebih dari 50% hanya dalam tiga kasus. Sama sekali tidak mengurangi pekerjaan penulis SqueezeNet. Ini adalah jaringan yang solid dengan kelas objek yang sangat luas dan kebutuhan sumber daya yang relatif rendah.
Artikel itu, tentu saja, bersifat komik, tetapi kesimpulan yang cukup pragmatis dapat diambil dari data yang diperoleh. Penting untuk menggunakan jaringan saraf pra-terlatih dengan sangat hati-hati, memeriksanya pada gambar nyata dari tugas yang direncanakan untuk menggunakan jaringan saraf.
Mengenai pilihan jaringan saraf optimal untuk Raspberry - pertanyaannya tetap terbuka sejauh ini. Saya melanjutkan eksperimen, jika ada minat audiens dalam topik ini, saya akan membagikan hasil penelitian lebih lanjut. Hanya saja hasil dari langkah pertama ternyata sangat lucu sehingga saya benar-benar ingin membaginya.
Terima kasih sudah membaca sampai akhir. Semoga sukses dan selamat bekerja seminggu)
UPD: Lihat bagian
kedua dari posting ini untuk kode kerja untuk menjalankan jaringan saraf pada Raspberry Pi Zero W.