L'API Python
Presque toutes les fonctionnalités proposé dans OpenPose sont disponible en Python !
Quand utiliser les API Python ou C++ ? Pour lire une entrée spécifique, ajouter une fonction de post-traitement personnalisée ou implémenter votre propre affichage/enregistrement.
Il est conseillé de se familiariser avec la démo OpenPose et les principaux indicateurs OpenPose avant de se lancer dans la lecture des exemples d'API C++ ou Python. Sinon, la compréhension sera beaucoup plus difficile.
Introduction avancée (facultatif)
Ce module présente une API Python pour OpenPose. Il s'agit d'un enveloppe reproduisant la plupart des fonctionnalités de la classe op::Wrapper et permet de renseigner et de récupérer des données de la classe op::Datum à l'aide de constructions Python et Numpy standard.
L'API Python est analogue aux appels de fonctions C++. Vous pouvez les trouver dans python/openpose/openpose_python.cpp#L194.
L'API Python est assez simple : les objets op::Array<float> et cv::Mat sont automatiquement convertis en tableaux numpy. Toute autre structure de données basée sur la bibliothèque standard est automatiquement convertie en objets Python. Par exemple, un std::vector<std::vector<float>> deviendrait [[item, item], [item, item]],... Nous fournissons également un transtypage de op::Rectangle et op::Point exposant simplement les fonctions setter-getter pour [x, y, width, height],...
Compatibilité
Le module Python OpenPose est compatible avec Python 2 et Python 3 (par défaut et recommandé). De plus, il fonctionne sur tous les systèmes d'exploitation compatibles OpenPose. Il utilise Pybind11 pour la cartographie entre les types de données C++ et Python.
Pour compiler, activez BUILD_PYTHON dans CMake-gui ou exécutez cmake -DBUILD_PYTHON=ON .. depuis votre répertoire de compilation. Sous Windows, assurez-vous de compiler l'intégralité de la solution (cliquer sur le bouton vert de lecture ne compile pas la solution entière !). Pour ce faire, faites un clic droit sur la solution du projet OpenPose, puis cliquez sur « Générer la solution » (ou compilez chaque module PyOpenPose individuellement).
Pybind sélectionne par défaut la dernière version de Python (Python 3). Pour utiliser Python 2, définissez les options PYTHON_EXECUTABLE et PYTHON_LIBRARY dans CMake-gui pour la version de Python souhaitée :
|
# Ubuntu PYTHON_EXECUTABLE=/usr/bin/python2.7 PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7m.so # Mac OSX PYTHON_EXECUTABLE=/usr/local/bin/python2.7 PYTHON_LIBRARY=/usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7m.dylib :: Windows PYTHON_EXECUTABLE=C:/Users/user/AppData/Local/Programs/Python/Python27/python.exe |
Si vous exécutez l'application via la ligne de commande, vous devrez peut-être exécuter cmake deux fois pour que cette modification soit prise en compte.
Installation
Assurez-vous d'avoir suivi les étapes Python décrites dans doc/installation/0_index.md#cmake-configuration.
Tests et développement
Tous les exemples Python du module Tutorial API Python se trouvent dans le répertoire build/examples/tutorial_api_python de votre dossier build. Accédez directement à ce répertoire pour exécuter les exemples.
|
# Depuis la ligne de commande cd build/examples/tutorial_api_python # Python 3 (version par défaut) python3 01_body_from_image.py python3 02_whole_body_from_image.py # python3 [any_other_python_example.py] # Python 2 python2 01_body_from_image.py python2 02_whole_body_from_image.py # python2 [any_other_python_example.py] |
Pour un prototypage rapide, vous pouvez simplement dupliquer et renommer les fichiers d'exemple existants dans build/examples/tutorial_api_python, dans ce même dossier, et commencer la compilation. Ces fichiers sont copiés à partir des fichiers d'exemple existants lors de la compilation. Deux alternatives :
- Vous pouvez dupliquer et créer vos fichiers dans examples/tutorial_api_python/, mais vous devrez recompiler OpenPose à chaque modification de vos fichiers Python afin qu'ils soient copiés dans le dossier build/.
- Vous pouvez également les modifier directement dans build/examples/tutorial_api_python. Cela ne nécessite pas de reconstruction, mais nettoyer OpenPose supprimera l'intégralité du dossier build/ ; pensez donc à sauvegarder vos fichiers !
Exportation de Python OpenPose
Remarque : Cette étape n'est requise que si vous déplacez les fichiers *.py hors de leur emplacement d'origine ou si vous écrivez de nouveaux scripts *.py hors de build/examples/tutorial_api_python.
Ubuntu/Mac OS X:
- Option a : installer OpenPose : sur un système Ubuntu ou Mac OS X, vous pouvez installer OpenPose en exécutant sudo make install. Vous pouvez ensuite définir le chemin d'accès OpenPose dans vos scripts Python sur le chemin d'installation d'OpenPose (par défaut : /usr/local/python) et commencer à utiliser OpenPose où vous le souhaitez.
- Option b : ne pas installer OpenPose : pour déplacer les démos de l'API Python OpenPose vers un autre dossier, assurez-vous que la ligne sys.path.append('{OpenPose_path}/python') est correctement définie dans vos fichiers *.py, où {OpenPose_path} pointe vers votre dossier de build d'OpenPose.
Windows :
Assurez-vous que les dossiers build/x{86/64}/Release et build/bin sont copiés avec build/python. Comme indiqué dans l'exemple, leur chemin peut être modifié dans les deux variables suivantes :
- sys.path.append(dir_path + '/../../python/openpose/Release);
- os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/../../{x86/x64}/Release;' + dir_path + '/../../bin;'
Problèmes courants
N'utilisez pas PIL
Pour lire des images en Python, veillez à utiliser OpenCV (n'utilisez pas PIL). Nous avons constaté que l'utilisation d'un format d'image PIL dans OpenPose entraîne l'affichage de l'image d'entrée en gris et dupliquée 9 fois (le squelette de sortie apparaît donc 3 fois plus petit que prévu et dupliqué 9 fois).
Impossible d'importer le nom PyOpenPose
L'erreur générale est que PyOpenPose est introuvable (erreur similaire à : ImportError : impossible d'importer le nom pyopenpose). Assurez-vous d'abord que l'indicateur BUILD_PYTHON est activé. Si l'erreur persiste, vérifiez les points suivants :
- Dans le script que vous exécutez, recherchez la ligne suivante et exécutez la commande suivante à l'emplacement où se trouve le fichier.
- sys.path.append('../../python');
- ls ../../python/openpose
- Si vous n'avez aucun de ces éléments, il est possible que vous n'ayez pas compilé OpenPose correctement, ou que vous exécutiez les exemples non pas depuis le dossier build, mais depuis le dossier source. Si vous possédez le premier, vous avez compilé PyOpenPose pour Python 3 et devez exécuter les scripts avec Python 3, et inversement pour le second. Suivez les exemples de test ci-dessus pour connaître les commandes exactes.
- Problème 2 : Python pour OpenPose doit être compilé en mode Release pour le moment. Cela peut être fait dans
Visual Studio. Ensuite, vérifiez cette ligne :
- sys.path.append(dir_path + '/../../python/openpose/Release');
- dir ../../python/openpose/Release
Vérifiez le contenu de cet emplacement. Il devrait contenir l'un des fichiers suivants :
pyopenpose.cp36-win_amd64.pyd
pyopenpose.pydSi ce dossier n'existe pas, vous devez compiler en mode Release, comme indiqué ci-dessus. Si vous possédez le premier, vous avez compilé PyOpenPose pour Python 3 et devez exécuter les scripts avec Python 3, et inversement pour le second. Suivez les exemples de test ci-dessus pour connaître les commandes exactes. Si cela ne fonctionne toujours pas, vérifiez cette ligne :
Assurez-vous que ces deux chemins existent, car PyOpenPose doit référencer ces bibliothèques. S'ils n'existent pas, modifiez le chemin afin qu'ils pointent vers le bon emplacement dans votre dossier de build.
Ubuntu/Mac OS X :
Vérifiez le contenu de cet emplacement. Il devrait contenir l'un des fichiers suivants :
|
pyopenpose.cpython-35m-x86_64-linux-gnu.so pyopenpose.so |
Windows : Problème 1 : Si vous utilisez Windows et que vous n'installez pas les bibliothèques Python tierces requises, une erreur similaire à : Exception : Erreur : Bibliothèque OpenPose introuvable. Avez-vous activé BUILD_PYTHON dans CMake et placé ce script Python dans le bon dossier ? Extrait du problème GitHub n°941 :
J'ai rencontré un problème similaire avec Visual Studio (VS). Je suis presque sûr que le problème vient du fait que, lors de la compilation d'OpenPose dans VS, OpenPose tente d'importer cv2 (python-opencv) et échoue. Assurez-vous donc que si vous ouvrez cmd.exe et exécutez Python, vous pouvez importer CV2 sans erreur. Je n'y suis pas parvenu, mais CV2 était installé dans un environnement IPython (Anaconda). J'ai donc activé cet environnement, puis exécuté (modifiez ceci pour l'adapter à votre version de VS et à l'emplacement d'OpenPose.sln) :
| C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild.exe C:\path\to\OpenPose.sln |