- ベストアンサー
Octaveでlibsvmを使った画像認識をしたい
- Octaveでlibsvmを使って画像認識をしたいが、imread()関数が使えないエラーが発生している。
- 古いバージョンのOctaveではimread()関数が使えるが、libsvmが使えなくなってしまった。
- Octaveのバージョンアップによってimread()関数が使えなくなる変更があったが、それを修正する方法が分からない。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/octave/3.8.0/lib/octave/3.8.0:/usr/local/octave/3.8.0/lib/libgcc についてはどうも効果がないようです。 Octave-cliはターミナルを使っていますが、環境変数はどうも引き継がなさそうです。害はないように思いますが、元に戻してください。 3.8.2でコンパイルしたものは3.8.2のライブラリを必要とするので(otoolで表示されている) それを残しておく必要があります。 3.8.2を消してしまっていたら次の方法を試してみてください。 cd /usr/local/octave sudo ln -s 3.8.0 3.8.2 これで3.8.2のライブラリを使ってくれると思いますが、バージョンの差を吸収できるかはわかりません。 それがダメなら、 3.8.2をインストールして、/usr/local/octave/3.8.2以下をどこかに移動(mvコマンドで可能)して、 3.8.0をインストールして、3.8.2を元の位置に戻すという方法です。 こちらで、10.9で両方のバージョンを重ねてインストールすると、 GraphicsMagickは片方にしか入っていなかったり、片方のライブラリがかなり不足した状態でできていました。 以上確認はできていませんが、動くような気がします。 ここまでするのならRなどに書き換えたほうが将来的によいような気もしますが、
その他の回答 (7)
- ki073
- ベストアンサー率77% (491/634)
無理みたいですね。このエラーはちょっと厄介です。 最初に書いた方法はどうですか? lnを使う方法です。 10.9でですが、MacPortsを使ってOctaveをインストールでき正常に動作しました。 元のままではエラーが出ていたので、次の様にしましした。 /opt/local/var/macports/sources/rsync.macports.org/release/tarballs/ports/math にoctaveというフォルダがあります。それをフォルダごと適当なところにコピーします。 その中に、Portfileというファイルがあります。 revision 7 を revision 7a に、これは元のものと区別するためです。 --enable-docs \ を --disable-docs \ に、docを作るときにエラーが出ていたのでそれを回避するためです。 後はcdで変更したoctaveフォルダの外になるようにして sudo port install ./octave で正常に動きました。 octave-cliのアイコンが出来ていませんでしたので、コマンドで入れる必要がありました。
お礼
再び時間が空いてしまいました。 今まで,いろいろなことを試しても だめだったので,Octaveは諦めました。 ご助言のように,別の環境で行うことにしました。 Rではなく,Pythonですが,細かな設定は少しあったものの, 環境のインストール 画像の読み込み libsvmの使用 は全てできました。 結局,Octaveでの実行はできませんでしたが, この2週間ほど,いろいろ考えてくださってありがとうございます。 少し,前進しましたm(_ _)m
- ki073
- ベストアンサー率77% (491/634)
訂正 >最後の方に ではなくexportが書かれているところですね。最後だとopen命令が実行された後になりますね。 gccのバージョンが違うのでちょっと厳しいかな。
補足
少し日が空きました。 おっしゃるのは, 3.8.2でimreadを使えるようにするのは難しそうなので, 3.8.0をベースにして,libsvmを使えるようにする方針でしょうか。 以下試したことです。 3.8.2でmakeは上手くいくようなので, まず,libsvmは3.8.2でmakeし,ダイナミックライブラリを確認すると 'USER'-MacBook-Pro:matlab 'username'$ otool -L svmtrain.mex svmtrain.mex: /usr/local/octave/3.8.2/lib/octave/3.8.2/liboctinterp.2.dylib (compatibility version 3.0.0, current version 3.0.0) /usr/local/octave/3.8.2/lib/octave/3.8.2/liboctave.2.dylib (compatibility version 3.0.0, current version 3.0.0) /usr/local/octave/3.8.2/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.20.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0) /usr/local/octave/3.8.2/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) となりました。 続いて,3.8.0をインストールし,3.8.0のターミナルから以下のテストを実行。 octave:3> z = [1; -1; -1; 1]; octave:4> X = [0, 0; 0, 1; 1, 0; 1, 1;]; octave:5> model = svmtrain(z, X); error: /Users/'username'/Desktop/libsvm-3.20/matlab/svmtrain.mex: failed to load: dlopen(/Users/'username'/Desktop/libsvm-3.20/matlab/svmtrain.mex, 2): Library not loaded: /usr/local/octave/3.8.2/lib/octave/3.8.2/liboctinterp.2.dylib Referenced from: /Users/'username'/Desktop/libsvm-3.20/matlab/svmtrain.mex Reason: image not found エラーがでます。 それから,Octave.cli(3.8.0)のOctaveに,2行目を追加しました。 1行目 export PATH=/usr/local/octave/3.8.0/bin:/usr/local/octave/3.8.0/sbin:${PATH} 2行目 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/octave/3.8.0/lib/octave/3.8.0:/usr/local/octave/3.8.0/lib/libgcc 3行目 export GNUTERM=qt 4行目 cd $OCTAVE_HOME 5行目 open -a Terminal.app /usr/local/octave/3.8.0/bin/octave | logger 2>&1 そして,3.8.0を再起動し,同じテストを実行。 同じエラーがでます。 さらに,3.8.2を消して,もう一度同じことを実行。 同じエラーがでます。 これで,おっしゃる方法は試したことになっているでしょうか?
- ki073
- ベストアンサー率77% (491/634)
OSX 10.10.3が入ったので試してみました。 結局は3.8.0ではimreadは大丈夫ですが、makeはだめ、3.8.2ではimreadもだめ、makeも一部だめでした。 よい解決方法は無さそうですが OSX10.9でmakeしたsvmtrain.mexはそのままで10.10で使えましたので、もしmake可能はバージョンで作ったものがあればコピーして使えると思います。 3.8.2でmakeできるのでしたら、もしかしたら.mexファイルだけを移しても使えるかもしれません。こちらでは確認できませんのでそんな気がするだけです。 ただし、3.8.2で作ったものは3.8.2内部のライブラリを使っていますので、必要なものを残しておく必要があります。共存可能な状態であれば動くかも知れません。 別の方法として、同じく3.8.2で作ったものですが、3.8.0内部のライブラリを使ってもらうように変更することも出来るかもしれません。この場合は、3.8.2を消してしまって、 Octave.cliを右クリックでパッケージを開いて、中の方にOctaveというファイルがあります。テキストファイルですので CotEditorなどのテキストエディタで開いて、最後の方に export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/octave/3.8.0/lib/octave/3.8.0:/usr/local/octave/3.8.0/lib/libgcc と一行追加してみてください。 確証が持てませんが、うまくいく可能性もあります。 参考 ターミナルで使っているダイナミックライブラリを確認できます。 otool -L svmtrain.mex とすると svmtrain.mex: /usr/local/octave/3.8.0/lib/octave/3.8.0/liboctinterp.2.dylib (compatibility version 3.0.0, current version 3.0.0) /usr/local/octave/3.8.0/lib/octave/3.8.0/liboctave.2.dylib (compatibility version 3.0.0, current version 3.0.0) /usr/local/octave/3.8.0/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.18.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) /usr/local/octave/3.8.0/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) のように出力されます。3.8.2で作った場合には3.8.2になりますので、ダマしてしまおうというものです。
- ki073
- ベストアンサー率77% (491/634)
追加ですが Octaveの3.8.2と3.8.0は両方インストールしたら駄目ですよ。 不完全なものになってしまいます。両方完全に消して(/usr/localの中身も)、その後で3.8.0だけをインストールしてください。
補足
それは大丈夫です。3.8.0だけのインストールは,試行錯誤の過程でやりました。 一応,もう一度やってみましたが,やはり両方インストールされている場合と同じエラーが出ます。 実は,mkoctfileを3.8.2のものと置き換えたり,また,それによって生じるエラーの原因のファイルを置き換えたりみたりもしてみました(あまりやってはいけないことと思いますが)。ですが,それもうまくいかないようです。
- ki073
- ベストアンサー率77% (491/634)
http://www.csie.ntu.edu.tw/~cjlin/libsvm/ のtar.gzファイルを使っていますが、たぶん同じものですよね。 原因を切り分けたいと思います。 makeの代わりに mex svmtrain.c ../svm.cpp svm_model_matlab.c とすればどうなりますか? また mex libsvmread.c mex libsvmwrite.c mex svmpredict.c ../svm.cpp svm_model_matlab.c はどうでしょうか? 結局は.mexのファイルがあればなんとかなるのですが。
補足
はい。tar.gzをダウンロードしています。 makeの代わりにmexとした場合, octave:3> mex svmtrain.c ../svm.cpp svm_model_matlab.c /usr/local/octave/3.8.0/bin/mkoctfile-3.8.0: line 479: 1619 Segmentation fault: 11 /usr/local/octave/3.8.0/bin/gcc-mp-4.7 -c -fPIC -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave/.. -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave -I/usr/local/octave/3.8.0/include -pipe -Os -m64 -D_THREAD_SAFE -pthread -I. svmtrain.c -o svmtrain.o warning: mkoctfile exited with failure status octave:4> mex libsvmread.c /usr/local/octave/3.8.0/bin/mkoctfile-3.8.0: line 479: 1631 Segmentation fault: 11 /usr/local/octave/3.8.0/bin/gcc-mp-4.7 -c -fPIC -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave/.. -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave -I/usr/local/octave/3.8.0/include -pipe -Os -m64 -D_THREAD_SAFE -pthread -I. libsvmread.c -o libsvmread.o warning: mkoctfile exited with failure status octave:5> mex libsvmwrite.c /usr/local/octave/3.8.0/bin/mkoctfile-3.8.0: line 479: 1640 Segmentation fault: 11 /usr/local/octave/3.8.0/bin/gcc-mp-4.7 -c -fPIC -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave/.. -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave -I/usr/local/octave/3.8.0/include -pipe -Os -m64 -D_THREAD_SAFE -pthread -I. libsvmwrite.c -o libsvmwrite.o warning: mkoctfile exited with failure status octave:6> mex svmpredict.c ../svm.cpp svm_model_matlab.c /usr/local/octave/3.8.0/bin/mkoctfile-3.8.0: line 479: 1651 Segmentation fault: 11 /usr/local/octave/3.8.0/bin/gcc-mp-4.7 -c -fPIC -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave/.. -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave -I/usr/local/octave/3.8.0/include -pipe -Os -m64 -D_THREAD_SAFE -pthread -I. svmpredict.c -o svmpredict.o warning: mkoctfile exited with failure status octave:7> となります。
- ki073
- ベストアンサー率77% (491/634)
Octave 3.8.2で試したらimreadがやはり駄目ですね。 GraphicMagickは入っているので、あまり深入りしないようにしました。 次に3.8.0にしました。質問欄のリンクのものです。 > make > z = [1; -1; -1; 1]; > X = [0, 0; 0, 1; 1, 0; 1, 1;]; > model = svmtrain(z, X); とやっても補足欄のような結果になりますが、どこでエラーが出ますか? 中に入っているgccが3.8.0で4.7, 3.8.2で4.9になっています。この程度で差がある様には思えませんが。 ちなみにこちらはOSX 10.9.5です。
補足
そちらでは,Octave3.8.0でlibsvmが動くようですね、、、 こちらのOctave3.8.0での実行結果を以下のとおりです。 octave:1> cd /Users/'username'/Desktop/libsvm-3.20/matlab octave:2> make /usr/local/octave/3.8.0/bin/mkoctfile-3.8.0: line 479: 936 Segmentation fault: 11 /usr/local/octave/3.8.0/bin/gcc-mp-4.7 -c -fPIC -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave/.. -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave -I/usr/local/octave/3.8.0/include -pipe -Os -m64 -D_THREAD_SAFE -pthread -I. libsvmread.c -o libsvmread.o warning: mkoctfile exited with failure status /usr/local/octave/3.8.0/bin/mkoctfile-3.8.0: line 479: 946 Segmentation fault: 11 /usr/local/octave/3.8.0/bin/gcc-mp-4.7 -c -fPIC -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave/.. -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave -I/usr/local/octave/3.8.0/include -pipe -Os -m64 -D_THREAD_SAFE -pthread -I. libsvmwrite.c -o libsvmwrite.o warning: mkoctfile exited with failure status /usr/local/octave/3.8.0/bin/mkoctfile-3.8.0: line 479: 955 Segmentation fault: 11 /usr/local/octave/3.8.0/bin/gcc-mp-4.7 -c -fPIC -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave/.. -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave -I/usr/local/octave/3.8.0/include -pipe -Os -m64 -D_THREAD_SAFE -pthread -I. svmtrain.c -o svmtrain.o warning: mkoctfile exited with failure status /usr/local/octave/3.8.0/bin/mkoctfile-3.8.0: line 479: 964 Segmentation fault: 11 /usr/local/octave/3.8.0/bin/gcc-mp-4.7 -c -fPIC -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave/.. -I/usr/local/octave/3.8.0/include/octave-3.8.0/octave -I/usr/local/octave/3.8.0/include -pipe -Os -m64 -D_THREAD_SAFE -pthread -I. svmpredict.c -o svmpredict.o warning: mkoctfile exited with failure status octave:3> z = [1; -1; -1; 1]; octave:4> X = [0, 0; 0, 1; 1, 0; 1, 1;]; octave:5> model = svmtrain(z, X); error: /Users/'username'/Desktop/libsvm-3.20/matlab/svmtrain.mex: failed to load: dlopen(/Users/'username'/Desktop/libsvm-3.20/matlab/svmtrain.mex, 2): Library not loaded: /usr/local/octave/3.8.2/lib/octave/3.8.2/liboctinterp.2.dylib Referenced from: /Users/'username'/Desktop/libsvm-3.20/matlab/svmtrain.mex Reason: image not found octave:5> cd /Users/'username'/Desktop/image_folder octave:6> img = imread('IMG.jpg'); octave:7> このエラーから,何か思い当たる節があるでしょうか? ※補足(試してダメだったこと) 私は,makeが失敗しているように思いました。 'warning: mkoctfile exited with failure status' のエラー文をgoogleで検索したところ, 'octaveでmexファイルを作成 - 禁漁の金魚の金色の岐路の業' http://d.hatena.ne.jp/LCRTB/20130212/1360654579 の記事があったので,記事と同じように'octave-headers'を入れればよいのかと思い, 以下のコマンドを実行しました。 'USER'-MacBook-Pro:~ 'username'$ brew install octave-headers Error: No available formula for octave-headers Searching formulae... Searching taps... が,見つからず,これはここで諦めました。
- ki073
- ベストアンサー率77% (491/634)
外部のライブラリを使う場合には普通次の様にします。(Octaveも多分そうだと思いますが一般的にはです) 1. 外部のライブラリ(ここではlibsvmに相当する)を適当な方法でインストールする(可能な限りパッケージ管理ソフトでインストールする) 2. 使用するソフト(Octaveに相当)から外部ライブラリを使うためのライブラリをインストールする。 この2段階になっている場合がほとんどです。Rのように2をやると1も自動的にやってくれるものもあります。 前の回答にも書きましたが、初心者がやってはいけないことをいっぱいやっているので、傍観していましたが、次のことを書き込めばこちらでもやってみます。 1) 質問欄のライブラリをインストールするためのコマンド全て。 2) 正しくインストールできたか確認するためのテストプログラム。 Rでもlibsvmを使ったライブラリがあり、日本語の記事がたくさんあります。こちらの方が楽な様におもいます。 一部試してみましたが、Rのメニューから選ぶだけでlibsvmもインストールでき、正常に動作することを確認できました。
補足
アドバイスありがとうございます。 Rでやれば全部うまくいくのかもしれませんが,その他のプログラムなどを既にOctaveで書いてしまっているので,どうしてもOctaveで実行したいのです。 エラーに至った経緯を,1), 2)の事項を考慮して以下に示します。 1. Octave3.8.2のダウンロード http://sourceforge.net/projects/octave/files/Octave%20MacOSX%20Binary/test/2014-09-25-Binary-of-GNU-Octave-3.8.2-for-OSX-10.9.5/ から,'GNU_Octave_3.8.2-1.dmg'をダウンロード。 2. Octave3.8.2のインストール 'GNU_Octave_3.8.2-1.dmg'を起動し,'Octave-3.8.2-1.mpkg'を開き, 指示に従ってインストール。すると,アプリケーションフォルダに,'Octave-cil'が出現する。 3. コマンドを実行 'Octave-cil'を起動し,以下のコマンドを実行する。 (libsvmと,image_folder/IMG.jpgはデスクトップに保存されている) octave:1> cd /Users/'username'/Desktop/libsvm-3.20/matlab octave:2> make octave:3> z = [1; -1; -1; 1]; octave:4> X = [0, 0; 0, 1; 1, 0; 1, 1;]; octave:5> model = svmtrain(z, X); * optimization finished, #iter = 2 nu = 1.000000 obj = -3.690364, rho = 0.000000 nSV = 4, nBSV = 4 Total nSV = 4 octave:6> cd /Users/'username'/Desktop/image_folder octave:7> img = imread('IMG.jpg'); error: default_formats: /usr/local/octave/3.8.2/lib/octave/3.8.2/oct/x86_64-apple-darwin13.4.0/__magick_read__.oct: failed to load: dlopen(/usr/local/octave/3.8.2/lib/octave/3.8.2/oct/x86_64-apple-darwin13.4.0/__magick_read__.oct, 2): Symbol not found: __ZN6Magick5ColorC1Ejjj Referenced from: /usr/local/octave/3.8.2/lib/octave/3.8.2/oct/x86_64-apple-darwin13.4.0/__magick_read__.oct Expected in: /usr/local/octave/3.8.2/lib/libGraphicsMagick++.3.dylib in /usr/local/octave/3.8.2/lib/octave/3.8.2/oct/x86_64-apple-darwin13.4.0/__magick_read__.oct error: called from: error: /usr/local/octave/3.8.2/share/octave/3.8.2/m/image/imformats.m at line 255, column 11 error: /usr/local/octave/3.8.2/share/octave/3.8.2/m/image/imformats.m at line 78, column 3 error: /usr/local/octave/3.8.2/share/octave/3.8.2/m/image/private/imageIO.m at line 60, column 7 error: /usr/local/octave/3.8.2/share/octave/3.8.2/m/image/imread.m at line 107, column 30 octave:7> すると,このようなエラーが出ます。
お礼
解決策は「別の環境で実行する」ということで落ち着きました。
補足
-> 3.8.2をインストールして、/usr/local/octave/3.8.2以下をどこかに移動(mvコマンドで可能)して、 3.8.0をインストールして、3.8.2を元の位置に戻すという方法です。 試してみました。すると, octave:3> z = [1; -1; -1; 1]; octave:4> X = [0, 0; 0, 1; 1, 0; 1, 1;]; octave:5> model = svmtrain(z, X); * optimization finished, #iter = 2 nu = 1.000000 obj = -3.690364, rho = 0.000000 nSV = 4, nBSV = 4 Total nSV = 4 octave-cli-3.8.0(1823,0x7fff7307e300) malloc: *** error for object 0x10c2d4270: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug panic: Abort trap: 6 -- stopping myself... attempting to save variables to 'octave-workspace'... save to 'octave-workspace' complete Abort trap: 6 logout [プロセスが完了しました] 結果は出ました!が,エラーがでます。 これだと学習はできても,識別器として使えません。。。 この種のエラーであれば,何とかなりそうでしょうか?