Seals vs neural network 2. Atau jalankan SqueezeNet v.1.1 pada Raspberry Zero secara realtime (hampir)

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.

gambar

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:

gambar

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:

gambar

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 sini
import picamera from picamera.array import PiRGBArray import numpy as np import time from time import sleep import datetime as dt import cv2 #    prototxt = 'models/squeezenet_v1.1.prototxt' model = 'models/squeezenet_v1.1.caffemodel' labels = 'models/synset_words.txt' #    rows = open(labels).read().strip().split("\n") classes = [r[r.find(" ") + 1:].split(",")[0] for r in rows] #    print("[INFO] loading model...") net = cv2.dnn.readNetFromCaffe(prototxt, model) print("[INFO] starting video stream...") #   camera = picamera.PiCamera() camera.resolution = (640, 480) camera.framerate = 25 #   camera.start_preview() sleep(1) camera.stop_preview() #     raw rawCapture = PiRGBArray(camera) #   FPS t0 = time.time() #     for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): #    blob frame = rawCapture.array blob = cv2.dnn.blobFromImage(frame, 1, (224, 224), (104, 117, 124)) #    blob,     net.setInput(blob) preds = net.forward() preds = preds.reshape((1, len(classes))) idxs = int(np.argsort(preds[0])[::-1][:1]) #  FPS FPS = 1/(time.time() - t0) t0 = time.time() #    ,   FPS,    text = "Label: {}, p = {:.2f}%, fps = {:.2f}".format(classes[idxs], preds[0][idxs] * 100, FPS) cv2.putText(frame, text, (5, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) print(text) cv2.imshow("Frame", frame) #     Raspberry fname = 'pic_' + dt.datetime.now().strftime('%Y-%m-%d_%H-%M-%S') + '.jpg' cv2.imwrite(fname, frame) #    SD  key = cv2.waitKey(1) & 0xFF #    `q`    if key == ord("q"): break #   raw       rawCapture.truncate(0) print("[INFO] video stream is terminated") #    cv2.destroyAllWindows() camera.close() 


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.

gambar

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):

gambar

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:

gambar

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

gambar

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

gambar

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

gambar

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.

gambar

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.

gambar

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.

gambar

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).

gambar

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

gambar

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)

gambar

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.

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


All Articles