J'ai essayé d'exécuter Movidius NCS avec python de Raspberry Pi3

introduction

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.

movidius (2).jpg

Ce que tu peux faire

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

Environnement d'exécution

Étant donné que le côté RasPi n'exécute que le modèle converti, installez uniquement les API nécessaires.

procédure

Convertir le modèle de Caffe pour qu'il fonctionne sur Movidius

  1. Construction de l'environnement

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
  1. Conversion du modèle Caffe

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

Exécution rapide depuis RasPi via Python

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

Courir

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

Comparaison du temps de traitement (calcul à terme)

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

J'ai essayé d'exécuter Movidius NCS avec python de Raspberry Pi3
J'ai essayé L-Chika avec Razpai 4 (édition Python)
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé d'exécuter faiss avec python, Go, Rust
Obtenez des informations sur le processeur de Raspberry Pi avec Python
J'ai essayé d'exécuter Deep Floor Plan avec Python 3.6.10.
Mesurer la température du processeur de Raspeye avec Python
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
Exploitons GPIO de Raspeye avec Python CGI
J'ai essayé la "conversion de morphologie" de l'image avec Python + OpenCV
J'ai essayé de créer un environnement Ubuntu 20.04 LTS + ROS2 avec Raspberry Pi 4
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
Utilisez vl53l0x avec RaspberryPi (python)
J'ai essayé webScraping avec python.
J'ai essayé de connecter Raspeye et conect + avec l'API Web
J'ai essayé Grumpy (allez exécuter Python).
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
J'ai essayé la communication SMTP avec Python
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
J'ai essayé d'exécuter la partie DNN d'OpenPose avec le processeur Chainer
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
# J'ai essayé quelque chose comme Vlookup avec Python # 2
Travailler avec le GPS en Python pour Raspberry Pi 3
Sortie CSV des données d'impulsion avec Raspberry Pi (vérifier l'entrée analogique avec python)
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé la reconnaissance manuscrite des caractères des runes avec scikit-learn
J'ai essayé de "lisser" l'image avec Python + OpenCV
Discord bot raspberry pi zéro avec python [Note]
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé la reconnaissance d'image de CIFAR-10 avec la reconnaissance d'image Keras-
J'ai essayé de trouver le rapport de circonférence par 100 millions de chiffres
J'ai essayé Flask avec des conteneurs distants de VS Code
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé d'utiliser mecab avec python2.7, ruby2.3, php7
J'ai essayé la synthèse de fonctions et le curry avec python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé d'automatiser la fabrication des sushis avec python
Sortie CSV des données d'impulsion avec Raspberry Pi (sortie CSV)