【DeepAA on Web】ディープラーニングでアスキーアートを"Web上で"作る #DeepAA

`DeepAA on Web` という `DeepAA` のモデルを使ったWebアプリ（AAオートトレーサー）を制作したのでその紹介記事になります。

2017/12/02 追記：本記事で使用しているDeepAAのモデルデータは v1.0 のものです
2012/02/03 追記：DeepAA v2.0 に対応しました

# TL;DR
以下のページで実行できるのでぜひご利用ください。
https://tar-bin.github.io/DeepAAonWeb/

# <i class="fa fa-cubes" style="font-size:1em;"></i> 概要

先日、@OsciiArtさんが「ディープラーニングでアスキーアートを作る」という記事で `DeepAA` を公開されました。

[ディープラーニングでアスキーアートを作る - Qiita](http://qiita.com/OsciiArt/items/325714d8ab3f2b482ced)

私個人としても同じことをやろうと計画してたので「先を越された！？」という感じでしたが、そもそもの目的がやる夫スレコミュニティへの貢献だったので、素晴らしいものがでてきたと素直に喜ぶことにしました。

[OsciiArt/DeepAA: make Ascii Art by Deep Learing](https://github.com/OsciiArt/DeepAA)

ただし、`DeepAA` の実行にはPythonの知識が必要であり、やる夫スレコミュニティでこのまま使ってもらうにはなかなか厳しいかと思い、コントリビュートとしてWeb上で実行できるアプリを作成してみました。

# <i class="fa fa-gear"></i> 動作イメージ(GIF)

`DeepAA` の仕様に合わせて、64x64のデータを順次評価して、該当する文字を取得しています。
そのままだと味気ないので、どのように動作してるかわかるようなプレビュー機能も実装しました。

![deppaa.gif](https://qiita-image-store.s3.amazonaws.com/0/174284/fa98dbe3-04ab-d020-9cd6-ec5a5e572180.gif)

# <i class="fa fa-cube" style="font-size:1em;"></i> ソースとデモページ
## <i class="fa fa-exclamation-triangle"></i> 注意
※モデルの読み込みに時間がかかるため、環境によってはしばらくページがフリーズしたようになってしまう現象が報告されています。報告いただいた方の環境では数分放置するとフリーズから復帰し、その後の使用は問題ないとのことでした。（おそらくネットワーク速度の影響ではないかと推測しています）

## <i class="fa fa-globe"></i> デモページ
https://tar-bin.github.io/DeepAAonWeb/

画像のアップロード後、`Start` で実行できます。
Chromeを推奨していますが、firefox, Edge, Vivaldiなどでも動作確認はしています。

`DeepAA` の紹介記事にも記載されていますが、入力画像は細線化した画像のほうが比較的うまく変換できるようです。


## <i class="fa fa-code"></i> ソース
[tar-bin/DeepAAonWeb: DeepAA front-end on Web](https://github.com/tar-bin/DeepAAonWeb)

主な実装は以下の `src/js/app.js` らへんになります。

https://github.com/tar-bin/DeepAAonWeb/blob/master/src/js/app.js

# <i class="fa fa-lightbulb-o"></i> 技術スタック
## Keras.js
メインとして、 `Keras.js` というライブラリを使用しています。

+ [transcranial/keras-js: Run Keras models (tensorflow backend) in the browser, with GPU support](https://github.com/transcranial/keras-js)

こちらを仕様すると、TensorFlow(Keras)などで学習したモデルをJavaScriptから使用することができます。つまりサーバーサイドではなく各クライアントサイドでモデルを評価することができるわけですね。さらにはWebGLを使って、GPUを使った処理もできます。（すごい）

`Keras.js` については以下のページでデモを確認できます。

+ [Keras.js Demos](https://transcranial.github.io/keras-js/)

使い方については本記事では割愛させていただきますが、`Keras.js` 自体の実装は初期化とモデルの評価程度しかコードがないため、READMEや上記のデモのソースを見ていただければわかるかと思います。

##  <i class="fa fa-cube" style="font-size:1em;"></i> その他使用したもの
その他使用したライブラリ等を記載します。あとはwebpackとbabelも使用しています。
画像のグレースケール化、リサイズ等はcanvasの機能のみで実装できました。

+ [scijs/ndarray: 📈 Multidimensional arrays for JavaScript](https://github.com/scijs/ndarray)
+ [scijs/ndarray-ops: ndarray operations](https://github.com/scijs/ndarray-ops)
+ [vuejs/vue: A progressive, incrementally-adoptable JavaScript framework for building UI on the web.](https://github.com/vuejs/vue)
+ [Bootstrap · The world's most popular mobile-first and responsive front-end framework.](http://getbootstrap.com/)
+ [keage/Saitamaar: AA 表示用フォント Saitamaar を AA っぽい要素に適用するスクリプト](https://github.com/keage/Saitamaar)

#  <i class="fa fa-cube" style="font-size:1em;"></i> TODO（時間があったらやりたい）

+ 画像の加工（回転、位置移動）に対応
    + => `Fablic.js` あたりでいけそう？
+ エッジ抽出
    + => やりかた不明
+ パフォーマンスの向上（けっこう時間ががかるため）
    + => プレビューの非表示化とか、あきらかな空白エリアの判定スキップとか
+ Electron でデスクトップアプリケーション化
+ 任意のDeepAAの学習済みモデルへの差し替え

# <i class="fa fa-cube" style="font-size:1em;"></i> まとめ
自分がやったのは `DeepAA` の `Keras.js` を使ったWebアプリへの移植で、機械学習的な要素は @OsciiArt さんの成果物（学習済みモデル）を流用しただけですが、なかなかおもしろいアプリが作れたんじゃないかなと思います。

特に、`Keras.js` を使えばクライアントサイドでモデルの評価をしてもらうことができるので、GitHub Pagesとかでも運用できるのがとても良いですね。

最後にアスキーアート（やる夫スレ）界隈は世間的にはマイナーかとは思いますが良い作品がたくさんありますので興味があれば覗いてみていただければと思っています。

以上です。