]> AND Private Git Repository - these_gilles.git/blob - PRESENTATION/diapos.rst
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
7 avril pour jury
[these_gilles.git] / PRESENTATION / diapos.rst
1 :title: Algorithmes rapides sur GPU
2 :author: Gilles Perrot
3
4
5 # boite arrondie fond gris
6
7 .. class:: example
8
9  lkj lkj lkj lj
10  olkj lkj
11  lkjdlkdj
12  ml kdmlk 
13
14 # 2 colonnes
15
16 .. class:: columns
17
18  .. list-table:: 
19     :widths: 50 80 
20     :header-rows: 0 
21
22     * - * kjh kj hkjh kqj hdkq jdhq lkj lj lkj lkj lj lqks,jxdxqdiqoioqiij
23         *  jkkjskdjf lskfj lskfjlksdjfls
24       - .. image:: css/logo-femto.png 
25                 :width: 300px 
26
27
28 ----
29
30 :id: titre
31
32 TRAITEMENT D'IMAGES SUR GPU 
33 ===========================
34
35 Algorithmes parrallèles rapides pour le filtrage et la segmentation des images bruitées sur GPU.
36 ------------------------------------------------------------------------------------------------
37
38 Gilles Perrot
39 +++++++++++++
40
41 Université de Franche-Comté, Institut FEMTO-ST 
42 +++++++++++++++++++++++++++++++++++++++++++++++
43 Département DISC - équipe AND
44 +++++++++++++++++++++++++++++++++++++
45
46 ----
47
48 PLAN DE LA PRÉSENTATION
49 =======================
50
51 #. Introduction - cadre des travaux
52
53    - Les GPUs (Graphical Processing Units)
54    - Généralités sur le traitement d'image. Nos axes de recherche.
55
56 #. La segmentation des images
57
58    - Généralités. Travaux de référence.
59    - Parallélisation GPU d'un algorithme de segmentation de type *snake*.
60
61 #. Le filtrage des images
62
63    - Généralités. Travaux de référence. 
64    - Optimisation pour GPU des filtres médian et de convolution.
65    - Conception d'un algorithme parallèle de réduction de bruit par recherche des lignes de niveaux.
66
67 #. Synthèse et conclusion. 
68
69 ----
70
71 INTRODUCTION
72 ============
73
74 ----
75
76 INTRODUCTION
77 ============
78 Les GPUs ou *Processeurs graphiques*.
79 -------------------------------------
80
81 .. image:: img/gpucpu1.png
82    :height: 400px
83
84
85 * Processeurs *classiques* **CPU** : exécution **séquentielle** 
86
87   - Quelques unités de calcul ( les c |oe| urs).
88
89 * Processeurs *graphiques* **GPU** : exécution **massivement parallèle**
90
91   - Des centaines, voire millier, d'unités de calcul, regroupées en quelques SMs (*Streaming Multiprocessors*).
92
93 ----  
94
95 INTRODUCTION
96 ============
97 Les GPUs ou *Processeurs graphiques*.
98 -------------------------------------
99
100 * La multiplication des c |oe| urs dans les GPUs se fait au détriment des fonctions de contrôle et de cache.
101 * Seule la mémoire *globale* est accessible par l'ensemble des fils d'exécution (les *threads*) et ses performances sont faibles.
102 * L'accès efficace aux différents types de mémoires est contraignant.
103 * Les échanges de données entre le GPU et son hôte CPU sont pénalisants.
104 * Il est important de concevoir un partage équilibré des ressources au sein de chaque SM, pour permettre un niveau de parallélisme élevé, et donc d'envisager de bonnes performances.
105 * La mise au point n'est pas aisée lorsque des centaines de milliers de threads concourent à l'exécution d'une tâche.
106
107 ----   
108
109 INTRODUCTION
110 ============
111 Le traitement des images
112 ------------------------
113
114 * Beaucoup d'applications sont basées sur l'analyse ou la visualisation d'images numériques.    
115 * Les capteurs numériques et les conditions d'acquisition sont à l'origine de perturbations (bruits) qui dégradent l'image de la scène idéale et peuvent en fausser ou compliquer l'interprétation.
116 * La réduction de bruit demeure un thème important, car les hautes résolutions sont souvent obtenues à faible flux de photons, dont les variations engendrent du bruit. 
117 * La segmentation représente aussi un enjeu crucial, mais aucun algorithme universel n'a encore été élaboré.
118
119 .. note:: 
120
121  * on recense plus de 4000 algorithmes de segmentation
122  * La segmentation intervient dans beaucoup d'applications : du tracking à la détection ou à l'extraction de caractéristiques diverses.
123  * Mais aujourd'hui encore, une bonne segmentation est celle qui permet d'extraire ce que l'on attend => l'algorithme dépend du problème. 
124
125 ----
126
127 INTRODUCTION
128 ============
129 Le traitement des images
130 ------------------------
131
132 * L'accroissement des capacités de calcul a suivi l'augmentation des résolutions d'images.
133 * Les traitements envisagés sur les images sont de plus en plus évolués ( traitements de haut niveau ) et requièrent souvent un temps de calcul accru.
134 * L'architecture parallèle particulière des GPUs a permis d'améliorer considérablement les performances de certaines classes d'algorithme et fait espérer des accélérations importantes pour d'autres.
135  
136 **Nos travaux sont une contribution à cette recherche de performance.**
137
138 .. note:: 
139
140  * La croissance des capacités de calcul des GPUs à été beaucoup plus forte que celle des CPUs.
141  
142
143 ----
144
145 INTRODUCTION
146 ============
147 Traitements d'images de haut niveau
148 -----------------------------------
149
150 #. **Pré-traiter** et effectuer les traitements de haut niveau sur des images *améliorées*. 
151
152    * permet, *a priori*, de réduire le coût des traitements de haut niveau.
153    * les prétraitements ont eux aussi un coût, en temps de calcul et potentiellement en information.
154  
155 #. **Ne pas pré-traiter** et effectuer les traitements de haut niveau sur les images bruitées.
156
157    * permet de ne pas subir la perte d'information occasionnée par le pré-traitement.
158    * les traitements de haut niveau sont, *a priori*, plus coûteux.  
159
160
161 .. note:: 
162
163  Certains algo (LNIV) peuvent être considérés comme pré-traitement ou comme haut-niveau selon le point de vue et la classe d'algorithme.
164
165 ----
166
167 INTRODUCTION
168 ============
169
170 Axes des travaux présentés
171 --------------------------
172
173
174 **Segmentation : accélérer le traitement de haut niveau**
175  
176  * La segmentation consiste à identifier des zones homogènes dans une image.   
177  * Algorithme de segmentation d'images bruitées (fortement) par contours actifs, appartenant à la classe communément appelée  *snakes*.
178
179 **Filtrage : accélérer les pré-traitements**
180
181  Réduction de bruit additif gaussien, suivant deux méthodes de conception  :
182
183      * algorithme original, conçu spécifiquement pour GPU, conjointement à son implémentation.
184      * algorithmes existants, où l'effort de conception ne peut porter que sur l'implémentation : filtres médian et de convolution.
185
186
187 ----
188
189 INTRODUCTION
190 ============
191
192 Images traitées
193 ---------------
194
195 * Nous nous sommes focalisés sur les *images naturelles* :
196
197  - réalisées en lumière naturelle, en intérieur aussi bien qu'en extérieur,
198  - prises avec un dispositif standard (CMOS, CCD).
199
200 * Les traitements que nous présentons ici opèrent sur des images en 
201   niveau de gris (8 ou 16 bits). 
202
203 .. note:: 
204
205  Toutefois, la plupart des algorithmes que nous proposons s'étend simplement à d'autres types d'images, comme les images en couleur ou celles issues des imageries ultrasonore ou RADAR à ouverture synthétique.  
206
207 ----
208
209 LA SEGMENTATION DES IMAGES
210 ==========================
211 Segmentation par contour actif
212
213 ----
214
215 SEGMENTATION PAR CONTOUR ACTIF 
216 ==============================
217 Introduction
218 ------------
219
220 * Le domaine médical recèle la quasi totalité des implémentations GPU d'algorithmes de segmentation.
221 * Nombre d'entre elles concernent des traitements effectués en 3D par nécessité, où l'emploi du GPU s'impose assez naturellement.
222 * La segmentation par contour actif regroupe des méthodes itératives tendant à faire converger, par déformation successive, une courbe paramétrique (contour) selon un critère d'homogénéité pré-établi :
223
224  - La classe d'algorithmes la plus implémentée est celle des **level-set**, essentiellement dans sa variante *bande étroite*.
225  - La classe des **snakes** n'est implémentée qu'au travers la variante GVF (Gradient Vector Flow).
226
227 .. figure:: img/l7-gvf.png
228    :width: 600px
229    
230    À  gauche : Level-set, évolution du contour, en rouge. À droite : visualisation du champ de force d'un *snake* GVF. 
231
232 ----
233
234 SEGMENTATION PAR CONTOUR ACTIF 
235 ==============================
236 Travaux de référence (level-set)
237 --------------------------------
238
239 L'implémentation de Roberts *et al.*  du *level-set* à *bande étroite* est actuellement la plus performante et parvient à segmenter des images d'IRM 
240
241  - 3D, de 256x256x256 pixels, sur GTX280, en **11 000 ms**
242
243 .. figure:: img/brain3D.png
244    :width: 800px
245    
246    À  gauche : évolution du contour pour une *tranche* avec, en bleu, les zones actives. À droite : visualisation  en 3D de la segmentation complète. 
247
248 ----
249
250 SEGMENTATION PAR CONTOUR ACTIF 
251 ==============================
252 Travaux de référence (snake)
253 ----------------------------
254
255 * À notre connaissance, aucune publication ne décrit d'implémentation de *snake* polygonal ou de *snake* orienté région.
256 * La référence est l'implémentation *snake GVF*  de Smistad *et al.* qui parvient à segmenter des images d'IRM
257
258  - 2D, de 512x512 pixels, sur C2070, en **41 ms**.
259  - 3D, de 256x256x256 pixels, sur C2070, en **7151 ms**
260
261 .. figure:: img/brain3D-gvf.png
262    :width: 600px
263    
264    À  gauche : une image 2D d'IRM. À droite : visualisation  en 3D de la segmentation complète. 
265
266 ----
267
268 SEGMENTATION PAR CONTOUR ACTIF 
269 ===============================
270 *Snake* polygonal orienté région (principe)
271 -------------------------------------------
272
273 .. class:: columns
274
275   .. list-table:: 
276     :widths: 50 80 
277     :header-rows: 0 
278
279     * - .. image:: img/snake-modele.png 
280                 :width: 350px 
281       - * L'objectif est de déterminer le contour le plus *vraisemblable* (nombre et positions des n |oe| uds).
282         *  Le critère de vraisemblance généralisée est, dans le cas gaussien :
283            
284            .. math::
285             
286               $$GL = \frac{1}{2}\left[ n_B.log\left(\sigma_B^2\right) + n_T.log\left(\sigma_T^2\right)\right]$$         
287        
288 * Les deux régions, intérieure et extérieure (T et B), sont prises en compte dans l'évaluation du contour. Cela permet d'extraire des formes aux contours mal définis, en raison d'un fort niveau de bruit par exemple. 
289 * Les variances :math:`\(\sigma^2\)` doivent être calculées pour chaque état du contour, ce qui est **très coûteux**. 
290
291 ----
292
293 SEGMENTATION PAR CONTOUR ACTIF 
294 ===============================
295 *Snake* polygonal orienté région (principe)
296 --------------------------------------------
297
298 * Chesnaud *et al.* ont montré comment réaliser le calcul des variances par une **sommation 2D** le long du contour, au lieu d'une classique sommation 3D sur la surface des régions concernées.
299 * Cette optimisation algorithmique implique de **pré-calculer** les trois images cumulées
300
301   .. math::
302     
303      $$S_1(i,j)=\sum_{x=0}^jx \text{ , }  S_x(i,j)=\sum_{x=0}^jI(i,x) \text{ et  } S_x^2(i,j)=\sum_{x=0}^jI(i,x)^2$$
304
305 * Les valeurs des éléments de ces images cumulées permettent de calculer la **contribution** de chaque pixel du contour, puis de chaque segment, aux calculs des variances.
306
307 ----
308
309 SEGMENTATION PAR CONTOUR ACTIF 
310 ===============================
311 *Snake* polygonal orienté région (algo CPU)
312 --------------------------------------------
313
314 .. image:: img/cochons-it0-it1.png
315    :height: 300px
316
317 **Itération 1**
318
319  #. Le contour initial est rectangulaire ( 4 n |oe| uds )
320  #. On déplace successivement les 4 n |oe| uds jusqu'à ce que plus aucun nouveau déplacement ne provoque l'amélioration du critère.
321
322
323 ----
324
325 SEGMENTATION PAR CONTOUR ACTIF 
326 ===============================
327 *Snake* polygonal orienté région (algo CPU)
328 --------------------------------------------
329
330 .. image:: img/cochons-it21-it22.png
331    :height: 300px
332
333 **Itération 2**
334
335  3. Ajout de n |oe| uds au milieu des segments suffisamment grands.
336  #. On recommence à évaluer les déplacements successifs des n |oe| uds.
337
338 ----
339
340 SEGMENTATION PAR CONTOUR ACTIF 
341 ===============================
342 *Snake* polygonal orienté région (algo CPU)
343 --------------------------------------------
344
345 .. image:: img/cochons-it4-it5.png
346    :height: 300px
347
348 **Itérations 4 et 5**
349
350 ----
351
352 SEGMENTATION PAR CONTOUR ACTIF 
353 ===============================
354 *Snake* polygonal orienté région (algo CPU)
355 --------------------------------------------
356
357 .. figure:: img/im014.png
358    :height: 400px
359
360    Image de 512x512 : contour final de 256 n |oe| uds en 14ms.
361
362 * Les résultats de segmentation dépendent des paramètres de la séquence d'optimisation (pas des déplacements, contour initial, seuil d'ajout des n |oe| uds)
363
364 ----
365
366 SEGMENTATION PAR CONTOUR ACTIF 
367 ===============================
368 *Snake* polygonal orienté région (algo CPU)
369 --------------------------------------------
370
371 .. figure:: img/snakegpu1.png
372    :height: 400px
373
374    Image de 4000x4000 : contour final de 447 n |oe| uds en 700ms.
375
376 ----
377
378 SEGMENTATION PAR CONTOUR ACTIF 
379 ===============================
380 Parallélisation du *Snake* polygonal sur GPU
381 --------------------------------------------
382 Identification des fonctions coûteuses
383
384 .. image:: img/algosnake1.png
385    :height: 500px
386
387 ----
388
389 SEGMENTATION PAR CONTOUR ACTIF 
390 ===============================
391 Parallélisation du *Snake* polygonal sur GPU
392 --------------------------------------------
393 Détail de la fonction de calcul du critère GL
394
395 .. image:: img/algosnake2b.png
396    :height: 500px
397
398
399 ----
400
401 SEGMENTATION PAR CONTOUR ACTIF 
402 ===============================
403 Parallélisation du *Snake* polygonal sur GPU
404 --------------------------------------------
405
406 .. image:: img/snake-pairimpair.png
407    :width: 800px
408
409 .. note::
410
411  * Pour un n |oe| ud et un pas de déplacement donnés, on évalue **en parallèle** 8 positions voisines, soit 16 segments distincts.
412  * Pour éviter les oscillations et *coller* à l'algorithme séquentiel, on distingue les n |oe| uds d'indices pairs et impairs.
413  * On évalue **en parallèle** l'ensemble des déplacements éventuels de tous les n |oe| uds de même parité. 
414
415 ----
416
417 SEGMENTATION PAR CONTOUR ACTIF 
418 ===============================
419 Parallélisation du *Snake* polygonal sur GPU
420 --------------------------------------------
421
422 **Structure des données** (n |oe| uds pairs)
423
424 .. image:: img/snake-segments-pairs.png
425    :width: 800px
426
427 .. note:: 
428
429   * règle 1 thread par pixel
430
431 ----
432
433 SEGMENTATION PAR CONTOUR ACTIF 
434 ===============================
435 Parallélisation du *Snake* polygonal sur GPU
436 --------------------------------------------
437
438 **Obtention du critère**
439
440 * Parallélisation :  1 thread par pixel. 
441 * Une seule taille de segment : la taille du plus long. 
442 * Bourrage avec des threads inactifs pour les segments plus courts.
443 * Calcul réalisé en 3 étapes par 3 fonctions parallèles GPU (*kernels*)
444
445  #. Calcul des coordonnées des pixels. Lecture des paramètres de chaque pixel dans les images cumulées. Sommes partielles, par bloc, des contributions des segments.  
446  #. Calcul final des contributions des segments par sommation des résultats du *kernel* précedent.
447  #. Calcul des valeurs du critère pour chaque contour évalué. Sélection du meilleur contour.
448
449
450 ----
451
452 SEGMENTATION PAR CONTOUR ACTIF 
453 ===============================
454 Parallélisation du *Snake* polygonal sur GPU
455 --------------------------------------------
456
457 **Propriétés de l'implémentation**
458
459  * Conservation des données en mémoire GPU. 
460  * Les images cumulées sont calculées en parallèle. 
461  * Abandon de l'algorithme de Bresenham pour la discretisation des segments. 
462  * Trop peu de calculs à effectuer. 
463  * Pas de coalescence possible dans les accès à la mémoire globale.
464  * Emploi de la mémoire partagée.    
465  
466 .. note::
467
468  * Un seul entier est échangé entre le CPU et le GPU à chaque itération.
469  * image cumulées par une adaptation de la méthode des sommes de préfixes.
470  * Abandon  Bresenham Possible car parcours unidirectionnel du contour. 
471  * Trop peu de calculs ne permet pas de masquer les latences.
472  * Pas de coalescence possible dans les accès à la mémoire globale car la géométrie des segments varie.
473  * mémoire partagée à cause des réductions.
474
475 ----
476
477 SEGMENTATION PAR CONTOUR ACTIF 
478 ===============================
479 Parallélisation du *Snake* polygonal sur GPU
480 --------------------------------------------
481
482 **Performances de l'implémentation**
483
484 .. image:: img/perfs-snake.png
485    :width: 600px
486  
487 ..
488  
489 .. image:: img/perfs-snake-img.png
490    :width: 600px
491
492 ----
493
494 SEGMENTATION PAR CONTOUR ACTIF 
495 ===============================
496 Parallélisation du *Snake* polygonal sur GPU
497 --------------------------------------------
498
499 **Conclusion**
500
501 * Première et seule implémentation à ce jour.
502 * Performances intéressantes pour les grandes images. 1OO MP en moins de 0,6 seconde.  
503 * Temps de calcul très dépendant du contenu de l'image.
504 * Le GPU n'est pas employé de manière optimale : réductions, threads inactifs, non coalescence.
505 * Le GPU apporte un gain important sur les premières itérations, quand les segments sont grands.
506 * Initialisation optionnelle par maximum de vraisemblance. Accélération jusqu'à x15 avec de petites cibles.
507   
508 ----
509
510 LE FILTRAGE DES IMAGES
511 ======================
512 Filtre médian - Filtres de convolution - Filtre par lignes de niveaux
513
514 ----
515
516 LE FILTRAGE DES IMAGES
517 ======================
518 Filtre médian
519 -------------
520
521 ----
522
523 LE FILTRAGE DES IMAGES
524 ======================
525 Filtre médian : principe
526 ------------------------
527
528 .. image:: img/median-principe.png
529    :width: 600px 
530
531 La valeur de sortie d'un pixel est la **médiane** des valeurs de son voisinage. 
532
533 * Bonne réduction de bruits gaussien et *poivre & sel*
534 * Valeurs de sortie appartenant au voisinage.
535 * Opération de sélection coûteuse (tri).
536 * Usages fréquents avec des petites fenêtres (de 3x3 à 7x7).
537 * Quelques applications avec de grandes fenêtres (au delà de 21x21).
538
539 ----
540
541 LE FILTRAGE DES IMAGES
542 ======================
543 Filtre médian : usage
544 ---------------------
545
546 .. table:: 
547
548    =================================== ======================================== ============================================  
549    .. image:: img/airplane_sap25.png    .. image:: img/airplane_sap25_med5.png   .. image:: img/airplane_sap25_med3_it2.png
550    =================================== ======================================== ============================================   
551    Bruit *poivre & sel* 25%            Médian 5x5                               Médian 3x3 - 2 passes
552    =================================== ======================================== ============================================
553
554 ----
555
556 LE FILTRAGE DES IMAGES
557 ======================
558 Filtre médian GPU : Travaux de référence
559 ----------------------------------------
560
561 * Sanchez *et al.* ont proposé le **PCMF** et l'ont comparé, sur C2075, avec les implémentations GPU de référence pour une image 8 bits de 512x512 (débit max. **80 MP/s**) :
562
563  - **ArrayFire**, bibliothèque commerciale, débit max. **185 MP/s**
564  - **BVM** parallélisé par Kachelrie |B|, débit max. **110 MP/s** 
565
566 .. image:: img/compar-median2.png
567    :width: 500px 
568
569 .. note:: 
570
571  * PCMF : Parallel (Complementary Cumulative Derivative Function) Median Filter (histogrammes cumulatifs)
572  * CTMF : CPU à temps constant
573
574 ----
575
576 LE FILTRAGE DES IMAGES
577 ======================
578 Filtre médian GPU : Travaux de référence  
579 ----------------------------------------
580
581 Emploi de la **mémoire partagée** pour pré-charger les valeurs utiles à chaque bloc de threads.
582
583 .. image:: img/shmemhalo.png   
584    :width: 800px
585  
586 ----
587
588 LE FILTRAGE DES IMAGES
589 ======================
590 Optimisation du filtre médian GPU  
591 ---------------------------------
592
593 Transferts des données optimisés
594
595  CPU :math:`\(\rightarrow\)` GPU texture :KERNEL:  GPU globale :math:`\(\rightarrow\)` CPU non paginée
596
597  .. image:: img/transferts-mem.png
598    :width: 650px 
599
600 .. note::
601
602  On gagne de 13 à 43 % sur les temps de transfert.
603
604 ----
605
606 LE FILTRAGE DES IMAGES
607 ======================
608 Optimisation du filtre médian GPU  
609 ---------------------------------
610
611 Débits maximums effectifs, en MP/s, pour des images en 8 et 16 bits, incluant les transferts optimisés (C2070).
612
613  .. image:: img/debit-max-2070.png
614    :width: 300px
615
616 **Rappel :** PCMF : 80 MP/s - BVM : 110 MP/s - ArrayFire : 185 MP/s
617
618 .. note::
619
620  ça laisse environ 80ms pour faire un tri de 9 valeurs sur une image de 4096x4096 
621
622 ----
623
624 LE FILTRAGE DES IMAGES
625 ======================
626 Optimisation du filtre médian GPU  
627 ---------------------------------
628
629 **Sélection de la médiane**
630
631  * Emploi exclusif des **registres** pour charger les valeurs utiles.
632  * Limitations à 63 registres par thread et 32 K par bloc de threads.
633  * Envisageable pour les médians de petite taille (jusqu'à 7x7 avec 1 thread/pixel).
634  * Exploitation des recouvrements entre fenêtres de pixels voisins.
635    
636   
637 ----
638
639 LE FILTRAGE DES IMAGES
640 ======================
641 Optimisation du filtre médian GPU  
642 ---------------------------------
643
644 **Sélection de la médiane** (par oubli)
645
646 .. class:: columns
647
648  .. list-table:: 
649     :widths: 50 80 
650     :header-rows: 0 
651
652     * - Bonnes performances envisagées :
653
654          * Économie de registres.
655          * Évite le tri complet. 
656       - .. image:: img/forgetful_selection.png
657            :height: 500px
658
659 ----
660
661 LE FILTRAGE DES IMAGES
662 ======================
663 Optimisation du filtre médian GPU  
664 ---------------------------------
665
666 **Exploitation des recouvrements**
667
668 .. image:: img/recouvrement5.png
669      :width: 800px
670
671 **Intérêt :**  Économie de registres - chaque thread traite 2 pixels. 
672
673 .. note:: 
674
675   * chaque thread utilise plus de registres
676   * mais sur un bloc, en adaptant la taille du bloc, on économise k+1 registres par paire de pixels.
677
678 ----
679
680 LE FILTRAGE DES IMAGES
681 ======================
682 Optimisation du filtre médian GPU  
683 ---------------------------------
684
685 **Masquage des latences**
686
687 * Accès à la mémoire globale : 2 pixels par thread.
688 * Instruction Level Parallelism (ILP) : Ordre des instructions minimisant l'interdépendance.
689
690   .. figure:: img/bitonic.png
691      :height: 300px 
692
693      Identification des extrema dans le vecteur initial d'un médian 5x5
694
695 .. note:: 
696
697    * au delà de 2 pixels par thread, le gain sur les latences est compensé par la perte sur le calcul / niveau de parallèlisme.
698    * ILP maximisée en appliquant une méthode simple; utilisée par ex. dans la technique des réseaux de tri bitoniques. 
699
700 ----
701
702 LE FILTRAGE DES IMAGES
703 ======================
704 Performances du filtre médian GPU proposé (PRMF)  
705 ------------------------------------------------
706
707 .. image:: img/perf-median.png
708    :width: 650px
709
710 ----
711
712 LE FILTRAGE DES IMAGES
713 ======================
714 Performances du filtre médian GPU proposé (PRMF)  
715 ------------------------------------------------
716
717 Image 512x512
718
719  .. image:: img/comp512.png           
720     :height: 200px
721
722 Image 4096x4096
723
724  .. image:: img/comp4k.png  
725     :height: 200px
726
727 ----
728
729 LE FILTRAGE DES IMAGES
730 ======================
731 Le filtre médian GPU   
732 --------------------
733
734 **Conclusion**
735
736  * Pas d'utilisation de la mémoire partagée.
737  * Débit global amélioré de x7 à x10, proche du maximum.
738  * Débit de calcul atteignant **5,3 GP/s**. 
739  * Médian jusqu'au 9x9 sur C2070, 21x21 sur K40. 
740  * Création d'une application web générant les codes sources.
741  * Utilisé pour le pré-traitement d'images de cristallographie  au synchrotron **SPring-8** (Japon).
742  
743 .. image:: img/SPring8.png
744     :height: 200px 
745
746 ----
747
748 LE FILTRAGE DES IMAGES
749 ======================
750 Les filtres de convolution 
751 --------------------------
752
753 ----
754
755 LE FILTRAGE DES IMAGES
756 ======================
757 Les filtres de convolution : généralités  
758 -----------------------------------------
759
760 **Principe**
761
762  .. math::
763  
764   $$I_{out}(x, y) = \left(I_{in} * h\right) = \sum_{(i < H)} \sum_{(j < L)}I_{in}(x-j, y-i)h(j,i)$$
765
766 **Usage, selon les valeurs du masque h**
767
768  * réduction de bruit,
769  * détection de bords,...
770
771 .. note::
772
773  * selon h --> convo séparable ou non séparable
774
775 ----
776
777 LE FILTRAGE DES IMAGES
778 ======================
779 Les filtres de convolution GPU
780 ------------------------------
781
782 Le fabricant Nvidia propose la plus rapide des implémentations connue :
783
784 Convolution **non séparable** sur image de 2048x2048, masque h de 5x5, sur **GTX280**.
785
786 * Débit global : **945 MP/s**.
787 * Débit de calcul : **3,00 GP/s** 
788
789 ----
790
791 LE FILTRAGE DES IMAGES
792 ======================
793 Les filtres de convolution GPU
794 ------------------------------
795
796 Exploitation des recouvrements
797
798  * un seul accès mémoire par pixel, mémorisation en registre.
799  * mise à jour de tous les calculs concernés
800
801 .. image:: img/convoOverlap2.png
802    :width: 400px
803
804 Application des techniques présentées pour le filtre médian :
805
806 * Optimum à 8 pixels par thread.
807 * Débit global : **966 MP/s**.
808 * Débit de calcul : **3,47 GP/s** 
809
810 Sur **C2070**, nos débits sont de **1666 MP/S** et **5280 MP/s**. Les débits maximum atteignent **2140 MP/s** et **8540 MP/s** (4090x4096, masque 3x3) 
811
812 ----
813
814 LE FILTRAGE DES IMAGES
815 ======================
816 Les filtres de convolution GPU 
817 ------------------------------
818
819 Convolution **séparable** sur C2070.
820
821 Implémentation Nvidia (mémoire partagée)
822
823  * Débit global max : **1933 MP/s**.
824  * Débit de calcul max : **6000 MP/s** 
825
826 Notre implémentation
827
828  * Optimum à 8 pixels par thread.
829  * Une convolution 1D en mémoire partagée, l'autre en registres. Copie intermédiaire en mémoire globale (cache 1D rapide).
830  * Débit global : **2028 MP/s**.
831  * Débit de calcul : **7626 MP/s** 
832  * Le gain est obtenu sur la convolution 1D en registres.
833
834 ----
835
836 LE FILTRAGE DES IMAGES
837 ======================
838 Les filtres de convolution GPU 
839 ------------------------------
840
841 **Conclusion**
842
843  * Amélioration limitée des débits globaux en raison de la prépondérance des temps de transfert.
844  * Amélioration sensible sur les débits de calcul (de 17 à 33 %).
845  * Le traitement 1D est jusqu'à 66% plus rapide. Applicable à d'autres signaux 1D.
846
847 ----
848
849 LE FILTRAGE DES IMAGES
850 ======================
851 Filtre par recherche des lignes de niveaux 
852 ------------------------------------------
853
854 ----
855
856 LE FILTRAGE DES IMAGES
857 ======================
858 Filtre par recherche des lignes de niveaux 
859 ------------------------------------------
860
861 **Motivations :**
862
863  * Les algorithmes qui débruitent le mieux sont lents (BM3D).
864  * Les images naturelles sont décomposables en un ensemble de lignes de niveaux ( iso-niveau de gris ). 
865  * Concevoir un algorithme GPU original et son implémentation.
866
867 ----
868
869 LE FILTRAGE DES IMAGES
870 ======================
871 Filtre par recherche des lignes de niveaux 
872 ------------------------------------------
873
874 **Principe**
875
876  * Estimation locale, par maximum de vraisemblance, des lignes de niveaux.
877  * Réduction de bruit par moyennage le long de la ligne estimée.
878  * Les lignes de niveaux estimées sont modélisées par des lignes brisées nommées **isolines**.  
879  * Les segments des lignes brisées sont choisis parmi des motifs pré-établis (32 motifs).
880  
881
882    .. image:: img/P5Q1.png
883       :width: 500px 
884
885
886 ----
887
888 LE FILTRAGE DES IMAGES
889 ======================
890 Filtre par recherche des lignes de niveaux 
891 ------------------------------------------
892
893 **Principe (étape 1)**
894
895  * En chaque pixel, recherche du motif maximisant la log-vraisemblance ( :math:`\(n=6, \sigma^2 =\)` variance )
896
897  .. math:: 
898
899    $$-\frac{n}{2}log\left(2\pi\right) - \frac{n}{2}log\left(\sigma^2\right) - \frac{n}{2}$$
900
901  * Mémorisation des paramètres des motifs sélectionnés dans deux matrices :math:`\(I_{\Theta}\)` et :math:`\(I_{\Sigma}\)`. 
902
903  .. image:: img/lniv-mv.png
904     :width: 500px
905
906 ----
907
908 LE FILTRAGE DES IMAGES
909 ======================
910 Filtre par recherche des lignes de niveaux 
911 ------------------------------------------
912
913 **Principe (étape 2)**
914
915  * Allongement itératif des segments sous condition GLRT.
916
917  .. math::
918     
919     $$(n_{s_1s_2}+n_{s_3})\left[log\left(\widehat{\sigma_{s_1s_2}}^2\right) - log\left(\widehat{\sigma_{s_3}}^2\right) \right]$$
920  
921  .. image:: img/pipd-detail.png
922     :width: 900px   
923
924 ----
925
926 LE FILTRAGE DES IMAGES
927 ======================
928 Filtre par recherche des lignes de niveaux 
929 ------------------------------------------
930
931 **Principe (étape 3)**
932
933  Compensation de la non robustesse de sélection des motifs dans les zones homogènes.
934  
935   * identification des zones homogènes avec un détecteur de bords.
936   * Application d'un filtre moyenneur dans ces zones.  
937  
938  .. image:: img/detecteur.png
939     :width: 400px   
940
941 .. note::
942
943  * Sous-ensembles de pixels n'ayant pas d'intersection --> MV
944  * Utilisation des motifs des segments pour gain de temps.
945  
946 ----
947
948 LE FILTRAGE DES IMAGES
949 ======================
950 Filtre par recherche des lignes de niveaux 
951 ------------------------------------------
952
953 **Résultats**
954
955  Sur l'ensemble d'images de S. Lansel (DenoiseLab, Université Stanford)
956
957  * Amélioration moyenne du rapport Signal sur bruit: **+7,1 dB**
958  * Indice de similarité structurelle : **+30%**
959  * Temps de calcul : **7 ms**
960  
961  Comparaison avec BM3D
962  
963  * Amélioration moyenne du rapport Signal sur bruit: **+9,5 dB**
964  * Indice de similarité structurelle : **+36%**
965  * Temps de calcul : **4300 ms**
966  
967 --------
968
969 LE FILTRAGE DES IMAGES
970 ======================
971 Filtre par recherche des lignes de niveaux 
972 ------------------------------------------
973  
974 .. table:: 
975
976    ============================================ === ======================================== 
977    .. image:: img/zoom_noisy.png                    .. image:: img/zoom_mean5.png        
978     
979
980    Bruit gaussien :math:`\(\sigma=25\)`             Moyennage 5x5                                                           
981    
982    .. image:: img/zoom_pipdh.png                    .. image:: img/zoom_bm3d.png
983    
984    PI-PD                                            BM3D
985    ============================================ === ======================================== 
986
987 --------
988
989 LE FILTRAGE DES IMAGES
990 ======================
991 Filtre par recherche des lignes de niveaux 
992 ------------------------------------------
993
994 **Synthèse - conclusion**
995
996  * Rapport qualité/temps élevé.
997  * Traitement d'images HD à 20 fps.
998  * Artefacts en marche d'escalier. Réduits par la méthode de Buades *et al.* (+1 dB, +0,2 ms pour 512x512).
999  * Extension aux images couleurs et autres types de bruits (multiplicatif). 
1000  * Algorithme original sans implémentation de référence séquentielle. Conception GPU dès l'origine. 
1001
1002 ----
1003
1004 CONCLUSION GÉNÉRALE - PERSPECTIVES
1005 ==================================
1006
1007 * Trois types de conception mis en  |oe| uvre.  
1008 * Le portage efficace d'algorithme peut s'avérer très complexe, voire sans intérêt.
1009 * L'emploi de la mémoire partagée n'apporte pas les meilleures performances en cas de recouvrements.
1010 * L'écriture de code performant est fastidieuse et les codes non paramétriques.
1011 * Création d'un programme générateur.
1012
1013 * Beaucoup de traitements peuvent bénéficier des techniques proposées.
1014 * Les évolutions de l'architecture laissent entrevoir de nouvelles possibilités.
1015 * Extension à d'autres domaines. 
1016
1017
1018 .. note::
1019
1020  * certaines ardeurs ont été refroidies 
1021
1022 .. |oe| unicode:: U+0153
1023    :trim:
1024
1025 .. |B| unicode:: U+00DF
1026    :trim: