KIEFERworld -音楽情報処理研究所-

音楽情報処理や機械学習について勉強したことを書くつもりが,なんだかPowerPointの使い方の記事しか書いてない.

SushiVAE -寿司生成モデル-

f:id:kieferAG:20181217142932p:plain

はじめに

FUN Advent Calendar 2018の12月17日の記事です. adventar.org

昨日はsatory074氏のPython+librosaでお手軽メロディ抽出でした.

音楽情報処理楽しいからみんなやろう. satory074.hatenablog.com

さて,皆さん寿司🍣は好きですか? 僕は好きです.

味もさることながら,フォルムも美しいですよね.

今回は,寿司をニューラルネットに学習させて,寿司を生成してみようと思います.

本当は音楽情報処理について書こうと思っていたのですが,さとり氏が昨日書いてくれたので「これは寿司🍣への愛を綴るしかないな」と思い,筆を執った次第です.

自己紹介

未来大で音楽情報処理の研究をしているD1です.(Twitter: kiefer7126)

一応,歌ったりギターを弾いたりもするんですけど,夏はキャンプを楽しんでいます. 魚釣りもキャンプとの親和性が高いので,ちょこちょこやっています. 冬は「キャンプに行けないなら温泉に行けばいいじゃない」という思想で,最近は週2のペースで温泉に行っています (そのうち冬キャンプもしてみたい). 「じゃあ,キャンプとか温泉の記事を書けばいいじゃない」と思うかもしれませんが,その通りかもしれませんね.

あと,トカゲを2匹飼ってます.可愛いです.

余談ですが,クレジットカードの明細を見てみると,平均で月に3回くらいのペースでスシローに行っていました.驚きですね.

データセット

機械学習をするにあたって,沢山の学習データが必要になります. この学習データを集めるのが大変ですよね. さらに,うまく学習できるように,画像から特定の物体だけを切り出したり,物体の向きを整えるなどの前処理が必要になる場合もあります.

でも,見てくださいこの寿司達🍣

f:id:kieferAG:20181217152315p:plain:w200f:id:kieferAG:20181217151841p:plain:w200f:id:kieferAG:20181217152140p:plain:w200

綺麗に同じ方向に並んでいるではありませんか.お利口さんですね.

しかも背景には何もなく,透過処理までされています.

この寿司達🍣の「機械学習をしてくれ」という声が聞こえてきませんか?

今回は,カッパ寿司,はま寿司,スシロー,とっぴ~,の4つのホームページから画像を拝借しました.

www.kappasushi.jp

www.hamazushi.com

www.akindo-sushiro.co.jp

toppi-sushi.jp

こうして集めた寿司🍣達からサイドメニューを除き,合計444枚の画像を学習に利用します.

SushiVAE -寿司生成モデル-

今回はVariational Autoencoder (VAE) というものを用います. VAEに関する説明はWeb上にたくさん転がっているので,ここで詳しく説明はしません.

詳しく知りたい方はこちらの解説などが良いと思います. qiita.com

論文が読めるぞという人は,こちらが良いと思います.

[1606.05908] Tutorial on Variational Autoencoders

実装はpython + kerasで,Keras blogを参考にして書きました.

Building Autoencoders in Keras

僕が見たときは評価関数が間違っていた気がしたんですが,今はなおっているんですかねー?

さて,VAEについて簡単に説明はしたいと思うのですが,VAEはAutoencoder (AE) に確率分布を導入した物と思っていただければ良いです.

ではAEとは何なのか?AEは日本語では自己符号化器と言います.

f:id:kieferAG:20181217180333p:plain:w400

自己符号化器という名前のように,出力が入力を再現するよう(入力 = 出力)に学習されたニューラルネットワークです. その際,中間層を入力や出力よりも低次元にしておくと,その少ない情報から元の入力を再現しようとします. もしその少ない情報で元の入力を再現できるのであれば,その少ない情報が重要な特徴なのではないか?という思想です.

この中間層を確率分布にしたものがVAEです. よくわかりませんよね? とりあえず寿司🍣達を学習させた結果と一緒に説明したいと思います.

結果

まず,このVAEに寿司🍣達を学習させるとこのような潜在寿司空間が出来ます (これは潜在寿司空間の一部です).

f:id:kieferAG:20181217135527p:plain
潜在寿司空間

この空間上では似ている寿司が近くに配置されています.似ているというのは画像的に似ているということです. 右のほうには軍艦系が集まっているのが確認できますね.

試しに,学習に使った寿司🍣をこの潜在寿司空間にプロットしてみるとこうなります.

f:id:kieferAG:20181217135531p:plain
潜在寿司空間
この緑の点一つ一つが寿司です. ラベルを付与していないので,どの点がどの寿司かはわからないと思いますが,「あーちゃんと散らばってるなー」と思っていただければ良いです.

そして,この潜在寿司空間,確率分布になっているので,この緑の点がない部分からも未知の寿司を生成することができるのです. この潜在空間上の座標を与えると,その点に対応した寿司が生成されます.

試しに潜在寿司空間上のxとy座標を少しずつ動かしながら100個の寿司を生成してみます. その100個の画像をgifにしたものがこれです.

f:id:kieferAG:20181217134527g:plain:w70
生成された寿司

このように,見たことのある寿司と寿司の間を補完するような寿司が生成されていますね.

おわりに

もっとくっきりと綺麗な寿司を生成したいですね. 透過のせいかもしれませんが,線が二重になっているようにも見えます. 今回は突貫工事なのでCNNを使っていませんが,CNNでやってみたいです.

次回はichiren1氏です. 何を書くかはわかりませんが,CSSについて書くと言っていました. いちれん氏はセンスの塊,技術力の塊,中臣 鎌足なので最高に面白い記事を書いてくれると思います. (ハードル上げといたぞ)

ichir9n1.hatenablog.com