Developpez.com

Le Club des Développeurs et IT Pro

Sortie de la version Alpha d'OpenCV 4.0

La bibliothèque graphique libre pour le traitement d'images et vidéos

Le 2018-09-24 14:03:29, par dourouc05, Responsable Qt & Livres
OpenCV est une bibliothèque de référence quand il s’agit de traitement des images et des vidéos, plus particulièrement de vision par ordinateur. Elle implémente une pléthore d’algorithmes dans le domaine, ce qui facilite le développement de nouvelles applications. De plus, les implémentations sont très optimisées, y compris en fonction de chaque plateforme (de bureau comme mobiles) ; d’ailleurs, bon nombre d’algorithmes sont aussi implémentés sur processeur graphique (avec CUDA et/ou OpenCL) pour une efficacité maximale.

La première préversion Alpha d’OpenCV 4.0 est sortie fin de la semaine dernière, avec quelques changements bienvenus (les premiers plans comptaient sur une sortie au mois de juillet). Au niveau des fonctionnalités, la partie apprentissage profond a été considérablement revue, puisque ces algorithmes d’apprentissage fonctionnent extrêmement bien quand il s’agit d’images. Notamment, le modèle Mask (un RCNN : un réseau neuronal profond tant récurrent que convolutif) est disponible pour traiter des vidéos. OpenCV peut désormais charger des réseaux neuronaux déjà entraînés au format ONNX, une norme partagée par bon nombre d’environnements d’apprentissage profond. Ceci inclut notamment une implémentation de l’algorithme YOLO (you only look once) pour la détection d’objets (positionner des rectangles autour de certains objets dans une scène). La bibliothèque Intel DLDT peut être utilisée pour améliorer la performance.

Au niveau de la performance, justement, des centaines de noyaux de calcul ont été réécrits pour exploiter des opérations intrinsèques universelles : le même code peut générer un exécutable utilisant divers jeux d’instructions vectoriels, comme SSE2, SSE4, AVX2 (x86), NEON (ARM) ou VSX (POWER). Ces nouvelles implémentations permettent bien souvent de gagner en performance, même par rapport aux implémentations précédentes (de l’ordre de quinze à trente pour cent). D’autres noyaux devraient voir la même transformation d’ici à la version finale. De plus, sur les processeurs x86 en 64 bits, la sélection du code à exécuter devrait être effectuée de manière dynamique, de telle sorte que les instructions les plus avancées disponibles sur le processeur courant soient utilisées.

Du côté des exemples, un détecteur de codes QR en temps réel a été ajouté ; la version finale devrait aussi comprendre un décodeur. L’algorithme Kinect Fusion, qui fusionne les différents capteurs disponibles sur la Kinect (un capteur d’images traditionnel et un capteur de profondeur — d’où l’expression RGBD : red, green, blue, depth), a été implémenté.


Pourquoi déjà OpenCV 4.0 ? En effet, il a fallu six ans entre la 2.0 et la 3.0, mais seulement trois entre la 3.0 et la 4.0. Ce changement permet de baser OpenCV sur une norme C++ plus récente, C++11 : ainsi, des classes comme cv::String et cv:tr n’ont plus vraiment de raison d’être (elles ont été remplacées respectivement par std::string et std::shared_ptr). Pour Linux, std::thread est utilisé au lieu d’une bibliothèque externe, pthread. Cependant, ce changement de norme implique forcément une cassure au niveau de la compatibilité binaire, ce qui nécessite un changement de version majeure.

La compatibilité binaire entre versions mineures (4.0 et 4.1, par exemple) sera également abandonnée : seule sera garantie la compatibilité des sources. Ainsi, un code écrit avec OpenCV 4.0 sera garanti de continuer à fonctionner avec toutes les versions 4.x. La compatibilité binaire aurait pu être utile pour Android et Linux, mais les développeurs préfèrent souvent embarquer leur propre version d’OpenCV sur Android ; de même, les distributions Linux font rarement des mises à jour importantes sans recompilation (passer de la 3.0 à la 3.1 est souvent considéré comme un trop gros changement).

Source : liste de changements.
  Discussion forum
1 commentaire
  • Garvelienn
    Membre éprouvé
    J'ai hâte de pouvoir faire joujou avec. Surtout avec les nouveaux algorithmes de reconnaissance. Cela pourrait améliorer grandement certaines de mes applications.

    Envoyé par dourouc05
    d’ailleurs, bon nombre d’algorithmes sont aussi implémentés sur processeur graphique (avec CUDA et/ou OpenCL) pour une efficacité maximale.
    Quid des traitements GPU pour MacOS et iOS depuis qu'Apple a supprimé le support d'OpenCL/GL (en mode roi tout puissant osef) ? Car actuellement, j'ai été obligé à refaire certains algos avec leur <avis subjectif>immonde</avis subjectif> Metal.

    Envoyé par dourouc05
    Ce changement permet de baser OpenCV sur une norme C++ plus récente, C++11 : ainsi, des classes comme cv::String et cv:tr n’ont plus vraiment de raison d’être (elles ont été remplacées respectivement par std::string et std::shared_ptr). Pour Linux, std::thread est utilisé au lieu d’une bibliothèque externe, pthread.
    Changement bienvenu ! Le code n'en sera que plus propre (et efficace ?).

    Envoyé par dourouc05
    La compatibilité binaire aurait pu être utile pour Android et Linux, mais les développeurs préfèrent souvent embarquer leur propre version d’OpenCV sur Android
    En même temps, c'est soit on embarque les binaires dans l'application, soit on oblige l'utilisateur à installer l'application OpenCV Manager. Ce dernier choix étant une hérésie au niveau expérience utilisateur.

    D'ailleurs, savons-nous si ils vont enfin proposer sur leur site les binaires pour les architectures mobiles Android ? Car actuellement, j'ai toujours été obligé de les recompiler (ou de les prendre chez quelqu'un d'autre).

    Si quelqu'un a des réponses à mes questions, si je suis preneur