GeckoGeek.fr

Paradigme d'un lézard

Mardi 26 Août 2014

Installer IPP pour améliorer les performances d’OpenCV ( Ubuntu 9.10 )

Par Vinz le 26/03/2010 dans Programmation | 8 commentaires

OpenCV, quant bien même optimisé à son meilleur niveau (ou plutôt bas niveau “ha ha, suivez la blague ^^…”), ne peut que se trouver ralenti lors de traitements vidéos plutôt complexes. C’est pourquoi il existe une compatibilité avec l’IPP (Intel® Integrated Performance Primitives) qui permet d’accélérer tout ça de manière significative ! Nous allons voir dans ce billet comment installer tout ce petit monde et faire une rapide étude de performances.

Avant de commencer (important)

Licence

IPP n’est pas gratuit. Ou du moins, il l’est pour des programmes non-commerciaux sous Linux. Pour le reste il y a possibilité de payer une licence à 200$ par tête de développeur ! Mais vous pouvez aussi vous frotter à la version d’essai de 30 jours.

Sauvegardez vos données !

Installer IPP pour OpenCV peut être “compromettant” pour votre ordinateur et selon votre configuration il pourrait mal le supporter. Le mieux est donc de faire une bonne sauvegarde de vos données avant de commencer. Notez toutefois qu’avec la configuration utilisée ci-dessous, nous n’avons rencontré aucun problème.

Configurations pour cette installation

Pour la rédaction de ce billet nous avons utilisé un Ubuntu 9.10 (32 bits) avec la dernière version d’OpenCV (svn) et la version 6.1.2.051 d’IPP.

Télécharger & Installer IPP

Télécharger Integrated Performance Primitives

Commencez par télécharger les 450Mo de fichiers que vous trouverez sur la page officielle de l’IPP. Attention à prendre la bonne en fonction de votre système d’exploitation et de votre ordinateur (32 ou 64 bits). Si vous pensiez prendre la version non-commerciale Linux c’est ici.

Installer Integrated Performance Primitives

Décompressez l’archive et allez dans le dossier via un terminal. Puis lancez le script d’installation (./install.sh) et suivez le guide !
Vous aurez besoin d’entrer votre clé d’enregistrement et faire un petit tour sur internet pour valider votre produit.
A la fin de l’installation le programme vous indiquera le chemin où a été installé l’IPP. Ce dernier change principalement en fonction de sa version. Je recommande donc que vous le notiez, vous en aurez besoin pour la suite ! Toutefois en général cela ressemble à ceci :

/opt/intel/ipp/6.1.2.051/ia32

Configurer et Installer OpenCV 2 avec IPP

Télécharger OpenCV

Je recommande de télécharger les dernières sources d’OpenCV en vous fiant au svn. C’est bien plus long à télécharger qu’en prenant l’archive disponible ou le paquet synaptic. Toutefois en général la version du dépôt corrige de nombreux bugs qui pourraient vous empêcher de l’installer correctement (comme certains suite au passage d’Ubuntu 9.10). Utilisez donc subversion pour récupérer le projet :

svn co https://code.ros.org/svn/opencv/trunk/opencv

Configurer avant d’installer

Une installation d’OpenCV récupérée via le svn doit se faire avec cmake. Donc si votre Linux ne contient pas ce dernier, pensez à l’installer avant de continuer. Rendez-vous ensuite dans le dossier récupéré :

cd /path/to/opencv

Puis créez un dossier temporaire qui servira à l’installation :

mkdir release

Donc maintenant il devrait exister un dossier release dans le dossier opencv : “/path/to/opencv/release”. Accédez au dossier via un petit “cd” :

cd release

Vient alors le temps de configurer OpenCV avant l’installation. En principe vous avez gardé le chemin menant jusqu’à votre IPP. Dans mon cas ce dernier ressemble à ceci : “/opt/intel/ipp/6.1.2.051/ia32″. Il vous suffit d’ajuster le chemin dans la ligne suivante :

cmake -D CMAKE_BUILD_TYPE=RELEASE \
 -D USE_IPP=ON -D IPP_PATH=/opt/intel/ipp/6.1.2.051/ia32/sharedlib ../

En principe vous devriez rapidement avoir un retour vous indiquant quelque chose comme :

-- Extracting svn version, please wait...
-- SVNVERSION:  svn:2835
-- Detected version of GNU GCC: 44 (404)
-- [ … ]
-- IPP detected: TRUE
-- Parsing 'cvconfig.h.cmake'
running mkdir -p "/home/vincent/Desktop/opencv/release/unix-install/"  2>&1
--
-- General configuration for opencv 2.0.0 =====================================
--
--     Built as dynamic libs?:    ON
--     Compiler:
--     C++ flags (Release):         -Wall -pthread -ffunction-sections  -O3 -DNDEBUG
        -fomit-frame-pointer -O3 -ffast-math -msse -msse2 -msse3 -mssse3 -mfpmath=387 -DNDEBUG
--     C++ flags (Debug):           -Wall -pthread -ffunction-sections  -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):
--     Linker flags (Debug):
--
--   GUI:
--     GTK+ 2.x:                  1
--     GThread:                   1
--
--   Image I/O:
--     JPEG:                      TRUE
--     PNG:                       TRUE
--     TIFF:                      TRUE
--     JPEG 2000:                 TRUE
--
--   Video I/O:
--     DC1394 1.x:                0
--     DC1394 2.x:                0
--     FFMPEG:                    1
--       codec:                   1
--       format:                  1
--       util:                    1
--       swscale:                 1
--       gentoo-style:            1
--     GStreamer:                 0
--     UniCap:
--     PvAPI:
--     V4L/V4L2:                  1/1
--     Xine:                      0
--
--   Interfaces:
--     Old Python:                0
--     Python:                    ON
--     Python interpreter:        /usr/bin/python2.6
--     Python numpy:              0
--     Use IPP:                   /opt/intel/ipp/6.1.2.051/ia32/sharedlib
--     Build Documentation        0
--
--     Install path:              /usr/local
--
--     cvconfig.h is in:          /home/vincent/Desktop/opencv/release
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/vincent/Desktop/opencv/release

Vérifier que vous avez bien une ligne qui ressemble à ceci :

--     Use IPP:                   /opt/intel/ipp/6.1.2.051/ia32/sharedlib

Si vous obtenez une erreur par rapport à une librairie manquante, installez-là et recommencez ! Si par contre vous avez un USE_IPP : NO, c’est qu’il n’a pas trouvé cette dernière, vérifiez donc le chemin que vous avez indiqué dans le cmake. Et enfin si vous n’avez pas d’erreur flagrante il vous suffit de procéder à un petit make :

make

OpenCV va se compiler tranquillement en vous affichant un petit pourcentage à gauche de chaque ligne, pratique pour savoir où en est l’installation ! Là encore si vous n’avez pas de problème, installez les binaires :

sudo make install

Et enfin il faut récréer les liens dynamiques qui seront nécessaires lors de l’exécution de vos programmes utilisant OpenCV :

sudo ldconfig

Rapide Benchmark

Histoire de vérifier que l’IPP améliore nettement les performances d’OpenCV nous avons bien évidemment procédé à un petit benchmark ! Nous avons prit pour exemple notre dernier tutorial qui contenait pas mal de traitements variés sur une vidéo en temps réel. Pour calculer le temps mis entre différentes méthodes nous avons utilisé un petit script maison afin de bien étudier la différence de temps entre chaque méthode. Les moyennes ont été effectuées sur quelques centaines d’images traitées.

Webcam utilisée

Ce test a été réalisé avec deux configurations différentes. Dans les deux cas nous avons utilisé la même Webcam :
- Quick Cam (logitech) qui ressortait une image 640px * 480px (contre 1600px * 1200px sous Mac)
Les résultats suivant sont donc à relativiser selon les cas et il est préférable de comparer la différence plutôt que les chiffres bruts.

Tests Core Duo & Core 2 Duo

- Le Core Duo était ici un Macbook 2GHz (2006), 2Go de ram virtualisant un Ubuntu 9.10.
- Le Core 2 Duo était ici un Macbook 2,4GHz Core 2 Duo (2008), 2Go de ram virtualisant un Ubuntu 9.10.

Les chiffres

Tous les chiffres suivants sont en millisecondes.

Graphique par Ordinateur

Voici un graphique par ordinateur. Petite précision, j’ai limité Y à 60 ce qui coupe un peu la mauvaise performance du Core 2 Duo sur le cvQueryFrame.

Graphique complet

Et enfin un graphique avec toutes les chiffres d’un coup !

Conclusions

On note donc dans les deux cas de larges améliorations avec IPP.

  • Le gain sur la récupération d’une image est fort appréciable mais dépendra aussi surement un peu du device ciblé. Par exemple on voit ici que le Core 2 Duo est vraiment mauvais avec la Webcam Logitech utilisée (malgré un OS strictement identique). Et le problème ne semble pas venir d’un coup de malchance, plusieurs tests ont été effectués.
  • Le gain sur la binarisation (beaucoup de calculs matriciels) est aussi très important. Ce dernier variera selon la résolution des images reçues. Ici le Core 2 Duo assure bien plus et montre de meilleures performances que le Core Duo.
  • Une légère perte sur l’affichage d’une image dans la fenêtre, et ceci pour les deux ordinateurs essayés. La perte n’est pas non plus significative car elle est d’environ 0.2ms, mais c’est tout de même un peu bizarre qu’avec IPP elle soit inférieure.

Il est donc possible d’accélérer les calculs de notre script d’environ 40% ce qui au final permet d’améliorer le framerate global (mais sans pouvoir non plus dépasser celui de la caméra). Une bonne chose donc pour des applications de réalité augmentée !

Si vous avez une question ou si ce billet vous a été utile, n’hésitez pas à laisser un commentaire pour nous le faire savoir !

Commentaires (8)
  1. Yohann Lepage le 24 May 2010 à 02:26

    Bonjour,

    Je tente depuis quelques heures d’installer opencv avec votre méthde, mais il est tard et je commence à sécher !
    Voici la procédure d’installation que j’ai suivi et j’obtiens l’erreur suivante lors de l’installation opencv http://wiki.2xyo.info/doku.php/dev/python/opencv/installation :

    Et résultat après de nombreux essais :
    [ 82%] Building CXX object modules/features2d/CMakeFiles/opencv_features2d.dir/src/precomp.o
    [ 83%] Building CXX object modules/features2d/CMakeFiles/opencv_features2d.dir/src/fast.o
    Linking CXX static library ../../lib/libopencv_haartraining_engine.a
    [ 83%] Built target opencv_haartraining_engine
    [ 83%] Building CXX object modules/haartraining/CMakeFiles/opencv_createsamples.dir/createsamples.o
    [ 83%] [ 83%] [ 83%] [ 83%] Building CXX object modules/haartraining/CMakeFiles/opencv_haartraining.dir/haartraining.o
    Building CXX object modules/haartraining/CMakeFiles/opencv_performance.dir/performance.o
    Building CXX object modules/traincascade/CMakeFiles/traincascade.dir/traincascade.o
    Building CXX object modules/traincascade/CMakeFiles/traincascade.dir/cascadeclassifier.o
    [ 83%] Building CXX object modules/traincascade/CMakeFiles/traincascade.dir/boost.o
    Linking CXX executable ../../bin/opencv_haartraining
    Linking CXX executable ../../bin/opencv_createsamples
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_codec_get_id’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_seek_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `guess_format’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_open_input_file’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_read_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_guess_codec’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_trailer’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_close_input_file’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `url_fclose’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_set_parameters’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `url_fopen’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_header’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_find_stream_info’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_register_all’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_init_packet’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `dump_format’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_new_stream’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_alloc_format_context’
    collect2: ld returned 1 exit status
    make[2]: *** [bin/opencv_haartraining] Erreur 1
    make[1]: *** [modules/haartraining/CMakeFiles/opencv_haartraining.dir/all] Erreur 2
    make[1]: *** Attente des tâches non terminées….
    [ 84%] Building CXX object modules/traincascade/CMakeFiles/traincascade.dir/features.o
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_codec_get_id’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_seek_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `guess_format’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_open_input_file’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_read_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_guess_codec’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_trailer’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_close_input_file’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `url_fclose’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_set_parameters’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `url_fopen’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_header’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_find_stream_info’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_register_all’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_init_packet’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `dump_format’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_new_stream’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_alloc_format_context’
    collect2: ld returned 1 exit status
    make[2]: *** [bin/opencv_createsamples] Erreur 1
    make[1]: *** [modules/haartraining/CMakeFiles/opencv_createsamples.dir/all] Erreur 2
    [ 84%] Building CXX object modules/traincascade/CMakeFiles/traincascade.dir/haarfeatures.o
    [ 84%] Building CXX object modules/traincascade/CMakeFiles/traincascade.dir/lbpfeatures.o
    Linking CXX shared library ../../lib/libopencv_features2d.so
    [ 84%] Built target opencv_features2d
    [ 84%] Building CXX object modules/traincascade/CMakeFiles/traincascade.dir/imagestorage.o
    Linking CXX executable ../../bin/opencv_performance
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_codec_get_id’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_seek_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `guess_format’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_open_input_file’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_read_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_guess_codec’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_trailer’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_close_input_file’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `url_fclose’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_set_parameters’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `url_fopen’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_header’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_find_stream_info’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_register_all’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_init_packet’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `dump_format’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_new_stream’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_alloc_format_context’
    collect2: ld returned 1 exit status
    make[2]: *** [bin/opencv_performance] Erreur 1
    make[1]: *** [modules/haartraining/CMakeFiles/opencv_performance.dir/all] Erreur 2
    /home/yoyo/opencv/opencv/modules/traincascade/imagestorage.cpp: In member function ‘bool CvCascadeImageReader::PosReader::get(cv::Mat&)’:
    /home/yoyo/opencv/opencv/modules/traincascade/imagestorage.cpp:153: warning: ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result
    /home/yoyo/opencv/opencv/modules/traincascade/imagestorage.cpp:154: warning: ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result
    Linking CXX executable ../../bin/opencv_traincascade
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_codec_get_id’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_seek_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `guess_format’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_open_input_file’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_read_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_guess_codec’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_trailer’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_close_input_file’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `url_fclose’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_set_parameters’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_frame’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `url_fopen’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_write_header’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_find_stream_info’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_register_all’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_init_packet’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `dump_format’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_new_stream’
    ../../lib/libopencv_highgui.so.2.1.1: undefined reference to `av_alloc_format_context’
    collect2: ld returned 1 exit status
    make[2]: *** [bin/opencv_traincascade] Erreur 1
    make[1]: *** [modules/traincascade/CMakeFiles/traincascade.dir/all] Erreur 2
    make: *** [all] Erreur 2

    Une idée ?

  2. Vinz le 24 May 2010 à 16:53

    Hello,
    Mmm comme ça non pas tellement.
    Tu es sur quel OS ?
    Tu souhaites juste installer OpenCV ou IPP aussi en plus ?
    A+
    Vincent

  3. slacku le 20 Aug 2010 à 08:33

    english version ?

  4. Vinz le 20 Aug 2010 à 12:29

    We haven’t so much time to trad it in English. But we take your demand in consideration. Currently, we recommand you tu use Google Traduction : http://translate.google.fr/translate?u=http://www.geckogeek.fr/installer-ipp-pour-ameliorer-les-performances-opencv-ubuntu-9-10.html&sl=fr&tl=en&hl=&ie=UTF-8 :-)

  5. vidine le 30 Nov 2011 à 15:00

    Just point out a mistake:

    Use IPP: /opt/intel/ipp/6.1.2.051/ia32/sharedlib

    Use IPP is a path to ../../bin folder , BOT sharelib dir

  6. Marvellous Monkey le 6 Jun 2012 à 16:32

    either youve removed my earlier comment or its got lost?? to the publisher… you’ve missed a few typos near the ending

  7. rouge le 22 Nov 2012 à 18:03

    prg qui fait la détection d’un pt et donne leur coordonné ds un image

  8. rouge le 22 Nov 2012 à 18:04

    prg qui fait la détection d’un pt et donne leur coordonné ds 1 image


Laisser un commentaire