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

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