Processing math: 100%

TP4 - Suite

On récupère les données de la première partie.

Exercice 4.- Descente de gradient pour le problème de débruitage 1D

On a à présent tous les outils permettant de résoudre numériquement le problème (P) dans le cas q=2. minVRNEq(V)avecEq(V)=12VSnoise22+λ2Jq(V)pourλ>0 fixé. On reprend nos signaux S et Snoise initiaux et on rappelle qu'on prendra S0=Snoise dans le terme d'attache aux données de (P).

  1. Définir une fonction gradE(V, lam) qui prend en argument un np.array V et le paramètre lam (λ dans le modèle) et renvoie E(V).

En reprenant le résultat obtenu à l'exercice 2, on remarque que E(V)=VS0+λ2J(V)et12J(V)=[V0V1,δ(δV)RN2,VN1VN2],δV a été défini à l'exercice 1.

  1. Modifier la fonction gradDescent de l'exercice 3 en une fonction gradDescentParam(gradfun, lam, x0, nbIter, tau) afin de prendre en compte le paramètre lam apparaissant dans E et dans son gradient gradE(V, lam).
  1. On a établi dans l'exercice 2 que la Hessienne de E était 2E(V)=IN+λA. On admettra que A est une matrice symétrique positive dont les valeurs propres sont toutes dans [0,4]. Pourquoi peut-on choisir un pas de temps 0<τ<21+4λ ?

Les valeurs propres de la Hessienne 2E(V)=IN+λA sont exactement {1+λμ:μSp(A)}, On est dans les hypothèses du théorème de convergence de la descente de gradient à pas fixe des notes de cours avec l=1 et L=1+4λ, à condition de choisir un pas 0<τ<2L=21+4λ.

On prendra par la suite un pas de temps τ=1.81+4λ.

  1. Appliquer la descente de gradient gradDescentParam afin de résoudre numériquement le problème (P), on partira de x0 = Snoise. On pourra choisir nbIter = 50 et lam = 4 (et tau adapté en fonction) pour ce premier test. Représenter et comparer le signal Sfin ainsi obtenu avec S et Snoise.
  1. On s'intéresse à l'influence du paramètre λ. Conserver les mêmes paramètres et faire varier lam in np.arange(0,50,0.2). Pour chacune de ces valeurs de lam, calculer Sfin (comme à la question précédente) puis N2(λ):=SfinS2. Représenter N2(λ) en fonction de λ.
  1. En déduire le choix de paramètre λ qui semble optimal dans le cas présent (on "triche" ici : on connaît la solution S qu'on veut retrouver). Pour la valeur du paramètre λ>0 ainsi obtenue, représenter et comparer le signal Sfin ainsi obtenu avec S et Snoise. On pourra utiliser la fonction np.argmin.

Il est normal que la valeur de λ "optimale" varie dès qu'on réexécute la première cellule de l'exercice :

noise = np.random.normal(0, 0.1, N) Snoise = S + noise

Exercice 5.- Modèle variationnel pour débruiter une image

On reprend notre image initiale et on moyenne les 3 canaux RVB afin d'obtenir une image en niveaux de gris stockée dans le np.ndarray U de taille n,N, ici n=N=256. On génère ensuite une version bruitée en ajoutant à chaque pixel une v.a. suivant une loi normale centrée de variance σ2 avec σ=0.1. On obtient le np.ndarray Unoise de même taille que U.

Reprenons la démarche suivie pour aboutir au modèle 1D (début de l'exercice 1). On se donne à présent v:[0,1]×[0,1]R qu'on suppose être une version bruitée de notre image u:[0,1]×[0,1]R qu'on ne connaît pas et qu'on souhaiterait "retrouver". Pour cela, on va à nouveau essayer de différencier (de façon quantitative) une image bruitée d'une image non bruitée en se basant sur les oscillations/variations : pour q1, vqq=[0,1]×[0,1]|v|q=[0,1]×[0,1](|xv|2+|yv|2)q2sera plus grand pour v que pour u. Du point de vue du signal discret, on peut remplacer xv(xi,yj) par le taux de variation entre deux valeurs successives : supposons qu'on connaît

V=[v(xi,yj)]i=0N1j=0n1MN,n(R)avec0=x0<x1<<xN1=1et0=y0<y1<<yn1=1

on peut remplacer xv par la matrice des différences selon les abscisses δxVMn,N1(R) :

δxV=[v(x1,y0)v(x0,y0)v(x2,y0)v(x1,y0)v(xN1,y0)v(xN2,y0)v(x1,y1)v(x0,y1)v(x2,y1)v(x1,y1)v(xN1,y1)v(xN2,y1)v(x1,yn1)v(x0,yn1)v(x2,yn1)v(x1,yn1)v(xN1,yn1)v(xN2yn1)]=[V0,1V0,0V0,2V0,1V0,N1V0,N2V1,1V1,0V1,2V1,1V1,N1V1,N2Vn1,1Vn1,0Vn1,2Vn1,1Vn1,N1Vn1,N2]=[V,1V,0V,2V,1V,N1V,N2]

On a utilisé les notations Vi, pour désigner la ligne i de V et V,j pour désigner la colonne j de V.

On peut de même remplacer yV par la matrice des différences selon les ordonnées δyVMn1,N(R) :

δyV=[V1,0V0,0V1,1V0,1V1,N1V0,N1V2,0V1,0V2,1V1,1V2,N1V1,N1Vn1,0Vn2,0Vn1,1Vn2,1Vn1,N1Vn2,N1]=[V1,V0,V2,V1,Vn1,Vn2,]

On peut alors remplacer vqq par

J(V)=i,j(|(δxV)i,j|2+|(δyV)i,j|2)q2=N1i=1n1j=1(|Vi,jVi1,j|2+|Vi,jVi,j1|2)q2+n1j=1|V0,jV0,j1|q+N1i=1|Vi,0Vi1,0|q.

Pour q=2, on peut en déduire facilement/fastidieusement le gradient de J, similairement à ce qui a été fait dans le cas d'un signal 1D.

  1. Effectuer le calcul de J(V) et vérifier qu'on peut alors réécrire, 12J(V)=δx([00(δxV)00])δy([00(δyV)00])

Soit k{1,,N2} et l{1,,n2}, le terme Vk,l apparaît 4 fois : 2 fois pour (i,j)=(k,l), pour (i,j)=(k+1,l) et pour (i,j)=(k,l), (i,j)=(k,l+1). On obtient 12k,lJ(V)=2Vk,lVk1,lVk+1,l+2Vk,lVk,l1Vk,l+1=4Vk,lVk1,lVk+1,lVk,l1Vk,l+1120,lJ(V)=3V0,lV1,lV0,l1V0,l+1et12N1,lJ(V)=3VN1,lVN2,lVN1,l1VN1,l+112k,0J(V)=3Vk,0Vk1,0Vk+1,0Vk,1et12k,n1J(V)=3Vk,n1Vk1,n1Vk+1,n1Vk,n2120,0J(V)=2V0,0V1,0V0,1,12N1,0J(V)=2VN1,0VN2,0VN1,1,120,n1J(V)=2V0,0V1,n1V0,n2et12N1,n1J(V)=2VN1,n1VN2,n1VN1,n2.

De même que dans le cas 1D, on peut alors réécrire,

J(V)=[00δx(δxV)00]+[00δy(δyV)00]+[(δxV),00Mn,N2(δxV),N1]+[(δyV)0,0Mn2,N(δyV)n1,]=δx[00(δxV)00]δy[00(δyV)00]

où par définition δx(δxV)Mn,N2(R) et δy(δyV)Mn2,N(R), et M,j désigne la colonne j de M, de même Mi, désigne la ligne i de M d'une matrice M.

Cela permet d'implémenter assez facilement le gradient de J et donc celui de E.

  1. Définir des fonctions deltax et deltay qui prennent en argument un np.ndarray V de taille n,N et renvoient respectivement le np.ndarray δxV de taille n,N-1 et le np.ndarray δyV de taille n-1,N. Grâce à l'écriture ci-dessus du gradient (question 1), définir une fonction gradEMat(V,lam) qui renvoie le gradient de E(V)=12VUnoise22+λ2J(V).

On a E(V)=VUnoise+λ2J(V) et on peut utiliser la question 1 pour l'implémentation.

  1. Utiliser la fonction gradDescentParam implémentée précédemment afin d'obtenir une solution approchée Ufin au problème de minimsation de E en partant de x0 = Unoise. On pourra commencer par tester avec λ=2, τ=1.81+8λ et 100 itérations.
  1. Représenter l'image Ufin obtenue à la question précédente et la comparer avec U et Unoise, on pourra comparer quelques fenêtres de zoom.
  1. Jouer sur les différents paramètres et comparer les résultats obtenus.

Exercice 6.- L'effet du régularisateur L2

On va essayer d'étudier l'effet du choix de "régularisation" J=J2. On remarque tout d'abord que la méthode de débruitage mise en oeuvre dans l'exercice précédent produit un floutage des contours présents dans l'image. On va le vérifier dans les questions 1 et 2 suivantes.

  1. Appliquer la descente de gradient à l'énergie modifée ˜E(V)=12VU22+λ2J(V) où on a remplacé Unoise par U dans le terme d'attache aux données afin d'observer uniquement l'effet de J2. On partira de x0 = U directement, en conservant les paramètres λ=2, τ=1.81+8λ. Comparer les résultats après 10 itérations et après 100 itérations avec l'image U.

On modifie la fonction gradDescentParampour passer le terme d'attache aux données en paramètre.

On observe que même en l'absence de bruit dans le term d'attache aux données et en partant de l'image elle-même, la minimisation de E=E2 introduit un floutage des contours présents dans l'image.

  1. Effectuer la même expérience qu'à la question 1, en remplaçant U par l'image plus simple Inb définie ci-dessous.
  1. On revient dans cette question à un signal 1D très simple : reprendre à nouveau la question 1 en remplaçant l'image Upar le signal Sgeom défini ci-dessous. Représenter le signal Sgeom et les signaux S10 et S50 obtenus après 10 itérations et 50 itérations de descente de gradient.

Plus précisément, on reprendra le gradient de E avec paramètre λ : gradE(V, lam) défini à la question 1 de l'exercice 4 et on remplacera Snoise par Sgeom dans le terme d'attache aux données. On effectuera ensuite la descente de gradient grâce à gradDescentParam (exercice 4 question 2) en prenant x0 = Sgeom, λ=10, τ=1.81+4λ et nbIt = 10 puis nbIt = 50.

On observe que la transition 0-1 est régularisée lorsqu'on minimise E pour q=2. rappelons à présent que dans l'exercice 1, on avait proposé un terme de régularisation de la forme Jq(S)=δSqq et on avait observé que plus q était proche de 1, plus Jq(S)Jq(Snoise) était grand ce qui donne envie de considérer q=1. Cependant, le choix q=2 était également naturel car simple à mettre en oeuvre : le gradient de J2 est assez simple à exprimer, ce qui permet d'utiliser une descente de gradient comme on l'a fait jusqu'ici.

  1. Calculer et comparer Jq pour q=1 et q=2 pour chacun des trois signaux Sgeom, S10 et S50 représentés à la question 3. En ce qui concerne les valeurs obtenues pour J1, justifiez les résultats obtenus par un calcul théorique.

En ce qui concerne J1, dès que le signal est croissant au sens où pour tout k{1,,N1}, VkVk1, on a J1(V)=N1k=1|VkVk1|=N1k=1(VkVk1)=VN1V0, indépendemment du fait que la transition entre la valeur initiale et la valeur finale soit régulière ou brutale. C'est très différent en ce qui concerne J2 qui prend des valeurs bien plus petites lorsque la transition se fait plus régulièrement.

On observe ainsi que contrairement à J2, le terme J1 ne tend pas à régulariser les transitions brutales, et on pourrait vérifier que de même J1 ne tend pas à flouter les contours présents dans une image (ces contours correspondent aux lignes de transition brutale entre deux teintes de gris différentes).

Exercice 7.- Modèle TV - L2 régularisé

On revient au choix q=1. Notons tout d'abord une obstruction importante : J1 n'est pas différentiable et la mise en oeuvre de la descente de gradient n'est plus possible. Pour VRN, J1(V)=N1i=1|ViVi1| n'est pas différentiable en tout point V tel que k, Vk=Vk1. Afin de contourner cette obstruction, on propose de remplacer |t| par ϵ2+t2, et ainsi considérer pour régulariser le signal Snoise : Eϵ(V)=12VSnoise22+λJϵ(V)avecJϵ(V)=N1i=1ϵ2+|ViVi1|2=N2k=iϵ2+|(δV)i|2, ou encore pour régulariser l'image Unoise : Eϵ(V)=12VUnoise22+λJϵ(V)avecJϵ(V)=i,jϵ2+|(δxV)i,j|2+|(δyV)i,j|2.

  1. On définit pour ϵ>0, hϵ:RR+, tϵ2+t2. Représenter le graphe de hϵ sur [2,2] pour ϵ{1,0.1,0.01}. Calculer hϵ et représenter également son graphe.
  1. Soit i,k{0,1,,N1}, vérifier que k[hϵ(ViVi1)]={hϵ(VkVk1)sii=khϵ(Vk+1Vk)sii=k+10sinon. En déduire que pour 0<k<N1, kJϵ(V)=hϵ(VkVk1)hϵ(Vk+1Vk)et0Jϵ(V)=hϵ(V1V0)etN1Jϵ(V)=hϵ(VN1VN2).
  1. Fixer ϵ=0.01 et implémenter une fonction gradEeps(V) qui prend en argument un np.array V et retourne Eϵ(V)Eϵ(V)=12VSnoise22+λJϵ(V).

On pourra utiliser la question 2 pour réécrire Jϵ(V)=δWW=[0,hϵ((δV)1),hϵ((δV)2),,hϵ((δV)N2)RN2,0],δV a été défini à l'exercice 1.

  1. Appliquer la descente de gradient avec λ=0.2, τ=1.81+4λϵ, en partant de x0 = Snoise et en effectuant 200 itérations. Comparer avec le signal obtenu en minimisant E=E2 dans l'exercice 4.

Afin de comparer au débruitage obtenu avec l'énergie E2, on effectue l'étude sur le paramètre λ "optimal" analogue à la question 6 de l'exercice 4.

  1. On va terminer ce travail en menant à bien la minimisation de Eϵ(V)=12VUnoise22+λJϵ(V) avec hϵ(t1,t2)=ϵ2+t21+t22 et Jϵ(V)=i,jhϵ((δxV)i,j,(δyV)i,j)=N1i=1n1j=1hϵ(Vi,jVi,j1,Vi,jVi1,j)+n1j=1hϵ(V0,jV0,j1,0)+N1i=1hϵ(0,Vi,0Vi1,0). On conserve ϵ=0.01 et on admettra que le gradient de Eϵ peut-être implémenté comme suit par la fonction gradETV(V,lam). Appliquer la descente de gradient afin de minimiser Eϵ, on prendra λ=0.05, τ=1.81+8λϵ, X0 = Unoise et 300 itérations. Comparer avec les résultats obtenus à la fin de l'exercice 5. Vérifier qu'on obtient des contours plus nets dans l'image.
  1. Représenter (par une image) Eϵ(Unoise) et E2(Unoise) en utilisant les paramètres ayant servis pour les calculs numériques dans la question précédente/dans la question 3 de l'exercice 5.