プログラミング素人のはてなブログ

技術屋の末端。プログラミングも電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#、python3、ラズパイ始めました。

TensorFlowとKerasでニューラルネットワークを使ってみた

以前の記事でTensolfrowとKerasをインストールしました。
(ただし、TensolfrowとKerasのVersionがマッチしなかったので、後述するように日経ソフトウェアのツールでインストールしなおしました。)
s51517765.hatenadiary.jp

今日は、この環境を使って実際にニューラルネットワークディープラーニング)を動かしてみました。
↓の日経ソフトウェアのソースを参考にしました。

まず初めにソースをそのまま動かしてみました。
まだTensorFlowやKerasの理解度も低いので、コメントも結構細かく書かれているので理解の助けになります。
日経ソフトウェアはすぐ品切れになってしまうのが残念です。
現在すでに、この号は中古しかAmazonでは入手できないですが、他のネット書店をさがせば見つかるかもしれません。

動作環境

動作環境は以下です。
Pillow(PIL)は画像処理のライブラリで必須ではありませんが、画像の水増し処理につかいました。

Python 3.5.2 |Anaconda 4.2.0 (64-bit)|
tensorflow==1.8.0
Keras==2.0.5
Pillow==3.3.1

ごく簡単なニューラルネットワークの概念

f:id:s51517765:20180528214609p:plain
今回のニューラルネットワークは図のような3層で、入力が、75px四方のRGB画像のため、 75x75x3 = 16875です。
この入力が0~255の値を持ったサイズ16875のlistになっているイメージです。
隠れ層1層と、出力層があります。

工程 じゃーん~~

f:id:s51517765:20180528213512p:plain

ステップ1 Anacondaのインストール

 これは、以前の記事の通りpython3.5のVersionのものをインストールしているのでスキップ

ステップ2 TensorFlowとKerasのインストール

 一度、すでに構築していた環境で進めてみましたが、NNが動かなかったのでこちらに戻ってtensorflowとkerasを再構築しました。

ステップ3 学習用の画像を集める FlickrAPIキーを取得

 Flickrというサイトから学習用の画像データを収集するために、APIキーを取得します。
この時に、YAHOO.COMのアカウントが必要になります。
www.flickr.com

ステップ4~5 Pythonのパッケージ「flickrapi」をインストールし、APIキーを設定する

ステップ6~8 画像をダウンロード

 これも、同梱のpythonプログラムで自動的にできますが、このプログラムをここに載せるのは著作権的にアレなので…。
 キーワード(sakura, sunflower, rose)を指定して、それぞれ300枚ダウンロードします。
f:id:s51517765:20180527185645p:plainf:id:s51517765:20180527185655p:plainf:id:s51517765:20180527185702p:plain

ステップ9 学習用の画像を手動で選ぶ

 ここでは間違っている画像、余計なものが映っている画像を "手動で" 削除するように指示されていますが、特に変なものがなかったので何もしませんでした。

ステップ10 学習用の画像から機械学習用のデータセットを作る

 これも同梱のpythonプログラムで…
 機械学習用のデータセットphoto.npzとテスト用のデータセットphoto-test.npzが生成されます。

ステップ11 機械学習のプログラムを動かす

 学習済みモデルnn.hdf5が作成されます。
 これがいわゆる学習ですね。

ステップ14(最終)画像を判定するプログラムを動かす

 12~13で水増しをするステップがありますが、とりあえずスキップ。

AIによる画像の判定結果

画像読み込み①
f:id:s51517765:20180528212457j:plain
→桜99%【正解】

画像読み込み②
f:id:s51517765:20180528212420j:plain
→ひまわり(99%)【正解】

画像読み込み③
f:id:s51517765:20180528212400j:plain
→ひまわり(99%)【不正解】
学習させていない”たんぽぽ"を読み込ませると、"ひまわり"と判定された。

画像読み込み④
f:id:s51517765:20180528214042j:plain
→桜(99%)【不正解】
学習させていない"あじさい"を読み込ませると”桜”と判定された。

あじさいとタンポポを追加したAIによる画像の判定結果

同様にflickrからタンポポあじさいをダウンロードし学習に追加しました。

タンポポを追加しようと画像をダウンロードしたら、黄色と綿毛の2種類があることに気づき、ラベルに”わたげ”も追加しました。
このため、タンポポとわたげのサンプル数が少なくなったので、PILというライブラリで回転させた画像を作成し、水増ししました。

from PIL import Image
import os

#画像を回転して保存

path="C:/Users/***/Documents/Projects/AiGips/Dandelion"
files = os.listdir(path)
for name in files:
    file=Image.open(path+"/"+name)
    file = file.rotate(180)
    file.save(path+"/"+"0"+name, 'JPEG', quality=100, optimize=True)

画像読み込み①
f:id:s51517765:20180528212457j:plain
→桜 (97 %)【正解】

画像読み込み②
f:id:s51517765:20180528212420j:plain
→ひまわり(99%)【正解】

画像読み込み③
f:id:s51517765:20180528214042j:plain
アジサイ(99 %)【正解】

画像読み込み④
f:id:s51517765:20180528212400j:plain
たんぽぽ (99 %)【正解】

画像読み込み⑤
f:id:s51517765:20180528223040j:plain
アジサイ (69 %)【不正解】

画像読み込み⑥再チャレンジ
f:id:s51517765:20180529221640j:plain
→わたげ (84 %)【正解】

うちで妻が育てているアジサイ
f:id:s51517765:20180529222809j:plain
これを75px四方に切り取って読み込ませました。
f:id:s51517765:20180529224606j:plain
アジサイ (99 %)【正解】
  (ちなみに白いほうは "わたげ" と認識されました。)

まとめ

日経ソフトウェアのサンプルコードの改造で、"桜", "ヒマワリ", "バラ","たんぽぽ","わたげ","アジサイ" の認識を実装できました。
精度としては白いアジサイが低いようです。
これは、もとの学習データのアジサイが青、紫系が多かったためかもしれません。