Halo semuanya!
Setelah menulis bagian
pertama, yang tidak terlalu serius dan tidak terlalu berguna dalam hal praktis, hati nurani saya sedikit menelan saya. Dan saya memutuskan untuk menyelesaikan apa yang saya mulai. Artinya, untuk memilih implementasi yang sama dari jaringan saraf untuk berjalan pada Rasperry Pi Zero W secara real time (tentu saja, sebanyak mungkin pada perangkat keras tersebut). Untuk mengusirnya dari data dari kehidupan nyata dan menerangi hasilnya di Habré.
Perhatian Ada kode yang bisa diterapkan dan beberapa kucing di bawah potongan daripada di bagian pertama. Dalam gambar, cot dan cod, masing-masing.
Jaringan apa yang harus dipilih?
Saya ingat bahwa karena kelemahan zat besi raspberry, pilihan realisasi jaringan saraf kecil. Yaitu:
1. SqueezeNet.
2. YOLOv3 Mungil.
3. MobileNet.
4. ShuffleNet.
Seberapa benar pilihan dalam mendukung SqueezeNet pada bagian
pertama ? .. Untuk menjalankan masing-masing jaringan saraf yang disebutkan di atas pada perangkat keras Anda adalah peristiwa yang agak panjang. Karena itu, tersiksa oleh keraguan yang samar-samar, saya memutuskan untuk google jika seseorang telah mengajukan pertanyaan seperti itu sebelumnya. Ternyata dia bertanya-tanya dan menyelidikinya secara rinci. Mereka yang ingin dapat merujuk ke
sumbernya . Saya akan membatasi diri saya pada satu gambar dari itu:

Dari gambar itu berarti bahwa waktu pemrosesan untuk satu gambar untuk model berbeda yang dilatih pada dataset ImageNet adalah yang paling sedikit dengan SqueezeNet v.1.1. Kami akan menganggap ini sebagai panduan untuk bertindak. YOLOv3 tidak termasuk dalam perbandingan, tetapi, sejauh yang saya ingat, YOLO lebih mahal daripada MobileNet. Yaitu kecepatan juga harus lebih rendah daripada SqueezeNet.
Implementasi jaringan yang dipilih
Bobot dan topologi SqueezeNet yang dilatih tentang dataset ImageNet (kerangka kerja Caffe) dapat ditemukan di
GitHub . Untuk berjaga-jaga, saya mengunduh kedua versi sehingga nantinya dapat dibandingkan. Mengapa ImageNet? Himpunan semua yang tersedia ini memiliki jumlah kelas maksimum (1000 pcs.), Jadi hasil dari jaringan syaraf menjanjikan cukup menarik.
Kali ini kita akan melihat bagaimana Raspberry Zero berurusan dengan pengenalan bingkai dari kamera. Inilah dia, pekerja keras kami yang rendah hati dari jabatan hari ini:

Saya mengambil kode sumber dari blog Adrian Rosebrock yang disebutkan di bagian
pertama sebagai dasar dari kode tersebut, yaitu
dari sini . Tetapi saya harus membajaknya secara signifikan:
1. Ganti model Anda dengan MobileNetSSD di SqueezeNet.
2. Penerapan Klausa 1 telah menyebabkan perluasan jumlah kelas menjadi 1000. Tetapi pada saat yang sama, fungsi menyoroti objek dengan bingkai multi-warna (fungsional SSD), sayangnya, telah dihapus.
3. Untuk menghapus penerimaan argumen melalui baris perintah (untuk beberapa alasan, input parameter seperti itu mengganggu saya).
4. Hapus metode VideoStream, dan dengan itu perpustakaan imutils dicintai oleh Adrian. Awalnya, metode ini digunakan untuk mendapatkan aliran video dari kamera. Tetapi dengan kamera saya terhubung ke Raspberry Zero, itu bodoh tidak berhasil, memberikan sesuatu seperti "instruksi ilegal".
5. Tambahkan frame rate (FPS) ke gambar yang dikenali, tulis ulang perhitungan FPS.
6. Buat bingkai penyimpanan untuk menulis posting ini.
Pada raspberry dengan Rapbian Stretch OS, Python 3.5.3 dan diinstal melalui pip3 instal OpenCV 3.4.1, yang berikut ini ternyata dan mulai:
Kode di siniimport picamera from picamera.array import PiRGBArray import numpy as np import time from time import sleep import datetime as dt import cv2
Hasil
Kode ditampilkan di layar monitor yang terhubung ke Raspberry, bingkai yang dikenali berikutnya dalam formulir ini. Di bagian atas bingkai, hanya kelas yang paling mungkin ditampilkan.

Jadi, mouse komputer diidentifikasi sebagai mouse dengan probabilitas yang sangat tinggi. Pada saat yang sama, gambar diperbarui pada frekuensi 0,34 FPS (mis., Kira-kira setiap tiga detik). Agak menyebalkan memegang kamera dan menunggu frame berikutnya diproses, tetapi Anda bisa hidup. Omong-omong, jika Anda menghapus bingkai simpan pada kartu SD, kecepatan pemrosesan akan meningkat menjadi 0,37 ... 0,38 FPS. Tentunya, ada cara lain untuk bubar. Kami akan menunggu dan melihat, dalam hal apa pun, kami akan meninggalkan pertanyaan ini untuk posting selanjutnya.
Secara terpisah, saya minta maaf untuk white balance. Faktanya adalah bahwa kamera IR dengan lampu latar dihidupkan terhubung ke Rapberry, sehingga sebagian besar frame terlihat agak aneh. Tetapi semakin berharga setiap hit dari jaringan saraf. Jelas, white balance pada set pelatihan lebih tepat. Selain itu, saya memutuskan untuk memasukkan bingkai mentah saja, sehingga pembaca melihat mereka dengan cara yang sama seperti mereka melihat jaringan saraf.
Pertama, mari kita bandingkan karya SqueezeNet versi 1.0 (di frame kiri) dan 1.1 (di kanan):

Dapat dilihat bahwa versi 1.1 bekerja dua dan seperempat kali lebih cepat dari 1,0 (0,34 FPS dibandingkan 0,15). Gain kecepatan bisa diraba. Tidak layak membuat kesimpulan tentang akurasi pengenalan dalam contoh ini, karena akurasi sangat tergantung pada posisi kamera relatif terhadap objek, pencahayaan, silau, bayangan, dll.
Mengingat keunggulan kecepatan yang signifikan seperti v1.1 di atas v.1.0 di masa depan, hanya SqueezeNet v.1.1 yang digunakan. Untuk menilai kinerja model, saya mengarahkan kamera ke berbagai objek yang
datang ke tangan dan menerima frame berikut pada output:

Keyboard lebih buruk daripada mouse. Mungkin di set pelatihan, sebagian besar keyboard berwarna putih.

Ponsel didefinisikan dengan cukup baik jika Anda menghidupkan layar. Sel dengan layar mati tidak menghitung jaringan saraf sebagai sel.

Gelas kosong secara lumayan didefinisikan sebagai cangkir kopi. Sejauh ini, semuanya berjalan cukup baik.

Gunting lebih buruk, mereka secara keras kepala didefinisikan oleh jaring sebagai jepit rambut. Namun, masuk ke pohon apel jika bukan bullseye)
Mari menyulitkan tugas
Mari kita coba letakkan sesuatu yang rumit di jaringan saraf
babi . Saya baru saja menemukan mainan anak-anak buatan sendiri. Saya percaya bahwa sebagian besar pembaca mengenalinya sebagai kucing mainan. Saya bertanya-tanya apa yang akan dipertimbangkan oleh kecerdasan buatan kita yang belum sempurna.

Di bingkai di sebelah kiri, lampu IR menghapus semua strip dari kain. Akibatnya, mainan itu didefinisikan sebagai masker oksigen dengan probabilitas yang cukup baik. Kenapa tidak Bentuk mainannya benar-benar menyerupai topeng oksigen.
Di bingkai di sebelah kanan, saya menutupi jari-jari saya dengan sorotan IR, sehingga garis-garis muncul di mainan, dan white balance menjadi lebih dapat dipercaya. Sebenarnya, ini adalah satu-satunya bingkai yang terlihat kurang lebih normal dalam posting ini. Tetapi jaringan saraf memiliki begitu banyak detail dalam gambar yang membingungkan. Dia mengidentifikasi mainan itu sebagai kaus. Saya harus mengatakan bahwa ini juga tidak terlihat seperti "jari di langit." Hit jika tidak di "pohon apel", maka setidaknya di kebun apel).
Yah, kami dengan lancar mendekati klimaks dari tindakan kami. Pemenang pertempuran yang menonjol, ditahbiskan secara rinci di
pos pertama, memasuki ring. Dan dengan mudah mengeluarkan otak dari jaringan saraf kita dari frame pertama.

Sangat mengherankan bahwa kucing praktis tidak mengubah posisinya, tetapi setiap kali ditentukan berbeda. Dan dari perspektif ini, paling mirip dengan sigung. Di tempat kedua adalah kemiripan dengan hamster. Mari kita coba untuk mengubah sudutnya.

Ya, jika Anda mengambil gambar kucing dari atas, itu ditentukan dengan benar, tetapi jika Anda hanya mengubah sedikit posisi tubuh kucing dalam bingkai, untuk jaringan saraf ia menjadi seekor anjing - masing-masing dari husky dan malamute Siberia (anjing seluncur Eskimo).

Dan seleksi ini indah karena seekor anjing ras berbeda didefinisikan pada setiap kerangka kucing yang terpisah. Dan trah tidak mengulangi)

Ngomong-ngomong, ada pose di mana jaringan saraf menjadi jelas bahwa ini masih kucing, bukan anjing. Yaitu, SqueezeNet v.1.1 masih berhasil membuktikan dirinya bahkan pada objek yang sulit untuk dianalisis. Mengingat keberhasilan jaringan saraf dalam mengenali objek pada awal pengujian dan mengenali seekor kucing sebagai kucing pada akhirnya, kali ini kami menyatakan hasil imbang pertempuran yang solid)
Yah, itu saja. Saya mengundang semua orang untuk mencoba kode yang diusulkan pada raspberry mereka dan benda apa pun yang telah masuk ke tampilan benda hidup dan benda mati. Saya terutama akan berterima kasih kepada mereka yang mengukur FPS di Rapberry Pi B +. Saya berjanji untuk memasukkan hasil dalam posting ini dengan merujuk pada orang yang mengirim data. Saya percaya bahwa ini akan menghasilkan lebih dari 1 FPS secara signifikan!
Saya berharap bahwa beberapa informasi dari pos ini akan berguna untuk tujuan hiburan atau pendidikan, dan seseorang bahkan dapat memunculkan ide-ide baru.
Semoga minggu kerja Anda menyenangkan! Dan sampai ketemu lagi)

UPD1: Pada Raspberry Pi 3B +, skrip di atas bekerja pada frekuensi 2 dengan FPS kecil.
UPD2: Pada RPi 3B + dengan Movidius NCS, skrip berjalan pada 6 FPS.