キャラクターの類似傾向


久しぶりのニューラルネットワークネタ。

某ゲーム向けにアップロードされている、キャラクターの性格付けが設定されたカテゴリとどの程度関係しているかを調べてみました。

ニューラルネットワークの作成はSONY NeuralNetworkConsoleを使用しました。

学習データは1カテゴリあたり350件づつ、評価用には100件づつ使用しています。

学習は10000エポック行いました。

 分類表

10件以上になっている場所を赤色にしています。

10件以上なので正解率10%というわりと甘い閾値ですが、綺麗に分類されれば、左上から右下に向けて赤い線になるはずです。

でもそううまく行くこともなく…

 誤判定をならべてみたもの

誤判定したカテゴリを並べてみました。

なんとなく類似傾向があるようなないような…

なお今回の学習には髪型や髪の色は含めませんでした。

某ゲームでキャラエディット


18歳未満の方は遊べないゲーム、コイカツ!を使用して3Dキャラクターを作ってみました。

以下のキャラクターはオフィシャルのアップローダーにも投稿してあるのですが、検索するのが大変なのでダウンロードデータの配布ページを別途用意しました。

以降の更新は以下のページで行います。

コイカツ!・キャラクターデータ

 優莉 祐里香 / 純真無垢で陸上部

 美影 瀬里華 / 大和撫子で茶道部

 祈里 アイラ / 野性的でチアリーディング部

 茜 美咲 / ミステリアスで帰宅部

 MODEL XH01F / 無口で帰宅部

自由にパーツを組み合わせてキャラクターを作れるのですが、エディットしている本人の絵柄の傾向が出てしまうのか、結局は手癖で描いたときに生み出さそうな容姿になってしまいました。

同じソフトを使っているのに、自分の作ったキャラクターが今風にならないというのは面白いのですが、なんだか自分の想像力の限界みたいな物を思い知ったり。

 

髪よりも手前に目を描画する設定が出来るのはちょっと嬉しかったり。

.

おまけ

http://www.illusion.jp

StructureSynthによるビル生成(2)


ヒント(道や建設して欲しくないところ)を指定してあげると、そこに考慮してビルを建ててくれるようにしてみました。

 こんな感じで与えます。

輝度でビル密度を与えようかな…と思っていますが、現在は黒い場所しか考慮していません。

 ビルが建設されます。

 ビルのディティールは低い…

.

試しに生成してみたスクリプト(そのままStructure Synthに貼り付けられます)

build_20180610.es

StructureSynthによるビル生成(1)


StructureSynthによる生成。

Sunflowでのレンダリング

こちらはShadeでレンダリングしたものをCLIP STUIO Paintで加工。

.

こんなスクリプトで生成しました。

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。

マンガ向けネーム用紙を作成するウェブアプリ


前回のウェブアプリの使い回しでネーム用紙を生成するウェブアプリを作成してみました。

 画面もほとんどそのまま。

http://www.mizunagi-works.com/gadgets/mangasheet/namesheet.html

.

同人マンガ原稿用紙を生成するウェブアプリ


微妙な便利さを求めて作成してみました。

 ウェブアプリである必要はあんまりなかったりして。

http://www.mizunagi-works.com/gadgets/mangasheet/mangasheet.html

.

600dpi, 300dpi, 150dpi, 96dpiの解像度でA4サイズのマンガ原稿用紙を生成します。

CLIP Studioなんかを使用している場合は、全く不要なアプリケーションだと思うのですが、自分が使用しているソフト(ArtRage)はマンガ作成向けでは無いため、微妙に便利な感じ…かも。

フォルダ内の重複画像を取り除きたい(2)


NNC Utilsで指定可能なハッシュ方法の説明を追記しておきます。

Hash方法

Average hash

画像を縮小した後に全画素の平均値を取得します。縮小画像の画素が求めた平均値よりも明るい(1)か暗い(0)かを元にハッシュ値を生成します。

画像の全体的な輝度や若干の色調補正が加わっていても、同じ画像と見なすことが出来ますが、縮小した結果が似たような画像だと適切な区別ができなくなります。

Perceptual hash

画像を縮小した後にDCT(離散コサイン変換)をかけます。求めた結果から低周波成分を取り出し、中央値を取得します。高周波成分を取り除くという事は、画像からノイズ(小さな差異)を取り除くという事になります。

求めた低周波成分領域から中央値よりも大きい(1)か小さい(0)かを元にハッシュ値を求めます。

一旦周波数に変換すると、直接の画素的な位置情報が失われてしまいますが、全体的に似ている(同じ様な周波数を含んでいるか)かどうかを区別する際に使用します。

Perceptual hash (simple)

Perceptual hashと同じですが、DCTの計算を一回、中央値を使わずに平均値を使用しています。

Difference hash

画像を縮小した後に、左右の画素同士を比較して、どちらが明るいかを求めます。

Average hashは画素全体の輝度から平均を求めるため、細かな差異が埋もれてしまう場合がありますが、こちらを使用するとうまく拾い出せる場合があります。

画像の一部分部分だけが異なっているものを区別したい場合に有効ですが、比率が異なる画像を違うものとみなしてしまう場合や、ノイズを有効な画素と見なしてしまう場合があります。

ある画像と同じ画像をJPEGで圧縮して劣化させた画像を同じものと見なしたい場合には良い結果が得られません。

Difference hash (vertical)

Difference hashと同じですが、画像比較を上下で行います。

Wavelet hash

画像を縮小した後に輝度情報を0.0〜1.0の範囲に変換し、wavelet変換(haar)を行います。変換結果から低周波成分の結果を取得し、中央値を求めます。

求めた低周波成分領域から中央値よりも大きい(1)か小さい(0)かを元にハッシュ値を求めます。

Perceptual hashと似たような処理ですが、waveletはDCTに比べてより適切な分解を行うことが出来るため、Perceptualよりも適切な区別が期待できます。

imagehashが使用できるアルゴリズムで最も重い処理となります。

.

フォルダ内の重複画像を取り除きたい(1)


「あるフォルダ内に保存されている画像が重複しているかを確認する」といった用途の場合、sha1等のハッシュを計算する事で重複を除外する事が出来ます。

この方法はどの様なファイルに対しても上手く動作してくれるのですが、ファイルのバイナリが完全に一致していなければ同一ファイルと認識されません。

特に画像ファイルの場合ですと、

  • 画像自体は完全に同じだがEXIF等のタグ情報が異なる。
  • 画像としては同じように見えるが、解像度が異なる。

といった画像は「同じ(似ている)」だと認識して欲しい時があります。

imagehash

そんな要求に対応するためにimagehashというものがあります。

Pythonではimagehashというモジュールがあり、Pillowと組み合わせることで容易にimagehashを計算する事が出来ます。

実際にハッシュを取得してみる

 いろんなフーちゃん

わりとうまくいっているみたい。

NNC Utils

まだ完成していない部分もありますが、ひとまずGitHubで公開しました。

ついでにGUIもつけてみたりして。

 PyQt5(画像はMac版)を使用しています。

.

Windows用バイナリ

NNC Utils

OneDriveからGitHubに移動させました。

簡単な使用方法

インストール方法

圧縮されたファイルをデスクトップ以外の場所に展開してください。

実行方法

実行は以下の三通りの方法があります。

なお、どちらの方法を使用してもファイルの自動削除等は行いませんので、結果が保存されたファイルを頼りに処理を行ってください。

(使用方法1)

コマンドプロントからchk_image_dup.exeを引数付きで実行します。

結果はchk_image_dup.exeが置かれている場所にimage_dc_result.tsvという名称で保存されます。

(使用方法2)

同梱されているimage_dc.batのショートカットを好きな場所(例えばデスクトップ)に作成します。

作成したショートカットに検索したいファイルをドロップすると、そのフォルダ以下に対して重複確認を行ってくれます。

結果はchk_image_dup.exeが置かれている場所にimage_dc_result.tsvという名称で保存されます。

(使用方法3)

nnc_utils.exeを実行するとGUIモードで立ち上がります。

結果は、ウィンドウ内のテキストボックスとnn_utils.exeが置かれている場所にimage_dc_result.tsvという名称で保存されます。

image_dc_result.tsvについて

重複ファイルが見つかるとimage_dc_result.tsvに重複したファイル名が保存されます。

ファイルはタブ区切りのテキストファイルで、それぞれのカラムは以下の内容となっています。

  • イメージハッシュ値(値が同じ物は同じ(或いは似ている)内容の画像ファイル)
  • ファイル名称
  • 画像の幅
  • 画像の高さ
  • 画像形式
  • ファイルフォーマット

対応している画像形式はPillowがサポートしているものとなります。(こちらで動作確認をしているわけではありません)

アンインストール方法

設定ファイル等は生成しませんので、展開したファイルを全て削除してください。

.

MacOSX Install Diskの作成


 

shellをfishにしてみました


長年使用していた(デフォルトだけど)bashからfishへと環境を切り替えてみました。

OSX環境でfishを呼び出すと、conda activateが出来なくなりましたが、 ~/.config/fish/config.fish に

と、一行追加すると使用できるようになります。

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


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)


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

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

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

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

学習させた文書は、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

.

 

Pawooのアカウントについて


Pixivアカウントを所有していればPowooと連携する事が出来ます。ただ、アカウントの扱いについて具体例があまりなかったので、自分なりに調べた情報をまとめてみました。

自分のアカウントはPixivIDにあわせて@mizunagi_kbにしてみました。

基本的な情報源について

重要な情報の多くは@pawoo_supportで閲覧する事が出来ます。閲覧できる情報にはわりと重要な内容が含まれていたりするため、出来れば静的なページとしてPixiv側か専用のサイトに用意しておいて欲しい所なのですが、現時点では前述したページに固定されているトゥート(ツイート)だけだったりします。

少し使ってみた感じだと、ウェブ版のユーザーインターフェースがやや判りづらい感じでしたが、アカウント管理に関する説明不足の方が気になりましました。また、アカウント周りのユーザーインターフェースがやや雑な挙動をするため、利用者に無駄な不安を抱かせてしまうのではないかと思われます。

 雑な挙動の例

上図の場合、パスワード変更メールが古いためにトークンが無効になっているために生じているのですが、テキストを読むだけでは利用者には何が起きているか判らず日本語としてもおかしい。

PixivIDとの連携方法

Pawooは他のマストドンと同様、アカウントとメールアドレスを登録する事で利用可能になりますが、PawooはPixivと連動するのを前提としていますので、Pawooを使用するのであれば、PixivIDを取得してから連携する事をお薦めします。

PixivIDからの連携は難しいことはなく、Pawooのトップページからpixivアカウントを使って連携(ログイン)を選択するだけです。初回利用時にはアカウント名とメールアドレスの登録が促され、一度連携すると次回からはログインが自動で行われるようになります。この振る舞いはTwitter連携等と同じOAuthにより実現されています。

アカウント名

初回利用時にPixivID名称が候補として指定されます。Pixivと連携をするつもりであれば、変更せずにそのままそのまま確定するだけで完了します。

未確認ですが、アカウント名はPawoo内でユニークでなければならないため、登録時点で既に誰かがアカウント名を使用していた場合は別の名称に変更する必要があります。なお、一度設定したアカウント名(@からはじまる名称)は変更する事が出来ません。

メールアドレス

おそらく無くても登録可能かもしれませんが、メールアドレス設定されていないとパスワード設定が行えません。そしてパスワード登録がされていないアカウントは削除する事が出来ません。

アカウントの削除方法

設定画面のログイン情報からアカウントの削除が行えます。

アカウントの削除を行うには、Pixivアカウント連携を解除しておく必要があります。

アカウントの削除を実行すると以下の処理が行われます。

  • 自分の投稿やメディアが全て削除される。
  • 自分のアカウント名称が永続的に使用不可能になる。

アカウント名称自体は消滅しない為、削除した後にもう一度同じアカウント名で作成することは出来ません。

パスワードの設定方法

Pixiv連携でアカウントを登録すると、初期状態ではパスワードが未設定の状態となります。

この状態のままだと、

  • Pixivアカウントの連携解除
  • アカウントとパスワードによるログイン
  • アカウント削除

といった機能を利用する事が出来ません。

新しいパスワードを設定する際に気を付けること

新しいパスワードを設定する歳にパスワード変更用のアドレスが記載されたメールが届くのですが、リクエストしてからメールを受け取るまでにかなり時間がかかります。場合によっては届かない場合があります。この際、新たなにパスワードの設定要求行うと、届くメールの内容と現在アクティブなパスワード変更アドレスが一致しないような挙動をする場合があり、この状況に陥るとどうしようもなくなります。

正攻法では、最後に送信したメールが届くまでひたすら待つ事なのですが、あまりお薦めできない手っ取り早い方法として、3回程度高速にパスワード変更要求をかけることで、サーバー側のキューをむりやりフラッシュさせる方法があります。

複数メールが届きますが、どれかのアドレスがアクティブになっているはずです。

アカウントと表示名称について

アカウント名称は一度作成すると変更出来ませんが、表示名称は設定画面から変更可能です。

PixivIDとPawooアカウントの同一性について

PixivIDとPawooアカウントはそれぞれ別の管理がされており、無関係の名称を関連付ける事が可能な様です。

そのため、他人のPixivIDを本人よりも先んじて取得してしまえるのではないかと推測出来ます。これを悪用することで、他人の使いそうなアカウント名称を登録+破棄を繰り返すことで、容易に妨害行為を行うことが出来そうに感じました。

実害はほとんどないのですが、PixivIDと連携するのであれば、PixivID取得時に何らかの方法でリザーブを行うか、PawooのID管理はUUIDで行うといった実装の方が良いような気がしました。(マストドンとの互換性を保持するために、あまりアカウント管理まわりは独自の実装に出来ないのかもしれませんが)

Pawooの良いと感じたところ

誰もが気にするであろうアカウント周りの扱いが雑に見えてしまい、今のところ積極的に乗り換える気はないのですが、マイクロブログという側面から観た場合はなかなか面白い機能が実装されています。

  • 入力文字数が500文字まである。
  • 一定時間後に削除されるメッセージを作成出来る。
  • ネタバレ等をうっかり読まれないように表示前に警告文を設定可能になっている。
  • 投稿の公開レベルをある程度制御出来る。

投稿単位で閲覧対象を変更できるというのは、表現内容につきまとう昨今の問題を考えた場合はかなり重要な機能に感じました。

このページへのリンクやツイートによる共有はご自由にどうぞ