Azure + Tensorflow + Kerasで画像認識やってみた part3

#CNN#Deep Learning#GPU#機械学習#画像認識

はじめに

part1では環境構築を行い、part2ではMNISTを試してみました。   今回は食材を同定する画像認識システムを作ります。 前回と違うのは

  • 自分で画像を用意する
  • カラー画像

という点です。   「チュートリアル(MNIST)はできたけど挫折」、ということがぽろぽろあるみたいなので、ちぎれないように心を強く保ちます。   ちなみに、なんで食材同定なのかというと、「冷蔵庫にある食材の写真を取って、今ある材料からレシピをレコメンドしてくれる」システムがあればいいなと思った次第です。 ちなみにこのシステムを大学の課題で作成しました。 最低限のレコメンドシステムですがこんな感じです。 https://www.youtube.com/watch?v=SvZkpe3Fb5s

学習データを用意する

今回は5種類の食材を認識することをゴールとしました。 なので少なめではあったのですが、やはりデータを集めるのが大変でした。 Flickerとかも使いましたが、なかなか求める画像が引っかからなくて悩みました。 後から知りましたが、こちらに様々なデータセット(画像に限らず)がまとめてあるので利用できる場合は有効活用したいですね。 GitHub: arXivTimes

スクレイピングで画像収集

GoogleやBingの画像検索で探してきます。 もちろん手動でダウンロードしてられないので、スクレイピングしました。 今回はテストなので「carrot」、「cabbage」、「tomato」、「radish」、「onion」の5つの単語の検索結果を取得しました。 画像検索ページってスクロールしないと全部表示できないので、本気出してたくさんデータ集めようと思ったらseleniumとか使う必要があるのかな、と想像。 とりあえず、それぞれ100枚弱くらい集めてみました。 *ブロッコリーや白菜が含まれていますが、一旦全部ダウンロードします。(ちなみに白菜はchinese cabbageだそうです。なるほど。) スクレイピングにはBeautiful Soupを使用しました。 それぞれの食材ごとにディレクトリ分けて、ファイル名もいい具合に設定するとあとで楽です。

適切な画像を選別

5つのディレクトリに分けられた画像をチェックします。 この時点で意にそぐわないものは除去します。 例えばブロッコリーや白菜などこちらの意図から逸れて引っかかってしまったもの、 キャベツスープや、にんじんおばけ(?)のイラストなど学習に適さないものです。 ここはどうしても人力ですかね。 効率を上げる工夫のしがいはありそうですが、今回はたかだか500枚程度だったので、サムネイル表示して選別しました。 この時点で各食材50枚前後になりました。

水増し

さすがに50枚では心許ないので、データ数を水増しします。 具体的には

  • 角度をずらす
  • 反転する
  • ぼかしを入れる

などの処理をした画像を作ります。 人間なら傾いていようが、鏡写しだろうが、多少ぼやけてても認識できるよね、って考え方らしいです。 これで10倍くらいにして、各500枚まで増やしました。 KaggleのDogs vs Catsの訓練データが犬猫それぞれ12500枚ずつなのを考えるとずいぶん少ないですが、とりあえずのテストとしては十分でしょう。 ここら辺の処理はPythonの画像処理ライブラリPillowを使用しました。

学習する

学習は前回MNISTでやったことを食材画像でやるだけです。 カラー画像なのでグレースケールではなくRGBを使ったことに注意です。 画像の水増しや学習のところは、「Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう」を大いに参考にしました。   試しにMacでトレーニングさせたところ、20分ほどかかりました。 比較のためにAzureのGPUインスタンスで実行したら30秒で済みました。 今回は最低限手順を把握するのが目的だったので、一回しか回しませんでしたが、チューニングを繰り返して何度も学習をする場合にはGPUでやらないと時間がいくらあっても足りないですね。 クラウドでGPUを利用する手順はこちらの記事「Azure + Tensorflow + Kerasで画像認識やってみた part1」にまとめてあります。

テスト

学習の結果、識別精度は70%ぐらいでした。   本来ならカリカリチューニングをしていくのでしょうが、僕はまず全体像を完成させてから細かいところをリファインしていく方法が好きなので、一旦これで次のステップに進みます。 こちらの記事「画像認識が人間の目を超えた 人工知能の歴史的ブレークスルーの先に」によると人間のエラー率は5%ぐらいとのことなので、いずれは95%を目標にしたいと思います。

まとめ

今回、任意の画像に対して画像認識を行うことができるようになりました。 ただ今の所コンソール上で実行する必要があります。 ネット記事を見ていてもここで終わってしまっているものが多いのですが、せっかく作ったのでウェブ上で動かしてみましょう。 ということで次回はこれまでの集大成として、食材認識サービスをウェブに公開します。   また画像認識システムとしての完成度を見ると、

  • 識別精度が低い点
  • 一枚の画像に複数の食材が含まれている場合に対応できない点

が改善点として挙げられます。 後者はR-CNNを取り入れることで解消できそうです。 R-CNNに関してはまた別途まとめたいと思いますが、 ざっくりいうと画像の中の特定の部分を物体として認識し、その部分を今回出てきたCNNで何か識別するという流れをとります。 つまりCNNでは「何か」ということしかできませんでしたが、R-CNNでは「どれが」、「何か」まで識別できるようになるので複数の対象を処理できるのです。

参考

初級: 人工知能は人間を超えるか

人工知能、機械学習、ディープラーニング、そこらへんのバズワードをさっくり知りたい人向け。 人工知能が普及したらどうなるのか、読み物として面白いです。 ゴリゴリ開発したい人には向いてないです。

人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)

中級: Pythonによるスクレイピング&機械学習

スクレイピングでデータを集めて、自分で学習させるところまで学べます。 全編が機械学習というわけではありませんが、実践的に機械学習を使って何かをしようとした時に付随して必要になる知識を勉強するのに役立ちます。 「機械学習のアルゴリズム自体を構築したい」という人より、「機械学習を使って何かしたい」という人におすすめ。

Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう

上級: ゼロから作るDeep Learning

学びの深い一冊です。ディープラーニングの中身を細かく解剖し、一つずつ自分で構築します。 Tensorflowなどのライブラリを使わないので、これらのライブラリの中身がどうなっているかということも学べます。 機械学習をブラックボックスではなくしっかり理解したい人向けです。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装