JetsonTX2でOpenCVをビルド

発端

ChainerCVのチュートリアル*1をJetson TX2で試したところ、「OpenCVが入ってないから処理時間かかるよ」みたいなWarningが表示された。
「OpenCV4Tegra入ってるのでは?」と思って調べてみたところ、Python2からは呼び出せるがPython3からは呼べなかった。(Python2から呼ぶ場合、あらかじめpython-opencvをpipしておく必要がある)

NVIDIAのフォーラム*2を見た感じだと、OpenCV4Tegraはpython3には対応してない模様。「自分でビルドしたらいけるよ」的な感じで一瞬途方に暮れたけど、フォーラムの最後に偉大なる先駆者の方が「ブログに書いたよ」と報告されていた。
そこで今回は先駆者の方に従ってTX2にOpenCVを入れてみた。

手順(の補足)

ということで、インストール手順そのものは先駆者の方*3をなぞれば基本的に大丈夫。ここではわかりにくかった箇所、つまったところを中心に補足する。

matplotlibrc の編集内容

以下に示した通り、「gtk3agg」箇所を「TkAgg」に変更する。

backend      : gtk3agg # 変更後
# backend      : TkAgg # 変更前
cuda_gl_interop.h の編集内容

以下のようにaarch64時にコンパイルエラーになるようになっているのをコメントアウトしまくって常にGL/gl.hをincludeするように変更する。

#if defined(__APPLE__)

#include <OpenGL/gl.h>

#else /* __APPLE__ */

//#if defined(__arm__) || defined(__aarch64__)
//#ifndef GL_VERSION
//#error Please include the appropriate gl headers before including cuda_gl_interop.h
//#endif
//#else
#include <GL/gl.h>
//#endif

#endif /* __APPLE__ */
make中にコンパイルエラーになる

gccのバグレポートがどうこうってエラーでビルドができない。関係あるのか不明だけど、プリコンパイルヘッダでやたらWarningでていた。
ためしにcmakeに「-D ENABLE_PRECOMPILED_HEADERS=OFF」を追加して「make -j6」ならビルドできた。「make -j」だとメモリを使いきって同じくエラーになってしまう。プリコンパイルヘッダを使った場合も、もしかしたらメモリを使いきっていた?

インストール中もなぜかビルドが走る

よくわからないけど、「sudo make install」した時になぜかいくつかビルドが走った。そのあとインストールが走ったから特に問題なさそう。

venv環境からcv2が見えない

そのままだとvenvからcv2がimportできなかった。
pyvenv.cfgを編集して「include-system-site-packages」を「true」にしてからactivateしたらimportできた。

謝辞

今回は先駆者の方の情報がとても役に立った。この場を借りて感謝いたします。
正直自分でやろうとしたら厳しかったのでは。


こんな感じでJupyter Notebookから呼べた。