plant-raspberrypi3のブログ

ラズベリーパイ3とPythonに挑戦して、植物を愛でたり画像を加工したりします。最近はscikit-imageの勉強してます。

ラズパイでも使えるTensorflowの公式版 Tensorflow Lite

こんにちは。らずべりーです。

先日TensorflowとKerasの環境構築をしていたのですが、

plant-raspberrypi3.hatenablog.com

今日、Tensorflowについて調べていたら、モバイル用のTensorflowLiteなるものが公式からリリースされているのを知りました。最新版ではラズパイのサポートが追加されているそうです。

developers.googleblog.com

引用

We're also sharing the latest updates to TensorFlow Lite, TensorFlow's lightweight, cross-platform solution for deploying trained ML models on mobile and other edge devices. In addition to existing support for Android and iOS, we're announcing support for Raspberry Pi, increased support for ops/models (including custom ops), and describing how developers can easily use TensorFlow Lite in their own apps. The TensorFlow Lite core interpreter is now only 75KB in size (vs 1.1 MB for TensorFlow) and we're seeing speedups of up to 3x when running quantized image classification models on TensorFlow Lite vs. TensorFlow.

Google翻訳

また、TensorFlowの軽量でクロスプラットフォームのソリューションであるTensorFlow Liteの最新のアップデートを共有し、訓練されたMLモデルをモバイルデバイスやその他のエッジデバイスに導入しています。 AndroidiOSの既存のサポートに加えて、Raspberry Piのサポート、ops /モデル(カスタム操作を含む)に対するサポートの強化、開発者がTensorFlow Liteを自分のアプリケーションで簡単に使用する方法について説明します。 TensorFlow Liteコアインタプリタのサイズは現在75KB(TensorFlowの場合は1.1MB)で、TensorFlow LiteとTensorFlowの両方で量子化画像分類モデルを実行すると、最大3倍のスピードアップが見られます。

TensorflowLiteへのリンク:

Introduction to TensorFlow Lite  |  TensorFlow

github.com

ラズパイさん用のセットアップページはこちら。

github.com

関連ニュース記事(日本語):

tech.nikkeibp.co.jp

blog.gclue.com

学習済みモデルを専用のフォーマット(.tflite)に変換して使用するらしいので、リアルタイム画像認識などにはこちらのほうがよいのかもしれませんね。

また時間が丸っと空いたら試してみたいところ。

ラズパイで学習済みモデルを使った画像認識をしてみた

こんにちは、らずべりーです。

無事、環境構築ができたので、早速おためし。 Kerasは学習済みのモデルがたくさんついていていいですね!

環境構築については過去記事を参照のこと。

plant-raspberrypi3.hatenablog.com

とりあえずVGG16で試してみた

早速、VGG16でお試し!

$ python
Python 3.6.5 (default, Apr 22 2018, 13:08:36) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
from keras.applications.vgg16 import VGG16
model = VGG16(weights="imagenet")

、、、20分以上経ってもラズパイさんは帰ってきません(T T)

やむなくキーボードで中断。

学習済みモデルには色々なデータサイズのものがある

どうもVGG16は重すぎるようだったので、それぞれのモデルの特徴について真面目に調べてみました。

引用元: Applications - Keras Documentation

f:id:plant-raspberrypi3:20180423113941p:plain

VGG16は重い方から2番目ですね。一番軽いMobileNetと比べると30倍ほども違いがあります。

一番軽いMobileNetで試してみた

from keras.applications.mobilenet import MobileNet
model = MobileNet(weights="imagenet")

今度は比較的すぐ帰ってきました(^ ^)

とりあえず、何か試したい!ということで、以下のページを参考に象さんの写真をダウンロードしてお試し。

ken5owata.hatenablog.com

from keras.preprocessing.image import load_img, img_to_array
import numpy as np
from keras.applications.mobilenet import preprocess_input, decode_predictions

img = load_img("elephant.jpg", target_size=(224,224))
img_array = img_to_array(img)
img_array1 = np.expand_dims(img_array,axis=0)
img_array1 = preprocess_input(img_array1)
pred = model.predict(img_array1)
results = decode_predictions(pred,top=5)[0]
for result in results:
     print(result)

('n01871265', 'tusker', 0.8331707)
('n02504458', 'African_elephant', 0.13779889)
('n02504013', 'Indian_elephant', 0.02774448)
('n02437312', 'Arabian_camel', 0.00064588425)
('n02113799', 'Standard_poodle', 0.00016444316)

tuskerというのは大きい牙の生えた動物のことで、象や猪のことを指すそうです。

ejje.weblio.jp

3位まで象関係で占められていますので、合っていると言えそうです。

少し重いものの正答率の高いXceptionで試してみた

次に、VGG16より6倍軽いXceptionで試してみました。このモデル、軽量ながらTop-5 accuracyは0.945と、Kerasに付属されている学習済みモデルの中ではトップクラスの成績を誇ります。

del model #modelの中身の消去

from keras.applications.xception import Xception, preprocess_input, decode_predictions

model = Xception(weights="imagenet")

MobileNetほどは速くはないですが、こちらもそこそこの時間で帰ってきました。実用上は問題なさそうです。

img = load_img("elephant.jpg", target_size=(299,299))
img_array = img_to_array(img)
img_array1 = np.expand_dims(img_array,axis=0)
img_array1 = preprocess_input(img_array1)
pred = model.predict(img_array1)
results = decode_predictions(pred,top=5)[0]
for result in results:
     print(result)
 
('n01871265', 'tusker', 0.35963103)
('n02504458', 'African_elephant', 0.27961522)
('n02504013', 'Indian_elephant', 0.023076782)
('n02422106', 'hartebeest', 0.0021587133)
('n03967562', 'plow', 0.0018908447)

3位まで象関係なので、こちらもオッケーですね。

象さんは、MobileNetとXceptionのどちらでもちゃんと判定できることがわかりました。

(2018/4/25 23:12追記) モデルの読み込みと予測にかかった時間を測って別記事にアップしました。こちらもご参照ください。

plant-raspberrypi3.hatenablog.com

ラズパイにpyenvでTensorflowとKerasを入れる

こんにちは。らずべりーです。

ラズパイさんで画像認識したくて表題の作業をしていたのですが、環境構築に苦戦して土日が潰れてしまったので備忘録として。長文です。

目次

  1. 実行環境
  2. なぜpyenvにしたの
  3. 参考ページ
  4. pyenv, pipを入れる
  5. Numpy, Scipy, Pandas, h5pyを入れる
  6. Tensorflow, Kerasを入れる

(2018/4/23 12:42) 一部コード間違いを修正、参考ページを追加
(2018/4/24 8:00) エラーログが見やすいようにコメントアウト

1. 実行環境

  • Raspberry pi3 Model B
  • Raspbian Jessie

2. なぜpyenvにしたの

Python2はNumpyもPandasも来年あたりにサポート終了という情報があったのでPython3でやろうとしたのですが、色々入れている間に間違ってPython2のほうを入れてしまったりしてわけがわからなくなったので、いっそのことpyenvでやったほうがラクかもと。

Macと違ってAnacondaとかMinicondaで丸っと入れることができないので、依存関係が難しかったです。Anacondaの素晴らしさがわかった、、、

ちなみに、ラズパイ用のBerrycondaというのもあるそうです。今回は試していませんが、使えると便利かもしれません。

github.com

qiita.com

3. 参考ページ

参考にさせていだいたページが多いので、最初に載せます。

• pyenv

github.com

qiita.com

https://hack-le.com/rpipython3-stretch/hack-le.com

qiita.com

• Tensorflow, Keras

github.com

karaage.hatenadiary.jp

ken5owata.hatenablog.com

qiita.com

時短のために推奨されているapt-getPythonパッケージをインストールする方法pyenvのほうに入れるやり方がわからず途中で断念。結局pipでインストールしました。時間は結構かかりました。

4. pyenv, pipを入れる

必要そうなものをダウンロード。実は全部はいらないかも。

$ sudo apt-get install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev python-pip python-dev

pyenvgit cloneでダウンロード。

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

パスを設定。

$ sudo nano ~/.bashrc

~/.bashrcの最後に以下の3行を追加。

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

ターミナルに戻って、

$ exec $SHELL

pyenvをバージョンを指定してインストール。

$ pyenv install -l
$ pyenv install 3.6.5 #欲しいバージョンを書く
$ pyenv global 3.6.5
$ pyenv rehash

pipのアップグレードなど。

$ sudo apt-get install -y pkg-config libjpeg8-dev libfreetype6-dev libffi-dev
$ pip install --upgrade pip

ちゃんとpyenv環境(Python3.6)になっているかチェック。

$ python

Python 3.6.5 (default, Apr 22 2018, 13:08:36) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

よしよし。

5. NumPy, Scipy, Pandas, h5pyを入れる

TensorflowとKerasを動かすために、この4つのパッケージをpipで入れます。ついでに他にも必要なもの、使いそうなものも入れておきます。

はじめに、NumPy、Matplotlibなど。

$ pip install numpy psutil python-dateutil pytz tornado pyparsing six matplotlib wheel setuptools

時間はかかりますが、エラーなどは出ずすんなりOK。

次にScipy。

$ pip install scipy

# numpy.distutils.system_info.NotFoundError: no lapack/blas resources found
#以下略

エラー :(´ཀ`」 ∠):

lapackblasがないと言われているので、lapackblasapt-getでインストールして解決。

$ sudo apt-get install libblas-dev liblapack-dev
$ pip install scipy

次にh5py。

$ sudo apt-get install -y libhdf5-dev
$ pip install h5py

最後にPandas。

$ pip install pandas

  Downloading https://files.pythonhosted.org/packages/08/01/803834bc8a4e708aedebb133095a88a4dad9f45bbaf5ad777d2bea543c7e/pandas-0.22.0.tar.gz (11.3MB)
    100% |████████████████████████████████| 11.3MB 5.8MB/s 
 #Could not find a version that satisfies the requirement Cython (from versions: )
#No matching distribution found for Cython

エラー :(´ཀ`」 ∠):

apt-getやらpipやらでCythonを入れるも解決せず、途方に暮れかけていたのですが、最終的にはPandasのバージョンを下げることで解決しました。

$ pip install --no-cache-dir "pandas==0.16.2"

Collecting pandas==0.16.2
  Downloading https://files.pythonhosted.org/packages/b6/39/9c18df7531a2aaf65e44920aef0fbd21c7ce9ce7aad296fc7e2b323e81b7/pandas-0.16.2.tar.gz (4.9MB)
    100% |████████████████████████████████| 4.9MB 4.0MB/s 
Requirement already satisfied: python-dateutil>=2 in ./.pyenv/versions/3.6.5/lib/python3.6/site-packages (from pandas==0.16.2) (2.7.2)
Requirement already satisfied: pytz>=2011k in ./.pyenv/versions/3.6.5/lib/python3.6/site-packages (from pandas==0.16.2) (2018.4)
Requirement already satisfied: numpy>=1.7.0 in ./.pyenv/versions/3.6.5/lib/python3.6/site-packages (from pandas==0.16.2) (1.14.2)
Requirement already satisfied: six>=1.5 in ./.pyenv/versions/3.6.5/lib/python3.6/site-packages (from python-dateutil>=2->pandas==0.16.2) (1.11.0)
Installing collected packages: pandas
  Running setup.py install for pandas ... done
Successfully installed pandas-0.16.2

やっとここまで来た、、、

6. Tensorflow, Kerasを入れる

Tensorflowを入れます。これはpipだけでは入れられないので、GitHubからソースをダウンロード。

$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.1.0/tensorflow-1.1.0-cp34-cp34m-linux_armv7l.whl

ダウンロードした.whlファイルを使ってpip installする。

$ sudo pip install tensorflow-1.1.0-cp34-cp34m-linux_armv7l.whl

#tensorflow-1.3.0-cp34-cp34m-linux_armv7l.whl is not a supported wheel on this platform

またしてもエラー :(´ཀ`」 ∠):

ファイルがPython3.4用のせいかもしれない。バージョン違いについて、GitHubのページになにやら記述がある。

Note: the provided binaries are for Python 2.7 and 3.4 only. If you've installed Python 3.5/3.6 from source on your machine, you'll need to either explicitly install these wheels for 3.4, or you'll need to build TensorFlow from source. Once there's an officially supported installation of Python 3.5+, this repo will start including wheels for those versions.

Google翻訳

注:提供されているバイナリは、Python 2.7および3.4用です。 マシンのソースからPython 3.5 / 3.6をインストールした場合は、これらのホイールを明示的にインストールするか、ソースからTensorFlowをビルドする必要があります。 公式にサポートされているPython 3.5以降のインストールが完了すると、このバージョンのホイールを含むこのレポが開始されます。

github.com

なんのこっちゃ。

エラーログでググってみたところ、wheelさんは名前でバージョン管理しているというような情報が。

oregengo.hatenablog.com

ファイル名の中の34は明らかにPython3.4なので、ここをPython3.6用になるように36にファイル名を変更してから、もう一度pip installしてみる。

$ cp tensorflow-1.1.0-cp34-cp34m-linux_armv7l.whl tensorflow-1.1.0-cp36-cp36m-linux_armv7l.whl
$ pip install tensorflow-1.1.0-cp36-cp36m-linux_armv7l.whl

Processing ./tensorflow-1.1.0-cp36-cp36m-linux_armv7l.whl
Collecting werkzeug>=0.11.10 (from tensorflow==1.1.0)
  Downloading https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl (322kB)
    100% |████████████████████████████████| 327kB 115kB/s 
Collecting protobuf>=3.2.0 (from tensorflow==1.1.0)
  Downloading https://files.pythonhosted.org/packages/bf/dc/42d35afffe88ce301c90457eb60d145dd64144f283ef4bf927c1187ef114/protobuf-3.5.2.post1-py2.py3-none-any.whl (388kB)
    100% |████████████████████████████████| 389kB 19kB/s 
Requirement already satisfied: numpy>=1.11.0 in ./.pyenv/versions/3.6.5/lib/python3.6/site-packages (from tensorflow==1.1.0) (1.14.2)
Requirement already satisfied: wheel>=0.26 in ./.pyenv/versions/3.6.5/lib/python3.6/site-packages (from tensorflow==1.1.0) (0.31.0)
Requirement already satisfied: six>=1.10.0 in ./.pyenv/versions/3.6.5/lib/python3.6/site-packages (from tensorflow==1.1.0) (1.11.0)
Requirement already satisfied: setuptools in ./.pyenv/versions/3.6.5/lib/python3.6/site-packages (from protobuf>=3.2.0->tensorflow==1.1.0) (39.0.1)
Installing collected packages: werkzeug, protobuf, tensorflow
Successfully installed protobuf-3.5.2.post1 tensorflow-1.1.0 werkzeug-0.14.1

意外とすんなりインストールできました!

最後にREADMEに書いてあるとおりにmockをアンインストール&インストールして、

$ pip uninstall mock
$ pip install mock

Kerasをインストールして、

$ pip install keras

Collecting keras
  Downloading https://files.pythonhosted.org/packages/ba/65/e4aff762b8696ec0626a6654b1e73b396fcc8b7cc6b98d78a1bc53b85b48/Keras-2.1.5-py2.py3-none-any.whl (334kB)
    100% |████████████████████████████████| 337kB 3.2MB/s 
Requirement already satisfied: numpy>=1.9.1 in ./.pyenv/versions/3.6.5/lib/python3.6/site-packages (from keras) (1.14.2)
Requirement already satisfied: six>=1.9.0 in ./.pyenv/versions/3.6.5/lib/python3.6/site-packages (from keras) (1.11.0)
Requirement already satisfied: scipy>=0.14 in ./.pyenv/versions/3.6.5/lib/python3.6/site-packages (from keras) (1.0.1)
Collecting pyyaml (from keras)
  Downloading https://files.pythonhosted.org/packages/4a/85/db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a/PyYAML-3.12.tar.gz (253kB)
    100% |████████████████████████████████| 256kB 3.2MB/s 
Building wheels for collected packages: pyyaml
  Running setup.py bdist_wheel for pyyaml ... done
  Stored in directory: /home/pi/.cache/pip/wheels/03/05/65/bdc14f2c6e09e82ae3e0f13d021e1b6b2481437ea2f207df3f
Successfully built pyyaml
Installing collected packages: pyyaml, keras
Successfully installed keras-2.1.5 pyyaml-3.12

最後に確認でPythonを起動してimportしてみる。

$ python
Python 3.6.5 (default, Apr 22 2018, 13:08:36) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
/home/pi/.pyenv/versions/3.6.5/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
Using TensorFlow backend.
>>> import tensorflow as tf

表記に関するWarningは出ますが、一応ちゃんとimportされたので問題なさそうです。 今のところ問題なく使えています。

な、、、長かった、、、ç(=ω=`) ヨボヨボ

(2018/4/27 追記)

Pandasのインストールエラーの対処について、Qiitaの記事を見つけました。こちらのほうが参考になる可能性。

qiita.com

mirrordirector.raspbian.orgのエラー [Raspberrypi3, Raspbian Jessie]

久々にラズパイさんをいじっていたのですが、いろいろアップデートしているときに以下のようなエラー(リブートしてしまったためうろ覚え)でうまくいかず対処したので備忘録。

Could not resolve ‘mirrordirector.raspbian.org’
#一部のみ抜粋

対処方法

ググってたら同じような問題に対処している方を発見。

www.llul.info

以下、真似して実行。

$ sudo nano /etc/apt/sources.list

元々のファイルの中身。

deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspbian.org/raspbian/ jessie main contrib non-free rpi

一行目を#でコメントアウトして、以下の二行を追加。

deb http://ftp.jaist.ac.jp/raspbian jessie main contrib non-free
deb http://ftp.yz.yamagata-u.ac.jp/pub/linux/raspbian/raspbian/ jessie main contrib non-free

最終的に引用元の通りの全文になります。

その後、保存して以下を実行。

$ sudo apt-get dist-upgrade
$ sudo apt-get update

これで、とりあえずエラーは出なくなりました。

深層学習モデルの可視化ツールGrad-CAM

こんにちは。らずべりーです。

深層学習モデルについて勉強中です。 といっても、自分の写真を学習済みモデル(主にVGG16)に認識させて遊んでるだけですが。

VGG16というのは転移学習やFine-tuningなどによく使われている学習済みモデルで、Kerasから使えます。詳しい説明は以下のページを参照。

https://www.kaggle.com/keras/vgg16

In this work we investigate the effect of the convolutional network depth on its accuracy in the large-scale image recognition setting. Our main contribution is a thorough evaluation of networks of increasing depth using an architecture with very small (3x3) convolution filters, which shows that a significant improvement on the prior-art configurations can be achieved by pushing the depth to 16-19 weight layers. These findings were the basis of our ImageNet Challenge 2014 submission, where our team secured the first and the second places in the localisation and classification tracks respectively.

Google翻訳さん

本研究では、畳み込みネットワークの深さが大規模な画像認識設定におけるその精度に及ぼす影響を調べる。 私たちの主な貢献は、非常に小さい(3x3)畳み込みフィルタを備えたアーキテクチャを使用して、深度のネットワークを徹底的に評価することです。これは、深さを16-19の重さまで押し込むことによって従来技術の構成を大幅に改善できることを示しています。 これらの調査結果は、ImageNet Challenge 2014提出の基礎となりました。私たちのチームは、ローカリゼーションと分類のそれぞれで第1位と第2位を確保しました。

なんかすごそうですね。

このVGG16さんがどこを見ているのかわかる(?)ツールを見つけたのでご紹介。 Grad-CAMというらしい。

Grad-CAMとは?

あるものと判定された時に、どのあたりの情報が主に元になっているのかをヒートマップで可視化してくれるそうです。(もうちょっと込み入っているとは思いますが。)

↓元論文はコチラ

[1610.02391] Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization

詳しい原理は勉強中。このあたりのページで丁寧に解説してくれています。

blog.brainpad.co.jp

Grad-CAMの論文を流し読むurusulambda.wordpress.com

www.slideshare.net

む、、、難しい(~_~) ぼちぼち勉強します o(・`д・´。)

とりあえず使ってみる

学習済みモデルで試すだけなら、TorchまたはKerasで実装されたものを以下のサイトで提供してくれているのですぐに試せます。

  • Torch実装版。

github.com

  • Keras実装版。

github.com

ありがたやー。

自分で学習したモデルを使いたいなら、このプログラムのソースコードを元に書き直す必要がありそうです。

結構ハードルが高そうですが、頑張ればできなくもなさそうな(素人考え)。

Grad-CAMの使い方

Python&Keras派の私はとりあえずKeras実装版でお試し。

$ git clone https://github.com/jacobgil/keras-grad-cam.git

でダウンロードして、ターミナルでgrad-cam.pyファイルのあるフォルダ(keras-grad-cam)をカレントディレクトリにして

$ python grad-cam.py <path_to_image>

で完了です。<path_to_image>のところに画像のパスを手入力するか、Macならファイルをドラッグして画像のパスが入力されればOKです。実行するとkeras-grad-camフォルダの中にgradcam.jpgguided_gradcam.jpgという2つの画像ファイルが出力されます。

簡単ですね。素晴らしい。

Grad-CAMの結果

使ったのは、道端で見かけたたんぽぽの写真。

f:id:plant-raspberrypi3:20180420145658j:plain

VGG16での予測は

stone_wall (n04326547) with probability 0.35

縁石を認識してしまった模様(泣)

次に、植物だけ切り出したものも。

f:id:plant-raspberrypi3:20180420145829j:plain

VGG16での予測は

daisy (n11939491) with probability 0.62

同じキク科の花の名前が出てきて良い感じ。

では、いよいよGrad-CAMでVGG16さんがどのあたりを見ていたのかを探っていきます。

結果は、、、

f:id:plant-raspberrypi3:20180420150148p:plain

全体像では左下が赤くなっていて、そのあたりの縁石に注目してしまっていることがわかります。

切り出した写真ではたんぽぽの花に注目していたのですね。よくできました!

VGG16さんの気持ちがわかって楽しいので、今後もぼちぼち使っていきたいです。

プログラミング素人からのPython勉強方法のまとめ

こんにちは。らずべりーです。

とある知り合いにPythonについて尋ねられたときのお答えを自分メモとして一部改変して掲載。

セットアップ手順については過去のブログ記事を参照のこと。

plant-raspberrypi3.hatenablog.com

plant-raspberrypi3.hatenablog.com

Pythonの勉強方法

CheckiOである程度コードに慣れたあと、みんなのPythonという書籍で一通り勉強しました。

CheckiO

PythonJavascriptプログラミング練習用のウェブベースのゲームサイト。ある程度までは無料でできます。アニメーションが凝ってる。スマホで読み込むとちょっと重い。

py.checkio.org

www.procrasist.com

知識ゼロからググりながら無理やり書いて、正解までたどり着く宝探しゲームみたいな使い方をしてました。正解後に他の人のコードが見れるので「なるほどー。こういう書き方もあるのか。」というのを繰り返して遊んでいました。

みんなのPython

SBクリエイティブ:みんなのPython 第4版

本屋さんで色々見てみた中で、理解しやすさと実用性のバランスが一番よかったのでこれにしました。

基本的には行き帰りの電車と週末に取り組んで、CheckiO & みんなのPythonを1ヶ月くらいで終えたくらいのペースでした。

私はPythonを勉強し始めた時点では仕事でRを完全コピペで使っていた程度のプログラミング能力でしたが(<-全くプログラミングではない)、そんな人にもわかりやすかったです。

ちなみに、他言語でプログラミングをすでにしている人にもオススメみたいです。

suzuki.tdiary.net

以上です。

自前の写真をKerasで学習したい [4/18コード追記]

お久しぶりのらずべりーです。

本業の方で忙しすぎてなかなか更新できずorz

最近は画像の深層学習も比較的手軽にできるようになってきているみたいなので、ちょっとやってみたい!とKerasを導入してみたのですが、Kerasでの画像の取り扱い方法がわからず苦戦して挫折したので、そのあたりを日本語で解説してくれているページをメモ。

qiita.com

www.mathgram.xyz

このあたりを参考にさせていただいて、ぼちぼち取り組んでみたいなー(予定は未定)。

追記 [2018/4/18]

最終的にフォルダ分けを工夫して、ImageDataGeneratorflow_from_directoryを使いました。めちゃ楽!

公式ドキュメントは以下。

画像の前処理 - Keras Documentation

フォルダ分け

フォルダ構造は以下の通り。A, B, Cの3つに分類する場合。

f:id:plant-raspberrypi3:20180418114254p:plain

このフォルダにそれぞれのカテゴリの画像データを入れていくだけ。

コード全文

ちょっと長いですが。説明入りです。

参考にさせていただいたページは以下。

qiita.com

前述の公式ドキュメントを見ながら改変を加えました。モデルはすでに設定してあるものを使っているので別途設定が必要です。(このコードだけでは走りません。注意!)

from keras.preprocessing.image import ImageDataGenerator

img_row,img_col = 100,100 #読み込み時の画像サイズ

train_path = "train/" #trainフォルダのpath
test_path = "test/" #testフォルダのpath

#訓練用のデータのインスタンス
#各画素の情報を0-255から0-1に変換
#画像を歪ませたり拡大縮小したり回したり反転したりして増やす
train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
    rotation_range=180,
        horizontal_flip=True)

#テスト用データのインスタンス
test_datagen = ImageDataGenerator(rescale=1./255)

#フォルダーごとにカテゴリーに分けて訓練用のデータとして読み込めるようにする
train_generator = train_datagen.flow_from_directory(
        train_path,
        target_size=(img_row,img_col),
        batch_size=32,
        class_mode='categorical')

#同様の処理をテストデータにも
test_generator = test_datagen.flow_from_directory(
        test_path,
        target_size=(img_row,img_col),
        batch_size=32,
        class_mode='categorical')

#すでに設定してあるモデルに対して上記訓練データで学習してテストデータで評価
epochs = 20

history = model.fit_generator(
    train_generator,
    samples_per_epoch=300,
    nb_epoch=epochs,
    validation_data=test_generator,
    nb_val_samples=100)