はじめに
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
でうまくいったような気がします。
次は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にやり方のおさらいを載せます。ダメだったら、、、、。忘れてください。)