• Aucun résultat trouvé

5 1 Vision par ordinateur

5.2.3 Schéma computationnel complet

La figure 5.3 décrit une itération complète du schéma de calcul 1. Assignation des vertex de la surface aux vertex GPU, rendu, calcul

de D2,k(p), k=1, 2, 3 pour tout point p ;

2. Assignation des triangles aux pixel shaders, rendu, calcul des doubles sommes avec les quantités ∂ET

∂dM ;

3. Assignation des vertex de la surface aux pixels shaders, rendu, cal- cul de la somme de voisinnage menant au gradient ∂E∂d(MS). Calcul des positions des vertex dm en fonction de ce gradient ;

4. Mis à jour des positions des vertex (stockés dans un buffer particu- lier) et éventuellement test d’arrêt.

5.2.4 Résultats

Nos expériences ont été réalisées avec un PC standard dont le CPU est cadencé à 3GHz et d’une carte graphique Geforce 7800GTX, maintenant largement démodée.

I1, I2 et ∇I2 sont précalculés lors d’une première phase. Les textures utilisées sont en 16bits (apportant un gain en temps de 40%). Nous avons obtenu une convergence rapide avec une moyenne de 10 itérations par ni- veau de détail. Il s’est avéré que notre approche multi-résolution empêche de tomber dans des minima locaux.

Pour effectuer des comparaisons, nous avons développé une version CPU de référence, minimisant la même énergie que la version GPU. Cette version CPU a été précautionneusement écrite et compilée avec toutes les optimisations disponibles. Le tableau 5.1 montre les gains obtenus par la version GPU sur la version CPU. On observe un gain moyen de l’ordre de 10 à 15. Cela montre que notre implémentation utilise au mieux le pipeline graphique.

Image Maillage GPU CPU Gain

642 52 1.60 kHz 555Hz 2.9 1282 92 1.33 kHz 116Hz 11.5 2562 172 464Hz 28.6 Hz 16.2 5122 332 102Hz 7.5 Hz 14.1 5122 652 89.4 Hz 7.3 Hz 12.2 5122 1292 67.9 Hz 7.2 Hz 9.0

Table 5.1 – Fréquences observées pour 1000 itérations à un niveau de détail donné, en fonction des tailles des images et du maillage. Le gain moyen est entre 10 et 15.

Les figures 5.4 et 5.5 montrent les jeux de donnés utilisés. Les résultats correspondants, ainsi que quelques temps de calculs sont donnés dans les figures 5.6, 5.7, 5.8 et 5.9. Pour chaque figure présentée, nous avons exécuté 8 itérations pour chaque niveau de détail, excepté pour les deux derniers niveaux, exécutés respectivement 4 et 2 fois. Un temps d’exécu- tion total de 250ms est observé pour une convergence globale. Comme attendu, notre algorithme n’est pas aussi rapide que ceux basés sur des cartes de disparités. Cependant, les applications visées ne sont pas les mêmes.

Etape 1 Etape 4 Pixel texture Pixel texture Pixel texture Etape 2 Etape 3 Rasterisation de la surface Pixel Shader :

pour chaque pixel m de

pour les diagonales) l'image 2, la quantité

Pixel Shader : (un pixel par triangle) Calcul des nouvelles (5.3) est calculée (sauf

dérivées de l'énergie pour chaque triangle utilisant les résultats de l'étape 1 dans une texture

(utilisation de Multiple Render Targets)

Pixel Shader :

de la surface) (un pixel par vertex

Ajout du terme de régularisation, calcul de la descente de gradient, calcul des nouvelles positions des vertex

Mise à jour des positions des vertex

Etape 4 (option) Test d'arrêt

Figure 5.3 – Schéma de calcul complet pour deux caméras. Exemple d’itération sur un maillage de 3×3 vertex et une image de taille 8×8. Notre implémentation débute avec un maillage 3×3 et une image 32×32. Un carré rouge représente un pixel effectivement calculé. Les lignes pleines représentent le maillage.

Un des inconvénients de cette méthode est que les occlusions ne sont pas gérées. Nous pouvons cependant facilement interdire l’algorithme de

5.3. Stéréovision à trois caméras 127

Figure 5.4 – Premier et deuxième jeux de données

Click to buy NOW!

PDF-XChange

w

ww

.docu-track. com

Click to buy NOW!

PDF-XChange

w

ww

.docu-track. com

Figure 5.5 – Troisième et quatrième jeux de données

considérer les triangles occlus, avec l’utilisation d’une troisième caméra. C’est ce que nous présentons dans la section suivante.

5.3

Stéréovision à trois caméras

Notre modèle peut facilement être étendu pour gérer trois caméras. Notons la caméra gauche L, la centrale C et celle de droite R. La caméra de référence sera C, tenant le rôle précédemment tenu par la caméra 1 dans la section précédente. La corrélation sera calculée entre les caméras C et L ou entre les caméras C et R. Les seuls critères d’assignation des caméras sont les suivants :

1. La surface est modélisée à partir du centre optique de la caméra C ; 2. La corrélation entre les caméras L et R n’est pas prise en compte.

Ce choix fait, nous divisons à chaque itération les triangles en deux ensembles SLet SR, SL(respectivement SR) étant l’ensemble des triangles corrélant entre les caméras C et L (respectivement entre les caméras C et R). L’énergie associée est alors similaire à celle donnée dans l’équation

Figure 5.6 – Surface obtenue à partir du premier jeu de données. Temps de calcul : 240ms. Deux caméras.

Figure 5.7 – Surface obtenue à partir du deuxième jeu de données. Temps de calcul : 250ms. Deux caméras. Ces images sont la propriété du Pr. Kyros Kutulakos, University of Toronto.

Figure 5.8 – Surface obtenue à partir du troisième jeu de données. Temps de calcul : 230ms. Deux caméras. Ces images sont la propriété du Pr. Kyros Kutulakos, University of Toronto. (5.1) : E(S) =

T∈SL (1ρT(IC◦ΠC, IL◦ΠL)) +

T∈SR (1−ρT(IC◦ΠC, IR◦ΠR)) (5.5) Dans nos tests, nous utilisons simplement un test sur les normales aux triangles pour déterminer la meilleure caméra secondaire entre L et R. De plus, les occlusions peuvent facilement être traitées. En déterminant la surface à partir de la caméra secondaire, on détermine si un triangle est vu ou non. Lorsqu’un triangle n’est vu par aucune caméra, il n’est assigné ni à SL, ni à SR. Ensuite, en gardant l’énergie donnée par l’équation (5.5), un triangle qui n’est pas vu par au moins C et une des deux autres ca- méras n’est pas pris en compte dans cette énergie. En fait, nous ignorons également les triangles qui ne sont pas assez "de face", en un certain sens. Cela apporte une première façon de gérer les discontinuités, un point im- portant que notre modèle ne prenait pas en compte jusqu’ici.

Nous avons implémenté cet algorithme à la fois sur CPU et GPU. La version CPU ne prend pas en compte les occlusions, un test de visibilité

Figure 5.9 – Surface obtenue à partir du quatrième jeu de données. Temps de calcul : 220ms. Deux caméras.

serait trop lent. Cette version s’exécute seulement 9% plus lentement que la version à deux caméras.

Pour implémenter la version GPU, nous utilisons un stencil buffer (voir section 1.4.4.1) pour classifier les triangles en deux groupes, pour pouvoir ensuite travailler séparément sur chaque groupe. On mémorise donc grâce à ce buffer l’appartenance de chaque triangle à SLou SR, en marquant un de ces deux groupes par un masque. Il sera simplement nécessaire d’in- verser le masque lors du changement de groupe. Ce test est directement câblé sur la carte graphique et est ainsi très rapide. Une vue d’ensemble de l’algorithme pour la version GPU est donnée dans la figure 5.10. Si les triangles étaient aléatoirement distribués entre SL et SR, notre algorithme pourrait mener à des problèmes de cache. Ce n’est heureusement pas le cas ici. Nos premiers résultats montrent une surcharge supplémentaire de 30% par rapport à la version à deux caméras.

La figure 5.11 montre le jeu de données utilisé pour notre algo- rithme à trois caméras. Quelques résultats graphiques sont présentés en figures 5.12 et 5.13.

Grâce à la gestion des occlusions et à une plus grande précision lorsque les trois caméras observent le triangle courant, la reconstruction à trois caméras (figure 5.13) est plus exacte et plus précise que celle à deux caméras (figure 5.12).

5.4

Vidéo

Nous avons testé notre algorithme sur des séquences vidéo. Pour la première image, la convergence est obtenue en environ 250ms. Par conti- nuité temporelle, nous prenons la surface reconstruite à l’image f comme valeur initiale pour la convergence à l’image f+1. Quelques tests prélimi- naires consistant principalement en un ajustement des choix des niveaux de détails et du nombre d’itérations ont montré des résultats prometteurs en atteignant une fréquence de 8 images par seconde pour l’algorithme à deux caméras. Avec les cartes les plus récentes actuellement, on peut es- pérer atteindre environ 20 images par secondes. De plus, il est à noter que notre approche peut facilement être transformée en une version utilisant deux cartes graphiques couplées, avec un minimum de transferts entre

Etape 1

Classification des triangles

Résultats écrits dans le stencil buffer

Etape 2

Ecriture du stencil buffer pour les étapes 3 à 4

Etape 3

Test sur le stencil buffer pour la gestion du premier groupe de triangles. pour chaque pixel Calcul de la quantité (5.3)

Test sur le stencil buffer

triangles.

Calcul de la quantité (5.3) pour chaque pixel

Etape 4

pour la gestion de l'autre groupe de

Etape 5

Calcul des dérivées de l'énergie pour le premier groupe de triangles avec un test sur le stencil buffer

Calcul des dérivées de l'énergie pour triangles avec un test sur le stencil buffer l'autre groupe de Etape 7 Etape 6 Ajout du terme de régularisation et calcul de la descente de gradient. Calcul des nouvelles positions des vertex

Mise à jour des positions des vertex

Changement du niveau de détail après quelques itérations

Etape 8

Figure 5.10 – Schéma de calcul complet pour trois caméras.

les deux, ce qui permettrait d’atteindre facilement le temps réel, tout en restant financièrement très abordable.

5.4. Vidéo 131

Figure 5.11 – Jeu de données pour l’algorithme à trois caméras. Issu de [137].

Figure 5.12 – Reconstruction à partir de deux caméras avec zones occludées. Le nez et la partie gauche du visage ne sont pas correctement reconstruits.

Conclusion du chapitre

Dans ce chapitre, nous avons présenté un algorithme de stéréovision dense sur GPU, basé sur des principes variationnels, capable de gérer les occlusions, prenant deux ou trois caméras en entrée et proposant un gain en temps de l’ordre de 10 à 15 et une reconstruction précise des objets observés, ceci grâce à un GPU aujourd’hui totalement dépassé techni- quement, bien plus lent que les GPU actuels et obligeant à calculer en plusieurs passes ce qui pourrait l’être directement.

Dans le prochain chapitre, nous décrivons un algorithme de mise en correspondance de points d’intérêts pouvant servir de base aux algo- rithmes de reconstitution 3D.

6

GPU

Sommaire

6.1 Détection et caractérisation de points d’intérêt . . . . 135

6.1.1 Détection . . . 136 6.1.1.1 Harris . . . 136 6.1.1.2 Harris-Laplace . . . 137 6.1.1.3 DoG et SIFT . . . 139 6.1.1.4 SURF . . . 142 6.1.2 Caractérisation par descripteur . . . 143 6.1.2.1 SIFT . . . 143 6.1.2.2 SURF . . . 145

6.2 Appariement de deux images . . . 147

6.2.1 Méthode d’appariement . . . 147 6.2.1.1 Distances . . . 147 6.2.1.2 Plus proche voisin approché (ANN) . . . 148 6.2.1.3 Filtrage . . . 148 6.2.2 Algorithme GPU d’appariement de deux images . . . 149 6.2.2.1 Implémentation . . . 150 6.2.2.2 Résultats . . . 152

6.3 Notre application . . . 153 Conclusion . . . 154

L

’appariement d’une image donnée avec une seconde image ou un en- semble d’autres images, est classiquement réalisé en repérant et en mettant en correspondance différents indices présents dans ces images. C’est un pré-requis essentiel à de nombreux algorithmes en vision par or- dinateur, tel le Structure From Motion [94], la reconnaissance d’objet ou la classification. Les indices usuellement utilisés sont des points d’intérêt, dé- tectés dans des images, puis caractérisés localement et appariés à travers l’ensemble de ces images. Avec de nombreuses images en entrée, pouvant contenir chacune plusieurs milliers de points d’intérêt, la mise en corres- pondance rapide de ces points est une étape très consommatrice en temps de calcul, même avec les plus récents CPU, et souvent sous-estimée. Dans les applications concernées, c’est en effet un des bottlenecks majeurs.

Dans ce chapitre, nous présentons dans une première partie quelques unes des méthodes classiques pour détecter et caractériser par un descrip- teur ces points d’intérêt, en particulier les Scale Invariant Feature Transforms (SIFT), et les Speeded-Up Robust Features (SURF). Dans une deuxième par- tie, nous exposons d’abord le procédé usuel d’appariement (matching), basé sur une comparaison de distances entre descripteurs, puis proposons ensuite une méthode de mise en correspondance rapide de deux images, implémentée sur GPU, s’exécutant classiquement en 20ms pour une paire d’images contenant un millier de points d’intérêt chacune. L’objet de notre troisième partie est la présentation d’une application de cette méthode, traitant un large ensemble d’images pour apporter une aide à l’utilisateur lors d’un processus d’acquisition photographique d’une scène, et pouvant indiquer quelles parties de la scène n’ont pas encore été "suffisamment" observées pour pouvoir être reconstituée, une nouvelle image étant appa- riée de façon interactive avec toutes les précédentes.

Les travaux présentés dans ce chapitre, réalisés dans le cadre du projet ANR Wired Smart, ont fait l’objet d’une publication à ICPR’08 [33], en collaboration avec Renaud Keriven.

6.1

Détection et caractérisation de points d’intérêt