経験ゼロから始めるAI開発

# 本記事について
本記事は2019/5/24に開催した[「経験ゼロから始めるAI開発/イラスト評価AIの仕組み解説セミナー」](https://connpass.com/event/129260/)の内容についてまとめたものです。

## 記事概要
本記事はAI・機械学習について素人の状態から、業務で使用するAIシステムを開発するまでのプロセスや勉強方法について解説します。また、実際に開発したイラスト評価AIの仕組みについても概要を説明します。
これからAI技術を使ったプロジェクトを始める方、AI・機械学習の勉強を始める方を対象とした記事になります。

## 何を作ったのか
制作されたキャラクターイラスト画像に使われている塗り方の割合判定や、背景画像の有無、描き込み量、制作難易度を解析し、それを元に想定制作価格の算出や制作可能なイラストレーターのレコメンドを行うアプリを作りました。
本アプリを2019年4月のAI・人工知能EXPOに出展したところ、ITメディア様に取り上げていただいた記事は2500リツイート以上され、注目を集めました。
https://www.itmedia.co.jp/news/articles/1904/03/news119.html

![7e63140dd31cdbc2fb4c6116d4059971.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197409/ac557a4f-5cdf-0fe9-e4ec-581d217b8493.png)


### なぜ作ったのか
開発の動機は主に以下となります。

- 人間にしかできないとされている「イラスト画像を評価する」という工程を、機械学習で代替またはサポートできないか検証したかった
- 人間とは別の視点（AI）によるイラスト画像の評価を取り入れることで、業務の効率化やトラブル防止に役立てたかった

ディープラーニングをイラスト画像に使う、となるとイラストの自動生成などが注目されがちですが、実際のクリエイティブの現場では「イラストを作る（描く）」以外にも様々な工程があります。
イラスト、商品パッケージ、Webサイトなどの制作プロジェクトにおいては、**デザインの良し悪しや制作工数の評価（判断）**はプロジェクト成否に関わる重要な工程です。しかしそれらの工程は人間の感覚でしかできないこと、人間の感覚でやるべきこととされています。

人間の感覚を持って行った評価には個人差が生じることが多々あります。個人の趣味嗜好、経験、得意分野、ポリシーなどが少なからず評価に反映されるため、評価結果が原因でトラブルになることも少なくありません。

これら問題に対してAI・機械学習を使うことで解決の可能性を見つけることができないか、というのが開発の主な動機です。


# 開発開始までに辿ったプロセス
AIプロジェクト開発開始までに辿ったプロセスは以下となりました。

1. 今のAIについて学ぶ
2. 構想・企画
3. 必要な作業・技術の整理
4. できないことを勉強
5. 開発開始

それぞれのプロセスについて解説します。

## 1. 今のAIについて学ぶ
今存在する課題がAI技術によって解決できるのか、それを明らかにするためにはAI技術について学ぶ必要があります（若干手段と目的が逆になっているような気もしますが）。
AIにできることとできないことを理解して、AIで**解決できる課題と解決できない課題を明確にする**ことがゴールです。

AIが流行っていることもあり教材は巷に溢れています。Qiitaで勧められている参考書、Web講座、セミナー、資格試験など、手当たり次第にやってみました。

- 参考書
    - ゼロから作るDeep Learning
    - 人工知能は人間を超えるか ディープラーニングの先にあるもの
    - 人工知能プログラミングのための数学がわかる本
- Web講座
    - Udemy
        - 井上博樹さんのコースをいくつか
    - Coursera
        - 機械学習コース
- 資格試験
    - 日本ディープラーニング協会 G検定
- セミナー
    - [キカガク](https://www.kikagaku.co.jp/)さんのセミナーをいくつか
    - [Connpass](https://connpass.com/)で機械学習関連のセミナー・勉強会にいくつか参加

勉強途中であまり関係のなさそうな項目や重複した内容はスキップしました。
おおよそ2〜3ヶ月ほど、空いた時間であれこれとAI・機械学習について学びました。

勉強を終えてみて振り返ると、セミナー（知り合いが増えモチベーションが上がる、質問ができる）と、Web講座（AI技術を使ったプロダクトを最初から最後まで作ることで全体のイメージが見える）は特にビジネスサイドの方にお勧めできます。

## 2. 構想・企画
まずイラスト制作業務の中にある課題（人間しか行えないとされている作業）をいくつかリストアップし、その中でAI技術で解決が可能と思われる作業をピックアップしました。

例えば以下のような課題・作業です。

- 提携するイラストレーターの作品クオリティチェック
- 完成したイラストのクオリティチェック
- 新人イラストレーターの面接
- 新規プロジェクトに使用するイラスト画像の工数・費用見積もり

この中から「新規プロジェクトに使用するイラスト画像の工数・費用見積もり」を選択しました。理由としては、実際の現場でもっともよく行われる作業であることと、イラスト制作の工数や費用が算出できれば他課題にも同技術が転用できると考えたためです。

AIを使った開発と聞くと「誰も見たことがないサービスやシステム」といったイメージを持たれがちですが、あくまで今回は目の前の現実的な課題を解決するものにしたいという思いがありました。

## 3. 必要な作業・技術の整理
アプリ完成までの大筋を整理しました。

A. 学習用の素材をたくさん集める
B. 画像のアノテーション（タグ付け）をする
C. 画像判別モデルを作る（モデルの学習）
D. 出来上がったモデルを組み込んだシステムを作る

Aについては社内に十分な量のイラスト素材がありました。選定作業に時間はかかるかもしれませんが、作業のイメージはできました。
Bについても、どのようなタグをつけるのかは十分検討する必要がありますが、こちらも作業内容の想像はつきました。
問題はCとDでした。最初にAI技術全体を学んだときにある程度は勉強しましたが、より深い知識をつけておく必要があると考えました。開発を進める途中でできないことが判明した場合大変です。


## 4. できないことを勉強

### モデルの学習について学ぶ

#### 画像分類の記事などを見て実際にいくつか実装した
いわゆる写経を何度か行いました。ディープラーニング用ライブラリも一つに限定せず、Tensorflow、Chainer、Kerasなどいろいろ触ってみました。
その中で今後の開発ではKerasを使っていくことを決めました。理由は[Stack Overflow](https://stackoverflow.com/)でKerasの記事数が最も多かったことと、同じことを実装する上でもっとも理解しやすかったことにあります。また、KerasはUdemyの講座でも使ったことがあったのでプロジェクトの全体図もイメージが容易でした。

#### 簡単な画像分類にトライした
ソースコードの全コピーではなく、自分で画像分類のプログラムを一から書いてみました。行ったのは犬or猫のようなシンプルな画像分類でした。自分で画像を用意し、タグ付けをし、自作のプログラムで分類モデルを作る、といった一連の作業を行うことで、自分でも気付いていない「自分がわかっていなかった箇所」を知ることができました。
そして、画像分類はCNNを使わないと精度が全く上がらないことがわかりました。

#### 手元のマシンでは処理が遅すぎる
これまでの学習は手元のマシン（MacBook Pro）を使っていました。薄々気づいていたことでしたが、学習（判別モデルのトレーニング）にかかる時間がすごく長く、GPUなるものを搭載したマシンでないと判別モデルの生成は現実的ではないと考えていました。
このGPUなるもの、安いものでも数万〜数十万円する上に、環境構築がすごく大変らしいとの記事もたくさん見ていたので、今回はクラウドでGPU環境を借りることにしました。
利用した環境はAWSでした。AWSでGPUを使ったディープラーニングの学習を覚えるのに使った時間は1日くらいだったので、おそらくこちらの方が環境構築するよりも早かったと思います。なお、その時に書いた記事が[こちら](https://qiita.com/RHM/items/24d7f79ea6417ab78621)です。

#### イラスト画像で試してみる
学習の方法と環境が整ったので、実際にイラスト画像で試してみることにしました。
数十枚のキャラクターイラスト画像を「アマチュア（イラストの素人）が描いたもの」、「プロが描いた簡易なもの」、「プロが描いたすごく手の込んでいるもの」に分け、こちらを分類できるかを検証しました。
人が見れば誰でもわかるような分類だったのですが、こちらの精度が40〜50％と全く上がりません。3分類ということは適当に分けても33％の確率なので、ほとんど成果が出ていないことがわかります。
ここにきてイラスト判別は無理なのだろうかと諦めかけました。

#### Fine tuning
何か良い方法はないかと探していたところ、Fine tuningという手法を見つけました。詳細な説明は省きますが、すでにトレーニングされた高精度のモデルを再利用することで、少ない画像でも高い精度が出せる手法です。
幸い、KerasでFine tuningを使った例はたくさん見つけられたので、それほど時間をかけることなく試行することができました。

結果、Fine tuningを使ったことで大幅に精度が上がりました。前項のイラスト３分類は90％以上の精度となり、今後の開発に大きな希望が持てる結果となりました。

いくつかのモデルを試した結果、最終的にVGG19を採用することに決めました。

その後、イラスト画像を様々な要素で判別する試行錯誤を何度か繰り返し、これはいけそうだという感触を得たところでモデル学習についての勉強をひと段落とし、Webアプリ制作についての勉強を進めました。

### システム組み込み（Webアプリ制作）について学ぶ

#### Webアプリケーションフレームワークについて調べる
最終的にWebブラウザで使えるアプリにしたかったので、有名なWebアプリケーションフレームワークをいくつか調べました。Ruby on Rails(Ruby)、CakePHP(PHP)などを使用する選択肢もありましたが、Pythonで実装されているDjangoを使うことに決めました。機械学習部分で使用している言語がPythonであるということが最も大きな理由です。

#### Djangoの基礎を勉強
[Django girls](https://djangogirls.org/)のチュートリアルや、[公式ドキュメント](https://docs.djangoproject.com/ja/2.2/intro/tutorial01/)を見てDjangoの基礎を勉強しました。前項でDjangoを選んだ理由の一つがこれらチュートリアルがわかりやすかったことにあります。
わからないことはドキュメントなどで都度調べました。また、UdemyでDjangoを使ったアプリ制作の講座も受講しました。

#### Webアプリを作ってみる
簡易なWebサイトを作りました。せっかくなのでイラスト評価AIアプリで使うことになると思われる機能（ページ上に画像をドラッグ&ドロップ、フォームへの値入力、DBへの書き込み・読み込みなど）を備えたWebアプリにしました。

#### Webアプリに学習済みモデルを組み込んでみる
アプリに判別モデルを組み込み、入力された画像をモデルを使って推論し、結果をページ上に表示するアプリを作りました。実際に開発するアプリとほぼ同じ構造です。
あとはUIを作り込んだり、モデルの精度を上げるだけ、という状態まで持っていかないと開発を進めるのは怖かったので、こちらが完成してから本開発を進めることにしました。
ページ上にドラッグ&ドロップされた入力画像をモデルに渡すところで少し苦労したものの、一連の流れは上手くできました。

## 5. 開発開始
![Screen Shot 2019-06-14 at 14.21.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197409/40b66329-879b-01cd-136b-683b49fcb3a3.png)
開発は上図のように進みました。開発開始から完成まで約3ヶ月強の期間となりました。

# イラスト評価AIの仕組み

## 前提・条件

今回開発したシステムは以下前提のもとに動作します。

- あらゆるイラスト画像を評価するものではない
- プロが描く商業用イラストのみを評価する
- 対象イラストを商業的に制作した場合の想定工数や価格を評価する
- 作者のネームバリューは考慮しない
- 作者の能力差は平均を取る

「世の中にある全てのイラストを評価する」といったシステムではなく、ゲームなどで使われる商業用イラストの評価を行うシステム、という前提です。素人が描いたイラストや、ピカソの作品のような画像を入力しても本システムでは正しい評価は期待できません。

このように最初に評価範囲を限定しておくことは非常に重要です。
トレーニングに使用する画像（教師データ）の選考基準や次の工程であるアノテーションの考え方にも大きく関わってきます。

## アノテーション(タグ付け）
![Screen Shot 2019-06-14 at 17.16.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197409/44056438-c4ac-b560-8701-9475d59ce325.png)

試行錯誤の結果、上記のタグを各画像に付与しました。
これらのタグ付けは専門知識を持っていないと難しい作業ですので、社内のプロイラストレーター複数名に依頼しました。

## 入出力イメージ
### 理想の入出力イメージ
![Screen Shot 2019-06-14 at 17.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197409/bc585ea2-a10b-d85f-8302-c64662a92745.png)

上記のように、1枚の入力イラスト画像から従来人間が判断していた項目を出力値とすることができれば理想でした。しかし試行の結果はうまくいく（精度が高い）項目もあればそうでない項目もありました。
何度か試行錯誤した結果、次のような流れとなりました。

### 実際の入出力イメージ
![Screen Shot 2019-06-14 at 17.52.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197409/8eafffba-f2fe-2d23-7079-c2bda6da2bf1.png)
まず、ディープラーニングで描き込み量や塗り技法の種類などを解析します。これらは比較的精度が高かった項目です。
それら解析結果を使い、別の機械学習手法で想定制作価格やレコメンドイラストレーターなどを算出しました。


# 開発を行った感想

今回、最初から最後まで一連の開発を1人で行ったことで、AI技術を使ったプロジェクトの勘所、AI（機械学習）でできることの範疇をおおよそ理解することができました。
AIは大きな可能性を秘めた技術ではありますが、いくつかの欠点もあり、また地味な作業を必要とする技術でした。もちろん大量のデータがあれば必ずすごいことができる、という技術でもありません。

今回の作業を、より機械学習に通じた方に依頼することで精度は大きく上がることと思います。
ただ、**いわゆる機械学習のプロであっても、専門知識を必要とするアノテーションや特徴量の選定など、その業界の経験や知識がないとできないことは多い**と感じました。そのため、AI開発を外注するにあたっては、発注側のAI技術に対する理解や協力が不可欠であることがわかりました。

AIを使ったプロジェクトの多くは検証段階で頓挫してしまうとの話もよく聞こえてきます。おそらくその原因には上記のような理由も少なくないのではないでしょうか。AI開発の発注側と受注側を橋渡しできる人材は今それほど多くないのかもしれません。

経験ゼロから始めて私が辿ったAI開発の工程が、同じ境遇の方の参考になれば嬉しく思います。