2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenCVAdvent Calendar 2016

Day 2

OpenCVをMIPSで走らせてみた

Last updated at Posted at 2016-12-01

はじめに

これは、OpenCV Advent Calendar 2016 2日目の記事です。関連記事は目次にまとめられています。

世界の果てまでitteQ OpenCV

昔から考えてたことに、**一体どんな変態的なプラットフォームでOpenCVを動かすことができるのだろう?**という興味がありました。
もともとARMデバイスでは数多くの成功例が報告されていましたが、この度MIPSのボード Imagination Creator CI20 を手に入れたので、その上でOpenCVをコンパイル、走らせてみました
ci20-speed.png
CI20

ちなみに、OpenCVを走らせる事自体は色んな方が試されているので、そういう意味では二番煎じなのですが、せっかくなのでAdvent Calendar に投稿してみます

クロスコンパイルとネイティブコンパイルについて

本題に入る前に、クロスコンパイルとネイティブ(?)コンパイルについて触れておきます。
通常、組み込みボード上での開発を行う場合、組み込みボードをターゲットシステム、それを制御、管理するパソコンをホストシステムと呼びます。
ターゲットシステムは組み込みなので、一般的にPCとはアーキテクチャが違い、ホストマシンのプログラムを直接ターゲットシステムに転送しても実行することはできません。
これを回避するには2つ方法があって、

  • クロスコンパイルによって違う命令セットのバイナリを生成する
  • ターゲットシステム上でコンパイルする

という方法があります。従来は前者が多かったのですが、近年はRaspberry Pi や CI20、Jetson、ODROIDなど、数々の組み込みボードが普通にLinuxを走らせられるようになっていることが多く、最近ではOpenCVをターゲットシステム上で直接コンパイルする機会も増えました

crossCompile.png
nativeCompile.png

なお、OpenCV自体はクロスコンパイルを念頭に入れてcmakeが設計されており、platforms以下を覗くとクロスコンパイル用の設定ファイルが転がっていたりします
platforms.png

それを流用すれば良いのですが、実際のところ、ARM用のコンパイラに対してSSEのオプションを渡す、64bit対応がされてない、などの細かな不具合がちらほらあり、そこそこの手修正が必要になります。なので可能であればネイティブに、開発ボード上でビルドするほうが幸せになれるでしょう。

セットアップ

cmakeやgitなどを入れます。Debianがインストールされているので、aptでインストールできます

ビルド

ビルド自体は通常のプロセスです

#cloneします
ci20@ci20:~$ git clone git@github.com:opencv/opencv.git opencv-fork

#3.1をチェックアウトします
ci20@ci20:~$ cd opencv-fork/
ci20@ci20:~/opencv-fork$ git checkout -b Branch_3_1_0 3.1.0
Switched to a new branch 'Branch_3_1_0'
HEAD is now at 92387b1 Fix java version++

#cmakeでMakefileを作ります
ci20@ci20:~/opencv-fork$ mkdir build
ci20@ci20:~/opencv-fork$ cd build/
ci20@ci20:~/opencv-fork/build$ time cmake ../

#ビルドします
ci20@ci20:~/opencv-fork/build$ time make -j 2 all
(中略)

real	209m34.010s
user	382m10.530s
sys	20m58.980s

**209分!?3時間半!?**とかすごい数字が表示されてます。

テスト

重めの処理、opencv_perf_imgprocを実行してみます

ci20@ci20:~/opencv-fork/build$ time ./bin/opencv_perf_imgproc
(中略)
real    415m12.056s
user    495m1.930s
sys     14m45.530s

サクッと書いてますが、415分、ということはざっくり7時間ぐらいかかります

実行してみての感想

CI20には、1.2GHzとは言え、SIMDも無い2コアのCPUが乗っています。また、GPUとしてPowerVR SGX540が乗っていますが、惜しむらくはPowerVRは SGX544からOpenCL対応となっており、SGX540ではOpenCL(UMat)の恩恵も得ることができません。
つまりは、2コアのみで単純にPixel-by-Pixelの処理をする他なく、非力と言わざるを得ません。同様に組み込みの、安価なRaspberry Pi 3 などと比較してみても以下のようなパフォーマンス差です

機種 perf_impgrocの実行時間 値段
Raspberry Pi 3 92m52.330s 約50$
CI20 415m12.056s 約50£(65$)

この比較は、アーキテクチャもコア数もクロック周波数も違うので、直接的には意味のない比較ですが、処理性能/値段という意味ではあまり画像処理向きではない、という感覚が分かって貰えるかと思います。

もっとも、Creator CI20 は後継のCI40が発表されており、CI20/CI40ともに、製品紹介のページにはCloud ConnectとかIoTみたいなキーワードが散りばめられております。なので、どちらかと言うと、ターゲットが組み込みのIoT、つまり重い処理はバックグラウンドに投げる想定をしており、むしろこのCPUにはそこまで期待してはいけない、ということなのかも知れません。

終わりに

本来、CI20を購入したきっかけはMIPSのSIMD命令、MSAをOpenCVに組み込んで、PRの数を稼ごうと思っていたから、なのですが購入して知ったのはCI20のCPU、XBurst はSIMD命令非対応だったという事です (買う前に気づけよ、と突っ込みたかった)。

というわけで、OpenCVをビルドしただけの記事でしたが、Advent Calendar の1日を埋めてみました。3日目はfukushima1981先生の記事で「OpenCV完全体コンパイル難易度ランキング」です。お楽しみに!

備考

筆者は以下の環境で試しました

  • CI20 (MIPS 32bit)
  • OpenCV 3.1.0
  • Debian 8.6
  • cmake 3.0.2
  • gcc 4.9.2
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?