retina_head.py 2.9 KB
Newer Older
1
2
3
4
5
import numpy as np
import torch.nn as nn
from mmcv.cnn import normal_init

from .anchor_head import AnchorHead
Kai Chen's avatar
Kai Chen committed
6
from ..registry import HEADS
7
from ..utils import bias_init_with_prob, ConvModule
8
9


Kai Chen's avatar
Kai Chen committed
10
@HEADS.register_module
11
12
13
14
15
16
17
18
class RetinaHead(AnchorHead):

    def __init__(self,
                 num_classes,
                 in_channels,
                 stacked_convs=4,
                 octave_base_scale=4,
                 scales_per_octave=3,
19
                 conv_cfg=None,
Kai Chen's avatar
Kai Chen committed
20
                 norm_cfg=None,
21
22
23
24
                 **kwargs):
        self.stacked_convs = stacked_convs
        self.octave_base_scale = octave_base_scale
        self.scales_per_octave = scales_per_octave
25
        self.conv_cfg = conv_cfg
Kai Chen's avatar
Kai Chen committed
26
        self.norm_cfg = norm_cfg
27
28
29
30
31
32
33
34
        octave_scales = np.array(
            [2**(i / scales_per_octave) for i in range(scales_per_octave)])
        anchor_scales = octave_scales * octave_base_scale
        super(RetinaHead, self).__init__(
            num_classes,
            in_channels,
            anchor_scales=anchor_scales,
            use_sigmoid_cls=True,
35
            cls_focal_loss=True,
36
37
38
39
40
41
42
43
44
            **kwargs)

    def _init_layers(self):
        self.relu = nn.ReLU(inplace=True)
        self.cls_convs = nn.ModuleList()
        self.reg_convs = nn.ModuleList()
        for i in range(self.stacked_convs):
            chn = self.in_channels if i == 0 else self.feat_channels
            self.cls_convs.append(
45
46
47
48
49
50
51
                ConvModule(
                    chn,
                    self.feat_channels,
                    3,
                    stride=1,
                    padding=1,
                    conv_cfg=self.conv_cfg,
Kai Chen's avatar
Kai Chen committed
52
                    norm_cfg=self.norm_cfg))
53
            self.reg_convs.append(
54
55
56
57
58
59
60
                ConvModule(
                    chn,
                    self.feat_channels,
                    3,
                    stride=1,
                    padding=1,
                    conv_cfg=self.conv_cfg,
Kai Chen's avatar
Kai Chen committed
61
                    norm_cfg=self.norm_cfg))
62
63
64
65
66
67
68
69
70
71
        self.retina_cls = nn.Conv2d(
            self.feat_channels,
            self.num_anchors * self.cls_out_channels,
            3,
            padding=1)
        self.retina_reg = nn.Conv2d(
            self.feat_channels, self.num_anchors * 4, 3, padding=1)

    def init_weights(self):
        for m in self.cls_convs:
72
            normal_init(m.conv, std=0.01)
73
        for m in self.reg_convs:
74
            normal_init(m.conv, std=0.01)
75
76
77
78
79
80
81
82
        bias_cls = bias_init_with_prob(0.01)
        normal_init(self.retina_cls, std=0.01, bias=bias_cls)
        normal_init(self.retina_reg, std=0.01)

    def forward_single(self, x):
        cls_feat = x
        reg_feat = x
        for cls_conv in self.cls_convs:
83
            cls_feat = cls_conv(cls_feat)
84
        for reg_conv in self.reg_convs:
85
            reg_feat = reg_conv(reg_feat)
86
87
88
        cls_score = self.retina_cls(cls_feat)
        bbox_pred = self.retina_reg(reg_feat)
        return cls_score, bbox_pred