LoginSignup
6
5

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-01

はじめに

 CornerNet-Liteのインファレンスの記事を投稿して、早くトレーニングの記事を書かなければと思っていたのですが、CenterNetをWindows 10で実行するのに手間取って、遅くなりました。
 CenterNetは、CenterNet (Objects as Points) を無料GPU(Colab)で動かしてみるという、マニアックな記事がQiitaにあります。私も次の投稿でWindows 10でのインファレンスのやり方を投稿するつもりです。いまはトレーニングができるかどうかやっているところです。(トレーニングができなかったら恥ずかしいので投稿はやめます。)

注意

 今回はインファレンスはすでにできているというのが前提で、トレーニングを実行するときにつまずいた箇所を書いていきます。

1. MS COCO APIsのインストール

 Installing MS COCO Dataにある通りなのですが、

# 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

次はGoogle DriveからAnnotationデータのダウンロードをここからします。それを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]
2014 Val images [41K/6GB]
2017 Test images [41K/6GB]
をダウンロードして、ディレクトリを作って展開しました。

(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

まずは、ここで、トレーニングをやってみましょう。(データをどこのディレクトリに置けばよいのかは、ちゃんと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にやり方のおさらいを載せます。ダメだったら、、、、。忘れてください。)

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5