【スパースモデリング】ADMMアルゴリズムを用いてレナさんをきれくする(ノイズ除去)

プログラミング

私事ですが転職することになりました。転職先ではスパースモデリングを用いた開発業務を携わります。そのため、最近は下の参考書の勉強をしております。

スパースモデリング 基礎から動的システムへの応用 [ 永原正章 ]

価格:3,240円
(2019/4/21 10:49時点)
感想(0件)

今回は上記参考書を参考にして、ADMMアルゴリズムを用いた画像のノイズ除去をPythonで行いました。初めに結果から載せますが、元レナさん画像(下の画像の女性はレナという名前だそうです。)にノイズを与えます。そこからADMMアルゴリズムという手法を用いてデノイズ(元画像再現)を行った結果が一番右になります。かなり綺麗に元画像が再現されていることが分かります。

 

今回のソースもGitHubにあげています。

Daisuke0209/sparse_modeling
Contribute to Daisuke0209/sparse_modeling development by creating an account on GitHub.

画像ノイズ除去のためのADMMアルゴリズム

数学的定式化

今回の画像ノイズ除去アルゴリズムを紹介する前に、まずは数学的な定式化を行います。まずノイズが混入した画像\({\bf Y}\in {\mathbb R}^{n×n}\)を考えます。今回のレナさん画像は512×512のため、\(n=512\)となります。この\({\bf Y}\)は行列となるが、一行(もしくは一列)ずつ抜き出して、それを\({\bf y}\in {\mathbb R}^{n}\)とし、以下の最適化問題を解きます。

$$minimize_{{\bf x}\in {\mathbb R}^{n}} ||x-y||^2+\lambda \sum_{i=1}^{n}|x_{i+1}-x_{i}|$$

上記最適化問題の第一項はノイズが付与された画像\(\bf Y\)になるべく近づけることを要請するものであり、一方で第二項は復元画像の隣合うピクセル同士の差が大きくならないように要請するものとなります。つまり、この最適化問題の解\(\bf x^*\)は、ノイズ付与画像にかなり”近い”けど、各ピクセル間の変動はあまり無いという画像になります。

最適化問題の解法(ADMMアルゴリズム)

前記最適化問題の一つの解法を以下に示します。

初期ベクトル\({\bf z}[0],{\bf v}[0]\in {\mathbb R}^n\)および正数\(\gamma >0\)を与えて、以下を繰り返す。

$${\bf x}[k+1]=\bigl( {\bf \Phi}^T {\bf \Phi}+\frac{1}{\gamma}{\bf \Psi}^T{\bf \Psi} \bigr)^{-1}\bigl( {\bf \Phi}^T{\bf y}+\frac{1}{\gamma}{\bf \Psi}^T( {\bf z}[k]-{\bf v}[k] )\bigr)$$

$${\bf z}[k+1]=S_{\gamma \lambda}({\bf \Psi}{\bf x}[k+1]+{\bf v}[k])$$

$${\bf v}[k+1]={\bf v}[k]+{\bf \Psi x}[k+1]-{\bf z}[k+1]$$

ここで\(S_{\gamma \lambda}\)はソフト閾値関数というもので、以下で与えられる。

$$\begin{equation*}
S_{\gamma}(v) =
\begin{cases}
v-\gamma & v\geq \gamma \\
0 & -\gamma <v<\gamma \\
v+\gamma & v\leq -\gamma
\end{cases}
\end{equation*}$$

また、\({\bf \Phi} ={\bf I}\)(単位行列)、\({\bf \Psi}\)は以下で与えられる。

$${\bf \Psi}=\begin{bmatrix}-1&1&0&\cdots &0\\0&-1&1&\ddots &\vdots \\ \vdots &\ddots & \ddots &\ddots &0\\ 0&\cdots &0&-1&1\\0&\cdots &0&0&-1\end{bmatrix}$$

では、この繰り返し計算を行ってノイズ除去した画像を得てみます。

【Python】ノイズ除去ADMMアルゴリズムの実装

事前準備

今回もGoogle Colaboratoryを使うので、まずはGoogle Driveとのマウントを取ります。

次に今回使うライブラリをインポートします。

私はレナさん画像をGoogle Driveに入れているので、Driveからレナさん画像を読み込みます。

レナさん画像

 

ふ、ふつくしい!!(;´・ω・)

解析に使うのはモノクロの画像なので、モノクロ化させます。

レナさんモノクロ

次に、このふつくしいレナさんにノイズをぶちまけます。

レナさんぶちまけ

すいません、レナさん(;´・ω・)。あと、もっと上手にノイズを乗せる方法があるかもしれませんが、すいません。

ここまでで準備完了です。

ADMMアルゴリズムのパラメータ設定

パラメータといってもたくさんあるものではありませんが、いくつか設定していきます。まずは\({\bf \Phi},{\bf \Psi}\)に行列を設定します。

次にパラメータではありませんが、ソフト閾値関数を定義します。

 

ソフト閾値関数は設定した\(\gamma\)未満(絶対値で見て)のところは0、それより大きいところは、傾き1で増加・減少していく関数になります。

\(\gamma,\lambda,N\)などのパラメータを設定します。

ADMMアルゴリズムの実装

ノイズが入った画像の各行ごとに、ADMMアルゴリズムの繰り返し計算を\(N=10\)回行っています。計算した結果を\(X_{re}\)に入れたら、ノイズ入り画像の次の行を取り出し・・・の繰り返しになります。つまり、復元画像は\(X_{re}\)に入ります。では、その結果を元画像とノイズ入り画像と比較して見てみます。

レナさんいっぱい!

ノイズ付与されたガサガサ感がかなり抑えられていると思います。

まとめ

今回はレナさん画像に失礼ながらノイズを与え、それをADMMアルゴリズムというものを使ってノイズ除去を行ってみました。

また、機械学習を勉強するための参考書を以下で紹介しています!よかったら見ていってください。

機械学習を勉強するためのオススメ参考書(理論・Python・Webアプリ)
統計・機械学習に関しては授業で習ったところありますが、結構忘れてしまっています(。また、Rの演習の授業はありましたが、Pythonは学生のころには使っていません。機械学習・データサイエンスを勉強するにあたり、私が参考にしている参考書を一挙ご紹介したいと思います。

コメント