mirror of https://github.com/RE-OWOD/RE-OWOD
54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
|
|
from abc import ABCMeta, abstractmethod
|
|
import torch.nn as nn
|
|
|
|
from detectron2.layers import ShapeSpec
|
|
|
|
__all__ = ["Backbone"]
|
|
|
|
|
|
class Backbone(nn.Module, metaclass=ABCMeta):
|
|
"""
|
|
Abstract base class for network backbones.
|
|
"""
|
|
|
|
def __init__(self):
|
|
"""
|
|
The `__init__` method of any subclass can specify its own set of arguments.
|
|
"""
|
|
super().__init__()
|
|
|
|
@abstractmethod
|
|
def forward(self):
|
|
"""
|
|
Subclasses must override this method, but adhere to the same return type.
|
|
|
|
Returns:
|
|
dict[str->Tensor]: mapping from feature name (e.g., "res2") to tensor
|
|
"""
|
|
pass
|
|
|
|
@property
|
|
def size_divisibility(self) -> int:
|
|
"""
|
|
Some backbones require the input height and width to be divisible by a
|
|
specific integer. This is typically true for encoder / decoder type networks
|
|
with lateral connection (e.g., FPN) for which feature maps need to match
|
|
dimension in the "bottom up" and "top down" paths. Set to 0 if no specific
|
|
input size divisibility is required.
|
|
"""
|
|
return 0
|
|
|
|
def output_shape(self):
|
|
"""
|
|
Returns:
|
|
dict[str->ShapeSpec]
|
|
"""
|
|
# this is a backward-compatible default
|
|
return {
|
|
name: ShapeSpec(
|
|
channels=self._out_feature_channels[name], stride=self._out_feature_strides[name]
|
|
)
|
|
for name in self._out_features
|
|
}
|