「見ていると不安になる基板実装第一位」として有名なOrangePI PC2、有り体に言えば廉価版Raspberry PI3なのですが、ラズパイでOpenCV3でDNNができるんだからOrangePIでもDNNがしたい!のは当然の帰結です。なんかいろいろめんどかったので手順をまとめておきます。

動作環境

OSはUbuntu 16.04。Orange PI PC2用のイメージは下記ページからダウンロードします。

OpenCVは3.4.2と3.3.0のビルドに成功しました。

手順1. 領域の確保

ディスク領域

以下の記事の手順にしたがって、microSDカードの全体を使えるようにしておきましょう。僕は32GBのmicroSDカードを使いました。

スワップ領域

OrangePI PC2は1GB RAMを持っているとはいえ、OpenCVのビルド時にはメモリが足りなくなるのでスワップ領域を作っておきます。

まず、 sudo cat /proc/swaps で現在のスワップ領域を確認します:

Filename                                Type            Size    Used    Priority

なにも表示されないと思います。以下のコマンドで、2GB分のスワップ領域を作ります。

$ sudo mkdir /swap
$ sudo chmod -R 0600 /swap
$ sudo dd if=/dev/zero of=/swap/swap1 bs=1M count=2048
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 159.885 s, 13.4 MB/s

$ sudo mkswap /swap/swap1
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=bfd8d247-b89c-40cc-86e6-b1ab250ef240

$ sudo swapon /swap/swap1
swapon: /swap/swap1: insecure permissions 0644, 0600 suggested.

$ sudo cat /proc/swaps
Filename                                Type            Size    Used    Priority
/swap/swap1                             file            2097148 0       -1

手順2: 依存パッケージのビルド

httpsをサポートしたcmakeをビルドするためにcurlをsslオプション付きでビルドします。

まずはお決まりのアップデートから

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install build-essential

numpyも必要なので入れておきます。

$ sudo apt-get install python3-pip python3-dev
$ sudo apt-get install python3-numpy

curlのビルド

$ sudo apt-get remove cmake
$ sudo apt-get remove curl
$ sudo apt-get install zlib1g
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install libssl-dev
$ wget https://curl.haxx.se/download/curl-7.61.0.tar.gz
$ tar zxvf curl-7.61.0.tar.gz
$ cd curl-7.61.0
$ ./configure --with--ssl
$ make
$ sudo make install
$ sudo ln -s /usr/local/bin/curl /usr/bin/curl

cmakeのビルド

$ wget https://cmake.org/files/v3.12/cmake-3.12.0.tar.gz
$ tar zxvf cmake-3.12.0.tar.gz
$ cd cmake-3.12.0
$ ./configure --prefix=/home/username/cmake-3.12.0 --system-curl
$ make -j1
$ sudo make install
$ vi ~/.bashrc
# 以下の行を追記
# export PATH=/home/username/cmake-3.12.0/bin:$PATH

これで準備ができました。

手順3: OpenCV3のビルド

以下は3.4.2の場合です。他のバージョンはバージョン名の数字を変えてください。

$ wget https://github.com/opencv/opencv/archive/3.4.2.tar.gz
$ tar zxvf 3.4.2.tar.gz
$ rm 3.4.2.tar.gz
$ wget https://github.com/opencv/opencv_contrib/archive/3.4.2.tar.gz
$ tar zxvf 3.4.2.tar.gz
$ rm 3.4.2.tar.gz

$ mkdir opencv-3.4.2/build
$ cd opencv-3.4.2/build/

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.3/modules \
    -D PYTHON_DEFAULT_EXECUTABLE=$(which python3) \
    -D BUILD_opencv_python2=ON \
    -D BUILD_opencv_python3=ON \
    -D WITH_OPENCL=OFF \
    -D WITH_OPENGL=ON \
    -D BUILD_TBB=OFF \
    -D WITH_CUDA=OFF \
    -D BUILD_EXAMPLES=OFF ..

$ make -j1
$ sudo make install
$ sudo ldconfig

以上です。ビルドは数時間かかるので気長に待ちましょう。

USBカメラを使って分類テスト

テストのため、計量な分類モデルとして定評のあるMobileNetSSDを使ってみましょう。

以下の記事からモデルとソースコードをありがたくもらってきます:

上記記事のソースコードを、下記のように変換します。

  1. image = cv2.imread(args[“image”]) となっているところを ret, image = cap.read() に変更し、
  2. その直前に cap = cv2.VideoCapture(“/dev/video0”) でカメラをオープンする
  3. ret, image = cap.read() からcv2.imshow(“Output”, image)までをwhileループ化する
  4. 最後にcap.release() と cv2.destroyAllWindows() が実行されるようにする

すると、USBカメラの画像を連続的に分類できるようになります。

 

体感でいうと、

  • 5秒ぐらいの遅延があり
  • 1~2 FPSぐらいの速度で分類可能

です。CPUのみでシングルボードコンピュータでこれはすごいですね。

関連記事

How to build kernel modules in armbian

Orangepi PC2でarmbianでlibrealsense、しちゃいましてね

Orangepi PC2でMovidius Neural Compute Stickを使う

さくらvpsでNEMスーパーノード構築 その4

さくらvpsでNEMスーパーノード構築 その3

blender addonのデバッグTips

コメント

コメントを返信する

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です