公式URL https://github.com/facebookresearch/Detectron
(開発者が自身で使用している)Linuxで動作確認しているけどWindowsで動くかは知らんぜよというケースがよくありますが、仕事で何か活用するぞとなるとほぼ100%がWindowsの状態で、簡単に「Linux入れれば使えるよ」と言うわけにもいかないので、かなりアドホックに修正しました。
##使用環境
- Windows 7
- GeForce GTX 1080
- CUDA 8+cuDNN v6(CUDA 9+cuDNN v7でも可)
- Visual Studio 2015 Update 3
- Python 2.7
Caffe2 のビルド
公式にはWindows 10以上が必要となっていますが、Windowsバージョンが違うくらいで影響が出るようなAPI叩いたりしてないでしょと、Windows 7 で動かしました。
基本的には公式ドキュメントの https://caffe2.ai/docs/getting-started.html?platform=windows&configuration=compile の手順通りに行います。
使用したCaffe2 https://github.com/pytorch/pytorch/tree/a44d9d6eb40a28975967f5a7c7fb828b2429ad04
Caffe2の修正
Detectronで使用するカスタムオペレータのDLLがそのままロードして使えないので、Caffe2本体に直接組み込むことにしました。
本来ならCaffe2の方をきちんとDLLを読み込めるように修正するのが筋でしょうが、Windows DLLの動作の仕組みもほとんど覚えてないので修正方法の見当をつけられませんでした。
- pytorch/modules/detectron のファイル(CMakeList.txtを除く)を pytorch/caffe2/operators にコピー
- pytorch/binaries/benchmark_helper.cc にダミーの sleep() 関数を作成
- Windowsにはsleep()ないんだよ……
- ベンチマーク用なので適当でよさそう
- pytorcch/scripts/build_windows.bat の編集
- https://github.com/munemasa/pytorch/commit/98080ef09acd6e718a38b0b21c1f7377c612443e
- PYTHON_EXECUTABLE のパスは環境に合わせてください
- ライブラリパスに python27.lib の場所を追加
あとは build_windows.bat を実行して、ビルド終わるのをお待ちください。
CUDA 9 を使った場合は Eigen ライブラリの修正する必要が出てきますが、エラーになった箇所(Half.hの204行目だったかな)はCaffe2で使われてない箇所なのでカットするだけでいいです。
Detectronのビルド
公式ドキュメント通りにビルドを進めます。
コンパイルオプション指定のところでエラーになるので setup.py の -Wno-cpp は削除して make すればすんなり終わります……が実行するとエラーになるので、問題箇所を修正します。
Detectron の修正
- detectron/utils/cython_nms.pyx を修正
- https://github.com/munemasa/Detectron/commit/6400ad18450bad7358aa3fb441b8230327b5c7f2
- np.int_t が long 型で、LP64のLinuxとLLP64のWindowsでサイズ違っているのを修正します(LP64に合わせる)
COCO APIの修正
Detectronで必要な COCO API もWindows対応版( https://github.com/philferriere/cocoapi )があるのでビルドは問題なく済みますが、実際にDetectronで使ってみるとエラーが起きるので修正します。
- メモリ解放処理を修正
- https://github.com/munemasa/cocoapi/commit/fb4b17dd8d69d8f28310770b2253ff733544c231
- Linuxだとそのままで問題ないですが、Windowsだとこうしておかないとダメでした。
おわり
Detectronのテストコード(test_spatial_narrow_as_op.py)が正常に動くようなら、infer_simple.py で物体検出も動作することでしょう。