ラズパイで物体認識(SSD_Keras)のテストコードが稼働するまでに行ったダメだったこと＆うまく行ったコマンド履歴等の記録メモ

![IMG_0673.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232287/ba4ec41a-bc76-3f0f-ae96-833dd0ea4407.jpeg)
動いた時の様子。筐体はレゴです。

# はじめに

自分は普段はDjango/PythonでサーバーサイドAPIなど作ったりが主で、機械学習の専門ではないですが、夏休みを利用して電子工作にチャレンジした記録です。出会ったエラーなどの記録が誰かのお役に立つ可能性もあるかもしれないと思い、投稿しました。これは、自分がラズパイで物体認識(SSD_Keras)のテストコードが稼働するまでに行ったコマンド履歴等の手順メモです。  
  
うまく行かなかったときのコマンドも感想と共に一応掲載することで、だれか詰まった時の参考になるべくなるように記載を試みています。（最初マニュアルっぽく書こうとしましたが、エラー解決などすっきりかけない部分もあるため、日記っぽい部分も出てしまってます。そこは専門家ではないのですみません。）

結果としては、先達の皆様の記事によって無事動きましたので、その参考にした記事も末尾に記載しております。 


#使った機材

・ラズパイ3b+  
・miniSDカード(SUNDisk製32GB)  
です。
・Webカメラ(バッファローやや低画質気味。)
・ディスプレイはKuman3.5インチ、ラズパイのケース自体は、他のディスプレイに付属していたものです。
・筐体はレゴ
・電源は、最終的には自動車用のシガーソケットからのUSB電源供給5V/2.4Aの装置（車に載せて稼働させたかったので、後述します）

# 手順

## 1.OSインストール 

ラズパイのOSは、現時点でRaspbianの最新のものをセットアップしました。
初めてセットアップする方は下記の記事がよさそうです。単にminiSDカード（自分は32GB使いました）に指定のファイルをコピペして、ラズパイにさして、電源を入れたら終わりなので、気楽に取り組んでみてください。

Raspberry PiにNOOBSでOSをインストールする方法
https://raspida.com/raspixnoobs

そしてOSセットアップ完了したら、いよいよコマンドを打っていきました。

## 2.必要パッケージのインストール等　

### エピソード1:python3で頑張るもあきめる（エピソード2で別方法で挽回）

python3系でやや粘って、python2系で動いた記事を見たため、とりあえず稼働が目標なのでpython2系で動かしました。

コンソールを開きます。
まずはtensorflowのインストールまで行います。
なお、pip3,python3のコマンドで動いたデフォルトのpython3.7.1で進めております。


```
$ sudo apt-get update
$ sudo apt-get upgrade
```

tensorflowを入れようとしましたが失敗です。ラズパイとtensorflowの正式サポートでpipインストール楽になったよという記事があったのですが、このコマンドではうまく行きませんでした。あとで調べたらpython3.4ならよかったのか…3.7で進めたのがダメだった可能性です。先にpyenvなりをいつものように入れればよかったなぁ。

ようやくTensorFlowがRaspberryPiを正式にサポート
https://uepon.hatenadiary.com/entry/2018/08/11/140334

```
$ sudo apt install libatlas-base-dev
$ pip3 install tensorflow
```
hash error というのが出現

下記参考記事のコメントにちょこちょこラズパイのことも書いてある。python3.4でまた今度すんなりいくか試してみてもう少し原因解析しようかな…
https://github.com/pypa/pipenv/issues/2540

今回は、hashエラーはちょっと放置して、他の方法を探しました。

TensorFlowの公式サイトをまじまじと見ると、ラズパイ用のソースが示されている。
https://www.tensorflow.org/install/pip

ここから、再びインストールを試みました。

```
$ wget https：//storage.googleapis.com/tensorflow/raspberrypi/tensorflow-1.14.0-cp34-none-linux_armv7l.whl

$ sudo pip3 install tensorflow-1.14.0-cp34-none-linux_armv7l.whl
```

またもerror...
'cp34'　のところが怪しい。あとで調べたらやはりpythonは3.4でないとダメな可能性が高い…自分のバージョンはpython3.7だもんな...だからか...

このあたりでpython3&tensorflow　をラズパイで動かす環境構築で他の方策がないか調べたら、下記の記事でpython2ならSSD_KerasというKerasを使ったモジュールでリアルタイム画像検出ができるみたいですね、ということでそれで行ってみよう。と思い、再起。

下記が、以下の手順で参考にさせていただいたありがたい記事です。

Raspberry PiでSSD_Kerasを使った物体検出にチャレンジ！！
https://ai-coordinator.jp/raspberry-pi-ssd-keras

Raspberry PiとTensorFlowを使ったディープラーニングの開発環境構築
https://karaage.hatenadiary.jp/entry/2017/08/09/073000

映像からの物体検出（SSD_Keras）に挑戦 for ubuntu
https://ai-coordinator.jp/ssd_keras-ubuntu

### エピソード2 python2系でセットアップ（無事動く）

ここから、openCV導入までのコマンドは、

先述の、からあげさんのRaspberry PiとTensorFlowを使ったディープラーニングの開発環境構築
https://karaage.hatenadiary.jp/entry/2017/08/09/073000

で、しっかりインストールできたので、それの引用となります。各コマンドの検証結果の報告になります。

まずswapfileというという部分を書き換えて、

vim(がない場合は sudo apt-get install vim でいれときます。) 

dphys-swapfile 100になっている部分を、1024へ

書き換え前

```
/etc/dphys-swapfile 100
```

書き換え後

```
/etc/dphys-swapfile 1024
```

これをしておかないと、上記記事群によると機械学習モジュールが重いせいか固まることがあるらしいです。

tensorflowを入れる工程です。

```
$ sudo apt-get install python-pip python-dev
$ sudo wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.1.0/tensorflow-1.1.0-cp27-none-linux_armv7l.whl
```
sudo 忘れると一度エラー出たのでご注意ください。

```
$ sudo pip install tensorflow-1.1.0-cp27-none-linux_armv7l.whl
$ sudo pip uninstall mock
```

ここで、すんなりいくかと思いきや、エラーで「mockはない」と返ってきたのでとりあえずそのまま。次のコマンドを入れてみると、、、

```
$ sudo pip install mock
```

もう入ってるよと返ってきた・・・さっきはないって言ったじゃん。謎・・・　ラズパイOSバージョンのせいか・・・！？もういいや。そのまま次に行く。(次に行って結果大丈夫でした。)

```
$ sudo apt-get install python-imaging
```

エラーがでたけど、とりあえずOpenCVが入れば問題なかろうということで、一旦放置で次に行く。嫌な予感がするが・・・（結果、放置で大丈夫でした）

```
$ sudo apt-get install libopencv-dev
```
すんなりOK。一安心。いざOpenCVインストールへ。

```
$ sudo apt-get install python-opencv
```
OK。無事インストールできました。ここで、pythonで確認コマンド

```
>>>import tensorflow
>>>import cv2
>>>
```
と、でればOK。問題ないです。

最後にkerasを入れれば環境構築は完了・・・

```
$ sudo pip install keras
```

Keras入れてたらラズパイがフリーズ。やりなおし。
scipyインストール段階でおっそいので中断。

からあげさんの前述の記事に短縮コマンドが記載あったのでそれを素直に打つとkerasも素直に入りました...急がば回れでした…

```
$ sudo apt-get install python-scipy
```
すぐ終わる

```
$ sudo apt-get install python-h5py
```
すぐ終わる

```
$ sudo pip install keras==1.2.2
```
kerasはSSD_Kerasが動くと確認できているバージョン指定が必要です！ご注意を・・・
インストール自体は、すぐ終わる。さっきのはなんだったんだ。。。

### 環境構築完了後、SSD_Kerasを入れて動かす。

SSD_kerasを入れます。

ここからは、前述の参考記事です。コード部分は一部下記記事の引用となります。

映像からの物体検出（SSD_Keras）に挑戦 for ubuntu
https://ai-coordinator.jp/ssd_keras-ubuntu

```
$ git clone https://github.com/rykov8/ssd_keras.git
```

下記から学習済みモデルを持ってきます。
https://github.com/rykov8/ssd_keras

hereを開いたのちの"weights_SSD300.hdf5"
というファイルです。oldの方ではないので注意ください。

ssd_keras/testing_utils/videotest.pyの87行目のコードがエラーでちゃうので書き換えます。

```
vidw = vid.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)
vidh = vid.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)
```

下記のように書き換えます。

```
vidw = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
vidh = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
```

あとは、ssd_keras/testing_utils/videotest_example.py
のパスをWebカメラを指定します。USBは空きのどこにさしてもOKです。0がWebカメラの指定場所になるので、int(0)と記載しておけばOKです。

```	
vid_test.run('path/to/your/video.mkv')
```

ここを

```	
vid_test.run(int(0))
```
こうしておきました。これで動きました。intつけなくてもいいかな…まあこれで動いたという報告なので、int(0)にして動いたことを報告します。

# いざ実行

やっとここまできましたね～　時間かかりました。

```
$ cd ssd_keras/testing_utils/videotest_example.py
$ python videotest_example.py
```

# 結果

fps1と体感はかなりおそいですが、ちゃんと1フレームごとに物体認識・タグ付けをしています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">fps1のスピードですが、ラズパイで、リアルタイム物体認識できました(^^) わーい(^^) 冷やさないとすぐ熱くなり計算スピード落ちました。夜はこれを持ち運びできるようにします(^^)（ちょっと掃除しても機材多すぎて無駄な抵抗でした…） <a href="https://twitter.com/hashtag/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4?src=hash&amp;ref_src=twsrc%5Etfw">#ラズパイ</a> <a href="https://t.co/P25AF9tCzs">pic.twitter.com/P25AF9tCzs</a></p>&mdash; mawa (@k_mawa82) <a href="https://twitter.com/k_mawa82/status/1161913728268324865?ref_src=twsrc%5Etfw">August 15, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# おまけ

車に搭載してみましたが、ディスプレイが小さいので、ちょっとうまくタグ付けがしっかりされている様子は撮影できませんでしたのニュアンスだけの報告ですが、車のシガーソケット電源5V/2.4Aでしっかりラズパイ上でテストコードは動きました。

https://www.youtube.com/watch?v=TUkRWpICl8Y

# 参考・引用になった資料（再掲）

Raspberry PiでSSD_Kerasを使った物体検出にチャレンジ！！
https://ai-coordinator.jp/raspberry-pi-ssd-keras

Raspberry PiとTensorFlowを使ったディープラーニングの開発環境構築
https://karaage.hatenadiary.jp/entry/2017/08/09/073000

映像からの物体検出（SSD_Keras）に挑戦 for ubuntu
https://ai-coordinator.jp/ssd_keras-ubuntu