RasPi：　Tensorflow&Kerasで物体認識！

なんだろね？？

この大変さは。。。
つまり、ディストリビューションによってDependency異なるからかな？？

とにかく、今回はRasPiにTensorflowとKeras構築して、物体認識まで実施できるようにしよう！！
※何がおいしいかは別として、。。。

ということで、まず
###環境（普段書かないけどここは最重要な要素）

```
$  lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 8.0 (jessie)
Release:	8.0
Codename:	jessie
```
jessieでした。そして、。。

```
$ cat  /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
```
Debianでした。。。

【参考】
１．[https://qiita.com/ekzemplaro/items/553db4c229632af79607](https://qiita.com/ekzemplaro/items/553db4c229632af79607)
２．[pip 10 and apt: how to avoid “Cannot uninstall X” errors for distutils packages](https://stackoverflow.com/questions/49932759/pip-10-and-apt-how-to-avoid-cannot-uninstall-x-errors-for-distutils-packages)
参考２は、なんでという参考ですが、あまりに途中で挫折するので、この「--ignore-installed」を使いました。
３．[samjabrahams/tensorflow-on-raspberry-pi](https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases)
*参考３から以下のtensorflow-1.1.0-cp34-cp34m-linux_armv7l.whlをダウンロード；wgetがうまくいかなかったので、直接ダウンロードしました。*

```
$ sudo pip3 install tensorflow-1.1.0-cp34-cp34m-linux_armv7l.whl --ignore-installed
...
   100% |████████████████████████████████| 573kB 955kB/s 
Installing collected packages: setuptools, six, protobuf, wheel, werkzeug, numpy, tensorflow
Successfully installed numpy-1.14.3 protobuf-3.5.2.post1 setuptools-39.1.0 six-1.11.0 tensorflow-1.1.0 werkzeug-0.14.1 wheel-0.31.1
```

```
$ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>> 
```
つまり、*python3でTensorflow動いた*みたい！

そして次は、いわゆるKerasのインストレーションガイド
[https://keras.io/#installation](https://keras.io/#installation)にしたがって、Kerasを導入します。

```
$ git clone https://github.com/keras-team/keras.git

$ cd keras
$ sudo python setup.py install
```
その結果、めでたく最終行まで到達できましたが、。。。

```
EOF
Traceback (most recent call last):
  File "setup.py", line 62, in <module>
    packages=find_packages())
...
  File "/tmp/easy_install-ISLDx3/numpy-1.14.3/numpy/distutils/command/build_src.py", line 257, in build_npy_pkg_config
AttributeError: 'NoneType' object has no attribute 'append'
```
最後に一言エラーが、。。。ここは。。。無視。。。

```
$ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "keras/__init__.py", line 3, in <module>
    from . import utils
。。。
  File "keras/backend/tensorflow_backend.py", line 5, in <module>
    import tensorflow as tf
ImportError: No module named tensorflow
```
やっぱりだめかな？？でもpython2.7系だから。。。

```
$ pip install tensorflow
```
python2.7用にTensorflowを入れてみる。。

```
$ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named tensorflow
```
やっぱり、だめかな？？でも、Tensorflow入れたのは３系。。。

```
$ sudo python3 setup.py install
```
そして、python3系のKerasのsetup。。。そして、動くかな？？

```
$ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
>>> 
```
やっと出来た！！
*python3.4系でkeras＆Tensorflowが動きました*
しかし、いわゆる物体認識？？

```
$ python3 videotest_example_alt2.py
Using TensorFlow backend.
Traceback (most recent call last):
  File "videotest_example_alt2.py", line 16, in <module>
    model = SSD(input_shape, num_classes=NUM_CLASSES)
。。。
TypeError: l2_normalize() got an unexpected keyword argument 'axis'
```
エラー。。。
そして、ほぼ基本のアプリは？？

```
$ python3 cifar10_cnn.py
Using TensorFlow backend.
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170500096/170498071 [==============================] - 678s 4us/step
x_train shape: (50000, 32, 32, 3)
50000 train samples
10000 test samples
Traceback (most recent call last):
  File "cifar10_cnn.py", line 132, in <module>
    model.add(Activation('softmax'))
  File "/usr/local/lib/python3.4/dist-packages/Keras-2.1.6-py3.4.egg/keras/engine/sequential.py", line 187, in add
。。。
  File "/usr/local/lib/python3.4/dist-packages/Keras-2.1.6-py3.4.egg/keras/backend/tensorflow_backend.py", line 3121, in softmax
TypeError: softmax() got an unexpected keyword argument 'axis'
```
うーん、辛い。。。やばいかも？？

[TensorFlow Models の使い方](https://qiita.com/ekzemplaro/items/9260aa0df5bc98af26b8)
これが最後の救いになりました！！
※中身は実はまだ理解していませんが、物体認識してます

そして、。。。

```
git clone https://github.com/tensorflow/models.git
Cloning into 'models'...
remote: Counting objects: 17204, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 17204 (delta 2), reused 2 (delta 2), pack-reused 17200
Receiving objects: 100% (17204/17204), 469.72 MiB | 728.00 KiB/s, done.
Resolving deltas: 100% (10196/10196), done.
Checking connectivity... done.
Checking out files: 100% (2208/2208), done.
```

そして、以下のパンダを。。
![cropped_panda.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/43b1edfc-2824-1e8c-d5bf-0bb528b7b999.jpeg)

```
$ cd models/tutorials/image/imagenet
$ python3 classify_image.py
>> Downloading inception-2015-12-05.tgz 100.0%
Successfully downloaded inception-2015-12-05.tgz 88931400 bytes.
2018-05-21 00:37:19.725433: W tensorflow/core/framework/op_def_util.cc:332] Op BatchNormWithGlobalNormalization is deprecated. It will cease to work in GraphDef version 9. Use tf.nn.batch_normalization().
giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89107)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00779)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00296)
custard apple (score = 0.00147)
earthstar (score = 0.00117)
```
パンダ成功！！

イチゴは？？
![strawberry.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/88bc2d8d-b293-54ad-6e9a-53ee3edf17b2.jpeg)

```
$ python3 classify_image.py --image_file  ~/Downloads/strawberry.jpg 
strawberry (score = 0.97967)
banana (score = 0.00068)
Leonberg (score = 0.00047)
ringneck snake, ring-necked snake, ring snake (score = 0.00047)
German shepherd, German shepherd dog, German police dog, alsatian (score = 0.00046)
```

![apple.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/f3cbae45-32aa-520d-e74c-68ae5fb645fd.jpeg)

```
$ python3 classify_image.py --image_file  ~/Downloads/apple.jpg 
orange (score = 0.23259)
Granny Smith (score = 0.22256)
banana (score = 0.05309)
pomegranate (score = 0.04968)
strawberry (score = 0.01616)
```
リンゴはダメっぽい、。。。リンゴは無いんだよね？？
日本じゃな地味だけど、ほかの国（米国）じゃ学習していないと思われる。
たぬきと一緒。。。

###まとめ
・RasPiにTensorflow&Kerasをインストールできた
・物体認識アプリが動かせた

・素性を理解して、利用できるようにしよう
　inception-2015-12-05みたいなので中を調べて、再学習してみよう