NVIDIA DIGITS 4の物体検出トレーニング時のエラーに対策してみた

digits
以下の記事のDIGITS 4の物体検出トレーニングにおいて、エラーが発生した原因が分かりましたので、対策を行いました。

NVIDIA DIGITS 4.0をインストールしてみた
NVIDIAからDeep Learning用トレーニングシステムのDIGITS 4がリリースされたので、Ubuntu 14.04にインストールしてみました。今回は、DIGITS 4、cuDNN 5.1等へのアップデートが行われています。

結論から言うと、CaffeとPythonで利用するOpenCVのバージョンが違っていることが原因でした。

スポンサーリンク

調査

digits4-error
DIGITS 4の画面では、ERROR: error code -11、さらに、テキストボックスの中には、以下のログがありました。

Train net output #0: loss_bbox = 6.15343 (* 2 = 12.3069 loss)
Train net output #1: loss_coverage = 2.38334 (* 1 = 2.38334 loss)
Iteration 3184, lr = 0.0001
Snapshotting to binary proto file snapshot_iter_3187.caffemodel
Snapshotting solver state to binary proto file snapshot_iter_3187.solverstate
Iteration 3187, Testing net (#0)
Ignoring source layer train_data
Ignoring source layer train_label
Ignoring source layer train_transform

1エポック目のトレーニングが終了してスナップショットを保存し、テストフェーズに移行した直後にエラーが発生しています。

ログの詳細を確認するために、DIGITS 4の画面に表示されているJob Directory(ここでは、/usr/share/digits/digits/jobs/20160813-185258-0320)に移動します。

このディレクトリの中のcaffe_output.logをgedit等で開きます。

ログファイルの最後の方に移動して行くと、テキストボックスのログの続きがありました。

I0813 20:19:01.472391  6350 net.cpp:723] Ignoring source layer train_data
I0813 20:19:01.472401  6350 net.cpp:723] Ignoring source layer train_label
I0813 20:19:01.472409  6350 net.cpp:723] Ignoring source layer train_transform
*** Aborted at 1471087141 (unix time) try "date -d @1471087141" if you are using GNU date ***
PC: @     0x7f5713964df2 cv::Mat::copyTo()
*** SIGSEGV (@0x7ffc02010040) received by PID 6350 (TID 0x7f57264b7800) from PID 33620032; stack trace: ***
@     0x7f5723d86cb0 (unknown)
@     0x7f5713964df2 cv::Mat::copyTo()
@     0x7f54675e6ae5 pyopencv_from<>()
@     0x7f546768d952 pyopencv_cv_groupRectangles()
...

どうやら、OpenCV関係のエラーのようです。

以下のコマンドを実行して、CaffeがリンクしているOpenCV関係のライブラリを確認してみます。

$ ldd /usr/bin/caffe | grep cv
libopencv_highgui.so.2.4 => /usr/local/lib/libopencv_highgui.so.2.4 (0x00007f9da19ca000)
libopencv_imgproc.so.2.4 => /usr/local/lib/libopencv_imgproc.so.2.4 (0x00007f9da14ca000)
libopencv_core.so.2.4 => /usr/local/lib/libopencv_core.so.2.4 (0x00007f9d9b847000)

Caffeは、OpenCV 2.4系を利用しているようです。

一方、Pythonは、

$ python -c "import cv2; print(cv2.__version__)"
3.1.0

やはり、OpenCV 2.4系ではありません。

なお、以下のコマンドを実行して、python-opencvをインストールしていることを確認しました。

$ dpkg -l python-opencv
...
ii  python-opencv  2.4.8+dfsg1- amd64        Python bindings for the computer

多分、以下の記事のMXNetのインストール時に、OpenCVサポートの関係でいろいろ試行錯誤して、cv2.soを書き換えてしまったものと思われます。

MXNetのNeural Artで画風を変換してみた
DMLCが開発しているDeep Learningフレームワーク「MXNet」をUbuntu 14.04にインストールして、画風を変換するNeural Artを試してみました。

対策

以下のコマンドを実行して、python-opencvの再インストールを行います。

$ sudo apt-get --reinstall install python-opencv

一旦、removeしてinstallでも、良いと思います。

次に、以下のコマンドを実行して、Pythonが利用するOpenCVのバージョンを確認します。

$ python -c "import cv2; print(cv2.__version__)"
2.4.8

まとめ

DIGITS 4の物体検出トレーニングで、エラーが発生した原因を調査し、caffe_output.logから、OpenCV関係のエラーが発生していることが分かりました。

CaffeがOpenCV 2.4系を利用しているのに対し、PythonがOpenCV 3.1系を利用していましたので、python-opencvを再インストールして、OpenCV 2.4系に合わせました。