Jadi tahap baru telah datang dalam pengembangan
Raspberry-tank .
Pada
seri sebelumnya, ternyata segmentasi semantik di luar kotak terlalu tangguh untuk Raspberry.
Curah pendapat dan komentar memungkinkan kami mengidentifikasi bidang-bidang pengembangan berikut:
- latih jaringan E-net Anda sendiri untuk ukuran gambar yang diinginkan
- mentransfer peluncuran jaringan saraf dari Raspberry sendiri ke perangkat keras khusus, yang mana Intel Movidius (alias Neural Compute Stick alias NCS) paling sering disebutkan.
Melampirkan sepotong besi baru ke robot adalah hal yang paling menarik dalam robotika, sehingga pekerjaan yang melelahkan untuk melatih jaringan saraf telah ditunda hingga waktu yang lebih baik.
Beberapa hari - dan sepotong besi Intel di tangan saya.
Ini cukup besar, dan Anda tidak bisa menempelkannya di konektor USB bawah raspberry. Mengingat port USB kanan dikaburkan oleh tripod kamera, dan bagian kiri atas ditempati oleh modul GPS, tidak ada begitu banyak pilihan.
Akibatnya, GPS diletakkan di atas kabel, dimatikan, dan kabelnya dililit tripod, dan NCS menggantikannya.
Pada bagian perangkat keras ini selesai.

Intel NCS
Intel baru-baru ini merilis versi kedua NCS, dan API benar-benar tidak kompatibel dengan versi sebelumnya, yang mana pengguna menumpahkan banyak rasa sakit di Internet.
Akibatnya, seluruh basis pengetahuan tentang versi sebelumnya saat ini hanya sampah informasi.
Edisi baru ini menawarkan kerangka kerja OpenVino, yang mencakup OpenCV dan banyak lagi, termasuk berbagai alat untuk bekerja dengan jaringan saraf.
Berikut adalah beberapa artikel pengantar tentang NCS2 dan OpenVino:
Memulai dengan NCS ternyata cukup lancar.
Intel awalnya membuat dukungan untuk Raspbian, jadi tidak perlu menari dengan rebana.
Dokumen pengantar juga sangat jelas dan pemasangan kerangka kerja OpenVino tidak menyebabkan masalah.
Ternyata itu adalah bonus yang bagus bahwa OpenVino menyertakan OpenCV 4.1, yang menghemat waktu, karena saya harus membuat versi OpenCV sebelumnya di Raspberry sendiri.
Inilah yang terlihat seperti NCS2 sendiri:

Lebih jauh ternyata menjadi lebih menarik.
NCS hanya mendukung format jaringan sarafnya sendiri, sementara Intel menyediakan alat Model Optimizer sebagai bagian dari OpenVino untuk mengonversi grafik kerangka kerja paling populer: Tensorflow, Caffe, Torch. Lebih lanjut tentang ini akan menjadi yang berikutnya.
Selain itu, Intel juga menyediakan
kebun binatang model - satu set model yang sudah jadi untuk banyak kesempatan.
Di antara mereka ada dua model untuk segmentasi jalan:
Jaringan saraf di NCS
Untuk menjalankan jaringan saraf pada perangkat, Anda perlu mengambil beberapa langkah.
Inisialisasi perangkat
Nama MYRIAD, gagasan plug-in dan pemuatan dinamisnya, jalur yang harus ditentukan dalam program - jelas terbentang dari masa lalu yang gelap.
from openvino.inference_engine import IENetwork, IEPlugin ncs_plugin = IEPlugin(device="MYRIAD", plugin_dirs="/opt/intel/openvino/inference_engine/lib/armv7l")
Unduh Model
Selanjutnya, Anda perlu mengunggah model ke perangkat.
Ini adalah operasi yang sulit. Model kecil yang saya gunakan untuk segmentasi membutuhkan waktu sekitar 15 detik untuk memuat.
Berita baiknya adalah Anda hanya perlu mengunduh model satu kali dan Anda dapat mengunduh beberapa model.
model = IENetwork(model=xml_path, weights=bin_path) net = ncs_plugin.load(network=model)
Jalankan perhitungan
Sekarang modelnya bisa digunakan.
input_blob = next(iter(model.inputs)) out_blob = next(iter(model.outputs)) n, c, h, w = model.inputs[input_blob].shape images = np.ndarray(shape=(n, c, h, w)) images[0] = image res = net.infer(inputs={input_blob: images}) res = res[out_blob]
Proses tunggal
Tiba-tiba ternyata Anda tidak dapat menggunakan NCS dari dua proses yang berbeda secara bersamaan.
Siapa pun yang terlambat tidak dapat memuat model:
E: [ncAPI] [ 684447] resetAll:348 Failed to connect to stalled device, rc: X_LINK_ERROR E: [ncAPI] [ 691700] ncDeviceOpen:672 Failed to find suitable device, rc: X_LINK_DEVICE_NOT_FOUND Traceback (most recent call last): net = ncs_plugin.load(network=model) File "ie_api.pyx", line 395, in openvino.inference_engine.ie_api.IEPlugin.load File "ie_api.pyx", line 406, in openvino.inference_engine.ie_api.IEPlugin.load RuntimeError: Can not init USB device: NC_ERROR
Baik Google maupun forum dukungan Intel memungkinkan untuk memahami apa yang terjadi - apakah perangkat itu benar-benar eksklusif atau saya tidak tahu cara memasaknya.
Segmentasi OpenVino
Seperti yang telah disebutkan, di luar kotak, OpenVino menyediakan model dan contoh segmentasi jalan.
Hasil tes agak kontradiktif. Kadang-kadang diakui bengkok, tetapi mayoritas itu normal.
Enet bekerja lebih baik, tetapi kita masih harus mencoba Enet di bawah NCS, jadi mari kita coba dengan apa yang kita miliki.

Menariknya, untuk mempelajari lebih lanjut tentang model dari OpenVino dan melatihnya tidak sesederhana itu.
Pengguna
tertarik , tetapi orang dari Intel secara tegas mengatakan bahwa kode dan data model ditutup, dan mereka yang ingin dapat mengambil
jaringan saraf yang sama di PyTorch , melatih, mengubah, dan menggunakannya.
Keuntungan kecepatan sangat signifikan:
Jika segmentasi Enet membutuhkan waktu 6 detik, maka model ini membutuhkan 0,8 detik untuk memproses satu gambar (sementara itu butuh 14 detik untuk memuat model ke perangkat, tetapi ini dilakukan pada waktu yang sama).
Klasifikasi arah
Untuk membuat keputusan tentang arah gerakan, tangki menggunakan jaringan saraf sederhana, seperti yang dijelaskan dalam
artikel terkait .
Jaringan saraf dilatih pada Keras dan berjalan pada Raspberry melalui Tensorflow, yang memiliki adaptor bawaan untuk format ini.
Modelnya sangat sederhana dan bahkan pada Raspberry menunjukkan hasil kecepatan yang dapat diterima.
(0,35 detik per gambar).
Namun demikian, dengan memiliki kelenjar Intel, Anda dapat mengharapkan untuk mencapai hasil yang lebih baik.
Di antara format yang diterima Pengoptimal Model Intel untuk konversi, ada Tensorflow, tetapi tidak ada Keras.
Konversi Keras ke TF adalah hal yang cukup populer, ada cukup banyak materi tentang topik ini, saya dipandu oleh
artikel ini .
Penulis yang sama memiliki
artikel yang lebih luas , hanya tentang topik bagaimana menjalankan model Keras di OpenVino.
Anda juga dapat menggunakan
panduan dari Intel .
Secara umum, saat mengkompilasi sumber, saya mendapatkan skrip untuk mengubah model Keras ke TF:
import tensorflow as tf from tensorflow.python.framework.graph_util import convert_variables_to_constants from keras import backend as K from keras.models import load_model from keras.models import model_from_json def load_keras_model(json_file, model_file): jf = open(json_file, 'r') loaded_model_json = jf.read() jf.close() loaded_model = model_from_json(loaded_model_json) loaded_model.load_weights(model_file) return loaded_model def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True): graph = session.graph with graph.as_default(): freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or [])) output_names = output_names or [] output_names += [v.op.name for v in tf.global_variables()]
Kode yang sama terletak
di github .
Model TF yang dihasilkan selanjutnya disaring ke dalam format OpenVino:
python mo_tf.py --input_model "model/ktf_model.pb" --log_level=DEBUG -b1 --data_type FP16
Pengujian menunjukkan bahwa klasifikasi gambar membutuhkan 0,007 detik.
Hasil ini sangat menyenangkan.
Semua model terlatih (Keras, TF, OpenVino) juga diunggah
ke github .
Pengakuan Objek
Tugas segmentasi bukan satu-satunya yang harus diselesaikan robot dalam kehidupannya yang sulit.
Pada awalnya ada detektor kucing, yang kemudian tumbuh menjadi detektor universal berdasarkan MobileSSD dan OpenCV-DNN.
Sekarang saatnya untuk mengubah tugas yang sama pada NCS.
Dalam
model_zoo Intel, detektor dari spesifisitas yang lebih sempit berdasarkan MobileSSD sudah cukup, tetapi tidak ada analog yang tepat.
Namun, jaringan ini terdaftar sebagai kompatibel dalam
daftar model TF yang didukung .
Menariknya, pada saat penulisan, versi MobileSSD 2018_01_28 ditunjukkan di sini.
Namun, OpenCV menolak untuk membaca model ini:
cv2.error: OpenCV(4.1.0-openvino) /home/jenkins/workspace/OpenCV/OpenVINO/build/opencv/modules/dnn/src/tensorflow/tf_importer.cpp:530: error: (-2:Unspecified error) Const input blob for weights not found in function 'getConstBlob'
(Tapi kami menemukan bahwa mereka menggunakan Jenkins).
Pada saat yang sama, konversi ke OpenVino berhasil.
Jika kami mencoba mengonversi versi Mobile SSD yang kompatibel dengan OpenCV-DNN (11_06_2017), maka kami mendapatkan ini:
[E0919 main.py:317] Unexpected exception happened during extracting attributes for node FeatureExtractor/MobilenetV1/Conv2d_13_pointwise_1_Conv2d_2_1x1_256/Relu6. Original exception message: operands could not be broadcast together with remapped shapes [original->remapped]: (0,) and requested shape (1,0,10,256)
Sesuatu seperti ini, secara teknis OpenVino dan OpenCV-DNN berada dalam paket yang sama, tetapi tidak kompatibel dengan versi jaringan saraf yang digunakan.
Artinya, jika Anda ingin menggunakan kedua pendekatan secara bersamaan, Anda harus menyeret dua versi MobileSSD.
Dalam hal kecepatan, perbandingan ini jelas mendukung NCS: 0,1 detik berbanding 1,7.
Dari segi kualitas ... (Meskipun ini bukan masalah NCS, tetapi evolusi SSD Mobile).

Klasifikasi gambar
Tangki ini dapat mengklasifikasikan gambar melalui Tensorflow, menggunakan Inception on Imagenet.
Dan saya menggunakan Inception 2015-12-05, ketika itu adalah satu lagi.
Ternyata saya jauh di belakang kehidupan, karena orang-orang dari Google bukan tanpa alasan memakan roti mereka dan sudah menghasilkan 4 versi!
Tetapi orang-orang dari Intel tidak di belakang mereka dan semua 4 versi didukung di OpenVino.
Berikut adalah
artikel yang menjelaskan berbagai versi Inception.
Tapi kami tidak akan menganggap enteng, kami segera mengunduh yang terakhir, keempat.
Kami mengklasifikasikan gambar dengan kucing dan laptop di atas meja.
Kami ingat hasil versi saat ini:
- laptop, komputer laptop 62%
- notebook, komputer notebook 11%
- 13 detik
- dimana kucingnya
Sekarang kita membaca
instruksi untuk mengonversi Inception ke OpenVino.
Konversi berhasil, kami memulai pengklasifikasi pada NCS:
- laptop, komputer laptop 85%
- notebook, komputer notebook 8%
- 0,2 detik
- tidak ada kucing lagi
Kesimpulan
Dengan demikian, semua skenario yang diperlukan Tensorflow direproduksi menggunakan NCS, dan ini berarti Anda dapat memilih tidak menggunakan Tensorflow.
Semua sama, kerangka kerja ini berat untuk Raspberry.
Kecepatan NCS mencerna jaringan saraf memungkinkannya memperluas cakrawala.
Ada tugas yang sudah dilakukan robot, misalnya, segmentasi dan klasifikasi semantik, tetapi ada yang lain seperti segmentasi objek atau transmisi video dengan objek yang terdeteksi secara real time. (yang tidak bisa dipikirkan pada Raspberry telanjang).
Masalah dengan multi-pemrosesan agak membingungkan, tetapi bahkan jika mereka tidak dapat diselesaikan, selalu ada opsi dalam bentuk membungkus NCS sebagai layanan terpisah.
Referensi