リアルタイムで画像を小さな領域(superpixel)に領域分割する手法gSLICのコードをテストしてみた。ソリューションファイル(*.sln)をロードする段階でプロジェクトファイル(*.vcxproj)が正常に読み込まれなかった。CUDAのインストールやプロジェクトの設定で追加しなければならなかったオプションなどを記録しておく。(2013/01/04)
動作環境
- Visual Studio 2010 SP1
- Windows 7 Pro SP1
- Nvidia Quadro 4000 for Mac
- NVIDIA CUDA Toolkit v4.2
CUDA4.2をインストール
CUDAを利用したgSLICのプログラムをコンパイルするためには、CUDA Toolkit、CUDA Driver、GPU Computing SDKが必要なのでこれらを順にインストールする。
-
CUDA 4.2 Toolkit 32bitをダウンロード。64bitマシンでも32bitコンパイルするなら32bitをダウンロードする。
https://developer.nvidia.com/cuda-toolkit-42-archive - ダウンロードされたcudatoolkit_4.2.9_win_32.msiを実行してインストール。Typicalを選択する以外特殊な操作はない。
-
CUDA 4.2 Driver 64bit()をダウンロード&インストール。32bitコンパイルする場合でも、64bitマシンならドライバ64bitを選ぶ。
https://developer.nvidia.com/cuda-toolkit-42-archive - ダウンロードされたdevdriver_4.2_winvista-win7_32_301.32_general.exeを実行してファイルを解凍。 「NVIDIA\DisplayDriver\275.89\WinVista_Win7_64\International」に解凍されたsetup.exeを実行してインストール開始。既存のドライバの設定を残すオプション「高速」を選択。
-
GPU Computing SDK4.2.9をダウンロード。
https://developer.nvidia.com/cuda-toolkit-42-archive - ダウンロードされたgpucomputingsdk_4.2.9_win_32.exeを実行してインストール。
ルールファイルをコピー
- C:\Program Files (x86)\NVIDIA GPU Computing Toolkit\CUDA\v4.2\extras\visual_studio_integration\rulesを開く。
- C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\VCProjectDefaultsも開く。
- NvCudaDriverApi.v4.2.rulesとNvCudaRuntimeApi.v4.2.rulesを最初のフォルダから次のフォルダにコピーする。
gSLICのコンパイル
何よりもはじめにgSLIC自身をダウンロードして来なければならないが、2013/01/04現在GoogleでgSLICと検索すると古いページがトップに出てくる。こちらはVisual Studio 2008のバージョンだがこれは古いので扱わない。新しいページからダウンロードしてVisual Studio 2010のバージョンを用いる。gSLICのデモプログラムにはCUDA以外にOpenCVも使用されている。予めOpenCVが正しくインストールされているとする。これ以外に必要な設定は以下のとおり。
- 新しいページからgSLIC_vs2010.zipをダウンロードする。
- Visual Studioを起動するとエラーがでることを確認する。
- ダウンロード・解凍して生成されるフォルダ内のgSLIC.slnからVisual Studioを起動すると「Microsoft Visual Studio: ソリューション内の1つ以上のプロジェクトが正しく読み込まれていません。詳細については、出力ウィンドウを確認してください。」というエラーウィンドウが表示される。
- 出力ウィンドウに「gSLIC\gSLIC\gSLIC.vcxproj : error : インポートされたプロジェクト "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 4.0.props" が見つかりませんでした。
宣言のパスが正しいかどうか、およびファイルがディスクに存在しているかどうかを確認してください。 gSLIC\gSLIC\gSLIC.vcxproj」の類のエラーが出てることを確認する。
- gSLIC.vcxprojファイルのCUDA関連項目を直接テキストエディタで修正する。修正箇所は4箇所。(絶対パス出ない方がよいがとりあえず・・・)
- 25行目。CUDAのバージョンとNVIDIA GPU Computingインストール先のパスを修正。
修正前 <CudaToolkitCustomDir> ..\..\..\..\..\..\..\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0 </CudaToolkitCustomDir>
修正後 <CudaToolkitCustomDir>$(CUDA_INC_PATH)</CudaToolkitCustomDir>
- 53行目。CUDAのバージョン修正。
修正前 <Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 4.0.props" />
修正後 <Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 4.2.props" />
- 90行目。同じ。
修正前 <AdditionalLibraryDirectories> C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\lib\Win32; %(AdditionalLibraryDirectories) </AdditionalLibraryDirectories>
修正後 <AdditionalLibraryDirectories> $(CUDA_LIB_PATH);%(AdditionalLibraryDirectories) </AdditionalLibraryDirectories>
- 172行目。同じ。
修正前 <Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 4.0.targets" />
修正後 <Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 4.2.targets" />
- 25行目。CUDAのバージョンとNVIDIA GPU Computingインストール先のパスを修正。
- OpenCV関連の修正。ビルドするとCUDAのビルドは正常終了するがOpenCVのライブラリの場所に問題がある旨のエラーがでるかもしれない。OpenCVのライブラリが絶対パスなどで設定されているのが原因。
- 追加のインクルードディレクトリに「C:\OpenCV2.1\include\opencv」が設定されているので、これを削除または正しいディレクトリを設定する。
- 上と同様に追加のライブラリディレクトリに設定されたC:\OpenCV2.1\libを削除する。(これは消さなくても問題ない)
- main.cppのインクルードを正しく修正。
修正前 #include "cv.h" #include "highgui.h"
修正後 #include <opencv/cv.h> #include <opencv/highgui.h>
- リンカー/入力/追加の依存ファイルにcxcore210d.lib;cv210d.lib;highgui210d.libが設定されているのでこれを削除。
- 「OpenCV ver.2 超々々入門(C++)」の方法でOpenCVのlibファイルを指定する。
参考
- gSLIC新しいページ(2013/01/04)
http://www.carlyuheng.com/?page_id=19 - gSLIC古いページ(2013/01/04)
http://www.robots.ox.ac.uk/~carl/software.html - 既存のVSプロジェクトにCUDAコードを追加する方法
http://www.slis.tsukuba.ac.jp/~fujis/cgi-bin/wiki/index.php?%B4%FB%C2%B8%A4%CEVS%A5%D7%A5%ED%A5%B8%A5%A7%A5%AF%A5%C8%A4%CBCUDA%A5%B3%A1%BC%A5%C9%A4%F2%C4%C9%B2%C3%A4%B9%A4%EB%CA%FD%CB%A1 - OpenCV ver.2 超々々入門(C++)
http://buaiso.blogspot.jp/2012/08/opencv2-c.html