TensorFlow1.xを使った画像認識

TensorFlow1.xの環境構築する

virtualenvでTensorFlow専用環境を構築

各種ライブラリの依存関係をスッキリさせるために仮想環境に必要なライブラリをインストールしていきます。

virtualenvのインストール

$ sudo pip3 install -U virtualenv
$ virtualenv --version
virtualenv 20.0.35 from /Users/xxxxx/.pyenv/versions/3.7.0/lib/python3.7/site-packages/virtualenv/__init__.py

仮想環境の作成

カレントディレクトリにvenvという名前の仮想環境を作ります。

オプション説明

  • --system-site-packages:システムにインストールされている Python パッケージ群を、仮想環境からも参照できるようにします。
  • -p:Pythonのバージョンを指定できます。
$ virtualenv --system-site-packages -p python3 ./venv

仮想環境に入る

$ source ./venv/bin/activate
(venv) $

仮想環境から出る

(venv) $ deactivate
$

Tensorflowをインストール

Tensorflowは、 ModuleNotFoundError: No module named 'tensorflow.contrib' の問題を回避するため、1.15.0を使用しています。 ちなみに、1.15.0をインストールする場合、Pythonバージョンは3.7以下にしておく必要がありますので、pyenvで3.7.0を指定しています。

$ source ./venv/bin/activate
(venv) $ pyenv local 3.7.0
(venv) $ python --version
Python 3.7.0
(venv) $ python -m pip install tensorflow==1.15.0
(venv) $ python -m pip install tensorflow_hub

学習させる画像を収集する

google images downloadを使う

google images downloadは、指定したキーワードで Google 画像検索を行い画像をダウンロードします。画像認識用のデータセットを作成するのに便利なツールです。が、現在エラーが発生して動きませんでした。_| ̄|○

$ googleimagesdownload -k "KTM"

Item no.: 1 --> Item name = KTM
Evaluating...
Expecting value: line 1 column 1 (char 0)
Image objects data unpacking failed. Please leave a comment with the above error at https://github.com/hardikvasa/google-images-download/pull/298

色々調査しましたが結局原因は不明で、もしかするとGoogleの規約が変更になったのかもです。 だれか対策ご存じの方は是非アドバイスお願いいたします。

仕方がないので、昔取得した画像で説明を続けます。

使用した画像

私の所有しているバイクが判定できるか確認するため、同じメーカの車種違いの写真を集めたものを使います。 googleimagesdownloadを使ってダウンロードした場合、downloadsディレクトリ内にキーワード毎にディレクトリが作成、画像が保存されます(今回は5車種で各100枚)。

downloads
├── ktm duke 390
├── ktm duke 690
├── ktm duke 790
├── ktm scmr 690
└── ktm super duke r 1290

ちなみに、どんなバイクかというとこんな感じです。国産車には無い、独特なデザインです。

KTM Duke 390
KTM Duke 690
KTM Duke 790
KTM SCMR 690
KTM Super Duke R 1290

画像の学習

retrain.py(画像分類器)を使って学習させます。retrain.pyは下記Githubから取得します。 github.com

downloadsディレクトリに保存されている5車種x100枚の画像を学習

(venv) $ python3 retrain.py   --bottleneck_dir=bottlenecks   --how_many_training_steps=80   --model_dir=inception   --summaries_dir=training_summaries/basic   --output_graph=retrained_graph.pb   --output_labels=retrained_labels.txt   --image_dir=downloads

--how_many_training_steps(学習ステップ数)は多いと学習精度は高くなるようですが、その分、学習時間も長くなるので適当に80って決めました。もし、うまく識別してくれない場合はこの値を増やすと良いと思います。

画像認識

私の愛車(Duke 690)はこれ↓↓↓

duke690.jpg

愛車が認識できるか試してみます。認識させる画像は duke690.jpg として保存してます。 画像認識にはlabel_image.pyを使用します。label_image.pyは下記Githubから取得します。 github.com

下記コマンドで認識開始です。

(venv) $ python3 label_image.py --image=duke690.jpg --graph=retrained_graph.pb --labels=retrained_labels.txt --output_layer=final_result --input_layer=Placeholder

認識結果

ktm duke 690 0.28816313
ktm duke 390 0.24794301
ktm scmr 690 0.13873537
ktm super duke r 1290 0.122627996
ktm duke 790 0.11766549

数字が大きいほど一致レベルが高いということなので、愛車は KTM duke 690と認識されています (^^)b

duke 390は形が似ているので数字が近いですが、ちゃんと区別してくれてますね。

あとがき

学習させる写真選別、枚数を増やす、学習ステップ数を増やすことで、認識精度Upできそうです。 ピッキングロボットのばら積み部品判定とかに使ってみたいですね。