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という名前の仮想環境を作ります。
オプション説明
$ 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
ちなみに、どんなバイクかというとこんな感じです。国産車には無い、独特なデザインです。
画像の学習
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 として保存してます。 画像認識には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できそうです。 ピッキングロボットのばら積み部品判定とかに使ってみたいですね。