CornerNet-LiteのWindows 10での実行（インファレンスだけで力尽きました。）

#はじめに
　[CornerNet-Lite: Efficient Keypoint Based Object Detection](https://arxiv.org/abs/1904.08900)の作者の実装である、[github](https://github.com/princeton-vl/CornerNet-Lite)をWindows 10で動かしたので、ここに記しておきます。
#１．CornerNet-Liteとは
　昨年発表された、[CornerNet: Detecting Objects as Paired Keypoints](https://arxiv.org/abs/1808.01244)を軽くしたもののようです。
　CornerNetは日本語での解説も一部ありますから、いろいろ探してみてください。私としては、__Fig.1__の、YOLOv3よりAPが高く、スピードが速いというところに魅力を感じました。まだまだ新しい方法ですので、派生のネットワークが出てくるのではないかと思います。
#２．私のPC

- Windows 10

- CPU Intel Core i5-4570S 2.9GHz

- RAM 16GB

- GPU RTX2070 8GB

なんか微妙にしょぼいですね。。。GPUに見合うCPUとメモリが欲しい。。。すでに、Visual Studio Community 2017やらCUDA10(cuDNN含む)やらは入っているので、そのあたりは参考にならないので注意してください。（もう一台まっさらなPCで再構成できればいいのですが、そうもいきません。。。）
#３．事前準備
私は、Anaconda環境を使いました。ものによってPythonのバージョンとかが微妙に違うので、仮想環境を使うのがよいと思います。Anacondaのインストールはググってください。本来ならば、`CornerNet-Lite`の環境を作ってからクローニングしますが、`conda_packagelist.txt`があるはずなので、まずはクローニングします。

```
(base) F:\Users\sounansu\Anaconda3>git clone https://github.com/princeton-vl/CornerNet-Lite.git CornerNet-Lite
```
はい、`CornerNet-Lite`のディレクトリに移って、仮想環境を作りましょう。

```
(base) F:\Users\sounansu\Anaconda3\CornerNet-Lite>conda create --name CornerNet_Lite --file conda_packagelist.txt --channel pytorch
略
PackagesNotFoundError: The following packages are not available from current channels:
略
```
Windows用は`packagelist.txt`にかかれたバージョン等がないのでしょう。
というわけで、地道に入れていきましょう。

```
(base) F:\Users\sounansu\Anaconda3\CornerNet-Lite>conda create --name CornerNet_Lite python==3.7.1 anaconda
略
done
#
# To activate this environment, use
#
#     $ conda activate CornerNet_Lite
#
# To deactivate an active environment, use
#
#     $ conda deactivate
```
仮想環境に移ります。

```
(base) F:\Users\sounansu\Anaconda3\CornerNet-Lite>conda activate CornerNet_Lite

(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite>
```
PyTorchは[Pytorch](https://pytorch.org/)サイトで、私は、Stable,windows,conda,python3.7,cuda10で`conda install pytorch torchvision cudatoolkit=10.0 -c pytorch`をえらびました。

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite>conda install pytorch torchvision cudatoolkit=10.0 -c pytorch
```
これで、事前準備は終わったこととして、CornerNet-Liteを入れていきましょう。
#４．CornerNet-Liteの実行
すでに、`git clone`しているので、[Compiling Corner Pooling Layers](https://github.com/princeton-vl/CornerNet-Lite#compiling-corner-pooling-layers)から順番にやっていきましょう。

```

(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite>cd core/models/py_utils/_cpools/
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\core\models\py_utils\_cpools>python setup.py install --user
略
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2
```
エラーが出ましたが、issueの[ここ](https://github.com/princeton-vl/CornerNet-Lite/issues/6#issuecomment-485673820)を参考に、

```
diff --git a/core/models/py_utils/_cpools/src/bottom_pool.cpp b/core/models/py_u
tils/_cpools/src/bottom_pool.cpp
index 8a20a43..9f88c66 100644
--- a/core/models/py_utils/_cpools/src/bottom_pool.cpp
+++ b/core/models/py_utils/_cpools/src/bottom_pool.cpp
@@ -1,4 +1,4 @@
-#include <torch/torch.h>
+#include <torch/extension.h>

 #include <vector>

diff --git a/core/models/py_utils/_cpools/src/left_pool.cpp b/core/models/py_uti
ls/_cpools/src/left_pool.cpp
index c36fc1b..90b1e81 100644
--- a/core/models/py_utils/_cpools/src/left_pool.cpp
+++ b/core/models/py_utils/_cpools/src/left_pool.cpp
@@ -1,4 +1,4 @@
-#include <torch/torch.h>
+#include <torch/extension.h>

 #include <vector>

diff --git a/core/models/py_utils/_cpools/src/right_pool.cpp b/core/models/py_ut
ils/_cpools/src/right_pool.cpp
index 1b2da43..2ff98e1 100644
--- a/core/models/py_utils/_cpools/src/right_pool.cpp
+++ b/core/models/py_utils/_cpools/src/right_pool.cpp
@@ -1,4 +1,4 @@
-#include <torch/torch.h>
+#include <torch/extension.h>

 #include <vector>

diff --git a/core/models/py_utils/_cpools/src/top_pool.cpp b/core/models/py_util
s/_cpools/src/top_pool.cpp
index bc63c49..6719357 100644
--- a/core/models/py_utils/_cpools/src/top_pool.cpp
+++ b/core/models/py_utils/_cpools/src/top_pool.cpp
@@ -1,4 +1,4 @@
-#include <torch/torch.h>
+#include <torch/extension.h>

 #include <vector>
```
のように修正しました。もう一度コーナープーリングをコンパイルしましょう。

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\core\models\py_utils\_cpools>python setup.py install --user
略
Finished processing dependencies for cpools==0.0.0
```
うまくいったようです。次は、[Compiling NMS](https://github.com/princeton-vl/CornerNet-Lite#compiling-nms)です。

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\core\models\py_utils\_cpools>cd ../../../external

(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\core\external>make
      1 [main] make 8172 find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer.  Please report this problem to
the public mailing list cygwin@cygwin.com
python setup.py build_ext --inplace
make: python: Command not found
Makefile:2: recipe for target `all' failed
make: *** [all] Error 127
```
makefileのどこがわるのかよくわからないので、これまたissueの[ここ](https://github.com/princeton-vl/CornerNet-Lite/issues/6#issuecomment-486045618)を参照して、

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\core\external>python setup.py build_ext --inplace
略
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2
```
これも、issueに[あって](https://github.com/princeton-vl/CornerNet-Lite/issues/6#issuecomment-486046092)

```
index ca3bd04..c1dfb4c 100644
--- a/core/external/setup.py
+++ b/core/external/setup.py
@@ -7,12 +7,12 @@ extensions = [
     Extension(
         "bbox",
         ["bbox.pyx"],
-        extra_compile_args=["-Wno-cpp", "-Wno-unused-function"]
+        extra_compile_args={'gcc': ['/Qstd=c99']}
     ),
     Extension(
         "nms",
         ["nms.pyx"],
-        extra_compile_args=["-Wno-cpp", "-Wno-unused-function"]
+        extra_compile_args={'gcc': ['/Qstd=c99']}
     )
 ]
```
のように修正しました。あらためて実行すると、

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\core\external>python setup.py build_ext --inplace
略
コード生成が終了しました。
```
次に、まずは、出来合いのウエイトデータでインファレンスが動くかやってみましょう。[Downloading Models](https://github.com/princeton-vl/CornerNet-Lite#downloading-models)に書かれている、google driveからデータをダウンロードして、`<CornerNet-Lite dir>/cache/nnet/CornerNet_Saccade/,<CornerNet-Lite dir>/cache/nnet/CornerNet_Squeeze/,<CornerNet-Lite dir>/cache/nnet/CornerNet/`にそれぞれ入れてください。

これで準備がおわったので、[Running the Demo Script](https://github.com/princeton-vl/CornerNet-Lite#running-the-demo-script)にあるように、`python demo.py`を実行してみましょう。

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite>python demo.py
Traceback (most recent call last):
  File "demo.py", line 3, in <module>
    import cv2
ModuleNotFoundError: No module named 'cv2'
```
opencvを入れましょう。

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite>conda install opencv
```
さて、また`python demo.py`を実行してみましょう。

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite>python demo.py
total parameters: 116969339
loading from F:\Users\sounansu\Anaconda3\CornerNet-Lite\core\..\cache\nnet\CornerNet_Saccade\CornerNet_Saccade_500000.pkl
F:\Users\sounansu\Anaconda3\envs\CornerNet_Lite\lib\site-packages\torch\nn\functional.py:2539: UserWarning: Default upsampling behavior when mode=bilinear is changed to align_corners=False since 0.4.0. Please specify align_corners=True if the old behavior is desired. See the documentation of nn.Upsample for details.
  "See the documentation of nn.Upsample for details.".format(mode))
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite>dir demo*.jpg
 ドライブ F のボリューム ラベルは 記憶域 です
 ボリューム シリアル番号は ACCF-E884 です

 F:\Users\sounansu\Anaconda3\CornerNet-Lite のディレクトリ

2019/05/10  22:29           323,088 demo.jpg
2019/05/12  14:38           219,824 demo_out.jpg
               2 個のファイル             542,912 バイト
```
実行結果を置いておきます。
![demo_out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168387/eccb78b9-9415-b754-5983-8c0a231bf4be.jpeg)
うまくいっているようです。
#おわりに
　一応これでインファレンスができるようになりました。途中`git make`等もinstallしました。すでに、cudaやVSCをインストールしていたので、そのあたりでのつまずきはなかったです。

　もし、うまくいかないとかありましたら、コメントに書いてくださいましたら、わかる範囲でお答えいたします。トレーニングもできるようになっているのですが、いろいろと、トラップが存在します。がんばってトレーニングも投稿しますので、、、期待せずに待っていてください。

では。