0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

確率モデルで画像を生成してみる.(仮)

Last updated at Posted at 2019-12-16

これは琉球大学アドベンドカレンダー16日目の記事です.
琉球大学OBのN/A3と書いて,なーさんと呼びます.投稿ギリギリでもうしわけないです.

1. はじめに

2014年にGoodfellow氏がGANを開発して以来,コンピュータが自動で画像を生成してくれる世界が到来しました.そして,年を重ねる毎に論文数も爆発的に増えて,深層学習 $\times$ 画像生成は広く認知された分野かと思います.

興味がある方は,以下のサイトたちがオススメです.前者はホットな論文を教えてくれるので,「こんなことができるのか!!」と驚きますし,後者はGANの歴史的論文を追っていくので,次何読めばいいか道を教えてもらえます.

そんな画像生成なのですが,実は正規性を担保したデータセットに対しては,(深層学習を使わなくても)単純な確率モデルでも生成や画像変形ができます.今日の内容は,じゃあどうやってやるんだって話をしていこうかと思います.

2. 平均画像と分散画像

単純に,画像を生成したい場合は,データ集めてきて,データの平均と分散を求めるだけでも画像生成はできます.(ただし,求めている画像かどうかは別

ということで,レシピ. まずは,データを読み込む関数を作って,画像をロードしましょう.書くの忘れたけど,データセットMNISTでやってます.

from tensorflow.keras.datasets import mnist
import numpy as np
import pandas as pd

def load_data():
    (x, y), _ = mnist.load_data()
    mnist_df = pd.DataFrame(x.reshape(-1, 784) / 255., 
                            columns=['dim' + str(num+1) for num in range(784)])
    mnist_df['target'] = y.reshape(-1, 1)

    return mnist_df

mnist_df = load_data()

上記の関数から,データロードしたら,下図のような,データテーブルができます.
Untitled Diagram.png

なぜラベルを引っ付けたのかというと,mnistの画像の輝度値からそのまま平均と分散を求めても, 下の画像のように雪玉画像しか生成されないためです.ですので,ラベル毎にデータを抽出して画像の生成を行おうかと思います.

mean.jpg std.jpg

ちなみに,画像かどうかを確認したい場合は,下記のおまじないを打てば確認できます.
(処理の流れ: 1.画像データのインデックス選択, 2.targetのカラムを除去, 3.numpy変換, 4.一次元データを28x28の二次元データ化)

import matplotlib.pyplot as plt
plt.imshow(mnist_df.iloc[0].drop(['target']).values.reshape(28, 28))

そして,おまじないの結果がコレ

5.png

2.1 ラベル毎に平均画像,分散画像の作成

表題の通り,ラベル毎に抽出して,平均画像と分散画像を生成してみましょう.

def img_write(name, data, norm=True):
    data *= 255 if norm else data
    data = np.array(data).astype(np.uint8)
    cv2.imwrite(name, data.reshape(28,28))

def mnist_static_by_target_cat(df, column='target', norm=True):
    for i, cat in enumerate(df[column].unique()):
        cat_df = df.groupby(column).get_group(cat)
        cat_df = cat_df.drop([column], axis=1)

        img_write('mean_' + str(i) + '.jpg', cat_df.mean(), norm)
        img_write('std_' + str(i) + '.jpg', cat_df.std(), norm)

mnist_static_by_target_cat(mnist_df)

そして,生成された画像が以下の通り.
なんかそれっぽい数字がなっているでしょう?

混合ガウス分布活用した画像生成 (1).png

3. 画像変形(工事中)

時間がないので,サマリだけ・・・今週中には理論含めて綺麗に書きます.(すいません)

  • 平均と分散を求めたので,正規分布を利用し,輝度値の変化を確率化
  • しかし,これだけでは太さをいじれるだけなので,画像の変形方法も考えてみる.
  • 輝度値ヒストグラムを確認すると,輝度値のピークが2つあるピクセルがあることに気がつく
  • そこで,潜在変数2で混合ガウス分布関数を適用し,ピークが二つの分布に近似させた
  • 結果として,より綺麗な画像が生成できるようになった.また,潜在変数の値を変化させると,画像を回転させられる.

以下,出力画像

  • 平均と分散より求めた正規分布の確率を利用した画像
    (左から, $P(輝度値)=[0.9, 0.99]$ 確率を0.9ずつ変化させた場合の画像の変化)
    prob.png

  • GMMを用いた潜在変数ごとの平均画像の変化
    (また,混合ガウス分布は潜在変数ごとに正規分布を用意する.そのため、上記と同様にこちらのモデルでも,輝度確率を変化させれば,形状の太さの変更が可能.)
    latent.png

4.終わりに

今回,ノリと勢いだけで参加したのですが,文章ってやっぱり書くの難しいですね.締め切りがあればきっと書ききれると思ったのですが,現実は厳かったのです.後輩の皆様は,僕みたいなダメ人間を反面教師にして,スケジュール組んで活動に取り組めるようになっていただければと思ったり・・・

とにかく,次の記事は噂のjogo氏らしいので,僕なんかよりも為になるかと思います.それでは!!

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?