Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Save to My Library
Look up keyword
Like this
2Activity
0 of .
Results for:
No results containing your search query
P. 1
NT2 : A High-performance library for computer vision.

NT2 : A High-performance library for computer vision.

Ratings: (0)|Views: 1,183|Likes:
Published by Joel Falcou
Cet article présente NT2, une solution logicielle simplifiant la mise au point d’applications de vision artificielle complexes tout en garantissant un haut niveau de performance. Pour ce faire, la bibliothèque NT2 propose une interface de haut niveau – proche de celle de MATLAB® – et offre des performances proches de celles obtenues en C grâce à des techniques d’implantation avancées comme l’évaluation partielle et la méta-programmation template. Nous démontrons la pertinence de cette solution en présentant les performances de plusieurs noyaux d’applications classiques de traitement d’images et de vision artificielle.
Cet article présente NT2, une solution logicielle simplifiant la mise au point d’applications de vision artificielle complexes tout en garantissant un haut niveau de performance. Pour ce faire, la bibliothèque NT2 propose une interface de haut niveau – proche de celle de MATLAB® – et offre des performances proches de celles obtenues en C grâce à des techniques d’implantation avancées comme l’évaluation partielle et la méta-programmation template. Nous démontrons la pertinence de cette solution en présentant les performances de plusieurs noyaux d’applications classiques de traitement d’images et de vision artificielle.

More info:

Categories:Types, Research, Science
Published by: Joel Falcou on Aug 09, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

08/19/2013

pdf

text

original

 
NT2 : Une bibliothèque haute-performance pour la vision artificielleNT2 : A High-performance library for computer vision.
Joël Falcou Jean-Thierry Lapresté Thierry Chateau Jocelyn Sérot
{prenom.nom@lasmea.univ-bpclermont.fr}
LASMEA - CNRS UMR 6602Campus des Cézeaux 63000 AUBIERE
Résumé
Cet article présente NT2, une solution logicielle simplifiant la mise au point d’applications de vision artificielle com- plexes tout en garantissant un haut niveau de performance.Pour ce faire, la bibliothèque NT2 propose une interfacede haut niveau – proche de celle de M 
ATLAB
® – et offredes performances proches de celles obtenues en C grâceà des techniques d’implantation avancées comme l’éva-luation partielle et la méta-programmation
template.
Nousdémontrons la pertinence de cette solution en présentant les performances de plusieurs noyaux d’applications clas-siques de traitement d’images et de vision artificielle.
Mots Clef 
méta-programmation
template,
évaluation partielle,M
ATLAB
.
Abstract
This paper introduces NT2, a software framework thaeases the development of complex computer vision ap- plications while maintaining high level performance. Todo so, the NT2 library proposes a high-level, close to M 
ATLAB
interface and allows execution times to be on par with a hand-made C implementation by using advanced software enginering technics like partial evaluation and 
template
meta-programming. We further demonstrates NT2impact with the analysis of some widely used computer vi-sion algorithms and image processing performances.
Keywords
template
meta-programming, partial evaluation, M
ATLAB
.
1 Introduction
Les applications de vision artificielle complexes sonthabituellement développées à partir d’un formalismemathématique adéquat et implantées dans un langage dehaut-niveau qui prend en charge les éléments classiquesdu calcul matriciel, de l’algèbre linéaire ou du traitementd’image. Des outils comme M
ATLAB
[18] sont réguliè-rement utilisés par les développeurs de la communautéVision car ils permettent d’exprimer de manière directedes expressions mathématiques complexes et proposentun large panel de fonctionnalités au sein d’un modèlede programmation procédural classique. Mais il s’avèreque certaines applications nécessitent d’être portées versdes langages plus performants en terme de temps de calcul.Pour ce faire, un processus de réécriture vers des langagescomme C ou FORTRAN est souvent envisamaisimplique un surcroît de travail non-négligeable comptetenu du faible niveau d’expressivité de ces langages. Unealternative consiste à utiliser un langage comme le C++que ses fonctionnalités rendent
a priori
intéressant dansle cadre du calcul scientifique. Ainsi, la surcharge desopérateurs, qui augmente l’expressivité du langage etson aspect orienté-objet qui favorise l’abstraction et laréutilisation de code sont autant d’atouts qui facilitentcette transition.Malgces fonctionnalis, le C++ est peu utilisé ausein d’applications de Vision car ses performances sontincompatibles avec leurs contraintes temporelles. En effet,les programmes C++ sont beaucoup plus lent que leurséquivalents C ou FORTRAN – d’un facteur compris entre1.2 et 10 – ce qui force un grand nombre de développeursà écrire en C ou en FORTRAN les parties critiques deleurs algorithmes, n’utilisant le C++ que pour des tâchesannexes comme les entrées-sorties ou la gestion des inter-faces graphiques et ce malgré l’existence de bibliothèquescomme OpenCV [12],VXL ou Gandalf.Le développeur d’applications de vision artificielle se re-trouve donc à devoir effectuer un choix entre l’expressi-vité de ses outils et leur efficacité. Quand bien même ilest possible de définir de nouveaux outils proposant uneexpressivité plus grande, leurs techniques d’implantationsclassiques dégradent rapidement leur efficacité (cf. fig. 1).Cet article présente une nouvelle approche qui allie les
 
Efficacité
      E     x     p     r     e     s     s      i     v      i      t       é
MatlabSciLabC++JAVAC, FORTRANNT2
F
IG
. 1
Tension expressivité-efficacité des langages usuel-lement employés pour le développement d’applications devision artificielle. Chaque langage permet d’exprimer unensemble d’outils de plus haut-niveau (représentés ici par les zones colorées) qui, en général, augmente l’expressivité au dépend de l’efficacité. NT2 propose de définir une nou-velle méthode d’implantation permettant de s’affranchir decette limitation.
performances de langages comme C et FORTRAN etl’expressivité de M
ATLAB
en tirant parti du haut-niveaud’abstraction des langages orientés objet. Cette solutionprend la forme d’une bibliothèque C++ – la bibliothèqueNT2 – qui permet de simplifier le portage d’applicationM
ATLAB
en C++ tout en introduisant un surcoût minimepar rapport à une version C.Nous présenterons d’abord les limitations des implanta-tions classiques des bibliothèques de calcul scientifiqueen C++, puis nous détaillerons les solutions de dévelop-pement utilisées par NT2. Nous présenterons ensuite lesfonctionnalités de NT2 avant d’évaluer ses performancestantentermed’efficacitéqu’entermed’expressivitésurdesnoyaux d’applications classiques de vision par ordinateur.
2 Le calcul scientifique en C++
L’écriture de bibliothèques dédiées au calcul scientifiqueen général et à la vision par ordinateur en particulier a faitl’objet de nombreuses tentatives. Ces travaux démontrentque l’expressivité du langage peut être relevée à un trèshaut-niveau mais que les techniques d’implantations clas-siques de ces solutions entrainent une perte sévère de per-formances. Nous allons dans un premier temps essayer decerner la source de ces pertes puis proposer un schémad’implantation plus adapté qui permettra de conserver desperformances élevées sans sacrifier l’expressivité de nosoutils.
2.1 Problématiques
La manipulation de vecteurs, matrices et tableaux sont àla base de la plupart des codes de calcul scientifique. EnC++, il est possible de définir des classes qui encapsulentce type d’objet et qui fournissent
des opérateurs surchar-gés
– comme
+
,
,
×
ou
/
. Ce mécanisme de surchargepermet aux bibliothèques de calcul à base de vecteurs etde matrices de proposer une interface naturelle. Ainsi, lasomme de trois vecteurs s’écrit simplement :
w
=
x
+
 y
+
 z
Mais, lorsque le compilateur traite une série d’appel d’opé-rateurs surchargés, il procède à une évaluation successivede chaque opérande et génère un objet temporaire. Cetteévaluation dyadique force le compilateur à évaluer toutd’abord
1
=
x
+
 y
, puis
2
=
1
+
 z
pour enfin affecter
2
à
w
,
1
et
2
étant des objets temporaires crées uniquementpour servir de stockage aux résultats intermédiaires.L’évaluation dyadique des opérateurs surchargés est lentecar, au lieu d’évaluer une expression via une seule boucle,plusieurs boucles de traitements et vecteurs temporairessont nécessaires. Ces vecteurs temporaires sont géné-ralement alloués dynamiquement, causant une perte deperformance notable pour des tableaux de petite taille.Par exemple, l’évaluation de
w
=
x
+
 y
+
 z
,
x
,
y
et
z
contiennent quatre nombres réels simple précision, nedemande que quelques cycles alors que l’allocation et lalibération des tableaux temporaires en demande près d’unecentaine, rendant la manipulation de tableaux de petitetaille en C++ extrêmement peu efficace. Pour des matricesou des vecteurs de grande taille, la principale perte deperformance provient de la bande passante de la mémoire.En effet, de nombreux codes de calcul sont limités nonpas par le temps de calcul effectif mais par le temps detransfert entre la mémoire principale et le processeur. Dansnotre exemple, si chaque tableau contient 1Mo de données,la version à base d’opérateurs surchargés nécessite 8Mo detransfert entre le processeur et la mémoire, soit deux fois laquantité effectivement nécessaire. On montre alors que, enmoyenne, l’évaluation d’une expression de
opérandeset
opérateurs s’exécute
2
 N  M 
fois moins vite que le codeéquivalent en C ou en FORTRAN [25].Une autre source de perte de performances réside dansl’utilisation de classes polymorphes
1
pour encapsuler descomportements variés. On utilise souvent cette techniquepour fournir des classes de vecteurs ou de matrices pro-posant des optimisations diverses comme par exemple lechoix de l’index de départ des accès, la gestion de la formede la matrice (diagonale, bande ou triangulaire, etc.). Cetype d’option s’implémente en général par l’intermédiairede
méthodes virtuelles
que chaque variante de la classe debase va surcharger. Or, l’appel d’une méthode virtuelle né-cessite un accès mémoire supplémentaire afin de résoudrel’indirection des pointeurs de fonctions de la
vtable
2
de laclasse. Ce surcoût est relativement négligeable lorsque le
1
c’est à dire faisant partie d’une hiérarchie de classe.
2
ou table des méthodes virtuelles
 
temps d’exécution de la méthode virtuelle elle-même estsuffisamment important. Malheureusement, dans le cas desoptions habituellement supportées par des classes de ma-trices, ce temps d’exécution est extrêmement faible.
2.2 Les bibliothèques actives
On pourrait croire que des phases d’optimisations inten-sives ou l’utilisation de techniques de programmationgénérique classiques telles que celles mises en œuvredans les bibliothèques VIGRA[15] ou ITK peuventéliminer ces problèmes. En général, il n’en est rien carles compilateurs n’ont pas accès à la sémantique desabstractions mises en œuvres. Là où un développeur voitun ensemble d’opérations sur des tableaux numériques,le compilateur ne voit que des boucles et des allocationsmémoires. L’utilisation des
templates
de manière naïveélimine certes les surcoûts dus aux appels de méthodes ouau polymorphisme dynamique mais ne permet pas – dumoins dans le type de solution classiquement proposé –d’effectuer des optimisations inter-appels.Une approche plus efficace est de développer des biblio-thèques qui proposent à la fois un niveau d’abstractionélevé et un mécanisme d’optimisation adapté utilisant nonplus seulement une programmation générique à base de
templates
mais bien une
programmation générative
ca-pable de générer un code optimisé en fonction d’un en-semble de spécifications statiques. Ce concept de «biblio-thèque active» [24] met en œuvre une phase d’optimisationhaut-niveau dépendant du modèle de programmation, lais-sant le compilateur effectuer les optimisations bas-niveauusuelles (allocation des registres et ordonnancement desinstructions par exemple). Pour réaliser de telles librairies,plusieurs systèmes de méta-définition ont été proposés.Parmi ceux ci, on peut citer des projets comme Xroma [4],MPC++ [13], Open C++ [3] ou Magik [5]. Ces systèmespermettent d’injecter au sein d’un compilateur C++ desextensions qui permettent de fournir à ce dernier les in-dications sémantiques nécessaires à une compilation effi-cace. L’utilisation de ces outils reste néanmoins difficile etcontraint les développeurs à maitriser des outils annexespotentiellement complexes. Il est donc nécessaire de cher-cher une alternative intégrable directement au sein du lan-gage C++ sans nécessiter d’outils externes.
2.3 Les
Expression Templates
L’idée maîtresse de NT2 repose sur l’utilisation d’unidiome appe
Expression Templates
[22] qui consisteà déterminer quels aspects d’une expression mathéma-tique peuvent être évalués lors de la compilation. Cettetechnique se base sur les propriétés intrinsèques des
templates
C++ qui se comportent comme un langageTuring-complet [21, 23].Considéronsparexempleuneexpressionmettantenjeudesopérateurs manipulant une classe de tableaux numériques :
=
a
+
b
+
c
Cette expression s’évalue en trois passes : évaluation de
a
+
b
, de la somme de ce résultat intermédiaire avec
c
etfinalement recopie du résultat final dans
.
i
,
1
[
i
] =
a
[
i
]+
b
[
i
]
i
,
2
[
i
] =
1
[
i
]+
c
[
i
]
i
,
[
i
] =
2
[
i
]
Lebutestalorsdeserameneràuneévaluation
enuneseulepasse
:
i
,
[
i
] =
a
[
i
]+
b
[
i
]+
c
[
i
]
Pour cela, il faut s’intéresser à la
structure
de l’expres-sion à droite de l’affectation. La structure de l’arbre desyntaxe abstraite associé à cette expression est clairementfixée au moment de l’écriture de cette expression, alors quele contenu des tableaux n’est connu qu’à l’exécution. Cettedichotomie montre que, dans l’évaluation d’une telle ex-pression, la composition des opérateurs est une donnée
sta-tique
et que les données contenues dans les tableaux sont
dynamiques
. L’application d’un évaluateur partiel à une ex-pression comprenant
opérandes et
opérateurs revient àcréer lors de la compilation une fonction
ϕ
à
argumentseffectuant l’application des
opérateurs de l’expressioninitiale sur une unique valeur scalaire. A l’exécution, seulel’application de cette fonction composite aux données ini-tiales sera évaluée. Ici, nous obtenons :
ϕ
(
 x
,
 y
,
 z
) =
x
+
 y
+
 z
i
,
[
i
] =
ϕ
(
a
[
i
]
,
b
[
i
]
,
c
[
i
])
L’idée est donc de définir un certain nombre de classespermettant de représenter
au sein du langage
la structuremême de l’arbre de syntaxe abstraite afin de pouvoir«construire»
ϕ
au moment de la compilation. Pour cela,nous définissons plusieurs classes
templates
qui vont nouspermettre de représenter respectivement la structure del’arbre, ses éléments terminaux et les opérations effectuéesà la traversée des nœuds de l’arbre. L’ensemble de cesclasses va alors évaluer partiellement l’expression à lacompilation et générer un code résiduel correspondantà la suite d’opérations strictement nécessaires pour uneévaluation dynamique optimisée [22, 8].
2.4 Gestion statique du polymorphisme
En ce qui concerne la gestion des comportements op-tionnels, une solution consiste à utiliser une version
tem- plate
du patron de conception
Strategy
[10]. Ce patrondéfinit une famille d’algorithmes encapsulés et interchan-geables.
Strategy
permet de modifier l’algorithme sans tou-cher au code qui l’utilise et réciproquement. Dans notrecas, cette famille d’algorithmes est implantée comme unesérie de structures
templates
[1, 2] exposant une ou plu-sieurs méthodes de classe qui seront utilisées au sein même

Activity (2)

You've already reviewed this. Edit your review.
1 thousand reads
1 hundred reads

You're Reading a Free Preview

Download
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->