相変わらずメモ
この文書はOPENCVをGitから持ってきてビルドしたことがある人対象です。
Windows10環境のOPENCVでCUDAを使えている人の人口が少なすぎるので、ビルド方法を告白します。
教えないほが得かと思い、前回のエントリーではあいまいに書きましたが、使っている人が少なすぎて質問できないのがつらいです。
皆さんバンバンCUDA込みのOPENCVをWindows10で使いましょう! そして私の質問や疑問に答えてください!
Windowsで自前ビルドできなくて、仕方なしにLinuxに行っちゃった人もこの際Windowsに戻ってきましょう!
それでは始めます。
まずはコントロールパネルの地域の管理を選択し、UNICODE対応でないプログラムの言語の設定を英語にします。
PCを再起動します。
そして超重要事項!CUDA9.1はVisualStudio2017 15.45までしか対応していません。
VisualStudioのバージョンを確認し、15.45でなかったらVisualStudio2017を削除してインストールしなおしです。
更新はしないように!言語パックは日本語と英語を入れておくと幸せになれるかもしれません。
https://docs.microsoft.com/en-us/visualstudio/productinfo/installing-an-earlier-release-of-vs2017
運が良ければまだ該当バージョンがダウンロードできます。
運が悪い人のための参考情報ですが、公式な古いバージョン対応のダウンロード方法は意外なところに書いてありました。
こんな記述を見つけました。
To setup build and runtime environment on Windows:
Install Visual Studio 2017 with following workloads and components. From command line (use Community version installer as example): vs_community.exe --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.Universal --add Microsoft.Component.PythonTools --add Microsoft.VisualStudio.Component.VC.Tools.14.11
つまり、コミュニティー版のインストーラーをダウンロードして、コマンドラインオプションを指定して実行するみたいです。
CUDA9対応バージョンがダウンロードできるみたいですね。試してませんがMicrosoftが書いているのだからできるでしょう。
CUDA9.1はNVIDIAのサイトからダウンロードしてインストールください。
あとは下のリンクの記述で大体わかります。
https://jamesbowley.co.uk/build-compile-opencv-3-4-in-windows-with-cuda-9-0-and-intel-mkl-tbb/
上のサイトを参考にしてOpenCVをクローンしてCMAKEしてビルドすればCUDA対応のバイナリが出来上がります。
上のサイトでは最初のCMAKEはコマンドでやってますが、最初からGUIでやっても問題ないです。
LINKとかNVCCのエラーメッセージの表示が化けて読めないかもしれませんが、エラーコードをつつけばWebで内容を確認できますからあまり気にしないでください。
ビルドが終了したら地域を日本に変更しておいたほうがいいかもしれないです。変えなくても意外に不便はないと思いますが。
メモ中のメモですが、
パホーマンスを追求する風味を出すのでしたら、上のリンクを参考にして、MKLとTBBをIntelのサイトから頂いてビルドすれば完全体に近づきますね。
IntelMediaSDKも使えるみたいなので突っ込んでおきます。IntelMediaSDKはIntelからダウンロードしてきて、インストールしたあと、CMAKEの WITH_MFXをONにすると有効になります。なにが変わるのかは正直わからないですが、完全体に近づきます。
世間ではTBBよりVisualStudio標準のコンカレントが最速ということみたいですが、もしかしてOVPENCVのTBBが遅いのはVisualStudioでコンパイルしているからではないかという気もするので、インテルが提供しているバイナリなら結果がちがうかな?という淡い期待でIntel配布のTBBを入れました。TBB込みですと、少なくともカスケードトレーニングは早くなります。
さらに、この際だからEIGENもダウンロードして入れておけば良さげです。EIGENを有効にするとCUDAのコンパイルでも使われるみたいです。早くなるかといわれるとわかりません。EIGENが何の役に立つのかも正直知らないニワカですので。
あと、JPEGのライブラリもTurboJpegのそれに差し替えると、大量のJPEGデータを処理する系のプログラムでは役に立ちます。これは体感できました。やり方を自分のメモがてら書いておきますと、CMAKE時にBUILD_JPEGをOFFにして、WITH_JPEGをONにして、JPEG_INCLUDE_PATH と JPEG_LIBLARYをTurboJpegのincludeとjpeg_static.libを指定します。
こうやって、できたバイナリとかDLLを使っていろいろ試してもらいたいのですが、CPUと、OPENCL GPU この3種類の処理で、同じ処理をしても結果が微妙に違くなる原因を誰か私に教えてください。特にGPUが他とずいぶん違くなるのです。
特に困っているのがCascadeで、同じcascade.xmlを使ってdetectmultiscale をしたとき、GPUでやるとほかの処理より取得領域が大きくなってしまうのです。
結果を同じにする方法はあるのか教えていただきたいのです。
以上、よろしくお願いいたします。