TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

WindowsでビルドしたCaffeをC++から使う

前回の日記WindowsでビルドしたCaffeをC++から使うことができたので方法を書いておきます。

Windows版caffeをビルドしたVisual Studio 2013のソリューションにプロジェクトを追加する形でプロジェクトを作成します。
はじめソリューションを新規作成して、ビルドしたcaffeのライブラリをリンクするやり方を試しましたがうまくいかないのであきらめました。*1

caffeソリューションにあるcaffeプロジェクトとプロジェクトの設定を同じにすればうまくいくので、以下でその方法を順を追って説明します。

まず、caffeのソリューションを右クリックして追加→新しいプロジェクトで、プロジェクトを作成します。
コマンドラインのアプリケーションの場合は、「Win32コンソールアプリケーション」を空のプロジェクトで作成します。


ここで一旦プロジェクトをすべて保存して、Visual Studioを終了します。


caffeのソリューション内にある「caffeプロジェクト」とプロジェクトの設定を合わせるため、エクスプローラで「caffe\windows\<作成したプロジェクト>」と「caffe\windows\caffe」を開きます。


「caffe\windows\<作成したプロジェクト>」内の「<作成したプロジェクト>.vcxproj」を一旦、どこか別の場所に移動して退避します。


「caffe\windows\caffe」から、「caffe\windows\<作成したプロジェクト>」に、以下のファイルをコピーします。

  • caffe.vcxproj
  • caffe.vcxproj.user
  • packages.config


ファイル名を以下の通り変更します。

  • caffe.vcxproj → <作成したプロジェクト>.vcxproj
  • caffe.vcxproj.user → <作成したプロジェクト>.vcxproj.user


「<作成したプロジェクト>.vcxproj」と退避した「<作成したプロジェクト>.vcxproj」をテキストエディタで開きます。


退避した「<作成したプロジェクト>.vcxproj」の

<ProjectGUID>{E200AC4A-3FC6-4D0A-B6D0-ADD9CBAC166C}</ProjectGUID>
<RootNamespace>MyCaffeSample</RootNamespace>

の2か所をコピーして、「<作成したプロジェクト>.vcxproj」の以下の個所に上書きします。

<ProjectGUID>{CE6BBC46-9EFC-4029-9065-85A023866AFB}</ProjectGUID>
<RootNamespace>caffe</RootNamespace>


以下の行を削除します。

  <ItemGroup>
    <ClCompile Include="..\..\tools\caffe.cpp" />
  </ItemGroup>


テキストエディタでファイルを保存します。


caffeソリューションをVisual Studioで開きます。


これで、プロジェクトの準備が完了です。
caffeプロジェクトと同じ設定になっています。
caffeプロジェクトと同じ設定を手動で行うのは大変なので、上記のようにプロジェクトファイルを加工した方が手っ取り早いです。


作成したプロジェクトにC++のソースを追加して、C++のコードからCaffeをAPI的に呼び出すことができます。
C++コードのサンプルは、このページが参考になります。

サンプルとほぼ同じコードを実装したプロジェクトをGitHubに公開しましたので参考にしてください。
サンプルはCPUで実行するコードでしたが、GPUで実行するように変更しています。

windows/MyCaffeSample」が追加したプロジェクトです。

github.com


このプロジェクトを実行すると以下のような結果が出力されます。

cudaGetDeviceCount = 1
GPU device name: GeForce GTX 760
0.341174x + 0.263271y + 0.524278 = target
10a + 20b + c = 9.20144

*1:libcaffe.libがスタティックリンクされるが、グローバル変数がリンクされないことが原因。extern宣言して無理やりリンクすればうまくいくが冗長なコードになってしまう。