LoginSignup
6
9

More than 5 years have passed since last update.

辞書学習のその他の応用

Last updated at Posted at 2017-01-06

概要

スパースモデリング第15章のその他の応用の一部を実装した。

  • 線画とテクスチャの分離
  • インペインティング
  • インパルス雑音の除去

ノートブック
ch15-02.ipynb
ch15-04.ipynb
ch15-05.ipynb

結果

K-SVD辞書をもちいた局所的モルフォロジ分析(MCA; morphological component analysis)で、線画とテクスチャを分離
local_mca.png

冗長DCT辞書による局所的インペインティングで欠損画素を補間
Peppers_recon.png

数字はピーク信号対雑音比(PSNR; peak signal to noise ratio)

K-SVD辞書による局所的インペインティングで欠損画素を補間
Peppers_recon_KSVD.png

  • 欠損率25%、50%では冗長DCT辞書によるインペインティングに比べてPSNRが改善した。

インパルス雑音の除去
Peppers_inpulse_recon.png

  • 推定マスクは、雑音ありの画像とメディアンフィルタで処理した画像の差分を閾値処理したもの
  • 推定マスクで検出された画素のみを、ノイズ除去するとPSNRが改善した。
  • メディアンフィルタを冗長DCT辞書による局所的インペインティングにかえると少しPSNRが改善した。

方法

K-SVD辞書による局所的MCA

Barbaraに標準偏差10の白色雑音を追加してテスト画像とした。
barbara_sig10.png

K-SVDで辞書学習した。パッチサイズを$8 \times 8$とした。アトムの数を256とした。直交マッチング追跡(OMP; orthogonal matching pursuit)の停止条件を、アトムの数$k_{0}=4$、許容誤差$\epsilon = 8^{2} \times 20^{2}$とした。K-SVDの反復回数を25とした。

画像から抽出したパッチの総数は255,025だった。メモリが不足するためK-SVDの1回の反復に用いるパッチの数は、その10分の1とした。K-SVDに使用するパッチは毎反復、ランダムに抽出した。

K-SVD辞書
A_KSVD_sig10.png

アトムの活性度を以下のように計算した。
$$ Activity(\mathbf{a}) = \Sigma_{i=2}^{n} \Sigma_{j=1}^{n} |a[i, j] - a[i-1, j]| + \Sigma_{i=1}^{n} \Sigma_{j=2}^{n} |a[i, j] - a[i, j-1]| $$活性度の最大値を1に規格化した。活性度が高いアトムはテクスチャ、低いアトムは線画のアトムとした。

アトムの活性度(黒は0、白は1)
activity.png
活性度が0.3未満のアトムは線画、それ以外をテクスチャとした。
activity_threshold.png
濃い灰色は線画のアトム、薄い灰色はテクスチャのアトムである。

線画のアトムとそのスパース表現の係数から、線画の画像を求められる。テクスチャのアトムとそのスパース表現の係数から、テクスチャの画像を求められる。

画像のインペインティングとインパルスノイズの除去

Peppersに標準偏差20の白色雑音を追加した。25%、50%、75%の画素をランダムに0クリアし、テスト画像とした。欠損画素の位置は既知とした。
Peppers_inpaint.png

冗長DCT辞書による局所的インペインティング

パッチサイズを$8 \times 8$とした。アトムの数を256とした。欠損画素をマスクしてスパース表現を求めるようOMPを修正した。OMPの停止条件を$k_{0}=4$、$\epsilon = (8^{2}-p) \times 20^{2} \times 1.1$とした。$p$はパッチ内の欠損画素の数である。求めたスパース表現から画像を復元できる。

K-SVD辞書による局所的インペインティング

K-SVDを以下のように修正した。

  1. 欠損画素をマスクするようOMPを修正し、スパース表現を求めた。OMPの停止条件は、冗長DCT辞書による局所的インペインティングの場合と同じとした。
  2. 上のスパース表現をもちいて欠損画素を補間した後、K-SVDでアトム、スパース表現を更新した。
  3. 2, 3を反復した。

K-SVDの初期値は冗長DCT辞書とした。反復回数15とした。K-SVDに1度の反復にはランダムに抽出した12,800個のパッチを用いた。

欠損25%の画像から求めたK-SVD辞書
A_KSVD_25.png

欠損50%の画像から求めたK-SVD辞書
A_KSVD_50.png

欠損75%の画像から求めたK-SVD辞書
A_KSVD_75.png

  • 欠損75%の場合、冗長DCT辞書からあまり学習が進まなかった。1反復目は、冗長DCTによるOMPノイズ除去で補間したパッチからアトム、スパース表現を更新するため、欠損75%の場合、そこから学習がすすまなかったと思われる。

インパルス雑音の除去

ランダムに10%の画素の画素値を+50もしくは-50し、テスト画像とした。画素値を最大255、最小0にクリップした。インペインティングとの違いは、欠損画素の位置がわからない点である。

Peppers_inpulse.png

メディアンフィルタでインパルス雑音を除去した。メディアンフィルタのカーネルサイズ$3 \times 3$とした。ノイズありの画像とメディアンフィルタでノイズ除去した画像の差の絶対値が27より大きい画素を、インパルス雑音で汚染された画素とした。

mask_median.png

推定マスクで検出された画素にのみメディアンフィルタをかけることでPSNRが改善した。冗長DCT辞書によるOMPノイズ除去でも同様だった。冗長DCT辞書によるOMPノイズ除去のパッチサイズは$8 \times 8$、アトム数は256、OMPの停止条件は$k_{0}=256$、$\epsilon = (8^{2}-p) \times 5^{2} \times 1.1$とした。

未実装の応用

  • カーブレット変換をもちいた大域的MCA
  • 辞書学習による高解像度化(超解像)

まとめ

  • K-SVD辞書による局所的MCAはなかなかうまくいった。カーブレット変換は実務に応用できそうなので調査したい。
  • インペインティングは、欠損率が低い場合にはK-SVDをからめて精度を改善できそう。
  • インパルス雑音の除去は、メディアンフィルタで十分かな…
  • 辞書学習による高解像度化は、実装できなかった…。ディープラーニングでやった方がいいかもしれんけどブラック(ボックス)なので、グレーな辞書学習も魅力的である。

参考

text.jpg

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9