Module kerod.model.backbone.fpn
None
None
View Source
import tensorflow as tf
from kerod.utils.documentation import remove_unwanted_doc
from tensorflow.keras import layers
from tensorflow.keras.initializers import VarianceScaling
__pdoc__ = {}
class FPN(layers.Layer):
"""Over your backbone feature build a FPN (inspired from tensorpack)"""
def __init__(self, dim=256, kernel_regularizer=None, **kwargs):
super().__init__(**kwargs)
self._dim = dim
self._kernel_regularizer = kernel_regularizer
def build(self, input_shape):
num_level_pyramid = len(input_shape[0])
self.lateral_connection_2345 = [
layers.Conv2D(self._dim, (1, 1),
padding='same',
kernel_initializer=VarianceScaling(scale=1.),
kernel_regularizer=self._kernel_regularizer)
for _ in range(num_level_pyramid)
]
self.anti_aliasing_conv = [
layers.Conv2D(self._dim, (3, 3),
padding='same',
kernel_initializer=VarianceScaling(scale=1.),
kernel_regularizer=self._kernel_regularizer)
for _ in range(num_level_pyramid)
]
super().build(input_shape)
def call(self, inputs):
"""Over your backbone feature build a FPN (inspired from tensorpack)
Arguments:
inputs: A list of tensors of shape [N, height, widht, channels]
Returns:
A list of tensors of shape [N + 1, height, width, channels]
"""
lateral_connection_2345 = [
conv(tensor) for tensor, conv in zip(inputs, self.lateral_connection_2345)
]
lat_sum_5432 = []
for idx, block in enumerate(lateral_connection_2345[::-1]):
if idx > 0:
up_shape = tf.shape(block)
block = block + tf.image.resize(lat_sum_5432[-1], [up_shape[1], up_shape[2]],
method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
lat_sum_5432.append(block)
# 3×3convolution on each merged map to generate the final feature map,
# which is to reduce the aliasing effect of upsampling.
lateral_connection_2345 = [
conv(tensor) for conv, tensor in zip(self.anti_aliasing_conv, lat_sum_5432[::-1])
]
p6 = layers.MaxPool2D()(lateral_connection_2345[-1])
return lateral_connection_2345 + [p6]
def get_config(self):
base_config = super().get_config()
base_config['dim'] = self._dim
return base_config
remove_unwanted_doc(FPN, __pdoc__)
Classes
FPN
class FPN(
dim=256,
kernel_regularizer=None,
**kwargs
)
Ancestors (in MRO)
- tensorflow.python.keras.engine.base_layer.Layer
- tensorflow.python.module.module.Module
- tensorflow.python.training.tracking.tracking.AutoTrackable
- tensorflow.python.training.tracking.base.Trackable
- tensorflow.python.keras.utils.version_utils.LayerVersionSelector
Methods
call
def call(
self,
inputs
)
Over your backbone feature build a FPN (inspired from tensorpack)
Parameters:
Name | Description |
---|---|
inputs | A list of tensors of shape [N, height, widht, channels] |
Returns:
Type | Description |
---|---|
None | A list of tensors of shape [N + 1, height, width, channels] |
View Source
def call(self, inputs):
"""Over your backbone feature build a FPN (inspired from tensorpack)
Arguments:
inputs: A list of tensors of shape [N, height, widht, channels]
Returns:
A list of tensors of shape [N + 1, height, width, channels]
"""
lateral_connection_2345 = [
conv(tensor) for tensor, conv in zip(inputs, self.lateral_connection_2345)
]
lat_sum_5432 = []
for idx, block in enumerate(lateral_connection_2345[::-1]):
if idx > 0:
up_shape = tf.shape(block)
block = block + tf.image.resize(lat_sum_5432[-1], [up_shape[1], up_shape[2]],
method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
lat_sum_5432.append(block)
# 3×3convolution on each merged map to generate the final feature map,
# which is to reduce the aliasing effect of upsampling.
lateral_connection_2345 = [
conv(tensor) for conv, tensor in zip(self.anti_aliasing_conv, lat_sum_5432[::-1])
]
p6 = layers.MaxPool2D()(lateral_connection_2345[-1])
return lateral_connection_2345 + [p6]