AIで遊べるデモサイト「AI World」

## はじめに
AIで手軽に遊べるデモサイトをFlaskで作りました。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/7a5044da-74c9-3810-bf81-368d4fb2a00e.gif>

スマホでも遊べるので、良かったら触ってみて下さい。

↓スマホでの表示
<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/96f9f44a-2692-3727-3b22-d355cc3282d3.png>

■デモサイト
[AI World](https://jw-automation.com/aiworld)

■環境
Python, AWS(Lightsail), Flask, Docker

## デモ一覧
デモの一覧は、以下の通りです。

|#|タイトル|内容|利用モデル
|:-|:-|:-|:-|
|1|Digit Recognition|異常検知付き手書き文字認識|<ul><li>Deep Metric Learning</li><li>LOF</li></ul>
|2|Image Denoising|ノイズ画像のデノイズ|<ul><li>Win5-RB</li></ul>
|3|Face Generation|存在しない人物の顔画像生成|<ul><li>StyleGAN</li></ul>|
|4|Face Transition|存在しない人物の顔画像のトランジション|<ul><li>StyleGAN</li></ul>|
|5|Face Manipulation|テキストでの顔画像編集|<ul><li>StyleCLIP</li></ul>|
|6|Human Detection|画像内の人物検出|<ul><li>YOLOv5</li></ul>|
|7|Object Detection|画像内のオブジェクト検出|<ul><li>YOLOv5</li></ul>|
|8|Image Inpainting|画像のマスク箇所の再構成|<ul><li>DeepFillv2</li></ul>|
|9|Instance Segmentation|画像内のオブジェクトのセグメンテーション|<ul><li>SOLO</li></ul>|

以下、個別に簡単なデモで紹介して行きます。

## 1. Digit Recognition
こちらは、「[Deep Metric Learning](https://qiita.com/jw-automation/items/7bbe1c872fcec7fa6c1d)」で以前紹介した、異常検知付きの手書き文字認識のデモです。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/7a5044da-74c9-3810-bf81-368d4fb2a00e.gif>

L2-constrained Softmax Lossを入れたCNNで、0～9までの文字を判定し、推定精度付きで返しています。全結合層の1つ前のL2-constrainedの層に、LOFで異常検知を入れているので、数字でないものが入力された場合は、「Not Digit」としてはじいています。

どちらかいうとスマホのほうが遊びやすいと思うので、色々な数字の形を書いたり、数字以外のものを書いてみたりと自由に遊んでみて下さい。

MNISTで学習しており、個人的にはもう少し弱い所のデータを足したいなという感触ですが、概ね人間と変わらないレベルで返してくれます。

## 2. Image Denoising
こちらも以前「[Deep Learning for Image Denoising](https://qiita.com/jw-automation/items/f942ea0c6a02e8e50fa2)」で紹介した、ノイズ画像からのデノイズのデモです。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/aab94988-1608-b442-0ab0-f49d4ade3e45.gif>

Win5-RBで、MNISTにガウシアンノイズを付加したノイズ画像5万枚と元画像で学習させており、ノイズ付きの新規画像(左)に対して、ノイズなし画像(右上)を推定します。

「Generate」ボタンでノイズ付きの新規画像が生成され、「Denoise」ボタンを押すと、右上にWin5-RBが推定したノイズなし画像、右下にノイズ付与前の元画像(正解画像)が表示されます。

正解画像と比較しても大差なく、上手くノイズ成分だけ除去してくれている事がわかります。

好きな数字とノイズの強度(noise intensity)も選べるので、こちらも自由に遊んでみて下さい。

## 3. Face Generation
こちらは、StyleGANを使った顔画像生成のデモです。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/d53f3677-e372-54aa-65a3-394737c63c15.gif>

表示されている顔画像は全て、StyleGANが生成したもので、この世に存在しない人物になります。

「Other Face」ボタンを押すと、異なるseedとtruncation(-0.9～0.9)によって顔画像が返されるので、こちらも色々と試してみて下さい。

赤ん坊だったり、サングラスをかけた人も出てきます。
## 4. Face Transition
こちらもStyleGANを使ったもので、顔画像の遷移のデモになります。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/6fa1fca3-119f-bcb5-4033-13e9f6b4fd14.gif>

seedを固定し、truncationを-0.7～0.7まで0.1ずつ動かす事で、徐々にStyleGANが生成する顔画像を遷移させています。
こちらも「Other Transition」で異なるseedでの顔画像の遷移が見れます。

どのseedにおいても、truncationが0となる真ん中のタイミングで、同じ顔(全ての本物画像を平均した顔)を通っている事がわかると思います。

性別や年齢も超えて、顔画像が遷移して行くのは面白いですね。

## 5. Face Manipulation
こちらはStyleCLIPを使った、テキストでの顔画像編集デモになります。
選択したテキストに合わせて、元画像をStyleCLIPで編集した結果が返されます。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/72beb992-16c3-b252-777f-e781070408b4.gif>

今回用意したテキストは、以下の10種類です。
- 表情変化：smile, sad, angry
- 目の変化：close, blue, glasses
- 髪の変化：black, blond, curly, short, long 

Global Directionsを使い、テキストからCLIPの埋め込み空間における変位を求め、テキストの変位分をStyleGANのスタイル空間における編集方向にマッピングすることで、テキストに合わせて顔画像が編集されます。

「Other Face」で、男性・女性・子供・老人など、StyleGANで生成された色々な顔が試せます。

今回はデモ用に任意で10種類選びましたが、笑った顔や怒った顔などを個別で学習している訳ではなく、テキストの変化と画像変化の対応自体が学習されているので、例えば、「ヒゲあり」「ボブカット」「眼鏡なし」など、入力するテキストを変えれば自由に編集できます。

## 6. Human Detection
こちらはYOLOを使った、人検出のデモです。
YOLOの検出対象を人だけに絞っており、「Detection」を押すと、人の領域のバウンディングボックス(矩形領域)が返されます。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/aaafa034-8fef-1472-414f-610e9a7f2259.gif>

シルエットやイラストでも検出可能で、10パターン程用意しているので、こちらも遊んでみて下さい。

## 7. Object Detection
こちらも同じくYOLOを使ったデモですが、今回は人に限らず、様々なオブジェクトを検出します。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/20d248ea-159e-1c0b-d7ac-f5e3da3e5f97.gif>

人に限らず、動物やスマホ、ネクタイなども検出可能なので、こちらも遊んでみて下さい。

## 8. Image Inpainting
こちらは以前、「[Deep Learning For Image Inpainting](https://qiita.com/jw-automation/items/0131b24a0b5a4e6fd0a6)」で紹介した、画像再構成のデモです。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/8a8c6b0d-6886-4a89-4da0-4b661e8b8ba8.gif>

DeepFill v2によって、元画像に対して白抜きのマスクをかけた箇所が、周辺領域を元に再構成されます。周辺領域から再構成される特性を活かし、オブジェクトにマスクを重ねる事で、消しゴムのようにオブジェクトを自然に消したり、逆に破損個所を綺麗に修復したりする事ができます。

## 9. Instance Segmentation
こちらはインスタンスセグメンテーションのデモです。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/f109db9c-a3aa-f632-5dbe-3888ccc01944.gif>

YOLOはバウンディングボックスの検出まででしたが、こちらはSOLOによって、バウンディングボックスの中のオブジェクトの領域まで抽出しています。

インスタンスセグメンテーションのため、個々のオブジェクトのIDが取れるので、特定のオブジェクトだけ操作したり(インペインティングで消したり)、色々と遊べそうですね。

## まとめ
一旦全てAIモデルをデプロイしたのですが、GAN系とDeepFillv2, SOLOはデモサイトにしてはレスポンスが遅くなってしまったため、デプロイは見送りました。

これらのデモについては、Colabで実装した際の結果を画像で返す形にしています。DeepMetricLearningとDenoising, Human/Object Detectionについてはリアルタイムでモデルを動かしています。

普段Colabの恩恵を受けすぎているので、デプロイになると、AIモデルやライブラリがどんどん重くなっている事や、GPUサーバーも個人利用にしてはまだまだ高いなと改めて痛感しますね。

とはいえ、もっとインタラクティブに遊べるものを今後増やして行きたいので、どこかでGPU環境に載せ変えたいと思います。

■参考
Qiita記載記事
・[Deep Metric Learning](https://qiita.com/jw-automation/items/7bbe1c872fcec7fa6c1d)
・[Deep Learning for Image Denoising](https://qiita.com/jw-automation/items/f942ea0c6a02e8e50fa2)
・[ホテル暮らしはクラウドである](https://qiita.com/jw-automation/items/2fcd6f6e15e470196646)
・[AIの実業務適用に必須なHITLという考え方と、HITLを加速させるAI×RPA](https://qiita.com/jw-automation/items/0fc9c1b9764233975ab9)
・[RPAの推進に必須なRPAOpsという考え方](https://qiita.com/jw-automation/items/53c45b7dfc7a5865c5ff)
・[VBAが組める人ならRPAは簡単に作れるという罠](https://qiita.com/jw-automation/items/38c28016bf5162e76c59)

個人ブログ
・[キャリア・フレームワークなど](https://jw-automation.com/blog)