Keras で変分オートエンコーダ(VAE)をオリジナルデータセットでやってみる

今回は、変分オートエンコーダで顔画像を2次元マップにマッピングしてみます。

こんにちは cedro です。

先回、変分オートエンコーダMNISTでやってみて潜在変数Z2次元マップに綺麗に数字が分類されるのをみて中々興味深かったので、今度はオリジナルデータセットでやってみます。

過去に作ったデータセットはブログに投稿すると大体削除してしまい、あまり残っていないのですが、5/4のブログ「DCGAN 生成される顔画像の向きをコントロールする」で使った顔画像のデータセットが残っていたので、これを使うことにしました。

このデータセットは、カラー64×64顔画像右向き左向き正面の3種類に分けて収集したもので、全部で2,400枚×3種類=7,200枚あります。

ということで、今回は、変分オートエンコーダ顔画像2次元マップマッピングしてみます。

 

データセットを準備する

まず、今回使うデータセットの概要をご紹介します。

 

右向き2,400枚です。ラベル0とします。正面ぽいのも多少交じっています。^^;

 

左向き2,400枚です。ラベル1とします。左向きと言っても左斜め下とか、左斜め下もあったり します。 ^^ ;

 

正面2,400枚です。ラベル2とします。

今回使うサンプルプログラムMNIST用なので、実際にはこのデータセットをモノクロ28×28に変換したものを使うことにします。

 

プログラムが格納してあるフォルダーに、faceフォルダーを作成し、その下に0、1、2のフォルダーを作成し、それぞれにモノクロ28×28の画像データを2,400枚づつ格納します。

 

プログラムを改造します

新たに必要なパッケージを追加でインポートします。

 

0〜2だけなので、colorbar は表示させません。また、filenameもあえて表示させません(一端表示すると、表示中止ボタンを押すまで動作が中断して、使い勝手が悪いので)。

 

マップが30×30では顔画像小さくなって見難くなるので、15×15に変更しています。

また、出力画像は後でGIF動画を作成するために、1枚づつ 0@0fig.png14@14fig.png まで225枚分(15×15=225)を保存する設定にしています。

 

データセットの読み込み部分です。MNISTの読み込み部分は、無効にします(削除でもOK)。

list_picture, load_img, img_to_arry を使って3種類のデータを読み込んで必要な処理をした後に、train_test_split  で学習用80%・評価用20%に分割しています。

 

プログラムを動かしてみます

 

上記コマンドで、プログラムを開始します。

潜在変数Z2次元マップに、右向き(0)左向き(1)正面(2)をマッピングした結果がこれです。なんとなく分類されている様ですが、結構重なり合っていますね(笑)。

無理やり、点線で囲って分類してみると、こんな感じでしょうか(笑)。そう言われれば、なんとなくそんな気もするでしょう?

さて、どんな画像が生成されるのでしょうか。

潜在変数Zのデータから、どのような出力が生成されるかマッピングさせた結果です。

さすが、変分オートエンコーダー! 期待通り、顔の向きをキーに綺麗な分布に仕上げてくれました。

それでは、潜在変数Zのデータを赤矢印の様に操作して画像を生成させてみましょう。といっても、既に保存されている、1枚単位の画像の中から、該当するものを拾って、 GIF動画にするだけです。

画像がモノクロ28×28のため、かなりボケた感じになります。ディスプレイから少し離れて、目を細めてご覧ください(笑)。

但し、ポイントとなる顔の向きの情報は、はっきり捕まえていますね。

変分オートエンコーダ、中々やります。

では、また。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUTこの記事をかいた人

アバター

ディープラーニング・エンジニアを趣味でやってます。E資格ホルダー。 好きなものは、膨大な凡ショットから生まれる奇跡の1枚、右肩上がりのワクワク感、暑い国の新たな価値観、何もしない南の島、コード通りに動くチップ、完璧なハーモニー、仲間とのバンド演奏、数えきれない流れ星。