LINEスタンプをDeepLearningで自動生成してみる【Part 1】

# はじめに
始めまして。私は、本職はインフラエンジニアです。畑違いですが、最近はDeepLearningに対して興味を持ち独学で勉強をしています。Qiitaアカウントも作成したので、メモがてら試したこと等など記述していきます。

# 背景
機械学習の対象データとして、画像や音声や自然言語処理など幅広いですが結果が視覚的にわかりやすい画像認識に焦点を当てて自分で何かしら実装してみようと思い立ちました。ちょうど、仲間内でオリジナルのLINEスタンプを手描きで作って公開してたいなという話があがっていたので、AIでLINEスタンプを自動生成とかできないかな？！という発想が生まれました。

↓私が満身創痍で描きあげたスタンプのひとつがこちら
![kinniku2.png](https://qiita-image-store.s3.amazonaws.com/0/113129/dbc64431-d32a-a32c-3549-c636a67656fb.png)

「………。」

どうも世間に受け入れられそうにないので、自分で描くのではなくAIに作らせる方法を模索しています。

# 目次
- はじめに
- 背景
- 発想
- データ収集
 - LINE store
 - スタンプの仕様
 - 収集方法
- DCGAN-tensorflow
 - 教師データ

# 発想
LINEのスタンプって、いろいろなシリーズがありますが、「おはよう」「ありがとう」「おやすみ」とか一般的な利用を想定したフレーズのものは結構な頻度で作られてたりしますよね。異なるLINEシリーズでも利用シーンでカテゴリに分けることができたら、最終的にスタンプを生成する際のハイパーパラメータにできるのではないかと考えています。アノテーション（教師データのラベル付け）の作業には膨大な時間が必要になりそうなので、後回しにしますが…。当面の目標は、純粋に「かわいい」スタンプを無条件に教師データとして入力してみて、DCGAN-tensorflowでどんなスタンプを出力できるのかについて調査したいと思います。


# データ収集

本記事では最初のステップとして、入力学習データとして与えるLINEスタンプの画像を収集します。
## LINE Store
LINE Storeでは膨大な量のスタンプが公開されています。大きく公式スタンプとクリエイタースタンプがありますが、試しにクリエイターズスタンプでカテゴリ「カワイイ・キュート」で検索したところ、なんと37万以上ヒットしました。この37万個のラインセットの中に、それぞれ24個だったり40個とかの画像が含まれることになります。DeepLearningにはもってこいの、膨大なデータですね。

![LINEstore.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/f63f047a-c063-000d-d666-30b974453879.jpeg)


## スタンプの仕様
LINEスタンプガイドラインを見てみると、画像数は8個/16個/24個/32個/40個のいずれかで、画像サイズはW 370 × H 320（最大）と指定されているみたいです。テキスト情報としては、スタンプタイトル＋説明文が掲載されていますが、今回は画像のみを収集しテキストは収集対象から外します。また、アニメーションスタンプも採集の対象としていますが、静止画として扱うこととします。

* LINEスタンプガイドライン
https://creator.line.me/ja/guideline/sticker/

## 収集方法
膨大な画像をダウンロードするため、Pythonで簡単なウェブスクレイピングのコードを書いて画像を収集しました。シリーズをフォルダごとに分けて収集しました。スクレイピングコードについては別の記事で紹介の予定です。

```python:scrape-line-stamp.py
import requests
import os
from bs4 import BeautifulSoup

 :  :

```

![スクリーンショット 2018-07-02 17.43.44.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/2c636081-8c79-10db-b018-0bb5bcd45920.jpeg)

#DCGAN-tensorflow

Deep Convolutional Generative Adversarial Networksの略で、損失関数にニューラルネットワークを利用することで学習データをもとに画像自動生成をすることを可能とする手法です。ランダムな入力を与えて画像を生成するGeneratorが生成した画像と、実際の画像（Ground Truth）に対し、Discriminatorが偽物or実際を判断します。DCGANでは、Discriminatorを騙すほど精度の高い偽の生成画像をつくることを目指します。ただ、GeneratorとDiscriminatorの強さのバランスをとるのが非常に難しく、DCGANの発表以降、世界中で様々な研究が進められています。今回はGitで公開されている、DCGANをtensorflowで実装したコードのクローンを試しに利用してみます。

https://github.com/carpedm20/DCGAN-tensorflow

## 教師データ
入力画像には、横長サイズのものや縦長サイズのもの、そもそもサイズが小さいものなど混在しています。DCGAN-tensorflowの入力としてよく紹介されている、セレブの顔画像やMNISTの手書き数字はいずれも入力画像のサイズが固定なので、例に習いサイズが370×320のスタンプ画像のみを教師データとして入力することとします。DCGAN-tensorflowディレクトリのフォルダ[data]の直下に今回入力として与える、画像データを格納したフォルダ[AI-st]を格納します。

## DCGAN-tensorflow
[AI-st]フォルダ直下のLINEスタンプの画像データ「*.png」すべてを入力として与え、学習処理を実行します。

```Bash
$python main.py --dataset AI-st --input_height=224 --input_fname_pattern="*.png" --train --crop

```

##学習の結果
### 入力画像数500、エポック25回で実行！
![test_arange_98.png](https://qiita-image-store.s3.amazonaws.com/0/113129/9ca75338-4a79-3551-c7b9-f2e4e6dd6e52.png)

しろくろ！！！？？？

原因不明ですが、白黒のモヤモヤとした物体が影を見せています！カワイイ系のラインスタンプには、白いウサギやらネコやらのキャラクターの割合が高いのでこのような暗黒キャラクターが生成されてしまったのですかね。とりあえずサンプル数が少ないので、入力させる画像数を増やしてテストを継続していきます。

Part1はここまでにします。

…Part2へつづく。

[LINEスタンプをDeepLearningで自動生成してみる【Part 2】](https://qiita.com/ku_don/items/1d65307ca46264bf6259)