コード例 #1
0
    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)
コード例 #2
0
    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')
コード例 #3
0
    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')
コード例 #4
0
    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)
コード例 #5
0
    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'])
コード例 #6
0
ファイル: factory.py プロジェクト: yiweichen04/nncf
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)
コード例 #7
0
    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)