]> AND Private Git Repository - these_gilles.git/blobdiff - PRESENTATION/index.html
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
final
[these_gilles.git] / PRESENTATION / index.html
index 91b91df8b120a754175648d409ff3272a111fb50..59e6efad43fa44573ec510711bcd44e636308485 100644 (file)
@@ -1 +1 @@
-<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><title>Algorithmes rapides sur GPU</title><meta name="generator" content="Hovercraft! 1.0 http://regebro.github.com/hovercraft"></meta><meta name="author" content="Gilles Perrot"></meta><link rel="stylesheet" href="css/hovercraft.css" media="all"></link><link rel="stylesheet" href="css/impressConsole.css" media="all"></link><link rel="stylesheet" href="css/highlight.css" media="all"></link><link rel="stylesheet" href="css/zulug5.css" media="all"></link><script type="text/javascript" src="https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script></head><body class="impress-not-supported"><div id="impress"><div class="step" step="0" id="titre" data-x="0" data-y="0"><h1 id="traitement-d-images-sur-gpu">TRAITEMENT D'IMAGES SUR GPU</h1><h2 id="algorithmes-rapides-pour-le-filtrage-et-la-segmentation-des-images-bruitees-sur-gpu">Algorithmes rapides pour le filtrage et la segmentation des images bruit&#xE9;es sur GPU.</h2><h3 id="gilles-perrot">Gilles Perrot</h3><h3 id="avril-2014">17 avril 2014</h3><h3 id="universite-de-franche-comte-institut-femto-st">Universit&#xE9; de Franche-Comt&#xE9;, Institut FEMTO-ST</h3><h3 id="departement-disc-equipe-and">D&#xE9;partement DISC - &#xE9;quipe AND</h3><h3 id="direction-r-couturier-s-domas">Direction  : R. Couturier &amp; S. Domas</h3></div><div class="step" step="1" data-x="1600" data-y="0"><h1 id="filtrage">FILTRAGE</h1><p>R&#xE9;duire le bruit.</p><img src="img/ex-filtrage.png" alt="" width="800px" height=""></img><div class="notes"><ul><li>les bruits d&#xE9;gradent l'image de la sc&#xE8;ne id&#xE9;ale et peuvent en fausser ou compliquer l'interpr&#xE9;tation.</li><li>Les capteurs num&#xE9;riques et les conditions d'acquisition sont &#xE0; l'origine de perturbations (bruits).</li><li>Les hautes r&#xE9;solutions sont souvent obtenues &#xE0; faible flux de photons, dont les variations engendrent du bruit.</li></ul></div></div><div class="step" step="2" data-x="3200" data-y="0"><h1 id="segmentation">SEGMENTATION</h1><p>Distinguer les zones homog&#xE8;nes d'une image.</p><img src="img/seg1.png" alt="" width="700px" height=""></img><div class="notes"><ul><li>on recense plus de 4000 algorithmes de segmentation</li><li>La segmentation intervient dans beaucoup d'applications : du tracking &#xE0; la d&#xE9;tection ou &#xE0; l'extraction de caract&#xE9;ristiques diverses.</li><li>Mais aujourd'hui encore, une bonne segmentation est celle qui permet d'extraire ce que l'on attend =&gt; l'algorithme d&#xE9;pend du probl&#xE8;me.</li></ul></div></div><div class="step" step="3" data-x="4800" data-y="0"><h1 id="id1">SEGMENTATION</h1><p>Deux approches</p><img src="img/approches.png" alt="" width="800px" height=""></img><div class="notes"><ul><li><strong>Pr&#xE9;-traiter</strong> et effectuer les traitements de haut niveau sur des images <em>am&#xE9;lior&#xE9;es</em>.</li></ul><blockquote><ul><li>r&#xE9;duction, <em>a priori</em>, du co&#xFB;t des traitements de haut niveau.</li><li>les pr&#xE9;traitements ont eux aussi un co&#xFB;t, en temps de calcul et potentiellement en information.</li></ul></blockquote><ul><li><strong>Ne pas pr&#xE9;-traiter</strong> et effectuer les traitements de haut niveau sur les images bruit&#xE9;es.<ul><li>pas de perte d'information due au pr&#xE9;-traitement.</li></ul></li></ul></div></div><div class="step" step="4" data-x="6400" data-y="0"><h1 id="plan-de-la-presentation">PLAN DE LA PR&#xC9;SENTATION</h1><ol><li>Introduction<ul><li>Les GPUs ou <em>Graphical Processing Units</em>.</li><li>Le filtrage et la segmentation d'images.</li></ul></li><li>La segmentation des images<ul><li>Travaux de r&#xE9;f&#xE9;rence.</li><li>Parall&#xE9;lisation GPU d'un algorithme de segmentation de type <em>snake</em>.</li></ul></li><li>Le filtrage des images<ul><li>Travaux de r&#xE9;f&#xE9;rence.</li><li>Optimisation GPU des filtres m&#xE9;dian et de convolution.</li><li>Conception d'un algorithme GPU de d&#xE9;bruitage par recherche des lignes de niveaux.</li></ul></li><li>Conclusion et perspectives</li></ol></div><div class="step" step="5" data-x="8000" data-y="0"><h1 id="introduction">INTRODUCTION</h1><h2 id="les-gpus-ou-processeurs-graphiques">Les GPUs ou <em>Processeurs graphiques</em>.</h2><img src="img/gpucpu1.png" alt="" width="800px" height=""></img><ul><li>Processeurs <em>classiques</em> <strong>CPU</strong> : ex&#xE9;cution <strong>s&#xE9;quentielle</strong><ul><li>Quelques unit&#xE9;s de calcul ( les c&#x153;urs).</li></ul></li><li>Processeurs <em>graphiques</em> <strong>GPU</strong> : ex&#xE9;cution <strong>massivement parall&#xE8;le</strong><ul><li>Des centaines, voire milliers, d'unit&#xE9;s de calcul, regroup&#xE9;es en SMs (<em>Streaming Multiprocessors</em>).</li></ul></li></ul><div class="notes"><ul><li>La multiplication des c&#x153;urs dans les GPUs se fait au d&#xE9;triment des fonctions de contr&#xF4;le et de cache.</li><li>Seule la m&#xE9;moire <em>globale</em> est accessible par l'ensemble des fils d'ex&#xE9;cution (les <em>threads</em>) et ses performances sont faibles.</li><li>AU sein de la RAM il y a diff&#xE9;rents canaux vers diff&#xE9;rents types de m&#xE9;moires.</li><li>L'acc&#xE8;s efficace aux m&#xE9;moires  est contraignant.</li><li>Les &#xE9;changes de donn&#xE9;es entre le GPU et son h&#xF4;te CPU sont p&#xE9;nalisants.</li><li>Il est important de concevoir un partage &#xE9;quilibr&#xE9; des ressources au sein de chaque SM, pour permettre un niveau de parall&#xE9;lisme  &#xE9;lev&#xE9;, et donc d'envisager de bonnes performances.</li><li>La mise au point n'est pas ais&#xE9;e lorsque des centaines de milliers de threads concourent &#xE0; l'ex&#xE9;cution d'une t&#xE2;che.</li><li>L'accroissement des capacit&#xE9;s de calcul a suivi l'augmentation des r&#xE9;solutions d'images.</li><li>Les traitements envisag&#xE9;s sur les images sont de plus en plus &#xE9;volu&#xE9;s ( traitements de haut niveau ) et requi&#xE8;rent souvent un temps de calcul accru.</li><li>L'architecture parall&#xE8;le particuli&#xE8;re des GPUs a permis d'am&#xE9;liorer consid&#xE9;rablement les performances de certaines classes d'algorithme et fait esp&#xE9;rer par ailleurs des acc&#xE9;l&#xE9;rations importantes.</li></ul></div></div><div class="step" step="6" data-x="9600" data-y="0"><h1 id="id2">INTRODUCTION</h1><h2 id="le-traitement-des-images">Le traitement des images</h2><p><strong>Le filtrage (du bruit)</strong></p><blockquote><ul><li>Les capteurs et les conditions d'acquisition induisent du bruit.</li><li><em>R&#xE9;solution &#xE9;lev&#xE9;e</em> n'implique pas <em>bruit r&#xE9;duit</em>.</li></ul></blockquote><p><strong>La segmentation</strong></p><blockquote><ul><li>Enjeu important.</li><li>Aucun algorithme universel.</li></ul></blockquote><div class="notes"><ul><li>les bruits d&#xE9;gradent l'image de la sc&#xE8;ne id&#xE9;ale et peuvent en fausser ou compliquer l'interpr&#xE9;tation.</li><li>on recense plus de 4000 algorithmes de segmentation</li><li>La segmentation intervient dans beaucoup d'applications : du tracking &#xE0; la d&#xE9;tection ou &#xE0; l'extraction de caract&#xE9;ristiques diverses.</li><li>Mais aujourd'hui encore, une bonne segmentation est celle qui permet d'extraire ce que l'on attend =&gt; l'algorithme d&#xE9;pend du probl&#xE8;me.</li></ul></div></div><div class="step" step="7" data-x="11200" data-y="0"><h1 id="id3">INTRODUCTION</h1><h2 id="ojectif-accelerer">Ojectif : acc&#xE9;l&#xE9;rer</h2><p><strong>Segmentation</strong></p><blockquote><ul><li>Algorithme par contours actifs, classe des  <em>snakes</em>.</li><li>Impl&#xE9;mentation CPU optimis&#xE9;e existante.</li><li>Conception de l'impl&#xE9;mentation GPU.</li><li>Adaptations mineures de l'algorithme.</li></ul></blockquote><p><strong>Filtrage</strong></p><blockquote><ul><li>Filtre par lignes de niveaux<blockquote><ul><li>Algorithme original,</li><li>Conceptions conjointes algorithme et impl&#xE9;mentation.</li></ul></blockquote></li><li>Filtres m&#xE9;dians, filtres de convolution<blockquote><ul><li>Op&#xE9;rateurs math&#xE9;matiques,</li><li>Conception d'une impl&#xE9;mentation optimis&#xE9;e.</li></ul></blockquote></li></ul></blockquote></div><div class="step" step="8" data-x="12800" data-y="0"><h1 id="segmentation-par-contour-actif">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="travaux-de-reference">Travaux de r&#xE9;f&#xE9;rence</h2><p><strong>Level-set</strong> ( Roberts <em>et al.</em>, 2010)</p><blockquote><ul><li>Images d'IRM de 256x256x256 pixels (16 millions),</li><li>Temps sur GTX280 : <strong>11 s</strong>.</li></ul></blockquote><p><strong>Snake GVF</strong> (Smistad <em>et al.</em>, 2012)</p><blockquote><ul><li>Images d'IRM de 256x256x256 pixels (16 millions),</li><li>Temps sur C2070 : <strong>7 s</strong>.</li></ul></blockquote><img src="img/brain3D-gvf.png" alt="" width="600px" height=""></img><div class="notes"><ul><li>Le domaine m&#xE9;dical rec&#xE8;le la quasi totalit&#xE9; des impl&#xE9;mentations GPU d'algorithmes de segmentation.</li><li>Nombre d'entre elles concernent des traitements effectu&#xE9;s en 3D par n&#xE9;cessit&#xE9;, o&#xF9; l'emploi du GPU s'impose assez naturellement.</li><li>Les algorithmes <strong>level-set</strong> sont les plus impl&#xE9;ment&#xE9;s sur GPU :</li><li>Les algorithmes <strong>snakes</strong> sont tr&#xE8;s peu impl&#xE9;ment&#xE9;e sur GPU :</li></ul></div></div><div class="step" step="9" data-x="14400" data-y="0"><h1 id="id4">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="snake-polygonal-oriente-region-principe"><em>Snake</em> polygonal orient&#xE9; r&#xE9;gion (principe)</h2><table cellpadding="0" cellspacing="0" class="columns"><tbody><tr><td><img src="img/snake-modele.png" alt="" width="350px" height=""></img></td><td><ul><li>Objectif : d&#xE9;terminer le contour le plus <em>vraisemblable</em>.</li><li>Le crit&#xE8;re de vraisemblance g&#xE9;n&#xE9;ralis&#xE9;e est, dans le cas gaussien :$$GL = \frac{1}{2}\left[ n_B.log\left(\sigma_B^2\right) + n_T.log\left(\sigma_T^2\right)\right]$$</li></ul></td></tr></tbody></table><ul><li>Calcul des variances \(\sigma^2\) pour chaque contour :</li></ul><blockquote><ul><li>M&#xE9;thode de Chesnaud <em>et el.</em> (1999) en \(\mathcal{O}(n^2)\).</li><li>Implique le <strong>pr&#xE9;-calcul</strong> de 3 images cumul&#xE9;es.</li></ul></blockquote><div class="notes"><ul><li>Cela permet d'extraire des formes aux contours mal d&#xE9;finis, en raison d'un fort niveau de bruit par exemple.</li></ul></div></div><div class="step" step="10" data-x="16000" data-y="0"><h1 id="id5">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="snake-polygonal-oriente-region-algo-cpu"><em>Snake</em> polygonal orient&#xE9; r&#xE9;gion (algo CPU)</h2><img src="img/cochons-it0-it1.png" alt="" width="" height="300px"></img><p><strong>It&#xE9;ration 1</strong></p><blockquote><ol><li>Le contour initial est rectangulaire ( 4 n&#x153;uds )</li><li>On d&#xE9;place successivement les 4 n&#x153;uds jusqu'&#xE0; ce que plus aucun nouveau d&#xE9;placement ne provoque l'am&#xE9;lioration du crit&#xE8;re.</li></ol></blockquote></div><div class="step" step="11" data-x="17600" data-y="0"><h1 id="id6">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="id7"><em>Snake</em> polygonal orient&#xE9; r&#xE9;gion (algo CPU)</h2><img src="img/cochons-it21-it22.png" alt="" width="" height="300px"></img><img src="img/cochons-it4-it5.png" alt="" width="" height="300px"></img><div class="notes"><ul><li>CONVERGENCE RAPIDE</li></ul></div></div><div class="step" step="12" data-x="19200" data-y="0"><h1 id="id8">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="id9"><em>Snake</em> polygonal orient&#xE9; r&#xE9;gion (algo CPU)</h2><p>Exemples de r&#xE9;sultats</p><img src="img/snake-exs.png" alt="" width="700px" height=""></img><div class="notes"><ul><li>Les r&#xE9;sultats de segmentation d&#xE9;pendent des param&#xE8;tres de la s&#xE9;quence d'optimisation (pas des d&#xE9;placements, contour initial, seuil d'ajout des n&#x153;uds)</li></ul></div></div><div class="step" step="13" data-x="20800" data-y="0"><h1 id="id10">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="parallelisation-du-snake-polygonal-sur-gpu">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p>Identification des fonctions co&#xFB;teuses</p><img src="img/algosnake1.png" alt="" width="" height="500px"></img></div><div class="step" step="14" data-x="22400" data-y="0"><h1 id="id11">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="id12">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p>Calcul du crit&#xE8;re GL</p><img src="img/algosnake-3etages.png" alt="" width="800px" height=""></img></div><div class="step" step="15" data-x="24000" data-y="0"><h1 id="id13">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="id14">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><img src="img/snake-pairimpair.png" alt="" width="800px" height=""></img><div class="notes"><ul><li>Pour un n&#x153;ud et un pas de d&#xE9;placement donn&#xE9;s, on &#xE9;value <strong>en parall&#xE8;le</strong> 8 positions voisines, soit 16 segments distincts.</li><li>Pour &#xE9;viter les oscillations et <em>coller</em> &#xE0; l'algorithme s&#xE9;quentiel, on distingue les n&#x153;uds d'indices pairs et impairs.</li><li>On &#xE9;value <strong>en parall&#xE8;le</strong> l'ensemble des d&#xE9;placements &#xE9;ventuels de tous les n&#x153;uds de m&#xEA;me parit&#xE9;.</li></ul></div></div><div class="step" step="16" data-x="25600" data-y="0"><h1 id="id15">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="id16">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><ul><li>1 thread par pixel.</li><li>Concat&#xE9;nation de tous les pixels composant l'ensemble des contours &#xE9;valu&#xE9;s.</li><li>R&#xE9;ductions en m&#xE9;moire partag&#xE9;e.</li><li>Une seule taille de segment : la taille du plus long.</li></ul><div class="notes"><ul><li>les r&#xE9;duction consistent &#xE0; sommer, pour chaque segment les contributions partielles par bloc calcul&#xE9;es au 1</li></ul></div></div><div class="step" step="17" data-x="27200" data-y="0"><h1 id="id17">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="id18">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p>Points positifs :</p><blockquote><ul><li>Conservation des donn&#xE9;es en m&#xE9;moire GPU.</li><li>Images cumul&#xE9;es calcul&#xE9;es en parall&#xE8;le.</li><li>Discretisation des segments en parall&#xE8;le (1 thread/pixel).</li><li>Respect de l'algorithme original.</li></ul></blockquote><p>Points n&#xE9;gatifs :</p><blockquote><ul><li>Trop peu de calculs &#xE0; effectuer.</li><li>Motifs d'acc&#xE8;s &#xE0; la m&#xE9;moire globale trop irr&#xE9;guliers.</li><li>Emploi de la m&#xE9;moire partag&#xE9;e.</li></ul></blockquote><div class="notes"><ul><li>Un seul entier est &#xE9;chang&#xE9; entre le CPU et le GPU &#xE0; chaque it&#xE9;ration.</li><li>image cumul&#xE9;es par une adaptation de la m&#xE9;thode des sommes de pr&#xE9;fixes.</li><li>Abandon  Bresenham Possible car parcours unidirectionnel du contour.</li><li>Trop peu de calculs ne permet pas de masquer les latences.</li><li>Pas de coalescence possible dans les acc&#xE8;s &#xE0; la m&#xE9;moire globale car la g&#xE9;om&#xE9;trie des segments varie.</li><li>m&#xE9;moire partag&#xE9;e &#xE0; cause des r&#xE9;ductions.</li></ul></div></div><div class="step" step="18" data-x="28800" data-y="0"><h1 id="id19">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="id20">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p><strong>Performances de l'impl&#xE9;mentation</strong></p><img src="img/perfs-snake.png" alt="" width="600px" height=""></img><img src="img/perfs-snake-img.png" alt="" width="400px" height=""></img></div><div class="step" step="19" data-x="30400" data-y="0"><h1 id="id21">SEGMENTATION PAR CONTOUR ACTIF</h1><h2 id="id22">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p><strong>Conclusion</strong></p><ul><li>Premi&#xE8;re et seule impl&#xE9;mentation &#xE0; ce jour.</li><li>Performances int&#xE9;ressantes pour les grandes images.</li><li>Image 10000x10000 en moins de 0,6 seconde.</li><li>Emploi non optimal du GPU : r&#xE9;ductions, irr&#xE9;gularit&#xE9;s.</li><li>Premi&#xE8;res it&#xE9;rations GPU rapides : grands segments.</li><li>Temps de calcul tr&#xE8;s d&#xE9;pendant du contenu de l'image :<ul><li>Proposition d'une m&#xE9;thode d'initialisation alternative.</li><li>Recherche du contour rectangle le plus vraisemblable.</li><li>Acc&#xE9;l&#xE9;ration jusqu'&#xE0; x15 avec de petites cibles.</li></ul></li></ul></div><div class="step" step="20" data-x="32000" data-y="0"><h1 id="le-filtrage-des-images">LE FILTRAGE DES IMAGES</h1><blockquote><ul><li>Filtre m&#xE9;dian,</li><li>Filtres de convolution,</li><li>Filtre par recherche des lignes de niveaux (PIPD).</li></ul></blockquote></div><div class="step" step="21" data-x="33600" data-y="0"><h1 id="id23">LE FILTRAGE DES IMAGES</h1><h2 id="filtre-median-principe">Filtre m&#xE9;dian : principe</h2><img src="img/median-principe.png" alt="" width="600px" height=""></img><p>La valeur de sortie d'un pixel est la <strong>m&#xE9;diane</strong> des valeurs de son voisinage.</p><ul><li>Bonne r&#xE9;duction de bruits gaussien et <em>poivre &amp; sel</em></li><li>Valeurs de sortie appartenant au voisinage.</li><li>Op&#xE9;ration de s&#xE9;lection co&#xFB;teuse (tri).</li><li>Usages fr&#xE9;quents avec des petites fen&#xEA;tres (de 3x3 &#xE0; 7x7).</li><li>Quelques applications avec de grandes fen&#xEA;tres.</li></ul></div><div class="step" step="22" data-x="35200" data-y="0"><h1 id="id24">LE FILTRAGE DES IMAGES</h1><h2 id="filtre-median-usage">Filtre m&#xE9;dian : usage</h2><table cellpadding="0" cellspacing="0"><thead><tr><th><img src="img/airplane_sap25.png" alt="" width="" height=""></img></th><th><img src="img/airplane_sap25_med5.png" alt="" width="" height=""></img></th><th><img src="img/airplane_sap25_med3_it2.png" alt="" width="" height=""></img></th></tr></thead><tbody><tr><td><p>Bruit <em>poivre &amp; sel</em> 25%</p></td><td><p>M&#xE9;dian 5x5</p></td><td><p>M&#xE9;dian 3x3 - 2 passes</p></td></tr></tbody></table></div><div class="step" step="23" data-x="36800" data-y="0"><h1 id="id25">LE FILTRAGE DES IMAGES</h1><h2 id="filtre-median-gpu-travaux-de-reference">Filtre m&#xE9;dian GPU : Travaux de r&#xE9;f&#xE9;rence</h2><p>Comparaison des impl&#xE9;mentations GPU de r&#xE9;f&#xE9;rence :</p><blockquote><ul><li><strong>PCMF</strong>, Sanchez <em>et al.</em> (2013), d&#xE9;bit max. <strong>80 MP/s</strong>,</li><li><strong>ArrayFire</strong>, biblioth&#xE8;que commerciale, d&#xE9;bit max. <strong>185 MP/s</strong>,</li><li><strong>BVM</strong> parall&#xE9;lis&#xE9; par Chen <em>et al.</em> (2009), d&#xE9;bit max. <strong>110 MP/s</strong>.</li></ul></blockquote><img src="img/compar-median2.png" alt="" width="500px" height=""></img><div class="notes"><ul><li>PCMF : Parallel (Complementary Cumulative Derivative Function) Median Filter (histogrammes cumulatifs)</li><li>CTMF : CPU &#xE0; temps constant</li></ul></div></div><div class="step" step="24" data-x="38400" data-y="0"><h1 id="id26">LE FILTRAGE DES IMAGES</h1><h2 id="id27">Filtre m&#xE9;dian GPU : Travaux de r&#xE9;f&#xE9;rence</h2><p>Emploi de la <strong>m&#xE9;moire partag&#xE9;e</strong> (exemple m&#xE9;dian 5x5)</p><img src="img/shmemhalo.png" alt="" width="800px" height=""></img><div class="notes"><ul><li>recouvrement pose probl&#xE8;me &#xE0; cause acc&#xE8;s concurrents &#xE0; la m&#xE9;moire partag&#xE9;e.</li></ul></div></div><div class="step" step="25" data-x="40000" data-y="0"><h1 id="id28">LE FILTRAGE DES IMAGES</h1><h2 id="optimisation-du-filtre-median-gpu">Optimisation du filtre m&#xE9;dian GPU</h2><img src="img/CPU-GPU-memcpy.png" alt="" width="650px" height=""></img><img src="img/transferts-mem.png" alt="" width="" height="300px"></img><div class="notes"><p>On gagne de 13 &#xE0; 43 % sur les temps de transfert.</p></div></div><div class="step" step="26" data-x="41600" data-y="0"><h1 id="id29">LE FILTRAGE DES IMAGES</h1><h2 id="id30">Optimisation du filtre m&#xE9;dian GPU</h2><img src="img/CPU-GPU-memcpy-dummykernel.png" alt="" width="750px" height=""></img><p>D&#xE9;bits maximums effectifs, en MP/s, sur C2070.</p><blockquote><img src="img/debit-max-2070.png" alt="" width="300px" height=""></img></blockquote><p><strong>Rappel :</strong> PCMF : 80 MP/s - BVM : 110 MP/s - ArrayFire : 185 MP/s</p><div class="notes"><p>&#xE7;a laisse environ 80ms pour faire un tri de 9 valeurs sur une image de 4096x4096</p></div></div><div class="step" step="27" data-x="43200" data-y="0"><h1 id="id31">LE FILTRAGE DES IMAGES</h1><h2 id="id32">Optimisation du filtre m&#xE9;dian GPU</h2><p><strong>S&#xE9;lection de la m&#xE9;diane</strong></p><blockquote><ul><li>Emploi exclusif des <strong>registres</strong> pour charger les valeurs utiles<blockquote><ul><li>m&#xE9;moires individuelles au c&#x153;ur du GPU,</li><li>non indexables dans un tableau.</li><li>maximum de 63 registres par thread et 32 K par bloc de threads.</li></ul></blockquote></li><li>Pour les petites tailles : max. 7x7 avec 1 pixel/thread.</li><li>Exploitation des recouvrements entre fen&#xEA;tres voisines.</li></ul></blockquote></div><div class="step" step="28" data-x="44800" data-y="0"><h1 id="id33">LE FILTRAGE DES IMAGES</h1><h2 id="id34">Optimisation du filtre m&#xE9;dian GPU</h2><p><strong>S&#xE9;lection de la m&#xE9;diane</strong> (par oubli)</p><table cellpadding="0" cellspacing="0" class="columns"><tbody><tr><td><p>Avantages :</p><ul><li>&#xC9;vite le tri complet : performances en hausse,</li><li>&#xC9;conomie de registres : \(\lceil \frac{n}{2}\rceil +1\) au lieu de \(n\),</li><li>Permet de plus grandes tailles : max 11x11.</li></ul></td><td><img src="img/forgetful_selection.png" alt="" width="" height="500px"></img></td></tr></tbody></table></div><div class="step" step="29" data-x="46400" data-y="0"><h1 id="id35">LE FILTRAGE DES IMAGES</h1><h2 id="id36">Optimisation du filtre m&#xE9;dian GPU</h2><p><strong>Exploitation des recouvrements</strong> : 2 pixels par thread (m&#xE9;dian 5x5).</p><img src="img/recouvrement5.png" alt="" width="800px" height=""></img><p>&#xC0; 4 pixels/thread, zone commune = 10 pixels &lt; 14 : <strong>pas performant</strong>.</p><div class="notes"><ul><li>chaque thread utilise plus de registres</li><li>mais sur un bloc, en adaptant la taille du bloc, on &#xE9;conomise k+1 registres par paire de pixels.</li></ul></div></div><div class="step" step="30" data-x="48000" data-y="0"><h1 id="id37">LE FILTRAGE DES IMAGES</h1><h2 id="performances-du-median-gpu-propose-prmf">Performances du m&#xE9;dian GPU propos&#xE9; (PRMF)</h2><img src="img/perf-median.png" alt="" width="650px" height=""></img></div><div class="step" step="31" data-x="49600" data-y="0"><h1 id="id38">LE FILTRAGE DES IMAGES</h1><h2 id="performances-du-filtre-median-gpu-propose-prmf">Performances du filtre m&#xE9;dian GPU propos&#xE9; (PRMF)</h2><p>Image 512x512</p><blockquote><img src="img/comp512.png" alt="" width="" height="200px"></img></blockquote><p>Image 4096x4096</p><blockquote><img src="img/comp4k.png" alt="" width="" height="200px"></img></blockquote><div class="notes"><ul><li>d&#xE9;bit d&#xE9;croit lin&#xE9;airement en fonction de <strong>n</strong></li></ul></div></div><div class="step" step="32" data-x="51200" data-y="0"><h1 id="id39">LE FILTRAGE DES IMAGES</h1><h2 id="le-filtre-median-gpu">Le filtre m&#xE9;dian GPU</h2><p><strong>Conclusion</strong></p><blockquote><ul><li>Pas d'utilisation de la m&#xE9;moire partag&#xE9;e.</li><li>Acc&#xE8;s optimaux : 1 lecture par pixel.</li><li>D&#xE9;bit global am&#xE9;lior&#xE9; de <strong>x7</strong> &#xE0; <strong>x10</strong>, proche du maximum.</li><li>D&#xE9;bit de calcul max. <strong>5,3 GP/s</strong>.</li><li>M&#xE9;dian jusqu'au 11x11 sur C2070, 21x21 sur K40.</li><li>Cr&#xE9;ation d'une application web g&#xE9;n&#xE9;rant les codes sources.</li><li>Utilis&#xE9; sur images de cristallographie au synchrotron <strong>SPring-8</strong>.</li></ul></blockquote><img src="img/spring82.png" alt="" width="" height="200px"></img></div><div class="step" step="33" data-x="52800" data-y="0"><h1 id="id40">LE FILTRAGE DES IMAGES</h1><h2 id="les-filtres-de-convolution-generalites">Les filtres de convolution : g&#xE9;n&#xE9;ralit&#xE9;s</h2><p><strong>Principe</strong></p><blockquote>$$I_{out}(x, y) = \left(I_{in} * h\right) = \sum_{(i &lt; H)} \sum_{(j &lt; L)}I_{in}(x-j, y-i)h(j,i)$$</blockquote><p><strong>Selon les valeurs du masque h</strong></p><blockquote><ul><li>R&#xE9;duction de bruit, d&#xE9;tection de bords,...</li><li>Op&#xE9;ration <strong>s&#xE9;parable</strong> en deux convolutions 1D.</li></ul></blockquote></div><div class="step" step="34" data-x="54400" data-y="0"><h1 id="id41">LE FILTRAGE DES IMAGES</h1><h2 id="les-filtres-de-convolution-gpu">Les filtres de convolution GPU</h2><p>Exploitation des recouvrements :</p><blockquote><ul><li>un seul acc&#xE8;s m&#xE9;moire par pixel, m&#xE9;morisation en registre.</li><li>Optimum &#xE0; 8 pixels/thread :</li><li>Exemple m&#xE9;dian 5x5, pour un thread :<blockquote><ul><li>60 pixels dans le halo : 60 lectures.</li><li>200 lectures + pr&#xE9;chargement si utilisation m&#xE9;moire partag&#xE9;e.</li></ul></blockquote></li></ul></blockquote><p>Nvidia propose les impl&#xE9;mentations les plus rapides (s&#xE9;parable ou non) :</p><blockquote><ul><li>Traitement de r&#xE9;f&#xE9;rence : 2048x2048 pixels, 5x5, 8bits.</li></ul></blockquote><img src="img/debit-calcul-convoNS.png" alt="" width="600px" height=""></img></div><div class="step" step="35" data-x="56000" data-y="0"><h1 id="id42">LE FILTRAGE DES IMAGES</h1><h2 id="id43">Les filtres de convolution GPU</h2><p><strong>R&#xE9;sultats (suite)</strong></p><img src="img/debit-calcul-convoS.png" alt="" width="600px" height=""></img><p>Convolution s&#xE9;parable :</p><ul><li>Une convolution verticale en m&#xE9;moire partag&#xE9;e, suivie d'une convolution horizontale en registres.</li><li>Copie interm&#xE9;diaire en m&#xE9;moire globale (cache 1D rapide).</li><li>L'acc&#xE9;l&#xE9;ration est due &#xE0; la seule convolution en registres (54%).</li></ul></div><div class="step" step="36" data-x="57600" data-y="0"><h1 id="id44">LE FILTRAGE DES IMAGES</h1><h2 id="id45">Les filtres de convolution GPU</h2><p><strong>Conclusion</strong></p><blockquote><ul><li>Am&#xE9;lioration sensible sur les d&#xE9;bits de calcul (de 17 &#xE0; 33 %).</li><li>Le traitement 1D est jusqu'&#xE0; 54% plus rapide.</li><li>Application &#xE0; d'autres familles de signaux 1D (audio,...).</li></ul></blockquote></div><div class="step" step="37" data-x="59200" data-y="0"><h1 id="id46">LE FILTRAGE DES IMAGES</h1><h2 id="filtre-par-recherche-des-lignes-de-niveaux">Filtre par recherche des lignes de niveaux</h2><p><strong>Motivations :</strong></p><blockquote><ul><li>Les algorithmes qui d&#xE9;bruitent le mieux sont lents (BM3D).</li><li>Les images naturelles sont d&#xE9;composables en un ensemble de lignes de niveaux ( iso-niveau de gris ).</li><li>Concevoir un algorithme GPU original et son impl&#xE9;mentation.</li></ul></blockquote></div><div class="step" step="38" data-x="60800" data-y="0"><h1 id="id47">LE FILTRAGE DES IMAGES</h1><h2 id="id48">Filtre par recherche des lignes de niveaux</h2><p><strong>Principe - mod&#xE8;le</strong></p><blockquote><ul><li>Estimation locale, par maximum de vraisemblance, des lignes de niveaux.</li><li>R&#xE9;duction de bruit par moyennage le long de la ligne estim&#xE9;e.</li><li>Les lignes de niveaux estim&#xE9;es sont mod&#xE9;lis&#xE9;es par des lignes bris&#xE9;es nomm&#xE9;es <strong>isolines</strong>.</li><li>Les segments des lignes bris&#xE9;es sont choisis parmi des motifs pr&#xE9;-&#xE9;tablis (32 motifs).<img src="img/P5Q1.png" alt="" width="500px" height=""></img></li></ul></blockquote></div><div class="step" step="39" data-x="62400" data-y="0"><h1 id="id49">LE FILTRAGE DES IMAGES</h1><h2 id="id50">Filtre par recherche des lignes de niveaux</h2><p><strong>Principe (&#xE9;tape 1)</strong></p><blockquote><ul><li>En chaque pixel, recherche du motif maximisant la log-vraisemblance ( \(n=6, \sigma^2 =\) variance )</li></ul>$$-\frac{n}{2}log\left(2\pi\right) - \frac{n}{2}log\left(\sigma^2\right) - \frac{n}{2}$$<ul><li>M&#xE9;morisation des param&#xE8;tres des motifs s&#xE9;lectionn&#xE9;s dans deux matrices \(I_{\Theta}\) et \(I_{\Sigma}\).</li></ul><img src="img/lniv-mv.png" alt="" width="500px" height=""></img></blockquote></div><div class="step" step="40" data-x="64000" data-y="0"><h1 id="id51">LE FILTRAGE DES IMAGES</h1><h2 id="id52">Filtre par recherche des lignes de niveaux</h2><p><strong>Principe (&#xE9;tape 2)</strong></p><blockquote><ul><li>Allongement it&#xE9;ratif des segments sous condition GLRT.</li></ul>$$(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]$$<img src="img/pipd-detail.png" alt="" width="900px" height=""></img></blockquote></div><div class="step" step="41" data-x="65600" data-y="0"><h1 id="id53">LE FILTRAGE DES IMAGES</h1><h2 id="id54">Filtre par recherche des lignes de niveaux</h2><p><strong>Principe (&#xE9;tape 3)</strong></p><blockquote><p>Compensation de la non robustesse de s&#xE9;lection des motifs dans les zones homog&#xE8;nes.</p><blockquote><ul><li>identification des zones homog&#xE8;nes avec un d&#xE9;tecteur de bords.</li><li>Application d'un filtre moyenneur dans ces zones.</li></ul></blockquote><img src="img/detecteur.png" alt="" width="400px" height=""></img></blockquote><div class="notes"><ul><li>Sous-ensembles de pixels n'ayant pas d'intersection --&gt; MV</li><li>Utilisation des motifs des segments pour gain de temps.</li></ul></div></div><div class="step" step="42" data-x="67200" data-y="0"><h1 id="id55">LE FILTRAGE DES IMAGES</h1><h2 id="id56">Filtre par recherche des lignes de niveaux</h2><p><strong>R&#xE9;sultats</strong></p><blockquote><p>Sur l'ensemble d'images de S. Lansel (DenoiseLab, Universit&#xE9; Stanford), filtre propos&#xE9; (PI-PD)</p><ul><li>Am&#xE9;lioration moyenne du rapport Signal sur bruit: <strong>+7,1 dB</strong></li><li>Indice de similarit&#xE9; structurelle : <strong>+30%</strong></li><li>Temps de calcul : <strong>7 ms</strong></li></ul><p>Comparaison avec BM3D</p><ul><li>Am&#xE9;lioration moyenne du rapport Signal sur bruit: <strong>+9,5 dB</strong></li><li>Indice de similarit&#xE9; structurelle : <strong>+36%</strong></li><li>Temps de calcul : <strong>4300 ms</strong></li></ul></blockquote></div><div class="step" step="43" data-x="68800" data-y="0"><h1 id="id57">LE FILTRAGE DES IMAGES</h1><h2 id="id58">Filtre par recherche des lignes de niveaux</h2><table cellpadding="0" cellspacing="0"><tbody><tr><td><img src="img/zoom_noisy.png" alt="" width="" height=""></img></td><td></td><td><img src="img/zoom_mean5.png" alt="" width="" height=""></img></td></tr><tr><td><p>Bruit gaussien \(\sigma=25\)</p></td><td></td><td><p>Moyennage 5x5</p></td></tr><tr><td><img src="img/zoom_pipdh.png" alt="" width="" height=""></img></td><td></td><td><img src="img/zoom_bm3d.png" alt="" width="" height=""></img></td></tr><tr><td><p>PI-PD</p></td><td></td><td><p>BM3D</p></td></tr></tbody></table></div><div class="step" step="44" data-x="70400" data-y="0"><h1 id="id59">LE FILTRAGE DES IMAGES</h1><h2 id="id60">Filtre par recherche des lignes de niveaux</h2><p><strong>Synth&#xE8;se - conclusion</strong></p><blockquote><ul><li>Rapport qualit&#xE9;/temps &#xE9;lev&#xE9;.</li><li>Traitement d'images HD &#xE0; 20 fps.</li><li>Artefacts en marche d'escalier. R&#xE9;duits par la m&#xE9;thode de Buades <em>et al.</em> (+1 dB, +0,2 ms pour 512x512).</li><li>Extension aux images couleurs et autres types de bruits (multiplicatif).</li><li>Algorithme original sans impl&#xE9;mentation s&#xE9;quentielle de r&#xE9;f&#xE9;rence.</li></ul></blockquote></div><div class="step" step="45" data-x="72000" data-y="0"><h1 id="conclusion-generale-perspectives">CONCLUSION G&#xC9;N&#xC9;RALE - PERSPECTIVES</h1><ul><li>Trois types de conception mis en &#x153;uvre.</li><li>Le portage efficace d'algorithme peut s'av&#xE9;rer tr&#xE8;s complexe, voire sans int&#xE9;r&#xEA;t.</li><li>L'emploi de la m&#xE9;moire partag&#xE9;e n'apporte pas les meilleures performances en cas de recouvrements.</li><li>Filtres utilisables par tout programmeur gr&#xE2;ce &#xE0; un g&#xE9;n&#xE9;rateur de code.</li><li>Beaucoup de traitements et domaines peuvent b&#xE9;n&#xE9;ficier des techniques propos&#xE9;es.</li><li>Les &#xE9;volutions de l'architecture laissent entrevoir de nouvelles possibilit&#xE9;s.</li></ul><div class="notes"><ul><li>certaines ardeurs ont &#xE9;t&#xE9; refroidies</li></ul></div></div><div class="step" step="46" data-x="73600" data-y="0"><h1 id="annexe">ANNEXE</h1><h2 id="id61">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p><strong>Structure des donn&#xE9;es</strong> (n&#x153;uds pairs)</p><img src="img/16segments.png" alt="" width="800px" height=""></img><div class="notes"><ul><li>r&#xE8;gle 1 thread par pixel</li></ul></div></div></div><div id="hovercraft-help"><table><tr><th>Space</th><td>Forward</td></tr><tr><th>Left, Down, Page Down</th><td>Next slide</td></tr><tr><th>Right, Up, Page Up</th><td>Previous slide</td></tr><tr><th>P</th><td>Open presenter console</td></tr><tr><th>H</th><td>Toggle this help</td></tr></table></div><script type="text/javascript" src="js/impress.js"></script><script type="text/javascript" src="js/impressConsole.js"></script><script type="text/javascript" src="js/hovercraft.js"></script></body></html>
\ No newline at end of file
+<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><title>Algorithmes rapides sur GPU</title><meta name="generator" content="Hovercraft! 1.0 http://regebro.github.com/hovercraft"></meta><meta name="author" content="Gilles Perrot"></meta><link rel="stylesheet" href="css/hovercraft.css" media="all"></link><link rel="stylesheet" href="css/impressConsole.css" media="all"></link><link rel="stylesheet" href="css/highlight.css" media="all"></link><link rel="stylesheet" href="css/zulug5.css" media="all"></link><script type="text/javascript" src="http://localhost/MATHJAX/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script></head><body class="impress-not-supported"><div id="impress"><div class="step" step="0" id="titre" data-x="0" data-y="0"><h1 id="traitement-d-images-sur-gpu">TRAITEMENT D'IMAGES SUR GPU</h1><h2 id="algorithmes-rapides-pour-le-filtrage-et-la-segmentation-des-images-bruitees-sur-gpu">Algorithmes rapides pour le filtrage et la segmentation des images bruit&#xE9;es sur GPU.</h2><h3 id="gilles-perrot">Gilles Perrot</h3><h3 id="avril-2014">17 avril 2014</h3><h3 id="universite-de-franche-comte-institut-femto-st">Universit&#xE9; de Franche-Comt&#xE9;, Institut FEMTO-ST</h3><h3 id="departement-disc-equipe-and">D&#xE9;partement DISC - &#xE9;quipe AND</h3><h3 id="direction-r-couturier-s-domas">Direction  : R. Couturier &amp; S. Domas</h3></div><div class="step" step="1" data-x="1600" data-y="0"><h1 id="filtrage">FILTRAGE</h1><p>R&#xE9;duire le bruit.</p><img src="img/ex-filtrage.png" alt="" width="800px" height=""></img><div class="notes"><ul><li>les bruits d&#xE9;gradent l'image de la sc&#xE8;ne id&#xE9;ale et peuvent en fausser ou compliquer l'interpr&#xE9;tation.</li><li>Les capteurs num&#xE9;riques et les conditions d'acquisition sont &#xE0; l'origine de perturbations (bruits).</li><li>Les hautes r&#xE9;solutions sont souvent obtenues &#xE0; faible flux de photons, dont les variations engendrent du bruit.</li></ul></div></div><div class="step" step="2" data-x="3200" data-y="0"><h1 id="segmentation">SEGMENTATION</h1><p>Distinguer les zones statistiquement homog&#xE8;nes d'une image bruit&#xE9;e.</p><img src="img/seg2.png" alt="" width="800px" height=""></img><div class="notes"><ul><li>on recense plus de 4000 algorithmes de segmentation</li><li>La segmentation intervient dans beaucoup d'applications : du tracking &#xE0; la d&#xE9;tection ou &#xE0; l'extraction de caract&#xE9;ristiques diverses.</li><li>Mais aujourd'hui encore, une bonne segmentation est celle qui permet d'extraire ce que l'on attend =&gt; l'algorithme d&#xE9;pend du probl&#xE8;me.</li></ul></div></div><div class="step" step="3" data-x="4800" data-y="0"><h1 id="id1">SEGMENTATION</h1><h2 id="deux-approches">Deux approches</h2><img src="img/approches.png" alt="" width="800px" height=""></img></div><div class="step" step="4" data-x="6400" data-y="0"><h1 id="plan-de-la-presentation">PLAN DE LA PR&#xC9;SENTATION</h1><ol><li>Introduction<ul><li>Les GPUs ou <em>Graphical Processing Units</em>.</li><li>Objectifs.</li></ul></li><li>La segmentation des images<ul><li>Travaux de r&#xE9;f&#xE9;rence.</li><li>Parall&#xE9;lisation GPU d'un algorithme de segmentation de type <em>snake</em>.</li></ul></li><li>Le filtrage des images<ul><li>Travaux de r&#xE9;f&#xE9;rence.</li><li>Optimisation GPU des filtres m&#xE9;dian et de convolution.</li><li>Conception d'un algorithme GPU de d&#xE9;bruitage par recherche des lignes de niveaux.</li></ul></li><li>Conclusion et perspectives</li></ol></div><div class="step" step="5" data-x="8000" data-y="0"><h1 id="introduction">INTRODUCTION</h1><h2 id="les-gpus-ou-processeurs-graphiques">Les GPUs ou <em>Processeurs graphiques</em>.</h2><img src="img/gpucpu1.png" alt="" width="800px" height=""></img><ul><li>Processeurs <em>classiques</em> <strong>CPU</strong> : ex&#xE9;cution <strong>s&#xE9;quentielle</strong><ul><li>Quelques unit&#xE9;s de calcul ( les c&#x153;urs).</li></ul></li><li>Processeurs <em>graphiques</em> <strong>GPU</strong> : ex&#xE9;cution <strong>massivement parall&#xE8;le</strong><ul><li>Des centaines, voire milliers, d'unit&#xE9;s de calcul, regroup&#xE9;es en SMs (<em>Streaming Multiprocessors</em>).</li></ul></li></ul><div class="notes"><ul><li>La multiplication des c&#x153;urs dans les GPUs se fait au d&#xE9;triment des fonctions de contr&#xF4;le et de cache.</li><li>Seule la m&#xE9;moire <em>globale</em> est accessible par l'ensemble des fils d'ex&#xE9;cution (les <em>threads</em>) et ses performances sont faibles.</li><li>AU sein de la RAM il y a diff&#xE9;rents canaux vers diff&#xE9;rents types de m&#xE9;moires.</li><li>L'acc&#xE8;s efficace aux m&#xE9;moires  est contraignant.</li><li>Les &#xE9;changes de donn&#xE9;es entre le GPU et son h&#xF4;te CPU sont p&#xE9;nalisants.</li><li>Il est important de concevoir un partage &#xE9;quilibr&#xE9; des ressources au sein de chaque SM, pour permettre un niveau de parall&#xE9;lisme  &#xE9;lev&#xE9;, et donc d'envisager de bonnes performances.</li><li>La mise au point n'est pas ais&#xE9;e lorsque des centaines de milliers de threads concourent &#xE0; l'ex&#xE9;cution d'une t&#xE2;che.</li><li>L'accroissement des capacit&#xE9;s de calcul a suivi l'augmentation des r&#xE9;solutions d'images.</li><li>Les traitements envisag&#xE9;s sur les images sont de plus en plus &#xE9;volu&#xE9;s ( traitements de haut niveau ) et requi&#xE8;rent souvent un temps de calcul accru.</li><li>L'architecture parall&#xE8;le particuli&#xE8;re des GPUs a permis d'am&#xE9;liorer consid&#xE9;rablement les performances de certaines classes d'algorithme et fait esp&#xE9;rer par ailleurs des acc&#xE9;l&#xE9;rations importantes.</li></ul></div></div><div class="step" step="6" data-x="9600" data-y="0"><h1 id="id2">INTRODUCTION</h1><h2 id="ojectif-accelerer">Ojectif : acc&#xE9;l&#xE9;rer</h2><p><strong>Segmentation</strong></p><blockquote><ul><li>Algorithme par contours actifs, classe des  <em>snakes</em>.</li><li>Impl&#xE9;mentation CPU optimis&#xE9;e existante.</li><li>Conception de l'impl&#xE9;mentation GPU.</li></ul></blockquote><p><strong>Filtrage</strong></p><blockquote><ul><li>Filtres m&#xE9;dians, filtres de convolution<blockquote><ul><li>Op&#xE9;rateurs math&#xE9;matiques,</li><li>Conception d'une impl&#xE9;mentation optimis&#xE9;e.</li></ul></blockquote></li><li>Filtre par lignes de niveaux<blockquote><ul><li>Conception d'un algorithme d&#xE9;di&#xE9; GPU.</li></ul></blockquote></li></ul></blockquote></div><div class="step" step="7" data-x="11200" data-y="0"><h1 id="id3">SEGMENTATION</h1><h2 id="travaux-de-reference">Travaux de r&#xE9;f&#xE9;rence</h2><p><strong>Level-set</strong> ( Roberts <em>et al.</em>, 2010)</p><blockquote><ul><li>Images d'IRM de 256x256x256 pixels (16 millions),</li><li>Temps sur GTX280 : <strong>11 s</strong>.</li></ul></blockquote><p><strong>Snake GVF</strong> (Smistad <em>et al.</em>, 2012)</p><blockquote><ul><li>Images d'IRM de 256x256x256 pixels (16 millions),</li><li>Temps sur C2070 : <strong>7 s</strong>.</li></ul></blockquote><img src="img/brain3D-gvf.png" alt="" width="600px" height=""></img><div class="notes"><ul><li>Le domaine m&#xE9;dical rec&#xE8;le la quasi totalit&#xE9; des impl&#xE9;mentations GPU d'algorithmes de segmentation.</li><li>Nombre d'entre elles concernent des traitements effectu&#xE9;s en 3D par n&#xE9;cessit&#xE9;, o&#xF9; l'emploi du GPU s'impose assez naturellement.</li><li>Les algorithmes <strong>level-set</strong> sont les plus impl&#xE9;ment&#xE9;s sur GPU :</li><li>Les algorithmes <strong>snakes</strong> sont tr&#xE8;s peu impl&#xE9;ment&#xE9;e sur GPU :</li></ul></div></div><div class="step" step="8" data-x="12800" data-y="0"><h1 id="id4">SEGMENTATION</h1><h2 id="snake-polygonal-oriente-region-principe"><em>Snake</em> polygonal orient&#xE9; r&#xE9;gion (principe)</h2><table cellpadding="0" cellspacing="0" class="columns"><tbody><tr><td><img src="img/snake-modele.png" alt="" width="350px" height=""></img></td><td><ul><li>Objectif : d&#xE9;terminer le contour le plus <em>vraisemblable</em>.</li><li>Le crit&#xE8;re de vraisemblance g&#xE9;n&#xE9;ralis&#xE9;e est, dans le cas gaussien :$$GL = \frac{1}{2}\left[ n_B.log\left(\sigma_B^2\right) + n_T.log\left(\sigma_T^2\right)\right]$$</li></ul></td></tr></tbody></table><ul><li>Calcul des variances \(\sigma^2\) pour chaque contour :</li></ul><blockquote><ul><li>M&#xE9;thode de Chesnaud <em>et al.</em> (1999) : sommes sur le <strong>contour</strong>.</li><li>Implique le <strong>pr&#xE9;-calcul</strong> de 3 images cumul&#xE9;es.</li></ul></blockquote><div class="notes"><ul><li>Cela permet d'extraire des formes aux contours mal d&#xE9;finis, en raison d'un fort niveau de bruit par exemple.</li></ul></div></div><div class="step" step="9" data-x="14400" data-y="0"><h1 id="id5">SEGMENTATION</h1><h2 id="snake-polygonal-oriente-region-algo-cpu"><em>Snake</em> polygonal orient&#xE9; r&#xE9;gion (algo CPU)</h2><img src="img/cochons-it0-it1.png" alt="" width="" height="300px"></img><ol><li>Le contour initial est rectangulaire ( 4 n&#x153;uds )</li><li>On d&#xE9;place successivement les 4 n&#x153;uds jusqu'&#xE0; ce que plus aucun nouveau d&#xE9;placement ne provoque l'am&#xE9;lioration du crit&#xE8;re.</li></ol></div><div class="step" step="10" data-x="16000" data-y="0"><h1 id="id6">SEGMENTATION</h1><h2 id="id7"><em>Snake</em> polygonal orient&#xE9; r&#xE9;gion (algo CPU)</h2><img src="img/cochons-it21-it22.png" alt="" width="" height="300px"></img><img src="img/barre-blanche.png" alt="" width="" height="10px"></img><img src="img/cochons-it4-it5.png" alt="" width="" height="300px"></img><div class="notes"><ul><li>CONVERGENCE RAPIDE</li></ul></div></div><div class="step" step="11" data-x="17600" data-y="0"><h1 id="id8">SEGMENTATION</h1><h2 id="parallelisation-du-snake-polygonal-sur-gpu">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p>Identification des fonctions co&#xFB;teuses</p><img src="img/algosnake1.png" alt="" width="" height="500px"></img></div><div class="step" step="12" data-x="19200" data-y="0"><h1 id="id9">SEGMENTATION</h1><h2 id="id10">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p>Calcul du crit&#xE8;re GL (1 pixel/thread)</p><img src="img/algosnake-3etages.png" alt="" width="800px" height=""></img></div><div class="step" step="13" data-x="20800" data-y="0"><h1 id="id11">SEGMENTATION</h1><h2 id="id12">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><img src="img/snake-pairimpair.png" alt="" width="800px" height=""></img><div class="notes"><ul><li>Pour un n&#x153;ud et un pas de d&#xE9;placement donn&#xE9;s, on &#xE9;value <strong>en parall&#xE8;le</strong> 8 positions voisines, soit 16 segments distincts.</li><li>Pour &#xE9;viter les oscillations et <em>coller</em> &#xE0; l'algorithme s&#xE9;quentiel, on distingue les n&#x153;uds d'indices pairs et impairs.</li><li>On &#xE9;value <strong>en parall&#xE8;le</strong> l'ensemble des d&#xE9;placements &#xE9;ventuels de tous les n&#x153;uds de m&#xEA;me parit&#xE9;.</li></ul></div></div><div class="step" step="14" data-x="22400" data-y="0"><h1 id="id13">SEGMENTATION</h1><h2 id="id14">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><ul><li>1 thread par pixel.</li><li>Concat&#xE9;nation dans un vecteur de tous les pixels composant l'ensemble des contours &#xE9;valu&#xE9;s.<ul><li>ex : 2x 256000 &#xE9;l&#xE9;ments &#xE0; l'&#xE9;tape 1 de l'image 100 MP.</li></ul></li><li>Sommes des contributions des pixels : op&#xE9;rations de <strong>r&#xE9;duction</strong>.<ul><li>op&#xE9;rations mal adapt&#xE9;es &#xE0; l'architecture  GPU,</li><li>en m&#xE9;moire partag&#xE9;e : acc&#xE9;l&#xE9;ration par rapport au CPU.</li></ul></li></ul><div class="notes"><ul><li>les r&#xE9;duction consistent &#xE0; sommer, pour chaque segment les contributions partielles par bloc calcul&#xE9;es au 1</li></ul></div></div><div class="step" step="15" data-x="24000" data-y="0"><h1 id="id15">SEGMENTATION</h1><h2 id="id16">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p>Points positifs :</p><blockquote><ul><li>Conservation des donn&#xE9;es en m&#xE9;moire GPU.</li><li>Images cumul&#xE9;es (pr&#xE9;-calculs) effectu&#xE9;es en parall&#xE8;le.</li><li>Discr&#xE9;tisation des segments en parall&#xE8;le (1 thread/pixel).</li><li>Respect de l'algorithme original.</li></ul></blockquote><p>Points n&#xE9;gatifs :</p><blockquote><ul><li>Trop peu de calculs &#xE0; effectuer.</li><li>Segments de tailles et orientations variables :<ul><li>motifs d'acc&#xE8;s &#xE0; la m&#xE9;moire globale irr&#xE9;guliers,</li><li>nombreux threads inactifs.</li></ul></li></ul></blockquote><div class="notes"><ul><li>Un seul entier est &#xE9;chang&#xE9; entre le CPU et le GPU &#xE0; chaque it&#xE9;ration.</li><li>image cumul&#xE9;es par une adaptation de la m&#xE9;thode des sommes de pr&#xE9;fixes.</li><li>Abandon  Bresenham Possible car parcours unidirectionnel du contour.</li><li>Trop peu de calculs ne permet pas de masquer les latences.</li><li>Pas de coalescence possible dans les acc&#xE8;s &#xE0; la m&#xE9;moire globale car la g&#xE9;om&#xE9;trie des segments varie.</li><li>m&#xE9;moire partag&#xE9;e &#xE0; cause des r&#xE9;ductions.</li></ul></div></div><div class="step" step="16" data-x="25600" data-y="0"><h1 id="id17">SEGMENTATION</h1><h2 id="id18">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p><strong>Performances de l'impl&#xE9;mentation</strong></p><img src="img/perfs-snake.png" alt="" width="600px" height=""></img><img src="img/perfs-snake-img.png" alt="" width="400px" height=""></img></div><div class="step" step="17" data-x="27200" data-y="0"><h1 id="id19">SEGMENTATION</h1><h2 id="id20">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p><strong>Conclusion</strong></p><ul><li>Premi&#xE8;re et seule impl&#xE9;mentation connue &#xE0; ce jour.</li><li>Performances int&#xE9;ressantes pour les grandes images.</li><li>Image 10000x10000 en moins de 0,6 seconde.</li><li>Emploi non optimal du GPU : r&#xE9;ductions, irr&#xE9;gularit&#xE9;s.</li><li>Temps de calcul tr&#xE8;s d&#xE9;pendant du contenu de l'image.</li><li>Proposition d'une m&#xE9;thode d'initialisation alternative :<blockquote><ul><li>Recherche du contour rectangle le plus vraisemblable.</li><li>Acc&#xE9;l&#xE9;ration jusqu'&#xE0; x15 avec de petites cibles.</li></ul></blockquote></li></ul><p><strong>Publication</strong></p><blockquote><ul><li><em>G. Perrot, S. Domas, R. Couturier, and N. Bertaux</em>. <strong>Gpu implementation of a region based algorithm for large images segmentation.</strong> <em>In Computer and Information Technology (CIT), 2011 IEEE 11th International Conference on, pages 291&#x2013;298.</em></li></ul></blockquote></div><div class="step" step="18" data-x="28800" data-y="0"><h1 id="le-filtrage-des-images">LE FILTRAGE DES IMAGES</h1><blockquote><ul><li>Filtre m&#xE9;dian,</li><li>Filtres de convolution,</li><li>Filtre par recherche des lignes de niveaux.</li></ul></blockquote></div><div class="step" step="19" data-x="30400" data-y="0"><h1 id="id21">LE FILTRAGE DES IMAGES</h1><h2 id="filtre-median-principe">Filtre m&#xE9;dian : principe</h2><img src="img/median-principe.png" alt="" width="600px" height=""></img><p>La valeur de sortie d'un pixel est la <strong>m&#xE9;diane</strong> des valeurs de son voisinage.</p><ul><li>Bonne r&#xE9;duction du bruit <em>poivre &amp; sel</em>.</li><li>Assez bonne pr&#xE9;servation des contours.</li><li>Usages fr&#xE9;quents avec des petites fen&#xEA;tres (de 3x3 &#xE0; 7x7).</li><li>Quelques applications avec de grandes fen&#xEA;tres.</li><li>Op&#xE9;ration de s&#xE9;lection co&#xFB;teuse (tri).</li></ul></div><div class="step" step="20" data-x="32000" data-y="0"><h1 id="id22">LE FILTRAGE DES IMAGES</h1><h2 id="filtre-median-exemple">Filtre m&#xE9;dian : exemple</h2><table cellpadding="0" cellspacing="0"><thead><tr><th><img src="img/airplane_sap25.png" alt="" width="" height=""></img></th><th><img src="img/airplane_sap25_med5.png" alt="" width="" height=""></img></th></tr></thead><tbody><tr><td><p>Bruit <em>poivre &amp; sel</em> 25%</p></td><td><p>M&#xE9;dian 5x5</p></td></tr></tbody></table></div><div class="step" step="21" data-x="33600" data-y="0"><h1 id="id23">LE FILTRAGE DES IMAGES</h1><h2 id="filtre-median-gpu-travaux-de-reference">Filtre m&#xE9;dian GPU : travaux de r&#xE9;f&#xE9;rence</h2><p>Comparaison des impl&#xE9;mentations GPU de r&#xE9;f&#xE9;rence :</p><blockquote><ul><li><strong>PCMF</strong>, Sanchez <em>et al.</em> (2013), d&#xE9;bit max. <strong>80 MP/s</strong>,</li><li><strong>ArrayFire</strong>, commerciale (2013), d&#xE9;bit max. <strong>185 MP/s</strong>,</li><li><strong>BVM</strong> parall&#xE9;lis&#xE9; par Chen <em>et al.</em> (2009), d&#xE9;bit max. <strong>110 MP/s</strong>.</li></ul></blockquote><img src="img/compar-median2.png" alt="" width="500px" height=""></img><div class="notes"><ul><li>PCMF : Parallel (Complementary Cumulative Derivative Function) Median Filter (histogrammes cumulatifs)</li><li>CTMF : CPU &#xE0; temps constant</li></ul></div></div><div class="step" step="22" data-x="35200" data-y="0"><h1 id="id24">LE FILTRAGE DES IMAGES</h1><h2 id="id25">Filtre m&#xE9;dian GPU : Travaux de r&#xE9;f&#xE9;rence</h2><p>Emploi de la <strong>m&#xE9;moire partag&#xE9;e</strong> (exemple m&#xE9;dian 5x5)</p><table cellpadding="0" cellspacing="0"><tbody><tr><td><img src="img/shmem.png" alt="" width="" height=""></img></td><td><img src="img/carreB.png" alt="" width="" height=""></img></td><td><img src="img/halo.png" alt="" width="" height=""></img></td></tr></tbody></table><div class="notes"><ul><li>recouvrement pose probl&#xE8;me &#xE0; cause acc&#xE8;s concurrents &#xE0; la m&#xE9;moire partag&#xE9;e.</li></ul></div></div><div class="step" step="23" data-x="36800" data-y="0"><h1 id="id26">LE FILTRAGE DES IMAGES</h1><h2 id="optimisation-du-filtre-median-gpu">Optimisation du filtre m&#xE9;dian GPU</h2><img src="img/CPU-GPU-memcpy.png" alt="" width="650px" height=""></img><img src="img/transferts-mem.png" alt="" width="" height="300px"></img><div class="notes"><p>On gagne de 13 &#xE0; 43 % sur les temps de transfert.</p></div></div><div class="step" step="24" data-x="38400" data-y="0"><h1 id="id27">LE FILTRAGE DES IMAGES</h1><h2 id="id28">Optimisation du filtre m&#xE9;dian GPU</h2><img src="img/CPU-GPU-memcpy-dummykernel.png" alt="" width="750px" height=""></img><p>D&#xE9;bits maximums effectifs, en MP/s, sur C2070.</p><blockquote><img src="img/debit-max-2070.png" alt="" width="300px" height=""></img></blockquote><p><strong>Rappel :</strong> PCMF : 80 MP/s - BVM : 110 MP/s - ArrayFire : 185 MP/s</p><div class="notes"><p>&#xE7;a laisse environ 80ms pour faire un tri de 9 valeurs sur une image de 4096x4096</p></div></div><div class="step" step="25" data-x="40000" data-y="0"><h1 id="id29">LE FILTRAGE DES IMAGES</h1><h2 id="id30">Optimisation du filtre m&#xE9;dian GPU</h2><p><strong>S&#xE9;lection de la m&#xE9;diane</strong></p><blockquote><ul><li>Emploi exclusif des <strong>registres</strong> pour charger les valeurs utiles<blockquote><ul><li>m&#xE9;moires individuelles au c&#x153;ur du GPU,</li><li>non indexables dans un tableau.</li><li>maximum de 63 registres par thread et 32 K par bloc de threads.</li></ul></blockquote></li><li>Pour les petites tailles : max. 7x7 avec 1 pixel/thread.</li><li>Exploitation des recouvrements entre fen&#xEA;tres voisines.</li></ul></blockquote></div><div class="step" step="26" data-x="41600" data-y="0"><h1 id="id31">LE FILTRAGE DES IMAGES</h1><h2 id="id32">Optimisation du filtre m&#xE9;dian GPU</h2><p><strong>S&#xE9;lection de la m&#xE9;diane</strong> (par oubli)</p><table cellpadding="0" cellspacing="0" class="columns"><tbody><tr><td><p>Avantages :</p><ul><li>&#xC9;vite le tri complet : performances en hausse,</li><li>&#xC9;conomie de registres : \(\lceil \frac{n}{2}\rceil +1\) au lieu de \(n\),</li><li>Permet de plus grandes tailles : max 11x11.</li></ul></td><td><img src="img/forgetful_selection.png" alt="" width="" height="500px"></img></td></tr></tbody></table></div><div class="step" step="27" data-x="43200" data-y="0"><h1 id="id33">LE FILTRAGE DES IMAGES</h1><h2 id="id34">Optimisation du filtre m&#xE9;dian GPU</h2><p><strong>Exploitation des recouvrements</strong> : 2 pixels par thread (m&#xE9;dian 5x5).</p><img src="img/recouvrement5.png" alt="" width="800px" height=""></img><ul><li><strong>7+2x5 = 17</strong> &#xE9;tapes de s&#xE9;lection au lieu de <strong>2x12 = 24</strong>.</li><li>Les plus co&#xFB;teuses sont communes.</li><li>&#xC0; 4 pixels/thread, zone commune = 10 pixels &lt; 14.</li></ul><div class="notes"><ul><li>chaque thread utilise plus de registres</li><li>mais sur un bloc, en adaptant la taille du bloc, on &#xE9;conomise k+1 registres par paire de pixels.</li></ul></div></div><div class="step" step="28" data-x="44800" data-y="0"><h1 id="id35">LE FILTRAGE DES IMAGES</h1><h2 id="performances-du-median-gpu-propose-prmf">Performances du m&#xE9;dian GPU propos&#xE9; (PRMF)</h2><img src="img/perf-median.png" alt="" width="650px" height=""></img><p><strong>Rappels :</strong></p><blockquote><ul><li>d&#xE9;bit cr&#xEA;te de la plateforme = 2444 MP/s.</li><li>d&#xE9;bit maximum des impl&#xE9;mentations de r&#xE9;f&#xE9;rence = 185 MP/s.</li></ul></blockquote></div><div class="step" step="29" data-x="46400" data-y="0"><h1 id="id36">LE FILTRAGE DES IMAGES</h1><h2 id="performances-du-filtre-median-gpu-propose-prmf">Performances du filtre m&#xE9;dian GPU propos&#xE9; (PRMF)</h2><p>Image 512x512</p><blockquote><img src="img/comp512.png" alt="" width="" height="200px"></img></blockquote><p>Image 4096x4096</p><blockquote><img src="img/comp4k.png" alt="" width="" height="200px"></img></blockquote><div class="notes"><ul><li>d&#xE9;bit d&#xE9;croit lin&#xE9;airement en fonction de <strong>n</strong></li></ul></div></div><div class="step" step="30" data-x="48000" data-y="0"><h1 id="id37">LE FILTRAGE DES IMAGES</h1><h2 id="le-filtre-median-gpu">Le filtre m&#xE9;dian GPU</h2><p><strong>Conclusion</strong></p><blockquote><ul><li>Pas d'utilisation de la m&#xE9;moire partag&#xE9;e.</li><li>Acc&#xE8;s optimaux : 1 lecture par pixel.</li><li>D&#xE9;bit global am&#xE9;lior&#xE9; de <strong>x7</strong> &#xE0; <strong>x10</strong>, proche du maximum.</li><li>D&#xE9;bit de calcul max. <strong>5,3 GP/s</strong>.</li><li>M&#xE9;dian jusqu'au 11x11 sur C2070, 21x21 sur K40.</li><li>Cr&#xE9;ation d'une application web g&#xE9;n&#xE9;rant les codes sources.</li><li>Utilis&#xE9; sur images de cristallographie au synchrotron SPring-8.</li></ul></blockquote><p><strong>Publications</strong></p><blockquote><ul><li><em>Gilles Perrot. Image processing. In</em> <strong>Designing Scientific Applications on GPUs</strong>, <em>pages 28-70. CRC Press, 2013.</em></li><li><em>Gilles Perrot, St&#xE9;phane Domas, and Rapha&#xEB;l Couturier.</em> <strong>Fine-tuned high-speed implementation of a gpu-based median filter.</strong> <em>Journal of Signal Processing Systems, pages 1&#x2013;6, 2013.</em></li></ul></blockquote></div><div class="step" step="31" data-x="49600" data-y="0"><h1 id="id38">LE FILTRAGE DES IMAGES</h1><h2 id="les-filtres-de-convolution">Les filtres de convolution</h2><p><strong>Principe</strong></p><blockquote>$$I_{out}(x, y) = \left(I_{in} * h\right) = \sum_{(i &lt; H)} \sum_{(j &lt; L)}I_{in}(x-j, y-i)h(j,i)$$</blockquote><p><strong>Selon les valeurs du masque h</strong></p><blockquote><ul><li>R&#xE9;duction de bruit, d&#xE9;tection de bords,...</li><li>Potentiellement <strong>s&#xE9;parable</strong> en deux convolutions 1D.</li></ul></blockquote></div><div class="step" step="32" data-x="51200" data-y="0"><h1 id="id39">LE FILTRAGE DES IMAGES</h1><h2 id="les-filtres-de-convolution-gpu">Les filtres de convolution GPU</h2><p>Extension des m&#xE9;thodes appliqu&#xE9;es au filtre m&#xE9;dian :</p><blockquote><ul><li>Un seul acc&#xE8;s m&#xE9;moire par pixel.</li><li>M&#xE9;morisation et calculs en registre.</li><li>Optimum &#xE0; 8 pixels/thread.</li></ul></blockquote><p>Impl&#xE9;mentations de r&#xE9;f&#xE9;rence (C2070) :</p><blockquote><ul><li>Nvidia atteint un d&#xE9;bit de calcul maximum de <strong>6,00 GP/s</strong>.</li></ul></blockquote></div><div class="step" step="33" data-x="52800" data-y="0"><h1 id="id40">LE FILTRAGE DES IMAGES</h1><h2 id="id41">Les filtres de convolution GPU</h2><p><strong>R&#xE9;sultats</strong></p><blockquote><ul><li>Am&#xE9;lioration sensible des d&#xE9;bits de calcul en 2D : 16 &#xE0; 35 %.</li><li>D&#xE9;bit de la convolution 1D horizontale jusqu'&#xE0; 54% plus &#xE9;lev&#xE9;.</li><li>D&#xE9;bit maximum de <strong>8,54 GP/s</strong>.</li><li>Application &#xE0; d'autres familles de signaux 1D (audio,...).</li></ul></blockquote></div><div class="step" step="34" data-x="54400" data-y="0"><h1 id="id42">LE FILTRAGE DES IMAGES</h1><h2 id="filtre-par-recherche-des-lignes-de-niveaux">Filtre par recherche des lignes de niveaux</h2><p><strong>Motivations :</strong></p><blockquote><ul><li>Les algorithmes qui d&#xE9;bruitent le mieux sont lents (BM3D).</li><li>Les images naturelles sont d&#xE9;composables en un ensemble de lignes de niveaux ( iso-niveau de gris ).</li><li>Concevoir un algorithme GPU original et son impl&#xE9;mentation.</li></ul></blockquote></div><div class="step" step="35" data-x="56000" data-y="0"><h1 id="id43">LE FILTRAGE DES IMAGES</h1><h2 id="id44">Filtre par recherche des lignes de niveaux</h2><p><strong>Principe - mod&#xE8;le</strong></p><blockquote><ul><li>Estimation locale, par maximum de vraisemblance.</li><li>R&#xE9;duction de bruit par moyennage le long de la ligne estim&#xE9;e.</li><li>Mod&#xE8;le de ligne de niveaux retenu : <strong>isoline</strong><blockquote><p>= ligne bris&#xE9;e compos&#xE9;e de <strong>segments</strong>.</p></blockquote></li><li>Segments choisis parmi 32 motifs pr&#xE9;-calcul&#xE9;s.</li><li>Les 8 premiers motifs pour des segments de 6 pixels :<img src="img/P5Q1.png" alt="" width="450px" height=""></img></li></ul></blockquote></div><div class="step" step="36" data-x="57600" data-y="0"><h1 id="id45">LE FILTRAGE DES IMAGES</h1><h2 id="id46">Filtre par recherche des lignes de niveaux</h2><p><strong>&#xC9;tape 1</strong> (1 pixel/thread)</p><blockquote><ul><li>En chaque pixel, recherche du motif maximisant la log-vraisemblance ( exemple \(n=6\))</li></ul>$$-\frac{n}{2}log\left(2\pi\right) - \frac{n}{2}log\left(\sigma^2\right) - \frac{n}{2}$$<img src="img/lniv-mv.png" alt="" width="400px" height=""></img><ul><li>M&#xE9;morisation des param&#xE8;tres du motif s&#xE9;lectionn&#xE9; dans deux matrices \(I_{\Theta}\) (indice) et \(I_{\Sigma}\) (moyenne, variance).</li></ul></blockquote></div><div class="step" step="37" data-x="59200" data-y="0"><h1 id="id47">LE FILTRAGE DES IMAGES</h1><h2 id="id48">Filtre par recherche des lignes de niveaux</h2><p><strong>&#xC9;tape 2</strong> (1 pixel/thread)</p><blockquote><ul><li>Isoline valid&#xE9;e de \(n_{prec}\) pixels.</li><li>Segment candidat de \(n_s\) pixels.</li><li>Allongement de l'isoline sous condition GLRT ?</li></ul>$$GLRT=T-\scriptstyle (n_{prec}+n_s)\left[log\left(\widehat{\sigma_{prec+s}}^2\right) - log\left(\widehat{\sigma_{prec}}^2\right) - log\left(\widehat{\sigma_{s}}^2\right) \right]$$<img src="img/pipd-extension.png" alt="" width="500px" height=""></img></blockquote></div><div class="step" step="38" data-x="60800" data-y="0"><h1 id="id49">LE FILTRAGE DES IMAGES</h1><h2 id="id50">Filtre par recherche des lignes de niveaux</h2><p><strong>&#xC9;tape 3</strong> (optionnelle)</p><blockquote><p>Compensation de la non robustesse de s&#xE9;lection des motifs dans les zones homog&#xE8;nes.</p><blockquote><ul><li>Conception d'un d&#xE9;tecteur de zones homog&#xE8;nes.</li><li>Identification des zones homog&#xE8;nes avec ce d&#xE9;tecteur.</li><li>Application d'un filtre moyenneur dans les zones identifi&#xE9;es comme homog&#xE8;nes (convolution).</li></ul></blockquote></blockquote><div class="notes"><ul><li>Sous-ensembles de pixels n'ayant pas d'intersection --&gt; MV</li><li>Utilisation des motifs des segments pour gain de temps.</li></ul></div></div><div class="step" step="39" data-x="62400" data-y="0"><h1 id="id51">LE FILTRAGE DES IMAGES</h1><h2 id="id52">Filtre par recherche des lignes de niveaux</h2><p><strong>R&#xE9;sultats</strong></p><blockquote><p>Ensemble d'images de S. Lansel (DenoiseLab, Universit&#xE9; Stanford), filtre propos&#xE9; (PI-PD)</p><ul><li>Am&#xE9;lioration moyenne du rapport Signal sur bruit: <strong>+7,1 dB</strong>,</li><li>Indice de similarit&#xE9; structurelle : <strong>+30%</strong>,</li><li>Temps de calcul (C2070, <strong>avec</strong> d&#xE9;tecteur) : <strong>7 ms</strong>.</li></ul><p>Algorithme de r&#xE9;f&#xE9;rence BM3D</p><ul><li>Am&#xE9;lioration moyenne du rapport Signal sur bruit: <strong>+9,5 dB</strong>,</li><li>Indice de similarit&#xE9; structurelle : <strong>+36%</strong>,</li><li>Temps de calcul : <strong>4300 ms</strong>.</li></ul></blockquote><div class="notes"><ul><li>2,4 dB d'&#xE9;cart, soit r&#xE9;duction de 43% de la puissance de bruit</li></ul></div></div><div class="step" step="40" data-x="64000" data-y="0"><h1 id="id53">LE FILTRAGE DES IMAGES</h1><h2 id="id54">Filtre par recherche des lignes de niveaux</h2><table cellpadding="0" cellspacing="0"><tbody><tr><td><img src="img/zoom_noisy.png" alt="" width="" height=""></img></td><td></td><td><img src="img/zoom_mean5.png" alt="" width="" height=""></img></td></tr><tr><td><p>Bruit gaussien \(\sigma=25\)</p></td><td></td><td><p>Moyennage 5x5</p></td></tr><tr><td><img src="img/zoom_pipdh.png" alt="" width="" height=""></img></td><td></td><td><img src="img/zoom_bm3d.png" alt="" width="" height=""></img></td></tr><tr><td><p>PI-PD</p></td><td></td><td><p>BM3D</p></td></tr></tbody></table></div><div class="step" step="41" data-x="65600" data-y="0"><h1 id="id55">LE FILTRAGE DES IMAGES</h1><h2 id="id56">Filtre par recherche des lignes de niveaux</h2><p><strong>Synth&#xE8;se - conclusion</strong></p><blockquote><ul><li>Rapport qualit&#xE9;/temps &#xE9;lev&#xE9;.</li><li>Traitement d'images HD &#xE0; 20 fps.</li><li>Artefacts en marche d'escalier.</li><li>Parall&#xE9;lisation de la m&#xE9;thode de Buades <em>et al.</em> (2006) :<blockquote><ul><li>gain +1 dB en +0,2 ms pour 512x512.</li></ul></blockquote></li><li>Algorithme d&#xE9;di&#xE9; GPU, sans impl&#xE9;mentation s&#xE9;quentielle de r&#xE9;f&#xE9;rence.</li></ul></blockquote><p><strong>Publication</strong></p><blockquote><ul><li><em>Gilles Perrot, St&#xE9;phane Domas, Rapha&#xEB;l Couturier, and Nicolas Bertaux.</em> <strong>Fast gpu-based denoising filter using isoline levels.</strong> <em>Journal of Real-Time Image Processing, pages 1&#x2013;12, 2013.</em></li></ul></blockquote></div><div class="step" step="42" data-x="67200" data-y="0"><h1 id="conclusion-generale">CONCLUSION G&#xC9;N&#xC9;RALE</h1><ul><li>Trois types de conception mis en &#x153;uvre :<blockquote><ul><li>Parall&#xE9;lisation GPU d'une impl&#xE9;mentation CPU (<em>snake</em>).</li><li>Impl&#xE9;mentations optimis&#xE9;es pour GPU d'op&#xE9;rateurs math&#xE9;matiques (m&#xE9;dian, convolution).</li><li>Algorithme d&#xE9;di&#xE9; GPU et son impl&#xE9;mentation (isolines).</li></ul></blockquote></li><li>Le portage <strong>efficace</strong> d'algorithme sur GPU s'av&#xE8;re tr&#xE8;s complexe.</li><li>Certains algorithmes ne se pr&#xEA;tent pas &#xE0; la parall&#xE9;lisation GPU.</li><li>L'emploi de la m&#xE9;moire partag&#xE9;e n'apporte pas les meilleures performances en cas de recouvrements.</li><li>Filtrage &#xE0; des d&#xE9;bits in&#xE9;gal&#xE9;s, proches des performances cr&#xEA;te.</li><li>Filtres utilisables par tout programmeur gr&#xE2;ce au g&#xE9;n&#xE9;rateur de code.</li></ul></div><div class="step" step="43" data-x="68800" data-y="0"><h1 id="perspectives">PERSPECTIVES</h1><blockquote><ul><li>Extension des filtres aux images couleurs et autres types de bruits (multiplicatif).</li><li>Extension aux pseudo-m&#xE9;dians de grandes tailles (microscopie).</li><li>Beaucoup de traitements et domaines peuvent b&#xE9;n&#xE9;ficier des techniques propos&#xE9;es (audio, imagerie 3D, BM3D).</li><li>Les &#xE9;volutions de l'architecture laissent entrevoir de nouvelles possibilit&#xE9;s (parall&#xE9;lisme dynamique, kernels concurrents).</li></ul></blockquote><div class="notes"><ul><li>certaines ardeurs ont &#xE9;t&#xE9; refroidies</li></ul></div></div><div class="step" step="44" data-x="70400" data-y="0"><h1 id="annexe-1">ANNEXE 1</h1><h2 id="id57">Parall&#xE9;lisation du <em>Snake</em> polygonal sur GPU</h2><p><strong>Structure des donn&#xE9;es</strong> (n&#x153;uds pairs)</p><img src="img/16segments.png" alt="" width="800px" height=""></img><div class="notes"><ul><li>r&#xE8;gle 1 thread par pixel</li></ul></div></div><div class="step" step="45" data-x="72000" data-y="0"><h1 id="annexe-2-median">ANNEXE 2 (m&#xE9;dian)</h1><h2 id="image-cristallographie-spring-8">Image cristallographie SPring-8</h2><img src="img/spring82.png" alt="" width="400px" height=""></img></div><div class="step" step="46" data-x="73600" data-y="0"><h1 id="annexe-3-lniv">ANNEXE 3 (lniv)</h1><h2 id="detecteur-de-bords">D&#xE9;tecteur de bords</h2><blockquote><img src="img/detecteur.png" alt="" width="400px" height=""></img></blockquote></div></div><div id="hovercraft-help"><table><tr><th>Space</th><td>Forward</td></tr><tr><th>Left, Down, Page Down</th><td>Next slide</td></tr><tr><th>Right, Up, Page Up</th><td>Previous slide</td></tr><tr><th>P</th><td>Open presenter console</td></tr><tr><th>H</th><td>Toggle this help</td></tr></table></div><script type="text/javascript" src="js/impress.js"></script><script type="text/javascript" src="js/impressConsole.js"></script><script type="text/javascript" src="js/hovercraft.js"></script></body></html>
\ No newline at end of file