Ich habe versucht, Movidius NCS mit Python von Raspberry Pi3 auszuführen

Einführung

Ich habe Movidius gekauft, einen USB-Beschleuniger, mit dem Deep Learning von Intel für kleine und leichte Terminals verwendet werden kann. CVPR17, das nur vor Ort verkauft wurde, ist jetzt bei RS erhältlich. Dieses Mal werde ich die Python-Bibliothek zusammen mit der Beispielausführung berühren.

movidius (2).jpg

Was du tun kannst

Ausführungsumgebung

Da die RasPi-Seite nur das konvertierte Modell ausführt, installieren Sie nur die erforderliche API.

Verfahren

Konvertieren Sie das Modell von Caffe, um an Movidius zu arbeiten

  1. Umweltbau

Starten Sie hier die Docker-Umgebung auf dem Mac, installieren Sie dort das SDK und konvertieren Sie das Modell. Ich werde es unter Bezugnahme auf den Artikel von hier machen. Erstellen Sie zunächst eine Docker-Umgebung in einem geeigneten Verzeichnis.

mkdir Docker && cd Docker
git clone https://github.com/peisuke/MovidiusNCS-setup.git
cd MovidiusNCS-setup
docker build -t movidius .

... Es braucht Zeit, um die Umgebung aufzubauen. Starten Sie nach Abschluss der Einstellungen Docker. Richten Sie einen freigegebenen Ordner ein und starten Sie ihn, um die konvertierte Modelldatei mit der Mac-Seite auszutauschen.

docker run -it --rm -v [Das Verzeichnis auf der Mac-Seite, das Sie für die Docker-Umgebung freigeben möchten]:/home/ubuntu/data movidius:latest /bin/bash
  1. Caffe Modellkonvertierung

Laden Sie das Caffe-Modell herunter, von dem Sie konvertieren möchten. Im Fall von AlexNet ist dies wie folgt.

mkdir -p data/AlexNet && cd data/AlexNet
wget http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel
wget https://raw.githubusercontent.com/BVLC/caffe/master/models/bvlc_alexnet/deploy.prototxt

Im Beispiel handelt es sich um einen Prozess für ein Image. Ändern Sie daher die Anzahl der Stapel im Netzwerk von 10 auf 1.

data/AlexNet/deploy.prototxt


input_param { shape: { dim: 1 dim: 3 dim: 224 dim: 224 } }

Konvertieren Sie jetzt das Modell von Caffe. Wie wir später vergleichen werden, erhöht das Hinzufügen der Option (-s 12) die Ausführungsgeschwindigkeit um das 3- bis 4-fache.

cd data/AlexNet
python3 ../../bin/mvNCCompile.pyc ./deploy.prototxt (-s 12) 
-w ./bvlc_alexnet.caffemodel -o graph

Schnelle Ausführung von RasPi über Python

Von hier aus werden wir an RasPi arbeiten. Ich werde die allgemeine Installationsmethode von Raspbian weglassen. Da die RasPi-Seite nur das konvertierte Modell ausführt, werden hier nur die erforderlichen Elemente wie die API installiert.

wget https://ncs-forum-uploads.s3.amazonaws.com/ncsdk/MvNC_SDK_01_07_07/MvNC_SDK_1.07.07.tgz
tar xvf MvNC_SDK_1.07.07.tgz
tar xvf MvNC_API-1.07.07.tgz
cd ncapi/redist/pi_jessie
sudo dpkg -i *

Es scheint, dass die andere Datei MvNC_Toolkit-1.07.06.tgz, die Sie beim Entpacken von MvNC_SDK_1.07.07.tgz erhalten, für die Ausführung nicht benötigt wird. (Wird nur für die Modellkonvertierung verwendet)

Verschieben Sie die zuvor konvertierte Grafikdatei mit scp oder ähnlichem auf die RasPi-Seite.

scp ./graph pi@***.***.**.**:~/***/ncapi/network/AlexNet/

Versuchen Sie für das Python-Beispiel Folgendes. ncapi/py_examples/classification_example.py

Wenn Sie es jedoch so ausführen, wie es ist, wird eine Fehlermeldung angezeigt, dass einige Dateien fehlen.

$ python3 classification_example.py 2                           
Found stale device, resetting
Device 0 Address: 1.4 - VID/PID 03e7:2150
Starting wait for connect with 2000ms timeout
Found Address: 1.4 - VID/PID 03e7:2150
Found EP 0x81 : max packet size is 512 bytes
Found EP 0x01 : max packet size is 512 bytes
Found and opened device
Performing bulk write of 825136 bytes...
Successfully sent 825136 bytes of data in 47.187813 ms (16.676149 MB/s)
Boot successful, device address 1.4
Found Address: 1.4 - VID/PID 040e:f63b
done
Booted 1.4 -> VSC
Traceback (most recent call last):
  File "classification_example.py", line 52, in <module>
    ilsvrc_mean = numpy.load('../mean/ilsvrc12/ilsvrc_2012_mean.npy').mean(1).mean(1) #loading the mean file
  File "/usr/local/lib/python3.4/dist-packages/numpy/lib/npyio.py", line 370, in load
    fid = open(file, "rb")
FileNotFoundError: [Errno 2] No such file or directory: '../mean/ilsvrc12/ilsvrc_2012_mean.npy'

Wenn ich das Toolkit eingerichtet habe, das ich zuvor nicht installiert habe, wird die entsprechende ILSVRC-Etikettendatei heruntergeladen. Da ich es jedoch übersprungen habe, lade ich nur die erforderlichen Dateien an den Ort herunter, an dem der Fehler auftritt.

wget https://github.com/BVLC/caffe/blob/master/python/caffe/imagenet/ilsvrc_2012_mean.npy
wget https://github.com/HoldenCaulfieldRye/caffe/blob/master/data/ilsvrc12/synset_words.txt

Lauf

Wenn dies erfolgreich ist, sieht es folgendermaßen aus:

$ python3 classification_example.py 1
Device 0 Address: 1.4 - VID/PID 03e7:2150
Starting wait for connect with 2000ms timeout
Found Address: 1.4 - VID/PID 03e7:2150
Found EP 0x81 : max packet size is 512 bytes
Found EP 0x01 : max packet size is 512 bytes
Found and opened device
Performing bulk write of 825136 bytes...
Successfully sent 825136 bytes of data in 47.039351 ms (16.728781 MB/s)
Boot successful, device address 1.4
Found Address: 1.4 - VID/PID 040e:f63b
done
Booted 1.4 -> VSC

------- predictions --------
prediction 1 is n02123045 tabby, tabby cat
prediction 2 is n02124075 Egyptian cat
prediction 3 is n02127052 lynx, catamount
prediction 4 is n02123394 Persian cat
prediction 5 is n02971356 carton

Python Module

Werfen wir einen Blick auf den Inhalt des Python-Beispiels. Die Teile, die sich auf die Verwendung von Netzwerkdateien beziehen, sind wie folgt.

from mvnc import mvncapi as mvnc
import cv2

mvnc.SetGlobalOption(mvnc.GlobalOption.LOGLEVEL, 2)
devices = mvnc.EnumerateDevices() #Überprüfen Sie den angeschlossenen Movidius
if len(devices) == 0:
	print('No devices found')
	quit()
device = mvnc.Device(devices[0])
device.OpenDevice()
opt = device.GetDeviceOption(mvnc.DeviceOption.OPTIMISATIONLIST)


network_blob='../networks/AlexNet/graph' #Name der konvertierten Modelldatei
f = open(network_blob, mode='rb')	
blob = f.read()
graph = device.AllocateGraph(blob) #Stellen Sie das konvertierte Modell in Movidius ein
graph.SetGraphOption(mvnc.GraphOption.ITERATIONS, 1)
iterations = graph.GetGraphOption(mvnc.GraphOption.ITERATIONS)

img = cv2.imread('***.jpg')
graph.LoadTensor(img.astype(numpy.float16), 'user object') #Speichern Sie Bilddaten in der Eingabe
output, userobj = graph.GetResult() #Vorwärtsberechnung hier
graph.DeallocateGraph() #Verarbeitung beenden
device.CloseDevice()

Bearbeitungszeitvergleich (Vorwärtsberechnung)

Obwohl dasselbe Netzwerk auf einem PC und Movidius mit unterschiedlichen Optionen ausgeführt wurde, ist die Verarbeitungszeit für jedes Bild wie folgt.

AlexNet (224x224 RGB) GoogleNet (227x227 RGB)
MacBookPro (CPU 2.7GHz Corei5) 0.091s 0.315s
Pi3 + Movidius (-s 12 Keine Optionen) 0.287s 0.574s
Pi3 + Movidius (-s 12 Option verfügbar) 0.097s 0.113s

Es ist nicht so schnell wie die GPU, aber schneller als der Core i5. RasPi ist endlich in der Lage, Deep Learning in vollem Umfang zu berechnen. In Zukunft werden verschiedene Verwendungen erwartet.

Recommended Posts

Ich habe versucht, Movidius NCS mit Python von Raspberry Pi3 auszuführen
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, mit Python Faiss zu laufen, Go, Rust
Holen Sie sich CPU-Informationen von Raspberry Pi mit Python
Ich habe versucht, Deep Floor Plan mit Python 3.6.10 auszuführen.
Messen Sie die CPU-Temperatur von Raspeye mit Python
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Lassen Sie uns GPIO von Raspeye mit Python CGI betreiben
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Ich habe versucht, mit Raspberry Pi 4 eine Umgebung von Ubuntu 20.04 LTS + ROS2 zu erstellen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Verwenden Sie vl53l0x mit RaspberryPi (Python)
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Raspeye und conect + mit der Web-API zu verbinden
Ich habe es mit Grumpy versucht (Python ausführen).
Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich habe versucht, den DNN-Teil von OpenPose mit Chainer-CPU auszuführen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Arbeiten mit GPS in Python für Raspberry Pi 3
CSV-Ausgabe von Pulsdaten mit Raspberry Pi (Analogeingang mit Python prüfen)
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, Runenfiguren mit Scikit-Learn handschriftlich zu erkennen
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Discord Bot Himbeere Pi Null mit Python [Hinweis]
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, Bilder von CIFAR-10 mit Keras-Bilderkennung zu erkennen.
Ich habe versucht, das Umfangsverhältnis mit 100 Millionen Stellen zu ermitteln
Ich habe Flask mit Remote-Containern von VS Code ausprobiert
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
CSV-Ausgabe von Impulsdaten mit Raspberry Pi (CSV-Ausgabe)