「見ていると不安になる基板実装第一位」として有名なOrangePI PC2、有り体に言えば廉価版Raspberry PI3なのですが、ラズパイでOpenCV3でDNNができるんだからOrangePIでもDNNがしたい!のは当然の帰結です。なんかいろいろめんどかったので手順をまとめておきます。
Contents
動作環境
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を使ってみましょう。
以下の記事からモデルとソースコードをありがたくもらってきます:
上記記事のソースコードを、下記のように変換します。
- image = cv2.imread(args[“image”]) となっているところを ret, image = cap.read() に変更し、
- その直前に cap = cv2.VideoCapture(“/dev/video0”) でカメラをオープンする
- ret, image = cap.read() からcv2.imshow(“Output”, image)までをwhileループ化する
- 最後にcap.release() と cv2.destroyAllWindows() が実行されるようにする
すると、USBカメラの画像を連続的に分類できるようになります。
体感でいうと、
- 5秒ぐらいの遅延があり
- 1~2 FPSぐらいの速度で分類可能
です。CPUのみでシングルボードコンピュータでこれはすごいですね。
コメント