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

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、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 %)【正解】
  (ちなみに白いほうは "わたげ" と認識されました。)

まとめ

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