2018年9月27日木曜日

make fileという操作(忘備録)


以下作業の忘備録な為、私以外の人が読んでも意味不明です。 
GNU Cコンパイラーは難しく調べても、内容が私にはまだ理解出来ません。熱が出そうです。9月26日27日で進捗がほとんどありません。

これが理解出来ないと実行ファイルを扱えないのでおまじないだと思う様にします。
オプションはこれからもう少し時間が必要です。

以下忘備録

OpenGL OPenCL CUDA qt5関連も全部入れてしまいました。これでOpencvexampleは全て実行可能になります。
 ビルド時一番の注意点はCUDA_ARCH_BINの番号。散々エラーが出て悩みましたが、GTX10806.1を指定すれば簡単にインストールできることが分かりました。
 まず依存ファイルインストール。Caffe分も含めて多分これで全部です。python-opencvは故意に外してあります。
sudo apt-get install qt5-qmake
sudo apt-get install qt5-default
sudo apt-get purge python-pip
sudo python get-pip.py
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install cmake git aptitude screen g++ libboost-all-dev \
libgflags-dev libgoogle-glog-dev protobuf-compiler libprotobuf-dev \
bc libblas-dev libatlas-dev libhdf5-dev libleveldb-dev liblmdb-dev \
libsnappy-dev libatlas-base-dev python-numpy libgflags-dev \
libgoogle-glog-dev python-skimage python-protobuf python-pandas 

 何でもかんでも入れちゃいます。そしてお好きなバージョンのOpencvをダウンロード。
 解凍してOpencvのフォルダに移動しますが
mkdir build
cd build
cmake -DWITH_CUDA=ON -DCUDA_ARCH_BIN=6.1 -DCUDA_ARCH_PTX="" -DENABLE_FAST_MATH=1 -DCUDA_FAST_MATH=1 -DWITH_CUBLAS=1 -D WITH_OPENCL=ON -D WITH_QT=ON -D WITH_OPENGL=ON -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_EXAMPLES=ON -D BUILD_opencv_python2=ON -D PYTHON_EXECUTABLE=$(which python) ..
sudo make -j8
sudo make install
 ワーニングが多少出ますが、すんなりコンパイルできます。ビルド中観察して見てるとOpencv2.4.13の方がNVCCを使う時間が多い様な...。感じ。コンパイルできたら、以下を直すことでopencvを使ったgpucコードで書かれたソースが
  g++ 該当ソース.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`
だけで簡単にコンパイルできます。



33%で止まったらまだまだです。肝心のGPU関連のコンパイルまで行ってません。
buildディレクトリに入ってると思いますが、一応buildの中身を全部消してから
以下のコマンドはbuile内で実行しないと大変なことになりますので注意です。
エラーメッセージを見ると、CUDA9.2にリンクしてないような気配です。(compute_61CUDA9.2のアーキテクチャですからCUDA9.2が認識されてないような感じ)
/home/.bashrc直してます?

とりあえず以下のコマンドを実行してから
export PATH=/usr/local/cuda-9.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.2/lib64:$LD_LIBRARY_PATH

make clean     エラー出るかもしれませんが気にしない
sudo rm -r *     buildの中身を全部消す

ここで再度
cmake -DWITH_CUDA=ON -DCUDA_ARCH_BIN=6.1 -DCUDA_ARCH_PTX="" -DENABLE_FAST_MATH=1 -DCUDA_FAST_MATH=1 -DWITH_CUBLAS=1 -D WITH_OPENCL=ON -D WITH_QT=ON -D WITH_OPENGL=ON -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_EXAMPLES=ON -D BUILD_opencv_python2=ON -D PYTHON_EXECUTABLE=$(which python) ..

多分ここではエラーが出ないはず
sudo make -j8
sudo make -j8は今の渡辺さんがつまずいてるとこだと思います。
これでエラーが無くなったら
sudo make install
です。


vimは操作がとても面倒でとんでもなく多くのコマンドがあってプロ向きのエディッタです。vim覚えるのは時間の無駄(覚えたんだったら何にも言えないけど)。nanoの方が無難.nanoが実行できなかったら sudo apt install nano でフリーソフトnanoをインストールします。
  
.bashrcですが、実際homeに行って ls でディレクトリ内のファイルを表示させてみて下さい。 あるはずの .bashrc は見つからないはず。これは隠しファイルです
ls -a でないと隠しファイルが表示されません。コマンド操作の基本重要です。
home ~/.bashhrc が正しいかどうか調べたかったら .bashrcvimで編集できるテキストファイルですから、 cat home ~/.bashhrc を実行して、ファイルの中身を表示できれば正解。ダメならエラー表示されるだけ….


良かったね~~~。make -j8まで行って、エラーで無かったらこっちのもの。
samplesに入るとcとかccpとか gpuとか python っていうフォルダあるから、こんなかの cppgpu に いろんなファイルがありますので(これ全部単独アプリです)
片っ端からやってみると良い 例えば aaa.cppなら g++ aaa.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`  
って打ち込むと、aaa っていう実行ファイルができるはずで  ,/aaa で実行します。 
ただこれらのソースはcmakeで指定してる-DBUILD_EXAMPLES=ONのでもうどこかに実行形式ファイル作られてると記憶してます。sanmleの中にbinってフォルダがあればその中に入ってます。 
じゃなかったら各フォルダの中に.cppと同じ実行形式ファイルが存在してます。動かし方はcppソースを見るしかありませんmain()部分の最初の方です。

但しopencv のサンプルプログラムは 単独で動くものが少なくて 必ず aaa の後に 入力ファイル名とか 数値を書かないと実行できないものが多い。
ソースを読むしかありません。 又はネットで解説を探すとかです。

Pythonはもっと簡単なので、ヴィデオ関連のはWevカメラ繋げば実行できるはず。大体Pythoncppの中身は同じようなやつです。gpuなんかCUDAがらみなので面白いと思います。


全部ごっちゃまぜで記憶してました。出力ファイル指定してないからa.outでしたね。

メール見ると ,/a.out で最初がカンマになってるけど?
ピリオドにしてる? buildに自動作成された実行形式ファイルをターミナルから試して見れば?
make中にこれらの実行形式ファイルが作成されたと言うことは、CpenCVがまともに作成されて
必ずコンパイル出来て実行できるってことです。

動かなければ必ずファイルが無いとか理解不能とかエラーメッセージ出るから、メッセージまるごと検索してみて下さい。


OPENCV3.3.1に関して、私も母艦Ubuntu3.3.1をインストールしてみました。
a.out っていうのは実行形式のファイルです。
私のでは ./a.out  だけでhogが動きます。

まず ./a.out を実行して、ターミナルにエラーメッセージが出たのかで無いのか、出たとすればどのようなエラーメッセージなのかが分からないと対処のしようがありません。
hogの場合はwebカメラが母艦に繋がれていないと  error:cant open camera: 0
とかのエラーメッセージがターミナルに表示されてそのままプログラムが終わってしまいます。
またピリオドをコンマに変えた場合は そんなファイルが無い的なメッセージが表示されます。
これが知りたいんです。出てきたメッセージを送って下さい。短時間で解決できます。

なので、動かない症状が分からないといつまでものまま。こちらとすれば謎解きみたいなもんです。
謎解きは時間の無駄です。


なんとも言えませんが、「ファイルが無いは」実行している場所が違うか、スペル違いだけです。
慣れないうちは、ファイルを実行する前に
ll
を実行して現状のフォルダに a.outがあるかどうか必ず確認することが必要。これが原因ってことはよくあります。

今回の場合、最後に重大なヒントがあります
error: can't open camera: 0
これが原因。ならかんたん
これは母艦にカメラがつながってないか、カメラを認識してないかどちらかです。
カメラがつながっていたら
ll /dev
を実行してみて video0 が最後の方に表示されているかどうか。表示されていれば
でなければvideo1かなんかになってませんか?
そして
lsusb
で出てきた接続機器の中にカメラがあるかどうかです。
カメラによっては認識されない場合があります。マイクロソフトのカメラなどはLinuxでは上手く動作しません。

なので、せめてOpenCVのプログラムをいっぱいコンパイルして実行してみると、プログラムを動かすこつが分かってきます。
また今回表示された内容は エラー以外ソースに書いてあるはずです。ソースに書いてあると言うことはプログラムは正常に動いていること。
で、 表示されたメッセージは実行オプションの指定です。
例えば ./a.out —camera 0
とかでカメラ番号を指定できて、他のオプションはhogの計数指定方法です。
つまりhogの実行はいろんなオプション指定が可能で様々な実験が出来ます。

この際だからOpenCVのソースを片っ端からコンパイルしてみたら? こつがつかめます。
一度はこういったことをやらないとダメッス。

Arduino IDEやXCODEのコンパイルは全部自動でやってくれるので、めんどくさいMake などが見えないだけで内部ではかなりのことをしています。
母艦にArduinoやiPhoneと同じ環境をつくって(CPUがちがうのに!!)そこでコンパイルしたバイナリファイルをUSBで送ってます。

Make ファイルと言うのは一種のバッチファイルで、普通Cをコンパイルする時、長大なオプション命令や、一旦コンパイルしたライブラリ群を付けないと満足に動きません。
この長大でやっかいな部分を自動化しようというものです。Linuxと言うのはiPhoneやArduinoなど特定の機種相手ではない無いため、こうなるのが必然なんでしょうね。
makeの仕方は多様すぎてなんだか分かりません。その場その場で作者の癖を掴むしかないんです。

makeを要求するソースがあった場合、ごく普通には
make だけでコンパイルできます。
make -j8   って言うのはCPUの8コアを全部使ってコンパイルすることで、コンパイル時間が一挙に短くなります
     TX2は-j6,Xabierは -j8、まで 母艦は4コアですが -j8まで可能です。
make all を要求される場合もあります(caffe など)コレはシステムにライブラリをインストールする場合とかに要求されます。たしかOpenCVもでしたよね。
そのほかにcmakeってのがあって、こちらはシステムが持っているライブラリを勝手に探しだして、それに合ったライブラリを自動でインストール出来ます。コレもOpenCVインストールの時に実行したと思います。
今のところはmakeは覚えなくて良いと思います。

ただmakeが要求されたときに覚えておいた方が良いのは2つだけ!!
-j4のオプション(早い方がいいので)
make clean  一旦makeした物が間違っていた場合、よけいなファイルが邪魔をする場合がある為文字通りクリーニングすると言う事
です。make cleanがプログラムによっては効かない場合もあります。

Opencvの場合はコンパイルオプションが複雑な為に、makeの代わりに、この前メールで書いた簡略化コンパイル手法を使います。内部で自動化されているのでmakeを意識する必要無しです。何故って?作者が決めたからで従わざるをえません。

OpenCVの挙動を試すのが今必要な事なので、面白いものから試すのがベターです 顔認証とか…。 ただ最初のうちは顔認証がまともに実行出来るまで1日以上かかったと思います。
(ファイル指定とか、カメラ指定とか要求されるので)
顔認証はcpu版、python版、GPU版3種類が入っていたと思います。これができればだいたいのOpenCVのサンプルが実行出来るようになったと記憶してます。
なので、何度も書きますがmakeは現段階では覚えなくても良いものの1つです。何をやってるのかわかる程度で良いと思います。

あとOpenCVのコンパイルですが、 -o オプション+スペース+実行ファイル名 でa.out でなく自分の好きな実行ファイル名を付けられます。
例:例の簡略化コンパイルコマンドを入力し、最後に -o TEST とか付け加えると TEST っていう実行ファイルが出来ます(a.outを後からリネームしても良いけどね)

0 件のコメント:

コメントを投稿