Tensorflowでリゾートの画像をディープラーニングで分類してみた

シェアする

どうも!いつもはビーチリゾートについての情報を主に扱っていますが、今回は趣向を大きく変えて、Pythonのディープラーニングのフレームワーク、Tensorflowを使って、世界のビーチを分類してみよう!ということをやっていこうと思います!

なぜこれをやろうと思ったか、そして記事にしようとしたかというと、

理由

  • 会社でTensorflow(ディープラーニングのフレームワーク)の話があがった。
  • もともと大学院ではプログラムを書いてて、Pythonとかも多少は読める(決して書けると言えるようなレベルではない)ので、なんかできそうだなと思った。
  • ヨーロッパのビーチとアジアのビーチって結構違うなあと思っていたので、それをなんとなく具現化したかった。
  • 記事にした理由は、備忘録ぐらいの意味

です!

基本的にディープラーニングの詳しい知識やTensorflowの知識はありません!いろんなサイトのコードを参考に作成しております!それを統合するスキルはないので、不細工なフローになっています!すいません!

参考にさせていただいた先人の方々は本当に偉大です。すごいの一言です。ありがとうございました!

それでは早速やっていきたいと思います!どうやってやるかに興味がない人は結果だけ見てもらえれば大丈夫です!

環境

環境

  • OS:mac OS X EI Capitan ver. 10.11.6
  • Python:2.7.3
  • フレームワーク:Tensorflow(インストール済み)

まあ、ネットサーフィンが主なユーザーには一般的な環境ですよね。

ゴール

ゴールは、ヨーロッパとアジアのビーチ画像を学習させ、それぞれ実際にテストして分類できるか見てみる!と設定します。

例えば、下記画像はアジアのビーチなのですが、これをテストした際に、”アジア”に分類されれば成功!

ゴールまでのフロー

フローとしては、

Point!

  1. WEB上の画像を取得して
  2. その画像をリサイズして(このフローはいらないかもです)
  3. 画像データを学習データに変換して
  4. 学習データを使ってモデル作成して
  5. 実際にテスト

という感じでやっていきます!

Tutorial.1 画像取得

まず、WEBからヨーロッパ、アジアの画像を取得する必要があります。コードに関しては、下記URLを参考にさせていただきました!プログラマーの味方Qiita、そして投稿者の方、ありがとうございます!

#はじめに以前修正版として書いた「pythonで特定のURLから画像を一括ダウンロード」では、例えばっとなっていた場合ERRORになり画像をダウンロードできなかったのを今回修正しました。#編集…

実際には自分のディレクトリとかに合わせて、ほんの少しだけいじりました。

このget_image.pyが置いてあるディレクトリに移動して、

$ python get_image.py

と入力すると、”写真を取得したいサイトのURLを入力してください。”と出るので、そのままURLを入力します。今回は一応商用利用が可能なサイト、pixaboyを利用しました。

具体的には”ビーチ ヨーロッパ”、”ビーチ アジア”で検索した時のURLを指定しました。保存先は’web_image’というディレクトリに入ってます。今回はとりあえず、それぞれ20枚ほど取得しています。

Tutorial.2 画像リサイズ

これ必要ないかもしれません。が、一応やっておくことにします。これは、下記URLを参考にさせていただきました!ありがとうございました!

このコードを先ほどのget_image.pyと同じディレクトリに置いておきます。

そしてそのディレクトリで、

$ python resize.py

を実行すると、先ほど取得した”web_image”ディレクトリ内にある.jpgファイルが64 x 64サイズにリサイズされています。

そして次のフローのために、get_image.pyとresize.pyがあるディレクトリに、”train”というディレクトリを作成し、更にその中にそれぞれ”Europe”、”Asia”というサブディレクトリを作成し、該当する画像を格納しておきましょう!

本当はこの作業もしないようにプログラム組めって話なんですけどね、これが出来ないのが僕のスキル不足ですね、ほんと悲しくなります。

追記:リサイズの必要はないです。画像移動は必要あります。(2017/09/09)

Tutorial.3 学習データ生成

先ほどリサイズした画像を基に、モデルの元となる学習データを生成します。tfrecordとかのファイル形式にする方法もあると思いますが、今回はcsvファイルで作成しております。これに関しては、下記サイトを参考にしております。ありがとうございました!

前編はこちら機械学習やディープラーニングについては全く初心者のソフトウェアエンジニアが、畳込み…

これも先ほどと同じディレクトリに置いておきます。

実行コマンドは

$ python gen_testdata.py

です。

もとのコードに追加してcsvで落とすという処理を加えております。

“train”というディレクトリの中の”Europe”というサブディレクトリの画像は0、”Asia”は1、に識別されます。

そしてまた面倒なのですが、csvで落としたものをtxt形式に変換しておきます。そして出来たtrain.txtをコピーしてtest.txtを作っておきます。

※test.txtはモデル作成時のバリデーションのために使用するのですが、今回は兎にも角にもモデルさえ作れれば(精度は気にせず)、OKの考えのもとやっているので、test.txtは適当にしてます。

また、”data”というディレクトリを作成し、リサイズされた画像をどかっと格納しておきます。

本当にクソなフローにしてしまい、すいません。後で気が向いたら修正しておきます。

Tutorial.4 学習→モデル作成

どんな学習方法かはわからないです!とにかく、下記URLを参考にしております!ありがとうございました!

保持しているファル形式、パス構造に応じて多少コードを変更しております。

実行コマンドは、

$ python train.py

これでとにかく、モデルが出来ました!

ちなみに、精度は、

step 196, training accuracy 0.908257
step 197, training accuracy 0.917431
step 198, training accuracy 0.926606
step 199, training accuracy 0.926606
test accuracy 0.926606

当たり前ですが、testの精度とtrainingの精度は一緒です。なので、出したはいいものの、なんの参考にもなりません。

Tutorial.5 テスト

そして出来たモデルを基に実際にアジアビーチの画像をテストしてみましょう!これのコードも下記URLを参考にしております!ありがとうございました!

これも多少、基のコードから変更したような気がします。そして先ほどのアジアビーチの画像をtest.jpgとし、test.pyと同じディレクトリに置いてコマンドを実行します。

$python test.py test.jpg
1

出ました!1という結果なので、ヨーロッパに分類されてますね!間違いですね笑!

まあ、画像も少ないですし、画像自体もほんとにアジアのものかとか、信憑性の高くない画像を使っているので、仕方がないかと思います。画像をもっと増やしたり、入れてる画像を精査したりすればもっと精度は上がると思います!

ちなみに下記ヨーロッパのビーチ画像でテストすると、

$python test.py test2.jpg
1

となり、一応こっちは分類出来ました!

まとめ

いかがでしたでしょうか。今回精度とかは全然気にしてなかったので、他の画像とかで、ちゃんとできるかはわからないです。本格的にやろうと思っている方は、他のサイトを検索してみたほうが良いと思います。

今回は単純に分類でしたが、画像同士の距離をマッピングして可視化できるtensorboardというのがあるので、時間があるときにそれも書けたらと思います。

シェアする

フォローする