ぼやけた画像を回復する別のアルゴリズム

良い一日。 画像のデコンボリューション方法については多くのことが言われていますが、追加するものは他にないようです。 ただし、以前のアルゴリズムよりも優れた新しいアルゴリズムが常に存在します。 少し前まで、低メモリコストで線形収束率を持ち、安定しており、並列化が可能な反復アルゴリズムが説明されていました。 そしてしばらくすると、二次収束にまで改善されました。 会う:(高速)反復収縮しきい値アルゴリズム。







問題の声明



画像のデコンボリューションアルゴリズムに関する長いシリーズの記事が公開されました。 サイクルは、線形代数方程式のシステムとそれらの正則化を解くための古典的な方法を考慮しました。 問題のステートメントの観点から説明した方法は、実際には古典的な方法と違いはありませんが、悪魔は詳細にあります。 数学の魔法を始めましょう。 これは、受信した破損したノイズの多い画像の古典的な表現です。







 mathbfy= mathbfAx+ mathbfn









マトリックス  mathbfA は畳み込み行列であり、物理的な観点から、元のデータと破損したデータのポイント間の関係を示します。 画像の場合、この行列は畳み込みカーネルを変換することで取得できます。 ベクトル  mathbfx そして  mathbfy ベクトル化された形式の元の破損した画像です。 つまり、画像内のすべてのピクセル列が次々に連結されます。



この問題の定式化の最初の問題:割り当てられたメモリの量。 画像のサイズが640x480の場合、タスクは、サイズが307200x1の要素とサイズが307200x307200要素の行列の画像の2つのベクトルを保存します。 畳み込み行列はスパースですが、そのサイズは、スパース形式であっても大きくなり、多くのメモリを占有します。 畳み込み行列を含む積は、カーネルを使用した2次元畳み込みに置き換えることができます。これにより、メモリに大きな行列を保存する必要がなくなり、行列を保存する問題が解決します。  mathbfA

元の画像にできるだけ近い画像を検索するには、損傷した画像と目的の画像の間の残差の2番目のノルムの古典的な形式で最適化された関数を記述します。







min hat mathbfx mid mid mathbfyA hatx mid mid2









従来の方法とは異なり



この問題に関する声明は最も人気のあるものの1つですが、パフォーマンスを改善するために補足します。 使用されるアプローチはマジョライゼーション最大化と呼ばれ、元のタスクを非常によく似た別のタスクに置き換えることで構成されます。 新しいタスクには2つのプロパティがあります。



  1. タスクははるかに簡単です
  2. 現在の点を除くすべての点で、残差は元の問題より大きい


このアクションは、アルゴリズムの各反復で発生します。 とても複雑に聞こえますが、実際に見えるよりもずっと複雑です。 結果の反復の最小化関数 k 次のように書かれています。







 mathbfJkx= mid mid mathbfyA hatx mid mid2+ mathbf hatx hatxkT\ア mathbfI mathbfATA mathbf hatx hatxk









右項の行列は正定です。 これは、  alpha>maxeig mathbfATA 。 最小化関数は、それぞれが非負の2つの量の合計で構成されます。 また、その時点で  mathbf hatx= hatxk 2番目の項はゼロに等しいため、リストの2番目の条件が満たされます。



ソリューションを検索する



解決策の検索は、古典的な方法で開始します。括弧を開き、勾配を書き、ゼロに等しくします。 これは上の勾配であることに注意してください kその反復。 たくさんの数学に注意してください!







 mathbfJk hatx= mathbfyA hatxT mathbfyA hatx+ mathbf hatx hatxkT cdot alpha mathbfI mathbfATA cdot mathbf hatx hatxk











 mathbfJk hatx= mathbfyTy+ mathbf hatxTATA hatx2 mathbfyTA hatx mathbf hatxT alpha mathbfI mathbfATA hatx+ mathbf hatxkT alpha mathbfI mathbfATA hatxk2 mathbf hatxkT alpha mathbfI mathbfATA hatx













 frac mathbfJk hatx delta mathbf hatx= mathbfATA hatx2 mathbfATy+ mathbf2 alpha mathbfI hatx mathbfATA hatx2 mathbf alpha mathbfI mathbfATA hatxk









その結果、デリバティブは次の形式になります。







 deltaJkx=2 mathbfATy2 alpha mathbfIATA mathbf hatxk+2 alpha mathbf hatx









この状況での次の古典的なステップは、勾配をゼロに等しくし、結果の式から目的のベクトルを表現することです  mathbf hatx 。 記録済み  mathbf hatx として定義する  mathbf hatxn+1 または、次の反復のソリューションとして。







 deltaJkx=2 mathbfATy2 alpha mathbfIATA mathbf hatxk+2 alpha mathbf hatx=0











 mathbfATy+ alpha mathbfI mathbf hatxk mathbfATA mathbf hatxk= alpha mathbf hatx











 mathbf hatxk+1= mathbf hatxk+ frac1 alpha cdot mathbfATyA hatxk









結果の式は「Landweber iteration」と呼ばれます。 これは、反復間の基本的な式です。 これを使用すると、線形速度での反復ごとの残差の減少を保証できます。



基本的なアルゴリズムには、「ソフトしきい値」と呼ばれる追加のステップが含まれており、ソリューションのスパース性を想定しています。 このステップは、設定された値より小さいモジュロを求めているベクトルのすべての値をゼロに等しくします。 これにより、回復結果に対するノイズの影響が軽減されます。



それはどのように見えますか




このソリューションからわかるように、好みに合わせて調整する2つのパラメーターがあります。 \ラ 近似の精度に責任を負い、収束をしきい値に制限します。  alpha 作業の安定性とアルゴリズムの収束速度を担当します。







 mathbf hatxk+1=soft mathbf hatxk+ frac1 alpha cdot mathbfATyA hatxk lambda/ alpha









アルゴリズムの変更



その後、アルゴリズムは、共役勾配法に理論的に類似した追加の用語によって改善されました。 各ステップで、前の2回の反復の結果の差を追加して、アルゴリズムの収束を2次に増やします。 アルゴリズムの最終手順は次のとおりです。



  1. パラメータを設定する  lambda alpha
  2. セット t1=1t0=1 mathbfytemp= hatx0=ATy
  3. 基本的なアルゴリズムを繰り返す  mathbf hatxk+1=soft mathbfytemp+ frac1 alpha cdot mathbfATyAytemp lambda/ alpha
  4. 一時変数を更新する

    t0=t1;t1=0.5+ sqrt0.25+t12
  5. 共役成分を変数に追加します  mathbfytemp= hatxk+ fract01t1 cdot mathbf hatxk hatxk1


次に、アルゴリズムの並列性について説明します。 各反復でしきい値を計算するサイクルは、OpenCLとCUDAの両方に含まれる要素ごとの積(アダマールの積)と比較演算で表現できるため、簡単に並列化できます。



CPUとGPUでの計算用の2つのバージョンでMatlabにアルゴリズムを実装しました。 将来的には、GPUの方が便利なため、GPUのバージョンのコードのみを使用し始めました。 コードを以下に示します。



ここにコード
function [x] = fista_gpu(y,H,Ht,lambda,alpha,Nit) x=Ht(y); y_k=x; t_1=1; T=lambda/alpha; for k = 1:Nit x_old=x; x=soft_gpu((y_k+(1/alpha)*Ht(yH(y_k))), T); t_0=t_1-1; t_1=0.5+sqrt(0.25+t_1^2); y_k=x+(t_0/t_1)*(x-x_old); end end function [y] = soft_gpu(x,T) eq=ge(abs(x),abs(T)); y=eq.*sign(x).*(abs(x)-abs(T)); end
      
      







練習に近づき、画像のサイズに応じてアルゴリズムのパフォーマンスをテストしましょう。



私のラップトップ構成
IntelコアI3-4005U

NVIDIA GeForce 820M



左側は、CPUとGPUのピクセル数に応じた、アルゴリズムの100回の繰り返しに対する依存性のグラフです。











次のグラフは、基本アルゴリズムと改善されたアルゴリズムの比較、およびアルゴリズムの収束の依存性を示しています。  alpha そして \ラ パラメータ。









そして最後に、FHD画像のアルゴリズムの例、



ソース画像




甘やかされて育った写真




復元された画像




ご覧のとおり、結果は非常に良好です。特に15秒しかかからない場合は、1.5がアルゴリズムの操作で、13.5がGPUメモリから画像をアンロードします。

アルゴリズムに使用されるすべてのコードはGitHubにアップロードされます



中古文学






All Articles