From f0ecb9d5316ddce6d159b2b040a2307084d54283 Mon Sep 17 00:00:00 2001 From: yhcao6 <yhcao6@gmail.com> Date: Thu, 20 Dec 2018 17:48:31 +0800 Subject: [PATCH] update center of base anchor to be half of stride --- configs/pascal_voc/ssd300_voc.py | 6 +++--- configs/pascal_voc/ssd512_voc.py | 6 +++--- configs/ssd300_coco.py | 6 +++--- configs/ssd512_coco.py | 6 +++--- mmdet/core/anchor/anchor_generator.py | 17 +++++++++-------- mmdet/models/single_stage_heads/ssd_head.py | 4 +++- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/configs/pascal_voc/ssd300_voc.py b/configs/pascal_voc/ssd300_voc.py index b98d36e..79d60e9 100644 --- a/configs/pascal_voc/ssd300_voc.py +++ b/configs/pascal_voc/ssd300_voc.py @@ -51,7 +51,7 @@ data = dict( workers_per_gpu=2, train=dict( type='RepeatDataset', - times=20, + times=10, dataset=dict( type=dataset_type, ann_file=[ @@ -113,7 +113,7 @@ lr_config = dict( warmup='linear', warmup_iters=500, warmup_ratio=1.0 / 3, - step=[8, 11]) + step=[16, 20]) checkpoint_config = dict(interval=1) # yapf:disable log_config = dict( @@ -124,7 +124,7 @@ log_config = dict( ]) # yapf:enable # runtime settings -total_epochs = 12 +total_epochs = 24 dist_params = dict(backend='nccl') log_level = 'INFO' work_dir = './work_dirs/ssd300_voc' diff --git a/configs/pascal_voc/ssd512_voc.py b/configs/pascal_voc/ssd512_voc.py index daae45c..25e1369 100644 --- a/configs/pascal_voc/ssd512_voc.py +++ b/configs/pascal_voc/ssd512_voc.py @@ -51,7 +51,7 @@ data = dict( workers_per_gpu=2, train=dict( type='RepeatDataset', - times=20, + times=10, dataset=dict( type=dataset_type, ann_file=[ @@ -113,7 +113,7 @@ lr_config = dict( warmup='linear', warmup_iters=500, warmup_ratio=1.0 / 3, - step=[8, 11]) + step=[16, 20]) checkpoint_config = dict(interval=1) # yapf:disable log_config = dict( @@ -124,7 +124,7 @@ log_config = dict( ]) # yapf:enable # runtime settings -total_epochs = 12 +total_epochs = 24 dist_params = dict(backend='nccl') log_level = 'INFO' work_dir = './work_dirs/ssd512_voc' diff --git a/configs/ssd300_coco.py b/configs/ssd300_coco.py index 575af58..781d2df 100644 --- a/configs/ssd300_coco.py +++ b/configs/ssd300_coco.py @@ -51,7 +51,7 @@ data = dict( workers_per_gpu=3, train=dict( type='RepeatDataset', - times=10, + times=5, dataset=dict( type=dataset_type, ann_file=data_root + 'annotations/instances_train2017.json', @@ -110,7 +110,7 @@ lr_config = dict( warmup='linear', warmup_iters=500, warmup_ratio=1.0 / 3, - step=[8, 11]) + step=[16, 22]) checkpoint_config = dict(interval=1) # yapf:disable log_config = dict( @@ -121,7 +121,7 @@ log_config = dict( ]) # yapf:enable # runtime settings -total_epochs = 12 +total_epochs = 24 dist_params = dict(backend='nccl') log_level = 'INFO' work_dir = './work_dirs/ssd300_coco' diff --git a/configs/ssd512_coco.py b/configs/ssd512_coco.py index db1152a..1d9b352 100644 --- a/configs/ssd512_coco.py +++ b/configs/ssd512_coco.py @@ -51,7 +51,7 @@ data = dict( workers_per_gpu=3, train=dict( type='RepeatDataset', - times=10, + times=5, dataset=dict( type=dataset_type, ann_file=data_root + 'annotations/instances_train2017.json', @@ -110,7 +110,7 @@ lr_config = dict( warmup='linear', warmup_iters=500, warmup_ratio=1.0 / 3, - step=[8, 11]) + step=[16, 22]) checkpoint_config = dict(interval=1) # yapf:disable log_config = dict( @@ -121,7 +121,7 @@ log_config = dict( ]) # yapf:enable # runtime settings -total_epochs = 12 +total_epochs = 24 dist_params = dict(backend='nccl') log_level = 'INFO' work_dir = './work_dirs/ssd512_coco' diff --git a/mmdet/core/anchor/anchor_generator.py b/mmdet/core/anchor/anchor_generator.py index 84600be..8995ea6 100644 --- a/mmdet/core/anchor/anchor_generator.py +++ b/mmdet/core/anchor/anchor_generator.py @@ -3,11 +3,12 @@ import torch class AnchorGenerator(object): - def __init__(self, base_size, scales, ratios, scale_major=True): + def __init__(self, base_size, scales, ratios, scale_major=True, ctr=None): self.base_size = base_size self.scales = torch.Tensor(scales) self.ratios = torch.Tensor(ratios) self.scale_major = scale_major + self.ctr = ctr self.base_anchors = self.gen_base_anchors() @property @@ -15,13 +16,13 @@ class AnchorGenerator(object): return self.base_anchors.size(0) def gen_base_anchors(self): - base_anchor = torch.Tensor( - [0, 0, self.base_size - 1, self.base_size - 1]) - - w = base_anchor[2] - base_anchor[0] + 1 - h = base_anchor[3] - base_anchor[1] + 1 - x_ctr = base_anchor[0] + 0.5 * (w - 1) - y_ctr = base_anchor[1] + 0.5 * (h - 1) + w = self.base_size + h = self.base_size + if self.ctr is None: + x_ctr = 0.5 * (w - 1) + y_ctr = 0.5 * (h - 1) + else: + x_ctr, y_ctr = self.ctr h_ratios = torch.sqrt(self.ratios) w_ratios = 1 / h_ratios diff --git a/mmdet/models/single_stage_heads/ssd_head.py b/mmdet/models/single_stage_heads/ssd_head.py index 20aaaab..ad3e78a 100644 --- a/mmdet/models/single_stage_heads/ssd_head.py +++ b/mmdet/models/single_stage_heads/ssd_head.py @@ -72,12 +72,14 @@ class SSDHead(nn.Module): self.anchor_strides = anchor_strides for k in range(len(anchor_strides)): base_size = min_sizes[k] + stride = anchor_strides[k] + ctr = ((stride - 1) / 2., (stride - 1) / 2.) scales = [1., np.sqrt(max_sizes[k] / min_sizes[k])] ratios = [1.] for r in anchor_ratios[k]: ratios += [1 / r, r] # 4 or 6 ratio anchor_generator = AnchorGenerator( - base_size, scales, ratios, scale_major=False) + base_size, scales, ratios, scale_major=False, ctr=ctr) indices = list(range(len(ratios))) indices.insert(1, len(indices)) anchor_generator.base_anchors = torch.index_select( -- GitLab