J'ai acheté Movidius, un accélérateur USB qui permet d'utiliser le Deep Learning publié par Intel sur des terminaux petits et légers. Le CVPR17, qui n'était pré-vendu que localement, est maintenant en vente chez RS. Cette fois, je vais toucher la bibliothèque python avec l'exemple d'exécution.
--Convertir le modèle de Caffe pour qu'il fonctionne sur Movidius --Contrôler Movidius depuis RasPi via Python --AlexNet peut calculer à 97 ms et GoogleNet à 113 ms par image
Étant donné que le côté RasPi n'exécute que le modèle converti, installez uniquement les API nécessaires.
Ici, lancez l'environnement Docker sur le Mac, installez le SDK là-bas et convertissez le modèle. Je vais le faire en se référant à l'article de ici. Tout d'abord, créez un environnement Docker dans un répertoire approprié.
mkdir Docker && cd Docker
git clone https://github.com/peisuke/MovidiusNCS-setup.git
cd MovidiusNCS-setup
docker build -t movidius .
... Il faut du temps pour construire l'environnement. Après avoir terminé les paramètres, démarrez docker. Configurez un dossier partagé et démarrez-le pour échanger le fichier de modèle converti avec le côté Mac.
docker run -it --rm -v [Le répertoire côté Mac que vous souhaitez partager avec l'environnement Docker]:/home/ubuntu/data movidius:latest /bin/bash
Téléchargez le modèle Caffe à partir duquel vous souhaitez effectuer la conversion. Dans le cas d'AlexNet, c'est comme suit.
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
Dans l'exemple, il s'agit d'un processus pour une image, changez donc le nombre de lots sur le réseau de 10 à 1.
data/AlexNet/deploy.prototxt
input_param { shape: { dim: 1 dim: 3 dim: 224 dim: 224 } }
Transformez maintenant le modèle de Caffe. Comme nous le comparerons plus tard, l'ajout de l'option (-s 12) augmentera la vitesse d'exécution de 3 à 4 fois.
cd data/AlexNet
python3 ../../bin/mvNCCompile.pyc ./deploy.prototxt (-s 12)
-w ./bvlc_alexnet.caffemodel -o graph
De là, nous travaillerons sur RasPi. Je vais omettre la méthode d'installation générale de Raspbian. Étant donné que le côté RasPi n'exécute que le modèle converti, nous n'installerons ici que les éléments nécessaires tels que l'API.
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 *
Il semble que l'autre fichier MvNC_Toolkit-1.07.06.tgz que vous obtenez lorsque vous décompressez MvNC_SDK_1.07.07.tgz ici n'est pas nécessaire pour l'exécution. (Utilisé uniquement pour la conversion de modèle)
Déplacez le fichier graphique converti précédemment du côté RasPi avec scp ou similaire.
scp ./graph pi@***.***.**.**:~/***/ncapi/network/AlexNet/
Pour l'exemple Python, essayez ce qui suit. ncapi/py_examples/classification_example.py
Cependant, si vous l'exécutez tel quel, vous obtiendrez une erreur indiquant que certains fichiers sont manquants.
$ 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'
Lorsque j'ai configuré la boîte à outils que je n'ai pas installée précédemment, elle télécharge le fichier d'étiquette ILSVRC approprié, mais comme je l'ai sauté, je ne téléchargerai que les fichiers nécessaires à l'emplacement où l'erreur apparaît.
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
En cas de succès, cela ressemblera à ceci:
$ 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
Jetons un coup d'œil au contenu de l'exemple Python. Les parties liées à l'utilisation des fichiers réseau sont les suivantes.
from mvnc import mvncapi as mvnc
import cv2
mvnc.SetGlobalOption(mvnc.GlobalOption.LOGLEVEL, 2)
devices = mvnc.EnumerateDevices() #Vérifiez le Movidius connecté
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' #Nom du fichier de modèle converti
f = open(network_blob, mode='rb')
blob = f.read()
graph = device.AllocateGraph(blob) #Définir le modèle converti dans Movidius
graph.SetGraphOption(mvnc.GraphOption.ITERATIONS, 1)
iterations = graph.GetGraphOption(mvnc.GraphOption.ITERATIONS)
img = cv2.imread('***.jpg')
graph.LoadTensor(img.astype(numpy.float16), 'user object') #Stocker les données d'image en entrée
output, userobj = graph.GetResult() #Calcul avant ici
graph.DeallocateGraph() #Terminer le traitement
device.CloseDevice()
Bien que le même réseau ait été réalisé sur un PC et Movidius avec des options différentes, le temps de traitement de chaque image est le suivant.
AlexNet (224x224 RGB) | GoogleNet (227x227 RGB) | |
---|---|---|
MacBookPro (CPU 2.7GHz Corei5) | 0.091s | 0.315s |
Pi3 + Movidius (-s 12 Aucune option) | 0.287s | 0.574s |
Pi3 + Movidius (-s 12 option disponible) | 0.097s | 0.113s |
Ce n'est pas aussi rapide que le GPU, mais c'est plus rapide que le Core i5. RasPi est enfin capable de calculer le Deep Learning à grande échelle. Divers usages sont attendus dans le futur.
Recommended Posts