以下の記事のDIGITS 4の物体検出トレーニングにおいて、エラーが発生した原因が分かりましたので、対策を行いました。
結論から言うと、CaffeとPythonで利用するOpenCVのバージョンが違っていることが原因でした。
調査
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を書き換えてしまったものと思われます。
対策
以下のコマンドを実行して、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系に合わせました。