[PYTHON] OpenPose sur MacBook Pro Partie 2

J'ai trouvé qu'OpenPose fonctionne sur MacBook Pro avec OpenPose sur MacBook Pro, mais je me demandais s'il pouvait être exécuté sur GPU. Puisqu'il existe quelque chose qui s'appelle PlaidML, j'ai lu ce qui suit et l'ai essayé parce que je pensais pouvoir le gérer moi-même.

environnement

Etapes de configuration

Préparation

En guise de préparation, configurez un environnement virtuel pour Python. C'était correct d'utiliser l'environnement précédent, mais je l'ai recréé au cas où il y aurait un conflit.

Créer un environnement virtuel
$ virtualenv mppose-plaidml

Entrez dans l'environnement virtuel
$ source mppose-plaidml/bin/activate

Réglage PlaidML, contrôle de fonctionnement

Après être entré dans l'environnement virtuel, installez le package PlaidML et configurez le périphérique à utiliser. Mon MacBook Pro avait une Radeon Pro 555x, alors j'ai choisi cela.

Installez PlaidML et les packages de référence
$ pip install plaidml-keras plaidbench

Définir l'appareil utilisé par PlaidML
$ plaidml-setup
* Utilisez y sauf pour les paramètres de l'appareil
・ ・ ・
<Omission>
・ ・ ・
Dans la section des paramètres de l'appareil, sélectionnez le numéro de l'appareil affiché dans la liste et appuyez sur Entrée.
Multiple devices detected (You can override by setting PLAIDML_DEVICE_IDS).
Please choose a default device:

   1 : llvm_cpu.0
   2 : opencl_intel_uhd_graphics_630.0
   3 : opencl_cpu.0
   4 : opencl_amd_radeon_pro_555x_compute_engine.0
   5 : metal_intel(r)_uhd_graphics_630.0
   6 : metal_amd_radeon_pro_555x.0

Default device? (1,2,3,4,5,6)[1]:6
・ ・ ・
<Omission>
・ ・ ・

Après avoir installé le package et paramétré l'appareil, vérifiez le fonctionnement.

Fonctionnement confirmé avec benchmark
$ plaidbench keras mobilenet
Running 1024 examples with mobilenet, batch size 1, on backend plaid
INFO:plaidml:Opening device "metal_amd_radeon_pro_555x.0"* Si cet affichage apparaît, il fonctionne sur le périphérique sélectionné.
Compiling network... Warming up... Running...
Example finished, elapsed: 0.545s (compile), 14.425s (execution)

-----------------------------------------------------------------------------------------
Network Name         Inference Latency         Time / FPS          
-----------------------------------------------------------------------------------------
mobilenet            14.09 ms                  0.00 ms / 1000000000.00 fps
Correctness: PASS, max_error: 1.675534622336272e-05, max_abs_error: 7.674098014831543e-07, fail_ratio: 0.0

Je savais que cela fonctionnait, mais je me demandais quoi faire car je ne savais pas "si c'est plus rapide ou plus lent que lors de l'utilisation du CPU", mais avant la commande, `` PLAIDML_DEVICE_IDS = "nom de l'appareil" "Il y a des informations que si vous écrivez" `, cela fonctionnera sur cet appareil, alors je l'ai essayé.

Banc avec CPU défini comme périphérique d'exécution
$ PLAIDML_DEVICE_IDS="opencl_cpu.0" plaidbench keras mobilenet
Running 1024 examples with mobilenet, batch size 1, on backend plaid
INFO:plaidml:Opening device "opencl_cpu.0"
Compiling network... Warming up... Running...
Example finished, elapsed: 3.034s (compile), 141.360s (execution)

-----------------------------------------------------------------------------------------
Network Name         Inference Latency         Time / FPS          
-----------------------------------------------------------------------------------------
mobilenet            138.05 ms                 134.30 ms / 7.45 fps
Correctness: FAIL, max_error: 0.005546755623072386, max_abs_error: 0.0003522038459777832, fail_ratio: 0.076

En conséquence, la Radeon Pro 555x semble avoir environ 10 fois les performances du processeur, donc je pense qu'elle est efficace.

De plus, si vous sélectionnez `` Fenêtre-> Historique GPU '' dans le moniteur d'activité, vous pouvez voir la liste des périphériques GPU et l'état de fonctionnement en temps réel, vous pouvez donc également l'utiliser pour voir l'état de fonctionnement.

Paramètres OpenPose

Maintenant, configurons OpenPose. La procédure est généralement la même que la dernière fois, mais certaines étapes doivent être modifiées afin d'utiliser PlaidML.

Installez le package pour exécuter OpenPose.
$ pip install ipython configobj pillow opencv-python

Clonez la version backend Keras d'OpenPose à partir de Github.
$ git clone https://github.com/michalfaber/keras_Realtime_Multi-Person_Pose_Estimation.git

Accédez au répertoire.
$ cd keras_Realtime_Multi-Person_Pose_Estimation/

Accédez au répertoire des modèles dans le référentiel et téléchargez les modèles de formation caffe et keras.
$ cd model
$ sh get_caffe_model.sh 
$ sh get_keras_model.sh 

Apportez des modifications au module de modélisation pour utiliser PlaidML.
$ vi cmu_model.py

* Ajoutez simplement les deux lignes suivantes au début du texte source.
import plaidml.keras
plaidml.keras.install_backend()

Init vide.Créez un py.(Dans mon environnement, si je ne l'ai pas créé, le module python sous le répertoire model n'a pas pu être chargé lors de l'exécution ultérieure du script python, et une erreur s'est produite.)
$ touch __init.py__

Revenez en haut du référentiel et videz la couche de modèle d'entraînement numpy de caffe.
$ cd ../
$ docker run -v `pwd`:/workspace -it bvlc/caffe:cpu python dump_caffe_layers.py

Convertissez la couche de modèle d'entraînement caffe pour les keras
$ python caffe_to_keras.py 

Ceci termine les réglages.

L'opération a réussi, mais ...

J'ai donc essayé de vérifier le fonctionnement avec la photo d'exemple et l'appareil photo comme avant ...

Essayez de détecter la posture de l'exemple de photo.
$ python demo_image.py --image sample_images/ski.jpg 

Démarrez la caméra et essayez de détecter la posture.
$ python demo_camera.py

La détection de la posture de la caméra a entraîné un temps de traitement d'environ 0,21 s, ce qui était inférieur au résultat de l'opération du CPU (temps de traitement d'environ 0,07 s). Quand j'ai enquêté sur "Pourquoi?", J'ai trouvé ce type d'échange dans le numéro PlaidML. Plaidml backend slower than TF backend #530

Une possibilité possible est que "le PlaidML actuel ne supporte pas beaucoup de modèles de calcul", et je pense qu'il ne supporte pas le modèle de calcul OpenPose (CMU?) Utilisé cette fois. Je vais.

Normalement, je pense qu'il est justifié d'abandonner ici et de "préparer un environnement utilisant GPU". Cette fois, je demandais "Que puis-je faire dans l'environnement actuel à la maison?", J'ai donc fait jusqu'à présent, donc le reste

―― J'attends après la mise à jour de la version de PlaidML (N'est-ce pas prévu car la mise à jour semble s'être arrêtée depuis plus d'un an?)

Dans un tel endroit, je pense que je vais le faire en réfléchissant à diverses choses.

Recommended Posts

OpenPose sur MacBook Pro Partie 2
OpenPose sur MacBook Pro
Remarques sur la configuration de tensorflow-gpu sur MacBook Pro (mi-2012)
Implémenter ESPnet sur Macbook
Exécutez Openpose sur Python (Windows)
Installez OpenPose sur mac (Catalina)
Dual Boot (pas VM) pour Kali Linux ver 2020.2 sur MacBook Pro 2017
Installez Ubuntu 18.04 sur le modèle de la barre tactile MacBook Pro et connectez-vous au WIFI
Essayez d'utiliser Pillow sur iPython (partie 1)
Introduction à Python Hands On Partie 1
Essayez d'utiliser Pillow sur iPython (partie 2)
Essayez d'utiliser Pillow sur iPython (partie 3)