ニューラルネットワークで要素抽出

Autoencoder

ニューラルネットワークは画像を認識させる際に、元情報よりも低次元で表現するようにネットワークを構成することが出来ます。

そのような低次元で表現された空間には、学習に使用した情報の要素が詰まっているとも言えます。

要素が詰まっているのですから、その情報を抜き出して再び画像にすれば、ニューラルネットワークが思っている物の片鱗を見ることが出来る…かもしれません。

技法的にはオートエンコーダと呼ばれるものなのですが、画像認識に使用しているヴィヴィオ達の画像を使用して計算させてみました。

Autoencoderを通したヴィヴィオ達

結果は以下のような感じです。

   

多分、リリカルなのはVividをよく知っている人であれば、誰か答えられるのではないかと思います。

今回は100次元で表現してみましたが、多分もっと少ない要素で表現出来そうで、ヴィヴィオ達は見た目だけでもかなり分類しやすそうに感じます。(…ってプロの方がそうなる様にデザインされているわけですから、そりゃそうなりますね。)

次元数を下げるほどぼやけた画像になっていき、極端に下げると「黄色っぽい」「みどりっぽい」だけの画像になります。

学習結果の応用

この学習は、

  • 「ヴィヴィオの絵」 + 「ヴィヴィオ」
  • 「アインハルトの絵」 + 「アインハルト」
  • 「リオの絵」 + 「リオ」
  • 「コロナの絵」 + 「コロナ」

という入力で学習させましたので、以下の様な入力を受け付けます。

  • 「ヴィヴィオの絵」 + 「アインハルト」
  • 「写真」 + 「ヴィヴィオ」

これを使えば、入力された画像をヴィヴィオっぽくしたり、アインハルトっぽくしたりする事が出来そうです。

試しに自分の絵を使って実行してみたものがこちら。

  •  =  + ヴィヴィオ
  •  =  + アインハルト
  •  =  + リオ
  •  =  + コロナ

…心の目で見ればなっているような、なっていないような。

今回やったことを図にすると、以下の様になります。

 学習させます。

 学習結果とヒントを使い、絵を加工。

Azure上でnnablaを動かしてみました

現在使用しているAzure環境にnnablaをインストールして、ウェブアプリを作成してみました。

nnablaはSONY Neural Network Consoleでも使用されているもので、比較的簡単にニューラルネットワークを利用出来るのですけど、学習した結果をどう使うかがなかったので、サンプルを兼ねて作ってみました。

VE Detect

https://www.mizunagi-works.com/gadgets/ve_detect/index.html

 しょっぱなから誤判定するデータを与えていたりして

言い訳っぽいのですけど、これは学習データが少ないのと「アインハルトかヴィヴィオのどちらか」を判定させるように学習させた結果となります。

例えばおにぎりの画像を与えたときでも必ずどちらかという判定します。(どちらでもないという回答を出すようには学習させていません)

Azureへの導入

ニューラルネットワークというと、強力なGPUを使用する負荷の高いアプリケーションに感じられるかもしれません。

確かに計算量は多いのですが、処理が重たいのは学習をする時で、学習済み結果を利用するのはそんなに重くありません。

(今回作成したニューラルネットワークの構成が単純というのもあります)

自分が使用しているAzure上のVMはA1 Basicでかなり非力(下から2番目)なのですが、学習結果を利用するにあたってはそこまで負荷はありませんでした。

SONY NNCによるネットワークの作成と学習

こんなネットワークにしてみました。

10,000回ほど学習させました。

プログラムの作成

学習が完了すると、学習結果が保存されたフォルダにparameters.h5というファイルが生成されています。

学習済みモデルを利用するにはこのh5ファイルと、NNCからエクスポートしたPythonスクリプトが必要となります。

スクリプトはちょっと長めですのでGitHubに置いておきました。

bottleを使用していますので、ローカルでこっそり楽しむことが可能です。

.

去年やった絵柄判定ネタ再び

最近、Neural Network Consoleで遊んでいるのですが、去年イラストを学習させて、誰が描いたのかを判定してみるというのをやってみたところ、わりと悲しい結果となってしまったものに改めて挑戦してみました。

(データについては以前に許可を頂いているデータをそのまま使用しました)

今回のモデル

今回はGUIでモデルを作成していますので、ネットワーク構成とかはりつけてみました。

左図のようなモデルにしてみました。

1,000回学習させたものがこちら。

あんまり芳しい感じではないです。

イラスト100枚を学習させています。

結果

こんな感じになりました。

https://www.mizunagi-works.com/gadgets/nanoillust/20180201/index.html

確率で並び替えが出来るようになっています。

「engo001さんが描いたビールジョッキを持ったはやて」をsan_ponさんが描いたと判定してくれるようになったので、前回よりはそれっぽい判断になってくれ…たかもしれない。

.

Neural Network Libraryで遊んでみる

SONYのNeural Network Libraryを使ってみてのメモとか。

NNLで画像を読み込みたい場合

モデルに画像を読み込ませるには、nnabla.utils.data_source_loaderモジュールで読み込ませる事が出来ます。

Pillowで読み込んだ画像をNNLで扱える構造にしたい場合

numpyモジュールを使います。

 

ISO-2022-JP-MSからCP932への変換

使用する機械はあまりなさそうでうけど、ISO-2022-JP-MS(JIS)からCP932(SHIFT-JIS)へ変換するコードを、以下のサイトに掲載されているプログラムを移植してみました。

http://www.geocities.jp/hoku_hoshi/TIPPRG/tipprg03.html

プログラム本体

テストデータ

テスト方法

上記の様なテストデータをUTF-8で作成して、iconvやnkfを使用してjis形式のファイルに変換します。

iconvの場合

nkfの場合

.

Neural Network Consoleでキャラ判定

SONYが公開しているNeural Network Console を使用して、キャラクター判定をさせてみました。

NNCはWindows用なのですが、学習させたモデルの利用はMac(Anaconda + Python 3.6)でも動作しました。

ヴィヴィオとアインハルトのみですので適当に答えても50%の確率なので、あまり面白みはないけど…

Neural Network Console

https://dl.sony.com/ja/

SONYが公開しているニューラルネットワークを作成するためのGUI環境です。

今回は以下のようなネットワークを作成してみました。

 ネットワーク構成

 学習状況(2000Epoch)

画像データはBingの画像検索を使用してヴィヴィオとアインハルトの画像を収集しました。

画像については以下のルールで生成しています。

  • 変身前か変身後は関係なくキャラクター毎に30枚程度を用意
  • 描かれているキャラクターは一人だけ(背景はあってもなくてもよい)
  • 画像サイズは64×64に縮小(パディングは0(黒)で行う)

画像はかなり少ないのですが2000Epoch程学習をさせて、評価を行います。

評価方法

NNC上でも評価出来るのですが、生成したモデルをPythonやC++から使用することが出来ます。

今回は以下のようなコードを生成しました。

学習結果はフォルダにHDF5形式で格納されていますので、そのまま使用することが出来ます。

ソースコードもNNCが生成したものをそのまま使用可能となっています。

評価に使用するデータ

画像は自分が描いた2枚の画像を使用してみました。

 ヴィヴィオ( vivio = 1 )

 アインハルト( einhald = 0 )

実行結果

 0.978

 0.042

0に近いほどアインハルト、1に近いほどヴィヴィオという判定が出るように学習させましたので、どうやら正しく判定してくれたようです。

自分以外の絵でも試してみましたが、正答率は80%ぐらいでした。

.

カスタマイズとゆるい合作が可能なグッズ(3)

以前考えていたブックマーカースタンドを既存の商品でレイアウトしてみました。

あとは厚さ1mmぐらいのアクリルで仕切りを作れば十分かもしれない。

一見したところ、全体的に透明の方が格好良さそうなのですが、透明だとブックマーカー自体が透明の場合に見づらくなってしまう為、やはり背面は白い方が良さそう。

 これは単なるフォトフレーム。

背景が黒い為ホコリが目立っていますが、アクリルだけあって静電気をなんとかしないと、かなり汚らしく見えますね。これも課題かもしれない。

設計図的なもの

 仕切り(1mm厚)

こんな感じの仕切りを考えて見たけど、通常の加工では強度の問題から幅を10mm以下に設定できなかったりして。(加工賃は多分5,000〜6,000円ぐらい?)

 雰囲気だけ。

デバイス・カードケースの委託

昨年のイベント(リリカルマジカル24)で頒布したデバイス・カードケース三種を、とらのあなに委託申請しました。

イベントでは午前中にほぼ売り切れてしまったため、久しぶりに委託販売をすることにしました。

委託手数料の分だけ値段が上がっています。

委託申請中の図案三種

通販ページ(とらのあな)

 

.

通販ページ(とらのあな)

 

.

通販ページ(とらのあな)

 

マテリアルズ達が使用するデバイスをキャラクターのイメージあわせて配置してみました。

  • ディアーチェは王として安定した配置
  • 元気に動き回るレヴィはデバイスと影で異なる形態
  • 落ち着いたイメージをもつシュテルは下向きに配置

といった感じです。

.

文書の類似度判定(3)

データベースに文書を保存するまでが出来たので、やっと本題の類似度判定を。

データベースから文書を取り出して学習と判定を行う

やっていることは、データベースから二文字以上の名詞を取り出して学習用データを生成して、与えたキーワード、文書に似ている(近いベクトルのもの)を取得しています。

実行すると以下のような結果が表示されます。

学習させた文書は、Pixiv百科事典からキャラクター名の項目をテキスト化したものを与えています。

ヴィヴィオに関連するものとして、

  • アインハルト
  • リンネ・ベルリネッタ

といったキーワードが出力されています。

与えた文書量が少なく、文書自体も短いためなんとなくうまくいっているようないないような。

文書の類似度判定(2)

まずはjanomeを使用して形態素解析を行います。

カスタム辞書を指定していますが、指定しなくても動作します。

janomeによる形態素解析

word2vecを使用するには形態素解析したデータをもとに分かち書きを作成する必要があります。

毎回形態素解析をして生成しても良いですが、ここでは形態素解析をした結果をデータベースに一旦保存した後、必要な情報を取得できるようにしてみます。

janomeによる形態素解析とデータベースへの保存

前述のコードを修正してデータベース(ここではsqlite3)へ保存するようにしたもの。

.

文書の類似度判定(1)

nanoha_keyword知り合いとの会話にword2vecが話題にあがったので、例によってリリカルなのは的なネタに絡めた記事を作成する事にしました。

やることは、

  1. 文書を形態素解析
  2. データベースに保存
  3. doc2vec(word2vec)向けのデータを生成

といったものです。

文書の形態素解析

文書を取り扱う為に、まずやるべきことは形態素解析です。

形態素解析を行うライブラリには様々な物がありますが、今回はjanomeを使用しました。janomeはIPA辞書を内蔵していますが、目的に特化した単語を判定するには専用の辞書を使用する必要があります。

カスタム辞書の追加方法

janomeのカスタム辞書は以下の方法で生成する事が出来ます。janomeのカスタム辞書はMeCabと同じ形式のものを使用する事が出来ますが、単語だけの簡単な構造の形式を使用する事も出来ます。

サンプルとして以下のファイルを用意してみました。

nanoha_keyword.csv

.

 

写真からもう一枚

ホルルさんが公開されている写真のモデルからもう一枚。

元のモデルは恥ずかしそうな表情が水着姿ととても似合っていて、思わず描いてしまいました。

許可を頂いたので掲載〜

 水着姿!

 

前回描いたイラストと違って装備品がほとんどないので、描きやすい…と思ったのですが、ボディラインを隠せないパーツというのは、それはそれで難しかったりして。

珍しいものを描きました

Twitterでたまたま見つけたモデル(FA:Gベース?)に惹かれて描いてみました。

自分が描いた絵の中では、かなり線がおおいんじゃないかと思ったり…

 頑張って描いたもの

参考にしたモデルは以下のツイートとなります。

 

フーカ(シェーラひめのぼうけん)

児童文学作品「シェーラひめのぼうけん」より、シェーラひめ…の服装をしたフーカ。

シェーラひめの設定は「正義感が強くて力持ち、だけどちょっぴり無鉄砲」といった感じで設定されているようで、似たような気質(?)のフーカに着てもらいました。

上下がセパレートになっているあたりも、元々のバリアジャケットに似ている様な。