Raspberry Pi3でTensorflowのObject Detection APIを使えるようにしてみる


※この文書は個人用のメモです。

Object Detection APIをラズパイで使えるようにしてみる。
元ネタはこちら( https://github.com/EdjeElectronics/TensorFlow-Object-Detection-on-the-Raspberry-Pi )

使ったのはデバイスはRaspberry Pi 3B。
SDカードは8Gのものを使ったが、容量ギリギリなので16G以上を推奨する。


## OSの準備
ここ( https://www.raspberrypi.org/downloads/raspbian/ )からRaspbianのイメージをダウンロードし、SDカードを作成する。今回はRaspbian Stretch with desktop 2019-04-08を使用した。


## 最新の状態にアップデートする
```
$ sudo apt-get update
$ sudo apt-get dist-upgrade
```

## Tensorflowのインストール

```
$ sudo apt install libatlas-base-dev
$ pip3 install tensorflow
```
libatlasはNumpyが依存する線形代数ライブラリでtensorflowを入れる前に導入されている必要があるとのこと。aptでATLASを入れた後にpipでtensorflowをインストールする。使ったバージョンは1.13。

## 必要なライブラリのインストール

```
$ sudo apt install libxml2-dev libxslt1-dev
$ sudo pip3 install pillow lxml jupyter matplotlib cython
```
## OpenCVのインストール
先に必要なライブラリをインストールする。

```
$ sudo apt install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
$ sudo apt install libavcodec-dev libavformat-dev libv4l-dev
$ sudo apt install libxvidcore-dev libx264-dev
$ sudo apt install qt4-dev-tools
$ sudo apt install libswscale-dev
```
ライブラリをインストールしたらpipでOpenCVをインストールする。

```
$ pip3 install opencv-python
```

## protocolbuffersをインストール
最初に必要なツール類をインストールする。

```
$ sudo apt install autoconf automake libtool curl
```
protocolbufferのソースコードを取得する。

```
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/protobuf-all-3.7.1.tar.gz
```
取得したファイルを展開する。

```
$ tar -zxvf protobuf-all-3.7.1.tar.gz
$ cd protobuf-3.7.1
```
ビルドする。ビルドにはかなり時間がかかる（数時間くらい）

```
$ ./configure
$ make 
$ make check
```
終わったらインストールする。

```
$ sudo make install
```

ライブラリのパスを設定し、pythonのモジュールをインストールする。

```
$ cd python
$ export LD_LIBRARY_PATH=../src/.libs
```
```
$ python3 setup.py build --cpp_implementation 
$ python3 setup.py test --cpp_implementation
$ sudo python3 setup.py install --cpp_implementation```
```

環境変数を設定する。

```
$ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp
$ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION=3
```
ライブラリのパスを更新する。

```
$ sudo ldconfig
```

``protoc``とコマンドプロンプトから入力し、正常に実行できればOK。
ここで一度再起動を行う。

```
$ sudo reboot
```

## Tensor Flowのディレクトリ構造の作成と環境変数の設定
home directoryの直下にtensorflow用のディレクトリを作成する。

```
$ mkdir tensorflow
$ cd tensorflow
```

Tensorflowのレポジトリからgit cloneする。

```
git clone --recurse-submodules https://github.com/tensorflow/models.git
```

cloneが終わったら``.bashrc``に以下のパスを追記する。

```
export PYTHONPATH=$PYTHONPATH:/home/pi/tensorflow/models/research:/home/pi/tensorflow/models/research/slim
```
変更したら、一度シェルを抜けて再度入りなおし、設定を有効にする。

Object Detection APIのprotoファイルをコンパイルする。

```
cd /home/pi/tensorflow/models/research
protoc object_detection/protos/*.proto --python_out=.
```

終わったらカレントディレクトリを移動し学習済みデータをダウンロードする。

```
cd /home/pi/tensorflow/models/research/object_detection
wget http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz
tar -xzvf ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz
```

## 動作テスト
参考情報のURLからテスト用プログラムをダウンロードし、実行してみる。

```
wget https://raw.githubusercontent.com/EdjeElectronics/TensorFlow-Object-Detection-on-the-Raspberry-Pi/master/Object_detection_picamera.py
```

ダウンロードしたら以下のコマンドを入力し、実行してみる。
正常に動作したらOK。

``python3 Object_detection_picamera.py --usbcam``

※内蔵カメラを使う場合はオプションをとること。



### 参考情報
https://github.com/EdjeElectronics/TensorFlow-Object-Detection-on-the-Raspberry-Pi
https://qiita.com/hidakanoko/items/5292ca79e3ff53867e40
https://www.amelt.net/imc/programming/python/4942/
https://github.com/protocolbuffers/protobuf