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.
Da die RasPi-Seite nur das konvertierte Modell ausführt, installieren Sie nur die erforderliche API.
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
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
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
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()
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