前回はCOCOデータセットの紹介をしました。今回はCOCOデータセットを使って実際に学習を行ってみます。
前回ご説明したようにCOCOを使った学習は、train2014の82,783枚と、val2014の40,504枚からvalidation用の5,000枚を引いた残り(val35k)をあわせた、trainval35kがよく用いられます。このデータのアノテーションデータは、instances_trainval35k.jsonと呼ばれるものですが、なぜか検索しても見つからなく、仕方ないのでまずこのアノテーションデータを作るところから始めます。
instances_train2014.jsonとinstances_valminusminival2014.jsonは入手可能ですので、instances_trainval35k.jsonはこれらをマージすればよいことになります。それぞれのjsonファイルの中身を見てみると、'info', 'licenses', 'categories', 'images', 'annotations'が共通するkeyで、このうち'info', 'licenses', 'categories'はvalueも同じでよいようです。あとは'images'と'annotations'をマージすれば良さそうなので、以下のようなスクリプトで、instances_trainval35k.jsonを作ってみました。
import json
def main():
f0 = open('instances_train2014.json')
d0 = json.load(f0)
f1 = open('instances_valminusminival2014.json')
d1 = json.load(f1)
i0 = d0["images"]
i1 = d1["images"]
i0.extend(i1)
a0 = d0["annotations"]
a1 = d1["annotations"]
a0.extend(a1)
d2 = {'info': d0['info'],
'licenses': d0['licenses'],
'categories': d0['categories'],
'images': i0,
'annotations': a0}
f2 = open('instances_trainval35k.json', 'w')
json.dump(d2, f2)
if __name__ == '__main__':
main()
$ python create_trainval35k.py
coco
images
trainval35k
- COCO_train2014_000000000009.jpg
- COCO_train2014_000000000025.jpg
- ...
annotations
- instances_trainval35k.json
学習関連のパラメータは data/config.py にまとめられています。以下の部分が使われますが、num_classesだけ変更しています。COCOのクラス数は80 (backgorundを含めて81) だと思うので、なぜ201となっているのか不明なのですが、ひとまず81に変更します。
coco = {
# 'num_classes': 201,
'num_classes': 81,
'lr_steps': (280000, 360000, 400000),
'max_iter': 400000,
'feature_maps': [38, 19, 10, 5, 3, 1],
'min_dim': 300,
'steps': [8, 16, 32, 64, 100, 300],
'min_sizes': [21, 45, 99, 153, 207, 261],
'max_sizes': [45, 99, 153, 207, 261, 315],
'aspect_ratios': [[2], [2, 3], [2, 3], [2, 3], [2], [2]],
'variance': [0.1, 0.2],
'clip': True,
'name': 'COCO',
}
学習は以下のようにして開始します。
$ CUDA_VISIBLE_DEVICES=0 python train.py --dataset=COCO --dataset_root=/mnt/ssd/data/coco/
学習結果の評価は次回とすることにして、その前に以前ご紹介したResNeXtをベースネットとして用いるFSSDを、COCOデータで学習してみます。train_fssd_resnext.py内でcfg = vocd512fとなっている部分を、cfg = cocoに変更します。また、data/config.py内で以下のようにします。
coco = {
'num_classes': 81,
'lr_steps': (100, 130, 150),
'max_epoch': 150,
'feature_maps': [64, 32, 16, 8, 4, 2, 1],
'min_dim': 512,
'steps': [8, 16, 32, 64, 128, 256, 512],
'min_sizes': [35, 76, 153, 230, 307, 384, 460],
'max_sizes': [76, 153, 230, 307, 384, 460, 537],
'box': [6, 6, 6, 6, 6, 4, 4],
'aspect_ratios': [[2,3], [2,3], [2,3], [2,3], [2,3], [2], [2]],
'variance': [0.1, 0.2],
'clip': True,
'name': 'COCO',
}
以下のコマンドで学習をスタートします。
$ CUDA_VISIBLE_DEVICES=0 python train_fssd_resnext.py --dataset=COCO --dataset_root=/mnt/ssd/coco/ --loss_type=cross_entropy --weight_prefix=VOC512_FSSD_RESNEXT_ --batch_size=8 --use_pred_module=True
どちらともロスの値が下がっていくようなら、ひとまずは成功です。