ニートの言葉

元ニートがやってみたこと・その過程で学んだこと・考えたこと・技術メモあたりを主に書いています。情報革命が起きた後に訪れるであろう「一億総ニート時代」の生き方を考え中です。

人工知能に柴犬の画像を集めてもらいたかった

柴犬って可愛いですよね。
ネットのまとめサイトでも定期的に柴犬画像の記事がアップされるほどの人気ぶりです。

そんな可愛い柴犬たちの画像を集めたいと思ったことは誰でもあると思います。 
とは言え、ネット上に大量に溢れている画像から柴犬画像だけを集めるのは大変です。

そこで、最近話題の人工知能(ディープラーニング)を使って、柴犬の画像だけ集められないかと考えました。

今回はその試してみた記録です。

前置き

人工知能とは?

今回「人工知能」と呼んでいるのはディープラーニングという技術*1によって作られた分類器のことです。
この人工知能に柴犬画像か否かを判断してもらいます。

ディープラーニングとは

ディープラーニングに関してはネット上にはわかりやすい説明がたくさんありますので、今回は簡単にディープラーニングの特色だけ説明します。

これまでは人間がコンピューターに特徴(今回の例で言うと、「柴犬らしさ」)を教えていました。

ディープラーニングでは、その特徴をコンピューターが見つけてくれます
つまり、「柴犬の画像を大量に与えることで、柴犬らしさを学習してくれる」というのがディープラーニングの特色になります。

今回の流れ

今回行ったことは大きく分けて三つのフェーズになります。
各フェーズに関しては後ほど詳しく解説します。

1.学習フェーズ

まずは柴犬かどうかを判断してくれる人工知能を作るために「柴犬とはどんなものか」を学習させるフェーズです。

2.収集フェーズ

次に分類してもらうための画像を収集するフェーズです。

3.分類フェーズ

収集フェーズで集めた画像を学習フェーズで作った人工知能に分類してもらうフェーズです。

 

それでは各フェーズに関して説明します。

1.学習フェーズ

ディープラーニングはすでに画像認識の分野では多用されているようですが、1から学習をさせるのは(求める精度にもよりますが)大変です。

大量の教師画像を用意する必要があり、高価なGPUを準備する必要もあります。画像の前処理*2なんかも必要です。

そこで、今回は学習させるのに便利なサービスを使いました。

どうやって学習させたのか

今回はラベリオというサービスを使いました。

一般的には学習させるにはそれなりにプログラミングが必要です。しかし、このサービスを使えば画像を用意するだけで学習してくれます。

詳しい使い方は公式のドキュメントをご覧ください。

どんなデータセットを学習させたのか

ラベリオには検索した画像を元に学習してくれる機能がついてます。今回はこの機能を使い学習用のデータを集めました。*3

柴犬画像か否かを判断するためには、柴犬以外のカテゴリを準備する必要があります

そこで、今回は
「柴犬」「自撮り」「ラーメン」「焼肉」「sky」「冬ファッション」
というキーワードで分けました。

各キーワードが1カテゴリになります。
(このキーワードの選び方が致命的な失敗であることを後々知ることになります。)

2.収集フェーズ

学習させた人工知能に分類をしてもらうための画像を集めるフェースです。

柴犬画像をどこから集めてきたのか

今回はTwitterを使いました。

TwitterStreamingAPIという世の中の全ツイートの1%をランダムに受信できる機能を使い、画像付きの日本語ツイートのみを集めました

今回は1万枚くらいしか使いませんでしたが、数日間放置していたら80万枚以上の画像が集まってました。

どのような形式で収集したのか

Python+Pymongoを使い、「ユーザー名・ツイート内容・画像URL」の三つを保存しました。

ツイートを保存するソースコードはGithubに公開しています。

3.分類フェーズ

集めた画像を人工知能に分類してもらうフェーズです。

どうやって分類したのか

学習させた人工知能はこちらの記事を参考に、自分のubuntuサーバーでAPIとして使えるようにしました。

今回は柴犬の確率が80%を超えた場合に柴犬と判断しています。

分類するソースコードもGithubに公開しています。

どうやって確認したのか

分類したものをブラウザから確認できるようにFlask*4を使いました。

githubに公開したソースコードのdisplay.pyがこれにあたります。

結果 

柴犬カテゴリの場合

今回の一番の目的である柴犬カテゴリに集まった画像の一部がこちらです。

 

柴犬画像も集まりましたが、「動物」という大きなカテゴリで画像が集まってしまいました。

可愛い動物が集まったので、満足ではありますが…これは失敗ですね。

なぜ失敗したのか

「柴犬か・それ以外の犬種か」「柴犬か・猫か」といった判断基準を与えていなかったのが敗因だったようです。

区別できない例

区別できる例

人間の写真は1つのカテゴリとして設定していたので、「人か動物か」は区別できるようです。

結果 その2「自撮り」カテゴリの場合

他のカテゴリの一例として「自撮り」カテゴリの写真もご紹介します。 

こちらは「顔写真が含まれる画像」が集まってます。意外といい感じです。

しかし、「自撮りかどうか」という点から見ると成功とは言えません。

こちらも「自撮り写真とそれ以外の顔写真」を比較をするためのカテゴリ作りをすると良いのかもしれません。

まとめ・感想

今回は深く考えずに学習から分類・Webでの閲覧までの流れを試してみました。

「柴犬画像だけを集める」という目的からすると失敗でしたが、人工知能による画像分類の勘所は抑えられたような気がします。

次は柴犬とそれ以外の犬種でカテゴリを分けた場合もやってみたいと思います。

今後

今回は「柴犬」という、キーワード検索からでも収集が可能そうなものを対象に選択しました。

しかし、初めに書いたようにディープラーニングの特色は大量の画像から特徴を見出してくれるところです。

つまり、「〜〜らしさ」を学習するということができるということなので、テキスト検索では見つけられないものも見つけ出してくれる可能性があると思っています。

例えば、自分の好みの風景画像を集めてくる・好みのファッションブランドを見つける・好みの異性の画像を集めてくる などなど

こういったことも今後試していけたらと思ってます。

ではでは。

*1:さらに詳しく言うと「CNN」という技術です。より詳しく知りたい方は「ディープラーニング CNN」または「畳み込みニューラルネットワーク」などで検索してください。

*2:画像にノイズを与えたり、拡大縮小、回転などを行うことで教師画像の枚数を増やすようです。

*3:本来であればしっかりと集めて、前処理を行ってから学習させるべきですが今回はスルーしました。

*4:Pythonで作られたWebサーバー