MCMCの画像のノイズ除去への応用
adventar.org
この記事はKyoto Universuty Advent Calendar 2021の23日目の記事です.
元々は逆強化学習について記事を書こうと考えていたのですが,
時間が無かったので別の内容について雑な記事を書きました. 申し訳ございません.
授業か何かでやった内容が面白かったので記事にまとめました.
背景というか定義
概要しか書けていません. 申し訳無いです...
・離散時間マルコフ連鎖
定義 : 状態空間上の確率過程がと状態列に対して,
を満たす時,
を状態空間上の離散時間マルコフ連鎖と呼ぶ.
※ マルコフ性 : 次の状態が現在の状態にのみ依存する事
・推移確率行列
定義 : 行列をマルコフ連鎖の推移確率行列と呼ぶ.
要はに遷移する確率を要素とする行列の事.
推移確率行列については以下が成立する事が知られている.
1. の各行の和はとなる. ()
2. に対して, が成立
2つめはチャップマン=コルモゴロフ方程式と呼ばれる. これはマルコフ性から証明できる.
・既約(連結クラス)
定義 : 状態部分集合が既約とは, に対して, からに到達可能という事.
雑にまとめるとどの状態間も行き来できるという事.
・再帰的
定義 : を状態への初到達時刻と置く. が成立する時,
状態は再帰的であると言う. 任意の状態が再帰的な時, マルコフ連鎖は再帰的と言う.
※ 再帰的かつ< \infty]も成立する時, 状態は正再帰的であると言う.
※ 規約なマルコフ連鎖に置いては, 「ある状態が(正)再帰的全ての状態が(正)再帰的」が成立.
(互いの状態の到達可能性から示せる.)
・周期性
定義 : 状態に対して, の最大公約数を状態の周期と呼ぶ.
※ 周期がに等しい時, 非周期的であると言う.
※ 互いに到達可能な状態は周期が同じになる.
・定常分布
定義 : を満たす確率ベクトルの事.
※ 常に存在するとは限らない.
※ 規約かつ再帰的なマルコフ連鎖は定常分布を持つ.
※ 定常分布と極限分布は異なる(定常分布に到達するとは限らない)
・極限分布
定義 : 任意の初期分布に対して, が同じ確率ベクトルに収束する時,
を極限分布と呼ぶ. 推移確率行列がエルゴート的(規約かつ非周期的で再帰的な事)な時には極限分布と定常分布が一致する. ()
・詳細釣り合い
定義 : 推移確率行列に対して, なる方程式の事.
これが成立する時, が成立するので
はを満たす. (これは定常測度である事に注意)
これは, 詳細釣り合いを満たす様にマルコフ連鎖を構成してやれば目的の分布を定常分布に持つ様にできる事を意味している. MCMCはこれを利用している.
MCMC
求めたい分布を定常分布に持つマルコフ連鎖を用いて, 分布からのサンプルを生成する手法のこと.
十分に分布が収束するまでの期間(バーンイン)のサンプルデータは破棄する.
Metropolis-Hastings法
===================================
提案分布をとし, 近似したい分布の密度関数をとする. エルゴード性を仮定.
0. : 初期値
1.
2.
3. として, を移動先の点として受け入れるか確率的に決定する. -> 1に戻る.
===================================
詳細釣り合いの成立について,
1. の時, 自明
2. の時, と書ける.
なので,
が成立する.
以上より詳細釣り合いが示された. また, この時の分布はに従う.
Gibbs sampling
===================================
], ]と置く. エルゴード性を過程
1. 適当にを選択する. (ランダムとか順番とか)
2. として定める. --> 1.に戻る
(条件付き分布である. )
===================================
※ これはMH法の特殊なケースに対応.
これに対して,より,
選択確率が1のMH法に対応している事が言える.
※ 実際の応用では1のの選択は番号順にやる事が多いらしい.
MCMCを応用した画像のノイズ除去
膨張・収縮を使った方が実用的レベルでは速いと思います.
原理
ノイズが乗る前の画像(未知)を, ノイズが乗った後の画像(既知)をと置く.
尤度関数に従って画像を生成.
同時確率はとして定義する.
ただし, は正規化項, はの近傍. はハイパーパラメータ.
画像データの配列の要素はが入るので, この様に定義すると, 周囲の点と同じ値を持つほど確率が上がり,
持たないほど下がる様に同時確率を構成できる.
結果と実装
ギブスサンプリングを用いて尤度関数を近似する.
結果は以下の通り.
↑ノイズを載せた画像(よく見るアレ)
↑ノイズ除去後の画像
実装は以下.
import numpy as np from tqdm import tqdm import matplotlib.pyplot as plt def load_image(filename): tmp = plt.imread(filename) img_gray = 0.299*tmp[:,:,2] + 0.587*tmp[:,:,1] + 0.114*tmp[:,:,0] # grayscale img = np.where(img_gray>0.5, 1, -1) fixed_img = np.zeros([img.shape[0]+2, img.shape[1]+2]) fixed_img[1:-1, 1:-1] = img return fixed_img # V:ノイズ有りの画像, H:元の画像 # 点(i,j)でのP(H|V) := 1/Z exp(v[i,j]*h[i,j] + \sum_{k,l \in N(i,j)}h[i,j]h[k,l] ) ただしN(i,j)は(i,j)の近傍 # H[i,j]をh_ijと書く事にすると, P(h_ij=1 |V,H_N(i,j))が求まる. def denoise(noised_pict, total_step, burnin_step, alpha, beta): ans = np.random.choice([1, -1], size=noised_pict.shape) x_max, y_max = ans.shape[0], ans.shape[1] for _ in tqdm(range(burnin_step+total_step)): for i in range(1, x_max-1): for j in range(1, y_max-1): tmp = beta*np.sum([ans[i-1+l][j-1+m] for l in range(3) for m in range(3)]) + alpha*noised_pict[i][j] prob_h = np.exp(tmp)/(np.exp(tmp)+np.exp(-tmp)) # H[i,j]=1となる条件付き確率 ans[i][j] = 2*(np.random.random_sample() < prob_h) -1.0 return ans if __name__ == "__main__": file_name = "./img_noised.png" tmp = load_image(file_name) plt.imshow(tmp, cmap="gray") plt.show() ans = denoise(tmp, 1000, 100, 1.0, 0.5) plt.imshow(ans, cmap="gray") plt.show()