TadaoYamaokaの開発日記

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

dlibをWindowsにインストールする

前々回の日記で、Bash on Windowsにdlibをインストールする方法を書いたが、Anaconda 4.1(64-bit)でインストールしたPython 3.5にもインストールできたので、その方法を示す。
※2016/9/27追記:この方法でインストールしてもJPEGライブラリが有効にならないためサンプルが実行できない。事前にソース修正が必要となる。こちらの記事を参照。

AnacondaでインストールしたPythonのpipコマンドで、

pip install dlib

と行うと、ソースがダウンロードされてcmakeでビルドが行われる。

cmakeは、MSYS2などでインストールして、PATHを通しておく。
コンパイラは、Python3.5に合わせて、Visual Studio 2015をインストールしておく。

この状態で、pipを使ってビルドすると、Boostがないというエラーがでる。

Could NOT find Boost

Boostインストール

Boostを用意する必要があるが、condaやpipでboostをインストールしてもうまく認識されなかったため、ソースからビルドを行った。

Boostの公式サイトから、Boostのソースをダウンロードする。
自分は最新バージョンの「boost_1_61_0.7z」をダウンロードした。

適当な場所に解凍する。(以下、C:\に解凍したものとして説明する。)

dlibをビルドした時のエラーメッセージにBoostのインストール方法が表示されるので、その通りにコマンドを実行する。

--  Set the BOOST_ROOT and BOOST_LIBRARYDIR environment variables before running cmake.
--  E.g.  Something like this:
--     set BOOST_ROOT=C:\local\boost_1_57_0
--     set BOOST_LIBRARYDIR=C:\local\boost_1_57_0\stage\lib
--
--  You will also likely need to compile boost yourself rather than using one of the precompiled
--  windows binaries.  Do this by going to the folder tools\build\ within boost and running
--  bootstrap.bat.  Then run the command:
--     b2 install
--  And then add the output bin folder to your PATH.  Usually this is the C:\boost-build-engine\bin
--  folder. Finally, go to the boost root and run a command like this:
--     b2 -a --with-python address-model=64 toolset=msvc runtime-link=static
--  When it completes, set BOOST_LIBRARYDIR equal to wherever b2 put the compiled libraries.
--  Note that you will need to set the address-model based on if you want a 32 or 64bit python library.
--
--  Next, when you invoke cmake to compile dlib you may have to use cmake's -G option to set the
--  64 vs. 32bit mode of visual studio.  Also, if you want a Python3 library you will need to
--  add -DPYTHON3=1.  You do this with a statement like:
--     cmake -G "Visual Studio 12 2013 Win64" -DPYTHON3=1 ..\..\tools\python
--  Rather than:
--     cmake ..\..\tools\python
--  Which will build a 32bit Python2 module by default on most systems.


コマンドプロンプトで、以下の通りコマンドを実行する。

c:
cd c:\boost_1_61_0
bootstrap.bat
b2 install
b2 -a --with-python address-model=64 toolset=msvc runtime-link=static

ビルドには数10分かかる。

ビルド完了後、環境変数を設定する。

set BOOST_ROOT=C:\boost_1_61_0
set BOOST_INCLUDEDIR=C:\boost_1_61_0
set BOOST_LIBRARYDIR=C:\boost_1_61_0\stage\lib

以下の手順は、環境変数を設定したコマンドプロンプトを閉じずに行う。


dlibインストール

もう一度、dlibをpipコマンドでインストールしようとすると、以下のエラーが表示される。

C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\shared\basetsd.h(77): error C2371: 'INT32': 再定義されています。異なる基本型です。 [C:\Users\xxx\AppData\Local\Temp\pip-build-b3ed4rlj\dlib\tools\python\build\dlib_build\dlib.vcxproj]

これは、おそらく64bit版のみで表示されるエラーで、32bit版の場合は、そのままpipでインストールできると思われる。

64bit版の場合は、dlibのソースを一部修正する必要がある。
pipコマンドでインストールすると、ソースのダウンロードとビルドが自動で行われるのでソースが修正できない。
そこで、dlibをソースからビルドする。

dlibサイトからソースをダウンロードして解凍する。

wget https://github.com/davisking/dlib/archive/v19.1.zip
unzip v19.1.zip

wgetとunzipはmsys2でインストール

解凍したdlib-19.1ディレクトリ内の、dlib\image_saver\save_jpeg.cppをテキストエディタで開いて、9行目に以下の行を追加する。

#include <basetsd.h>

SDKのbasetsd.hでINT32が再定義されるエラーだが、basetsd.hを先にincludeすることでdlib側では定義しなくなるため、エラーが回避できる。

dlib-19.1ディレクトリで、以下のコマンドを実行し、dlibをビルド/インストールする。

python setup.py install

成功すれば、以下のメッセージが表示され、インストール完了となる。

Installed c:\anaconda3\lib\site-packages\dlib-19.1.0-py3.5-win-amd64.egg
Processing dependencies for dlib==19.1.0
Finished processing dependencies for dlib==19.1.0

動作確認

Jupyter QTConsoleなどで、以下のスクリプトを実行する。

import dlib
dlib.__version__

成功すれば、以下の通り表示される。

'19.1.0'