さわやかのげんこつハンバーグで学ぶニューラルネットワークを使った画像識別

2019.06.04

ド素人でも画像識別が簡単に行える世の中になってきたようなので、「さわやかのげんこつハンバーグ判別機」を作ってみました。

その過程で得られた情報を簡単にまとめます。

お察しの通り私はド素人なので、情報の真偽に関しては保証しかねます。
よろしくお願いします。

前提

  • python のインストールが済んでいる。
  • pip が使える。
  • git が使える。

推奨

ニューラルネットワーク自体の概要は以下のリンクを読むと理解が深まるかもしれない。

https://tutorials.chainer.org/ja/src/13_Basics_of_Neural_Networks_ja.html

TensorFlow

私が最初にニューラルネットワークに手を付けたのは、GoogleからTensorFlowがリリースされた2017年ごろ。
(ベータ版は2015年末に公開)

TensorFlowはニューラルネットワークを利用するためのソフトウェアライブラリで、誰でもニューラルネットワークが使えると機械学習(ディープラーニング)ブームの一因になっていたような気がします。

TensorFlowができることは以下のようなネットワーク構造を表現し、その構造に沿った数学的計算を行うことでした。

引用元:https://tutorials.chainer.org/ja/src/13_Basics_of_Neural_Networks_ja.html

このため実際に高精度な識別をさせるためには、適切なネットワーク構造等の理論背景を理解し、大量の教師データを準備する必要がありました。

つまりド素人には結局何をしていいかわからない状況だったのです。

とは言え、現在でも機械学習の実装の根幹となっているライブラリなので、ひとまず何も考えず TensorFlowをインストールしておきましょう。
(ここから先の工程にも必要です。)

$ pip install tensorflow

学習済みモデル

現代では理論背景を詳細に理解していない人間にも手軽にニューラルネットワークを利用した機械学習を試す機会が得られるようです。

その一つが学習済みモデル。

予め凄まじい数のデータセットを良い感じに学習してくれている、学習済みモデルというものが配布されています。

一例として Google が提供している画像識別向けの学習済みモデルである Inception v3 というものがあります。

Inception v3 は ILSVRC-2014 の分類問題で優勝したネットワークです。

アーキテクチャの難しい話は以下の論文が詳しいです。

Going Deeper with Convolutions

このネットワーク構造を利用して世界最大級の画像データベースであるImageNetのデータを学習させたモデルが TensorFlow 向けにも配布されています。

早速使ってみます。

$ git clone https://github.com/tensorflow/models

でクローンしたリポジトリ内の “models\tutorials\image\imagenet”にある “classify_image.py”を実行します。

$ python classify_image.py

モデルのデータダウンロード後、サンプルとして用意されたパンダ画像の解析結果が表示されます。

giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89107)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00779)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00296)
custard apple (score = 0.00147)
earthstar (score = 0.00117)

パンダを識別しても仕方ないので、早速げんこつハンバーグを突っ込んでみましょう。

以下のげんこつハンバーグの画像をひとまず突っ込みます。

`–image_file` オプションで画像ファイルを渡してあげます。

$ python classify_image.py --image_file test.jpg

以下のような解析結果が得られました。

chocolate sauce, chocolate syrup (score = 0.50619)
meat loaf, meatloaf (score = 0.11685)
frying pan, frypan, skillet (score = 0.08017)
plate (score = 0.06157)
ice cream, icecream (score = 0.02323)

Inception v3 さんから見るとげんこつハンバーグはチョコレートソースやミートローフに見えるようです。

(皆さんも好きな画像を突っ込んでみましょう。)

ImageNet のような大規模画像ライブラリを利用した学習済みモデルは、パンダのような一般的な分類には強いですが、げんこつハンバーグのような細分化されたローカルな分類は苦手なようです。(当たり前)

参考リンク

第10回 学習済みInception-v3モデルを使った画像認識アプリケーションを作ろう

TensorFlow で GoogLeNet (Inception モデル) を実装

転移学習

では現在でもど素人がげんこつハンバーグの前で無力なのかというと、そんなことはありません。

「転移学習」という素晴らしい手法が存在します。

転移学習は、予め学習済みのモデルを他の領域に転用する手法です。
この手法を用いれば、Inception v3 のような学習済みモデルを転用することで比較的短時間に自身の対象とする領域向けのモデルを作成することができます。

TensorFlowではTensorFlow Hub を利用することで転移学習を手軽に利用することができるようです。

まずは、 `tensorflow hub` をインストールします。

$ pip install tensorflow-hub

`tensorflow hub` を使った転移学習は、チュートリアルを見れば誰でも簡単に試すことができます。

How to Retrain an Image Classifier for New Categories

早速チュートリアルをぶっ飛ばして、ハンバーグの画像を覚えさせます。

今回は以下の5パターンの画像データを Google 画像検索を使って 200 枚ずつ集めました。

  • さわやか
  • びっくりドンキー
  • ココス
  • ビックボーイ
  • etc

適当に画像をまとめてダウンロードした後、手作業であまりにもかけ離れた画像を抜いています。

さわやか
びっくりドンキー
ココス
ビックボーイ
etc

これらの画像を使って実際に転移学習を行います。

画像を以下のようなディレクトリ構成にまとめます。
この後の学習でディレクトリ名がクラス名として扱われることに注意してください。

HamburgSteak/
 ├ bigboy/
 ├ bikkuridonkey/
 ├ cocos/
 ├ etc/
 └ sawayaka/

以下のスクリプトをダウンロードします。

https://github.com/tensorflow/hub/raw/master/examples/image_retraining/retrain.py

用意した画像を “–image_dir” オプションで読み込み、学習をさせます。

$ python retrain.py --image_dir ./HamburgSteak

こんなログが永遠と流れます。

それなりの時間の後、下記2つのファイルが出力されます。
(私の環境では30分程度)

C:\tmp\output_graph.pb
C:\tmp\output_labels.txt

これらの学習させたモデルを使って画像識別を行ってみます。

以下のスクリプトをダウンロードします。

https://github.com/tensorflow/tensorflow/raw/master/tensorflow/examples/label_image/label_image.py

`–graph`, `–label` オプションで先ほど生成したモデルデータを指定し、 `–image`オプションで解析対象の画像を指定してスクリプトを実行します。。

$ python label_image.py \
--graph=./output_graph.pb --labels=./output_labels.txt \
--input_layer=Placeholder \
--output_layer=final_result \
--image=./test.jpg

先ほどのこちらの画像を突っ込んでみました。

すると以下の結果が得られました。

sawayaka 0.96540827
etc 0.020229403
cocos 0.010655077
bigboy 0.0031137362
bikkuridonkey 0.00059357565

96% さわやかとの判定。

すごい!

しかし、すべてのハンバーグをさわやかだと言いはる可能性もあります。

他のハンバーグも解析してみましょう。

bikkuridonkey 0.952118
etc 0.045051686
cocos 0.0024361226
bigboy 0.0003072243
sawayaka 8.689245e-05

95% びっくりドンキーとご判断いただきました。

すごい。。。

まとめ

解析できること自体には、今の時代驚きも少なくなってきましたが、ここまで簡単に機械学習による画像識別を行うことができるとは思っていませんでした。

進歩が早いですね。

ノシ