def __init__( self, min_level, max_level, num_classes, anchors_per_location, num_convs=4, num_filters=256, use_separable_conv=False, norm_activation=nn_ops.norm_activation_builder(activation='relu')): """Initialize params to build RetinaNet head. Args: min_level: `int` number of minimum feature level. max_level: `int` number of maximum feature level. num_classes: `int` number of classification categories. anchors_per_location: `int` number of anchors per pixel location. num_convs: `int` number of stacked convolution before the last prediction layer. num_filters: `int` number of filters used in the head architecture. use_separable_conv: `bool` to indicate whether to use separable convoluation. norm_activation: an operation that includes a normalization layer followed by an optional activation layer. """ self._min_level = min_level self._max_level = max_level self._num_classes = num_classes self._anchors_per_location = anchors_per_location self._num_convs = num_convs self._num_filters = num_filters self._use_separable_conv = use_separable_conv with tf.name_scope('class_net') as scope_name: self._class_name_scope = tf.name_scope(scope_name) with tf.name_scope('box_net') as scope_name: self._box_name_scope = tf.name_scope(scope_name) self._build_class_net_layers(norm_activation) self._build_box_net_layers(norm_activation)
def __init__( self, num_classes, mask_target_size, num_convs=4, num_filters=256, use_separable_conv=False, activation='relu', use_batch_norm=True, norm_activation=nn_ops.norm_activation_builder(activation='relu')): """Initialize params to build Fast R-CNN head. Args: num_classes: a integer for the number of classes. mask_target_size: a integer that is the resolution of masks. num_convs: `int` number that represents the number of the intermediate conv layers before the prediction. num_filters: `int` number that represents the number of filters of the intermediate conv layers. use_separable_conv: `bool`, indicating whether the separable conv layers is used. activation: activation function. Support 'relu' and 'swish'. use_batch_norm: 'bool', indicating whether batchnorm layers are added. norm_activation: an operation that includes a normalization layer followed by an optional activation layer. """ super().__init__() self._num_classes = num_classes self._mask_target_size = mask_target_size self._num_convs = num_convs self._num_filters = num_filters if use_separable_conv: self._conv2d_op = functools.partial( tf.keras.layers.SeparableConv2D, depth_multiplier=1, bias_initializer=tf.zeros_initializer()) else: self._conv2d_op = functools.partial( tf.keras.layers.Conv2D, kernel_initializer=tf.keras.initializers.VarianceScaling( scale=2, mode='fan_out', distribution='untruncated_normal'), bias_initializer=tf.zeros_initializer()) if activation == 'relu': self._activation_op = tf.nn.relu elif activation == 'swish': self._activation_op = tf.nn.swish else: raise ValueError('Unsupported activation `{}`.'.format(activation)) self._use_batch_norm = use_batch_norm self._norm_activation = norm_activation self._conv2d_ops = [] for i in range(self._num_convs): self._conv2d_ops.append( self._conv2d_op(self._num_filters, kernel_size=(3, 3), strides=(1, 1), padding='same', dilation_rate=(1, 1), activation=(None if self._use_batch_norm else self._activation_op), name='mask-conv-l%d' % i)) self._mask_conv_transpose = tf.keras.layers.Conv2DTranspose( self._num_filters, kernel_size=(2, 2), strides=(2, 2), padding='valid', activation=(None if self._use_batch_norm else self._activation_op), kernel_initializer=tf.keras.initializers.VarianceScaling( scale=2, mode='fan_out', distribution='untruncated_normal'), bias_initializer=tf.zeros_initializer(), name='conv5-mask')
def __init__( self, num_classes, num_convs=0, num_filters=256, use_separable_conv=False, num_fcs=2, fc_dims=1024, activation='relu', use_batch_norm=True, norm_activation=nn_ops.norm_activation_builder(activation='relu')): """Initialize params to build Fast R-CNN box head. Args: num_classes: a integer for the number of classes. num_convs: `int` number that represents the number of the intermediate conv layers before the FC layers. num_filters: `int` number that represents the number of filters of the intermediate conv layers. use_separable_conv: `bool`, indicating whether the separable conv layers is used. num_fcs: `int` number that represents the number of FC layers before the predictions. fc_dims: `int` number that represents the number of dimension of the FC layers. activation: activation function. Support 'relu' and 'swish'. use_batch_norm: 'bool', indicating whether batchnorm layers are added. norm_activation: an operation that includes a normalization layer followed by an optional activation layer. """ super().__init__() self._num_classes = num_classes self._num_convs = num_convs self._num_filters = num_filters if use_separable_conv: self._conv2d_op = functools.partial( tf.keras.layers.SeparableConv2D, depth_multiplier=1, bias_initializer=tf.zeros_initializer()) else: self._conv2d_op = functools.partial( tf.keras.layers.Conv2D, kernel_initializer=tf.keras.initializers.VarianceScaling( scale=2, mode='fan_out', distribution='untruncated_normal'), bias_initializer=tf.zeros_initializer()) self._num_fcs = num_fcs self._fc_dims = fc_dims if activation == 'relu': self._activation_op = tf.nn.relu elif activation == 'swish': self._activation_op = tf.nn.swish else: raise ValueError('Unsupported activation `{}`.'.format(activation)) self._use_batch_norm = use_batch_norm self._norm_activation = norm_activation self._conv_ops = [] self._conv_bn_ops = [] for i in range(self._num_convs): self._conv_ops.append( self._conv2d_op(self._num_filters, kernel_size=(3, 3), strides=(1, 1), padding='same', dilation_rate=(1, 1), activation=(None if self._use_batch_norm else self._activation_op), name='conv_{}'.format(i))) if self._use_batch_norm: self._conv_bn_ops.append(self._norm_activation()) self._fc_ops = [] self._fc_bn_ops = [] for i in range(self._num_fcs): self._fc_ops.append( tf.keras.layers.Dense(units=self._fc_dims, activation=(None if self._use_batch_norm else self._activation_op), name='fc{}'.format(i))) if self._use_batch_norm: self._fc_bn_ops.append(self._norm_activation(fused=False)) self._class_predict = tf.keras.layers.Dense( self._num_classes, kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.01), bias_initializer=tf.zeros_initializer(), name='class-predict') self._box_predict = tf.keras.layers.Dense( self._num_classes * 4, kernel_initializer=tf.keras.initializers.RandomNormal( stddev=0.001), bias_initializer=tf.zeros_initializer(), name='box-predict')
def __init__( self, min_level, max_level, anchors_per_location, num_convs=2, # pylint: disable=W0613 num_filters=256, use_separable_conv=False, activation='relu', use_batch_norm=True, norm_activation=nn_ops.norm_activation_builder(activation='relu')): """Initialize params to build Region Proposal Network head. Args: min_level: `int` number of minimum feature level. max_level: `int` number of maximum feature level. anchors_per_location: `int` number of number of anchors per pixel location. num_convs: `int` number that represents the number of the intermediate conv layers before the prediction. num_filters: `int` number that represents the number of filters of the intermediate conv layers. use_separable_conv: `bool`, indicating whether the separable conv layers is used. activation: activation function. Support 'relu' and 'swish'. use_batch_norm: 'bool', indicating whether batchnorm layers are added. norm_activation: an operation that includes a normalization layer followed by an optional activation layer. """ super().__init__() self._min_level = min_level self._max_level = max_level self._anchors_per_location = anchors_per_location if activation == 'relu': self._activation_op = tf.nn.relu elif activation == 'swish': self._activation_op = tf.nn.swish else: raise ValueError('Unsupported activation `{}`.'.format(activation)) self._use_batch_norm = use_batch_norm if use_separable_conv: self._conv2d_op = functools.partial( tf.keras.layers.SeparableConv2D, depth_multiplier=1, bias_initializer=tf.zeros_initializer()) else: self._conv2d_op = functools.partial( tf.keras.layers.Conv2D, kernel_initializer=tf.keras.initializers.RandomNormal( stddev=0.01), bias_initializer=tf.zeros_initializer()) self._rpn_conv = self._conv2d_op( num_filters, kernel_size=(3, 3), strides=(1, 1), activation=(None if self._use_batch_norm else self._activation_op), padding='same', name='rpn') self._rpn_class_conv = self._conv2d_op(anchors_per_location, kernel_size=(1, 1), strides=(1, 1), padding='valid', name='rpn-class') self._rpn_box_conv = self._conv2d_op(4 * anchors_per_location, kernel_size=(1, 1), strides=(1, 1), padding='valid', name='rpn-box') self._norm_activations = {} if self._use_batch_norm: for level in range(self._min_level, self._max_level + 1): self._norm_activations[level] = norm_activation( name='rpn-l%d-bn' % level)
def __init__( self, resnet_depth, activation='relu', norm_activation=nn_ops.norm_activation_builder(activation='relu'), data_format='channels_last'): """ResNet initialization function. Args: resnet_depth: `int` depth of ResNet backbone model. norm_activation: an operation that includes a normalization layer followed by an optional activation layer. data_format: `str` either "channels_first" for `[batch, channels, height, width]` or "channels_last for `[batch, height, width, channels]`. """ self._resnet_depth = resnet_depth if activation == 'relu': self._activation_op = tf.nn.relu elif activation == 'swish': self._activation_op = tf.nn.swish else: raise ValueError('Unsupported activation `{}`.'.format(activation)) self._norm_activation = norm_activation self._data_format = data_format model_params = { 10: { 'block': self.residual_block, 'layers': [1, 1, 1, 1] }, 18: { 'block': self.residual_block, 'layers': [2, 2, 2, 2] }, 34: { 'block': self.residual_block, 'layers': [3, 4, 6, 3] }, 50: { 'block': self.bottleneck_block, 'layers': [3, 4, 6, 3] }, 101: { 'block': self.bottleneck_block, 'layers': [3, 4, 23, 3] }, 152: { 'block': self.bottleneck_block, 'layers': [3, 8, 36, 3] }, 200: { 'block': self.bottleneck_block, 'layers': [3, 24, 36, 3] } } if resnet_depth not in model_params: valid_resnet_depths = ', '.join( [str(depth) for depth in sorted(model_params.keys())]) raise ValueError( 'The resnet_depth should be in [%s]. Not a valid resnet_depth:' % (valid_resnet_depths), self._resnet_depth) params = model_params[resnet_depth] self._resnet_fn = self.resnet_v1_generator(params['block'], params['layers'])
def norm_activation_generator(params): return nn_ops.norm_activation_builder(momentum=params.batch_norm_momentum, epsilon=params.batch_norm_epsilon, trainable=True, activation=params.activation)
def __init__( self, min_level=3, max_level=7, fpn_feat_dims=256, use_separable_conv=False, activation='relu', use_batch_norm=True, norm_activation=nn_ops.norm_activation_builder(activation='relu')): """FPN initialization function. Args: min_level: `int` minimum level in FPN output feature maps. max_level: `int` maximum level in FPN output feature maps. fpn_feat_dims: `int` number of filters in FPN layers. use_separable_conv: `bool`, if True use separable convolution for convolution in FPN layers. use_batch_norm: 'bool', indicating whether batchnorm layers are added. norm_activation: an operation that includes a normalization layer followed by an optional activation layer. """ self._min_level = min_level self._max_level = max_level self._fpn_feat_dims = fpn_feat_dims if use_separable_conv: self._conv2d_op = functools.partial( tf.keras.layers.SeparableConv2D, depth_multiplier=1) else: self._conv2d_op = tf.keras.layers.Conv2D if activation == 'relu': self._activation_op = tf.nn.relu elif activation == 'swish': self._activation_op = tf.nn.swish else: raise ValueError('Unsupported activation `{}`.'.format(activation)) self._use_batch_norm = use_batch_norm self._norm_activation = norm_activation self._norm_activations = {} self._lateral_conv2d_op = {} self._post_hoc_conv2d_op = {} self._coarse_conv2d_op = {} for level in range(self._min_level, self._max_level + 1): if self._use_batch_norm: self._norm_activations[level] = norm_activation( use_activation=False, name='p%d-bn' % level) self._lateral_conv2d_op[level] = self._conv2d_op( filters=self._fpn_feat_dims, kernel_size=(1, 1), padding='same', name='l%d' % level) self._post_hoc_conv2d_op[level] = self._conv2d_op( filters=self._fpn_feat_dims, strides=(1, 1), kernel_size=(3, 3), padding='same', name='post_hoc_d%d' % level) self._coarse_conv2d_op[level] = self._conv2d_op( filters=self._fpn_feat_dims, strides=(2, 2), kernel_size=(3, 3), padding='same', name='p%d' % level)