SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ITエンジニアのためのスパースモデリング入門

スパースモデリングの画像処理への発展的な応用~欠損補間、異常検知、超解像

  • このエントリーをはてなブックマークに追加

 本連載は「これから機械学習に取り組みたい」「ディープラーニングや機械学習を使った経験がある」といったエンジニアに向けて、データ量が少なくても分析が実現できる「スパースモデリング」という手法を紹介します。 前回は辞書学習を用いた画像の再構成を紹介しました。今回は発展的な内容として、画像の欠損補間、異常検知、超解像の三つを紹介します。辞書学習でそんなことができるのか、と驚いてもらえるような例を用意しました。それでは、順番に見ていきましょう。

  • このエントリーをはてなブックマークに追加

画像の欠損補間

 実世界の問題において、データが欠損していることが多々あります。そのような場合にも、スパースであるという仮定をうまく利用することで、データの欠損を補間することができます。

 前回、画像の再構成について紹介したとき、自然画像をパッチに区切って辞書学習を行うと、各パッチは得られた辞書を用いてスパースに表現できることがわかりました。実はこの辞書とスパース表現は、学習画像に、ある程度欠損があったとしても、うまく求めることができるのです。

 なぜ、そんなことが可能かというと、例えば100変数の連立方程式を考えたときに、式の数は100個あれば全ての変数の値を決定できます。データとして10000個方程式があったとしても、そのうちの1%だけを使って連立方程式を解くことができます。また、方程式の解がほとんど0であるとわかっている場合も少数の方程式から解が得られることが知られています。つまり、10000変数の連立方程式を解くために10000個も方程式を必要としないということであり、これがスパースモデリングは少量データと相性がいいと言われる理由です。

 このことから、辞書学習で求める辞書とスパースコードが連立方程式の変数に相当すると考えると、欠損していない部分から得られる方程式だけで、うまく辞書とスパースコードを推定できるというわけです。

 では実際に、欠損画像に対して辞書学習を適用してみます。まず、以下のように、画像をランダムに50%欠損させた画像を作ります。

deficit_rate = 0.5
img = np.asarray(Image.open("img/recipe.jpg").convert('L'))
mask = (np.random.rand(img.shape[0], img.shape[1]) > deficit_rate)
deficit_img = mask * img
欠損画像の作成
欠損画像の作成

 この画像に対して、辞書学習を適用します。ただし、欠損箇所には0という値が入っているので、欠損箇所は無視して学習を行うようにアルゴリズムを書き換える必要があります。前回使用したspm-imageというライブラリでは、すでに欠損を想定した辞書学習アルゴリズムが提供されているので、それを使ってみましょう。興味がある方は、内部の実装を読んでみるといいかもしれません。実際は、以下のようにmissing_value=0と指定するだけで、欠損を考慮した辞書学習を実行することができます。

from sklearn.feature_extraction.image import extract_patches_2d, reconstruct_from_patches_2d
from spmimage.decomposition import KSVD
from spmimage.decomposition import sparse_encode_with_mask
from sklearn.preprocessing import StandardScaler

# 辞書学習のパラメータを設定
patch_size = (8, 8)
n_nonzero_coefs = 5
n_components = 64

# 画像からパッチを切り出す
patches = extract_patches_2d(deficit_img, patch_size).reshape(-1, np.prod(patch_size)).astype(np.float64)

# 辞書学習を実行し、辞書DとスパースコードXを求める
model = KSVD(n_components=n_components, transform_n_nonzero_coefs=n_nonzero_coefs, max_iter=15, missing_value=0)
X = model.fit_transform(patches)
D = model.components_

 欠損している画像から学習された辞書とスパース表現を用いて、再構成画像を計算した結果が以下の通りです。

欠損画像の再構成結果
欠損画像の再構成結果

 このように、欠損している画像からでも、ある程度復元をすることができました。欠損率を変えて、どの程度まで復元できるのか、いろいろ挑戦してみると面白いかもしれません。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
異常検知

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
ITエンジニアのためのスパースモデリング入門連載記事一覧

もっと読む

この記事の著者

増井 隆治(株式会社HACARUS)(マスイ リュウジ)

 中学生の頃からプログラミングに興味を持ち、鈴鹿高専で情報学の基礎を学び、その後京都大学に編入し、より高度な数学を学ぶ。大学の実験で仲良くなった大関先生の紹介でハカルスでアルバイトを始める。3年間のアルバイトの後、2019年4月にハカルス初の新卒として入社。データサイエンティストの仕事に邁進している...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/12433 2020/06/22 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング