CornerNet-LiteのWindows 10での学習（ようやくトレーニング）

# はじめに
　CornerNet-Liteの[インファレンスの記事](https://qiita.com/sounansu/items/9a6caf1ac5e78aefaeae)を投稿して、早くトレーニングの記事を書かなければと思っていたのですが、[CenterNet](https://arxiv.org/abs/1904.07850)をWindows 10で実行するのに手間取って、遅くなりました。
　CenterNetは、[CenterNet (Objects as Points) を無料GPU（Colab）で動かしてみる](https://qiita.com/sonodaatom/items/fe148a177b1d1b40c34d)という、マニアックな記事がQiitaにあります。私も次の投稿でWindows 10でのインファレンスのやり方を投稿するつもりです。いまはトレーニングができるかどうかやっているところです。（トレーニングができなかったら恥ずかしいので投稿はやめます。）
### 注意
　今回はインファレンスはすでにできているというのが前提で、トレーニングを実行するときにつまずいた箇所を書いていきます。
#1. MS COCO APIsのインストール
　[Installing MS COCO Data](https://github.com/princeton-vl/CornerNet-Lite#installing-ms-coco-api)にある通りなのですが、

```
# mkdir -p <CornerNet-Lite dir>/data
# cd <CornerNet-Lite dir>/data
# git clone  git@github.com:cocodataset/cocoapi.git coco
Cloning into 'coco'...
Warning: Permanently added the RSA host key for IP address '52.69.186.44' to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

と言われてしまったので、

```
# git clone https://github.com/cocodataset/cocoapi.git coco
Cloning into 'coco'...
remote: Enumerating objects: 953, done.
remote: Total 953 (delta 0), reused 0 (delta 0), pack-reused 953
Receiving objects: 100% (953/953), 11.70 MiB | 687.00 KiB/s, done.
Resolving deltas: 100% (565/565), done.
```

として、インストールしました。

```
# cd <CornerNet-Lite dir>/data/coco/PythonAPI
# make install
      1 [main] make 9832 find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer.  Please report this problem to
the public mailing list cygwin@cygwin.com
# install pycocotools to the Python site-packages
make: /bin/sh: Command not found
Makefile:7: recipe for target `install' failed
make: *** [install] Error 127
```
いろいろいわれているので、面倒なので

```
# type Makefile
all:
    # install pycocotools locally
        python setup.py build_ext --inplace
        rm -rf build

install:
        # install pycocotools to the Python site-packages
        python setup.py build_ext install
        rm -rf build
```
ということで、

```
# python setup.py build_ext install
略
cl : コマンド ライン error D8021 : 数値型引数 '/Wno-cpp' は無効です。
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
```
inferenceの時に出ていたエラーがまた出ているので、

```
# git diff
index dbf0093..cd37940 100644
--- a/PythonAPI/setup.py
+++ b/PythonAPI/setup.py
@@ -9,7 +9,7 @@ ext_modules = [
         'pycocotools._mask',
         sources=['../common/maskApi.c', 'pycocotools/_mask.pyx'],
         include_dirs = [np.get_include(), '../common'],
-        extra_compile_args=['-Wno-cpp', '-Wno-unused-function', '-std=c99'],
+        extra_compile_args={'gcc': ['/Qstd=c99']},
     )
 ]
```
と修正して、

```
# python setup.py build_ext install
略
Finished processing dependencies for pycocotools==2.0
```
でうまくいったような気がします。

#2. [Downdloading MS COCO](https://github.com/princeton-vl/CornerNet-Lite#downloading-ms-coco-data)

次はGoogle DriveからAnnotationデータのダウンロードを[ここ](https://drive.google.com/file/d/1dop4188xo5lXDkGtOZUzy2SHOD_COXz4/view?usp=sharing)からします。それを```CornerNet-Lite\data\coco\```におき、unzipします。

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco>dir annotations.zip
 ドライブ F のボリューム ラベルは 記憶域 です
 ボリューム シリアル番号は ACCF-E884 です

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

2019/05/06  12:53       165,200,202 annotations.zip
               1 個のファイル         165,200,202 バイト
               0 個のディレクトリ  2,430,335,139,840 バイトの空き領域
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco>dir annotations
 ドライブ F のボリューム ラベルは 記憶域 です
 ボリューム シリアル番号は ACCF-E884 です

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

2019/06/01  12:14    <DIR>          .
2019/06/01  12:14    <DIR>          ..
2019/06/01  12:14    <DIR>          annotations
2019/06/01  12:14    <DIR>          __MACOSX
               0 個のファイル                   0 バイト
               4 個のディレクトリ  2,429,785,260,032 バイトの空き領域

```
次に、COCOのイメージデータをダウンロードということで、
[2014 Train images [83K/13GB]](http://images.cocodataset.org/zips/train2014.zip)
[2014 Val images [41K/6GB]](http://images.cocodataset.org/zips/val2014.zip)
[2017 Test images [41K/6GB]](http://images.cocodataset.org/zips/test2017.zip)
をダウンロードして、ディレクトリを作って展開しました。

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco\images>dir
 ドライブ F のボリューム ラベルは 記憶域 です
 ボリューム シリアル番号は ACCF-E884 です

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

2019/06/01  14:03    <DIR>          .
2019/06/01  14:03    <DIR>          ..
2019/06/01  14:03    <DIR>          minival2014
2019/05/07  08:22     6,646,970,404 test2017.zip
2019/06/01  14:26    <DIR>          testdev2017
2019/05/07  03:08    13,510,573,713 train2014.zip
2019/06/01  13:39    <DIR>          trainval2014
2019/05/07  02:30     6,645,013,297 val2014.zip
               3 個のファイル      26,802,557,414 バイト
               5 個のディレクトリ  2,368,184,655,872 バイトの空き領域
```
#3.[Training and Evaluating a Model](https://github.com/princeton-vl/CornerNet-Lite#training-and-evaluating-a-model)
まずは、ここで、トレーニングをやってみましょう。（データをどこのディレクトリに置けばよいのかは、ちゃんとPythonコードを追うとわかるのでしょうが、、）

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite>python train.py CornerNet_Saccade
Process 0: loading all datasets...
Process 0: using 4 workers
loading annotations into memory...
Traceback (most recent call last):
  File "train.py", line 249, in <module>
    main(None, ngpus_per_node, args)
  File "train.py", line 220, in main
    training_dbs = [datasets[dataset](config["db"], split=train_split, sys_config=system_config) for _ in range(workers)]
  File "train.py", line 220, in <listcomp>
    training_dbs = [datasets[dataset](config["db"], split=train_split, sys_config=system_config) for _ in range(workers)]
  File "F:\Users\sounansu\Anaconda3\CornerNet-Lite\core\dbs\coco.py", line 71, in __init__
    self._detections, self._eval_ids = self._load_coco_annos()
  File "F:\Users\sounansu\Anaconda3\CornerNet-Lite\core\dbs\coco.py", line 78, in _load_coco_annos
    coco = COCO(self._anno_file)
  File "F:\Users\sounansu\Anaconda3\envs\CornerNet_Lite\lib\site-packages\pycocotools-2.0-py3.7-win-amd64.egg\pycocotools\coco.py", line 84, in __init__
    dataset = json.load(open(annotation_file, 'r'))
FileNotFoundError: [Errno 2] No such file or directory: './data\\coco\\annotations\\instances_trainval2014.json'
```
どうも、```data\coco\annotations```の下にjsonを置かなければならないようで、

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco\annotations>dir
 ドライブ F のボリューム ラベルは 記憶域 です
 ボリューム シリアル番号は ACCF-E884 です

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

2019/06/01  12:14    <DIR>          .
2019/06/01  12:14    <DIR>          ..
2019/06/01  12:14    <DIR>          annotations
2019/06/01  12:14    <DIR>          __MACOSX
               0 個のファイル                   0 バイト
               4 個のディレクトリ  2,368,184,639,488 バイトの空き領域
```
のannotationsの中のannotationsディレクトリ

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco\annotations>dir annotations
 ドライブ F のボリューム ラベルは 記憶域 です
 ボリューム シリアル番号は ACCF-E884 です

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

2019/06/01  12:14    <DIR>          .
2019/06/01  12:14    <DIR>          ..
2019/06/01  12:14             6,148 .DS_Store
2019/06/01  12:14        21,920,976 instances_minival2014.json
2019/06/01  12:14         3,978,101 instances_testdev2017.json
2019/06/01  12:14       523,965,144 instances_trainval2014.json
               4 個のファイル         549,870,369 バイト
               2 個のディレクトリ  2,368,117,530,624 バイトの空き領域
```
のjsonを一つ上に移動させましょう。

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco\annotations>cd annotations

(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco\annotations\annotations>move *.json ..
F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco\annotations\annotations\instances_minival2014.json
F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco\annotations\annotations\instances_testdev2017.json
F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco\annotations\annotations\instances_trainval2014.json
        3 個のファイルを移動しました。

(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco\annotations\annotations>cd ..

(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite\data\coco\annotations>dir
 ドライブ F のボリューム ラベルは 記憶域 です
 ボリューム シリアル番号は ACCF-E884 です

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

2019/06/01  17:36    <DIR>          .
2019/06/01  17:36    <DIR>          ..
2019/06/01  17:36    <DIR>          annotations
2019/06/01  12:14        21,920,976 instances_minival2014.json
2019/06/01  12:14         3,978,101 instances_testdev2017.json
2019/06/01  12:14       523,965,144 instances_trainval2014.json
2019/06/01  12:14    <DIR>          __MACOSX
               3 個のファイル         549,864,221 バイト
               4 個のディレクトリ  2,368,117,530,624 バイトの空き領域

```
さて、もう一度トレーニングをやってみましょう。

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite>python train.py CornerNet_Saccade
Process 0: loading all datasets...
Process 0: using 4 workers
loading annotations into memory...
Done (t=22.49s)
creating index...
index created!
loading annotations into memory...
Done (t=19.21s)
creating index...
index created!
loading annotations into memory...
Done (t=19.87s)
creating index...
index created!
loading annotations into memory...
Done (t=37.70s)
creating index...
index created!
loading annotations into memory...
Done (t=1.36s)
creating index...
index created!
system config...
{'batch_size': 48,
 'cache_dir': './cache',
 'chunk_sizes': [12, 12, 12, 12],
 'config_dir': './config',
 'data_dir': './data',
 'data_rng': <mtrand.RandomState object at 0x0000021027B4C048>,
 'dataset': 'COCO',
 'decay_rate': 10,
 'display': 5,
 'learning_rate': 0.00025,
 'max_iter': 500000,
 'nnet_rng': <mtrand.RandomState object at 0x000002102AF984C8>,
 'opt_algo': 'adam',
 'prefetch_size': 5,
 'pretrain': None,
 'result_dir': './results',
 'sampling_function': 'cornernet_saccade',
 'snapshot': 5000,
 'snapshot_name': 'CornerNet_Saccade',
 'stepsize': 450000,
 'test_split': 'testdev',
 'train_split': 'trainval',
 'val_iter': 100,
 'val_split': 'minival'}
db config...
{'ae_threshold': 0.3,
 'att_max_crops': 30,
 'att_nms_ks': [3, 3, 3],
 'att_ranges': [[96, 256], [32, 96], [0, 32]],
 'att_ratios': [16, 8, 4],
 'att_scales': [[1, 2, 4]],
 'att_sizes': [[16, 16], [32, 32], [64, 64]],
 'att_thresholds': [0.3],
 'border': 64,
 'categories': 80,
 'data_aug': True,
 'gaussian_bump': True,
 'gaussian_iou': 0.5,
 'gaussian_radius': -1,
 'init_sizes': [192, 255],
 'input_size': [255, 255],
 'lighting': True,
 'max_per_image': 100,
 'max_per_set': 40,
 'max_scale': 32,
 'merge_bbox': False,
 'min_scale': 16,
 'nms_algorithm': 'exp_soft_nms',
 'nms_kernel': 3,
 'nms_threshold': 0.5,
 'num_dets': 12,
 'output_sizes': [[64, 64]],
 'rand_center': True,
 'rand_color': False,
 'rand_crop': False,
 'rand_scale_max': 1.1,
 'rand_scale_min': 0.5,
 'rand_scale_step': 0.1,
 'rand_scales': array([0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1]),
 'ref_dets': True,
 'score_threshold': 0.05,
 'test_flipped': True,
 'test_scales': [1],
 'top_k': 12,
 'view_sizes': [],
 'weight_exp': 8}
len of db: 118287
distributed: False
Process 0: building model...
total parameters: 116969339
start prefetching data...
shuffling indices...
start prefetching data...
shuffling indices...
start prefetching data...
shuffling indices...
start prefetching data...setting learning rate to: 0.00025
shuffling indices...

training start...
  0%|                                                | 0/500000 [00:00<?, ?it/s]
```
始まったのですが、

```
RuntimeError: CUDA error: invalid device ordinal (exchangeDevice at ..\c10/cuda/impl/CUDAGuardImpl.h:29)
(no backtrace available)
```
とエラーが出てしまいました。
よくわからないのですが、複数のissueを読むと、githubのコードは、トレーニングの際に4GPU使ってトレーニングするように、```CornerNet-Lite\configs```ないのjsonの

```
       "batch_size": 48,
```
と

```
        "chunk_sizes": [12, 12, 12, 12]
```
で1GPUあたり、12個ずつ1バッチ48で指示しているようなので、

```
diff --git a/configs/CornerNet_Saccade.json b/configs/CornerNet_Saccade.json
index 533b3fa..137eda6 100755
--- a/configs/CornerNet_Saccade.json
+++ b/configs/CornerNet_Saccade.json
@@ -1,7 +1,7 @@
 {
     "system": {
         "dataset": "COCO",
-        "batch_size": 48,
+        "batch_size": 6,
         "sampling_function": "cornernet_saccade",

         "train_split": "trainval",
@@ -19,7 +19,7 @@
         "stepsize": 450000,
         "snapshot": 5000,

-        "chunk_sizes": [12, 12, 12, 12]
+        "chunk_sizes": [6]
     },

     "db": {
```
と合計1GPUでGPUあたり6バッチ(RTX2070のため)と変更してトレーニングし始めると、

```
(CornerNet_Lite) F:\Users\sounansu\Anaconda3\CornerNet-Lite>python train.py CornerNet_Saccade
Process 0: loading all datasets...
Process 0: using 4 workers
loading annotations into memory...
Done (t=19.18s)
creating index...
index created!
loading annotations into memory...
Done (t=19.24s)
creating index...
index created!
loading annotations into memory...
Done (t=20.39s)
creating index...
index created!
loading annotations into memory...
Done (t=41.88s)
creating index...
index created!
loading annotations into memory...
Done (t=1.13s)
creating index...
index created!
system config...
{'batch_size': 6,
 'cache_dir': './cache',
 'chunk_sizes': [6],
 'config_dir': './config',
 'data_dir': './data',
 'data_rng': <mtrand.RandomState object at 0x000001794F768438>,
 'dataset': 'COCO',
 'decay_rate': 10,
 'display': 5,
 'learning_rate': 0.00025,
 'max_iter': 500000,
 'nnet_rng': <mtrand.RandomState object at 0x000001794F768480>,
 'opt_algo': 'adam',
 'prefetch_size': 5,
 'pretrain': None,
 'result_dir': './results',
 'sampling_function': 'cornernet_saccade',
 'snapshot': 5000,
 'snapshot_name': 'CornerNet_Saccade',
 'stepsize': 450000,
 'test_split': 'testdev',
 'train_split': 'trainval',
 'val_iter': 100,
 'val_split': 'minival'}
db config...
{'ae_threshold': 0.3,
 'att_max_crops': 30,
 'att_nms_ks': [3, 3, 3],
 'att_ranges': [[96, 256], [32, 96], [0, 32]],
 'att_ratios': [16, 8, 4],
 'att_scales': [[1, 2, 4]],
 'att_sizes': [[16, 16], [32, 32], [64, 64]],
 'att_thresholds': [0.3],
 'border': 64,
 'categories': 80,
 'data_aug': True,
 'gaussian_bump': True,
 'gaussian_iou': 0.5,
 'gaussian_radius': -1,
 'init_sizes': [192, 255],
 'input_size': [255, 255],
 'lighting': True,
 'max_per_image': 100,
 'max_per_set': 40,
 'max_scale': 32,
 'merge_bbox': False,
 'min_scale': 16,
 'nms_algorithm': 'exp_soft_nms',
 'nms_kernel': 3,
 'nms_threshold': 0.5,
 'num_dets': 12,
 'output_sizes': [[64, 64]],
 'rand_center': True,
 'rand_color': False,
 'rand_crop': False,
 'rand_scale_max': 1.1,
 'rand_scale_min': 0.5,
 'rand_scale_step': 0.1,
 'rand_scales': array([0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1]),
 'ref_dets': True,
 'score_threshold': 0.05,
 'test_flipped': True,
 'test_scales': [1],
 'top_k': 12,
 'view_sizes': [],
 'weight_exp': 8}
len of db: 118287
distributed: False
Process 0: building model...
total parameters: 116969339
start prefetching data...
shuffling indices...
start prefetching data...
shuffling indices...
start prefetching data...
shuffling indices...
start prefetching data...
shuffling indices...
setting learning rate to: 0.00025
training start...
Process 0: training loss at iteration 5: 166.93370056152344
Process 0: training loss at iteration 10: 50.40235137939453
Process 0: training loss at iteration 15: 26.264556884765625
  0%|                                   | 16/500000 [01:17<279:45:48,  2.01s/it]
```
無事始まったようです。
#おわりに
　CornerNet-Liteいかがだったでしょうか？Windowsでいらん苦労しているという話でもあるのですが、Object Detectionの新しい流れを感じるためにも、まずは、コードを動かしてみて、いろいろいじってみるのがいいんじゃないかと思うところです。
　Inferenceができれば、Trainingは比較的楽にできますので、遊んでみてください。次は一応InferenceができるようになったCenterNetですが、これからそちらのTrainingにチャレンジしてみます。
（うまくそこまでいけばQiitaにやり方のおさらいを載せます。ダメだったら、、、、。忘れてください。）