MobileNetV2-SSDLiteの前処理・後処理などの一部をC++共有ライブラリ化してPythonからコールする

# 1. Introduction
自分用の開発メモです。 RaspberryPi4のディープラーニングプログラムの前処理と後処理を部分的に高速化するために Python から C++ の共有ライブラリをコールする方法を学んだ結果を書き留めます。 今回は **`boost_python3`** というライブラリを使用してPython実行用の共有ライブラリを作成します。 ヘッダファイルのインクルードと共有ライブラリ間の依存関係を調べるために少しだけ時間を要しますが、対象が分かってしまえばものすごく簡単に実施できました。

# 2. Environment

- RaspberryPi4 Ubuntu 19.10 aarch64 (eoan)
- 作業用PC Ubuntu 18.04 x86_64 (bionic)
- OpenCV 4.2.0 (self-build)
- libboost-python-dev 1.67.0.2

# 3. Procedure
## 3-1. Tutorial implementation
環境の下準備

```console:Install_boost-python
$ sudo apt-get update
$ sudo apt-get install libboost-all-dev python3-dev
```

味見プログラムの作成

```console:
$ nano CModule.cpp
```

```cpp:CModule.cpp
#include <boost/python.hpp>

std::string hello() {
    return "hello world";
}

BOOST_PYTHON_MODULE(CModule) {
    using namespace boost::python;
    def("hello", &hello);
}
```

味見プログラムのコンパイル

```console:compile
$ g++ -I/usr/include/aarch64-linux-gnu/python3.7m \
      -I/usr/include/python3.7m \
      -DPIC \
      -shared \
      -fPIC \
      -o CModule.so \
      CModule.cpp \
      -lboost_python3
```

Pythonから味見用共有ライブラリ(CModule.so)の呼び出しテスト

```console:test
$ python3
>>> import CModule
>>> CModule.hello()
'hello world'
```

## 3-2. Pre-processing test implementation and operation verification
前処理用のプログラムをC++で簡易実装

```console:Edit
$ nano preprocessing.cpp
```

```cpp:preprocessing.cpp
#include <string>
#include <stdio.h>
#include <boost/python.hpp>
#include <opencv2/opencv.hpp>

void resize_and_normalize(std::string image_file, int width, int height) {
    cv::Mat image = cv::imread(image_file, 1), prepimage;
    cv::resize(image, prepimage, cv::Size(width, height));
    cv::imshow("InputImage", prepimage);
    cv::waitKey(0);
}

BOOST_PYTHON_MODULE(preprocessing) {
    using namespace boost::python;
    def("resize_and_normalize", &resize_and_normalize);
}
```

作成した前処理用プログラムをコンパイル
共有ライブラリ(.so) が生成される

```console:compile_ubuntu1910_aarch64
$ g++ -I/usr/include/aarch64-linux-gnu/python3.7m \
      -I/usr/include/python3.7m \
      -I/usr/local/include/opencv4 \
      -DPIC \
      -shared \
      -fPIC \
      -o preprocessing.so \
      preprocessing.cpp \
      -lboost_python3 \
      -L/usr/local/lib \
      -lopencv_core \
      -lopencv_imgcodecs \
      -lopencv_highgui
```

```console:compile_ubuntu1804_x86_64
$ g++ -I/usr/include/x86_64-linux-gnu/python3.6m/ \
      -I/usr/include/python3.6m \
      -I/opt/intel/openvino_2019.3.376/opencv/include \
      -DPIC \
      -shared \
      -fPIC \
      -o preprocessing.so \
      preprocessing.cpp \
      -lboost_python3 \
      -L/opt/intel/openvino_2019.3.376/opencv/lib \
      -lopencv_core \
      -lopencv_imgcodecs \
      -lopencv_highgui
```
![Screenshot 2020-02-06 18:08:23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194769/9f63238a-ef84-0d91-cd8b-e6ca96b16d58.png)

テスト用Pythonプログラムの作成

```console:Edit
$ nano test.py
```

```python:test.py
import preprocessing
preprocessing.resize_and_normalize("dog.jpg", 300, 300)
```

```console:Execution
$ python3 test.py
```

![Screenshot 2020-02-06 18:05:15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194769/4632c6d7-fa4d-5eb1-7ed0-f1af28365ed6.png)

# 4. Reference articles

1. **[ubuntuでC++をpython3に公開する - Qiita - mink0212さん](https://qiita.com/mink0212/items/5a429bdc70bef2245413)**
2. **[C++ で Python 用ライブラリーを作成する](https://www.xsim.info/articles/BoostPython/How-to-make-Python-module-with-BoostPython.html)**
3. **[Python Tips：ライブラリ・モジュールの場所を調べたい](https://www.lifewithpython.com/2014/07/python-get-location-of-libraries-modules-packages.html)**
4. **[Linux共有ライブラリの簡単なまとめ](https://www.wagavulin.jp/entry/20091026/1256577635)**
5. **https://stackoverflow.com/questions/51308292/swig-linker-undefined-symbol-zn2cv8fastfreeepv-cvfastfreevoid**
6. **[cv::Matの基本処理](https://book.mynavi.jp/support/pc/opencv2/c3/opencv_mat.html)**
7. **[CV_Assert, CV_DbgAssert, CV_StaticAssert](https://qiita.com/dandelion1124/items/b80cd4378462f88e34b6)**
8. **[画像処理で2重ループをなるべく書くな - Qiita - nonbiri15さん](https://qiita.com/nonbiri15/items/9d4296b3a79fad38bf76)**