Maximiser la vitesse d'OpenPose
Benchmark OpenPose
Consultez le Benchmark OpenPose pour connaître la vitesse approximative attendue de votre carte graphique.
Version CPU
La version CPU tourne à environ 0,3 FPS sur le modèle COCO et à environ 0,1 FPS (soit environ 15 s/image) sur le modèle BODY_25 par défaut. Passez au modèle COCO et/ou réduisez la résolution réseau comme indiqué ci-dessus. Fait contradictoire : le modèle BODY_25 est environ 5 fois plus lent que COCO sur la version CPU uniquement, mais environ 40 % plus rapide sur la version GPU.
Sous Ubuntu (pour les versions d'OS antérieures à 20), vous pouvez également multiplier par 2 à 3 la vitesse du processeur uniquement en suivant la procédure installation/0_index.md#faster-cpu-version-ubuntu-only.
Profilage de la vitesse
OpenPose affiche les FPS dans l'interface graphique de base. Cependant, des mesures de vitesse plus complexes peuvent être obtenues en ligne de commande lors de l'exécution d'OpenPose. Pour les obtenir, compilez OpenPose avec l'option PROFILER_ENABLED sur CMake-gui. OpenPose affichera automatiquement les mesures de temps pour chaque sous-processus léger après le traitement de F images (par défaut, F = 1000, mais cette valeur peut être modifiée avec l'option --profile_speed, par exemple --profile_speed 100).
- Mesure du temps pour une carte graphique : Le FPS correspond au temps le plus lent affiché dans la ligne de commande de votre terminal (OpenPose étant multi-processus léger). Les temps sont exprimés en millisecondes, donc FPS = 1000/milliseconde_measurement.
- Mesure du temps pour > 1 carte graphique : En supposant n cartes graphiques, vous devrez attendre jusqu'à n × F images pour visualiser la vitesse de chaque carte graphique (car les images sont réparties entre elles). De plus, le nombre d'images par seconde serait : FPS = minFPS(vitesse_par_GPU/n, pire_mesure_temporelle_autre_que_les_GPU). Pour moins de 4 GPU, le nombre d'images par seconde est généralement égal à FPS = vitesse_par_GPU/n.
Assurez-vous que le temps de wPoseExtractor est le plus lent. Sinon, le générateur d'entrée (problèmes de codecs vidéo/webcam avec OpenCV, images trop grandes, etc.) ou l'affichage de l'interface graphique (utilisation de la prise en charge OpenGL, comme détaillé dans la section suivante « Accélérer et préserver la précision ») risquent de ne pas être optimisés.
Accélérer et préserver la précision
Quelques astuces pour optimiser la vitesse d'exécution d'OpenPose tout en préservant la précision (sans espérer de miracles, cela pourrait améliorer légèrement la fréquence d'images) :
- Activez l'option «WITH_OPENCV_WITH_OPENGL» dans CMake pour accélérer considérablement l'affichage de l'interface graphique. Cela réduit la latence et augmente la vitesse d'affichage des images en demandant à OpenCV d'utiliser la prise en charge d'OpenGL pour le rendu. Cela accélère le rendu d'environ trois fois. Par exemple, le temps d'affichage des images en résolution HD passe d'environ 30 ms à environ 3-10 ms. OpenCV doit être compilé avec la prise en charge d'OpenGL et provoque un artefact visuel de rapport hauteur/largeur lors du rendu d'un dossier contenant des images de différentes résolutions. Remarque : OpenCV par défaut dans Ubuntu 16 (à partir d'apt-get install) prend bien en charge OpenGL. Cependant, la version par défaut d'Ubuntu 18 et les binaires portables Windows ne le prennent pas en charge. 2. Remplacez le rendu GPU par le rendu CPU pour obtenir environ +0,5 FPS (`--render_pose 1`).
- Utilisez cuDNN 5.1 ou 7.2 (cuDNN 6 est environ 10 % plus lent).
- Utilisez le modèle `BODY_25` pour une vitesse et une précision maximales (les modèles COCO et MPII sont plus lents et moins précis). Cependant, cela augmente la mémoire GPU, ce qui peut entraîner des problèmes de mémoire insuffisante sur les GPU à faible mémoire.
- Activez l'option AVX dans CMake-GUI (si votre ordinateur le prend en charge).
Accélération et réduction de la mémoire
Quelques conseils pour maximiser la vitesse d'OpenPose, mais gardez à l'esprit le compromis de précision :
- Réduisez la valeur de «--net_resolution» (par exemple, à 320 x 176) (précision réduite). Remarque : Pour une précision maximale, suivez (01_demo.md#maximum-accuracy-configuration).
- Pour le visage, réduisez la valeur de « --face_net_resolution ». Une résolution de 320 x 320 fonctionne généralement assez bien.
- Les points 1 et 2 réduiront également l'utilisation de la mémoire GPU (ou de la mémoire RAM pour la version CPU).
- Utilisez le modèle «BODY_25» pour une vitesse maximale. Utilisez le modèle « MPI_4_layers » pour une utilisation minimale de la mémoire GPU (mais une précision, une vitesse et un nombre de pièces réduits).