Пример #1
0
 def testAtrousFullyConvolutionalValues(self):
     """Verify dense feature extraction with atrous convolution."""
     nominal_stride = 32
     for output_stride in [4, 8, 16, 32, None]:
         with arg_scope(resnet_utils.resnet_arg_scope()):
             with ops.Graph().as_default():
                 with self.cached_session() as sess:
                     random_seed.set_random_seed(0)
                     inputs = create_input(2, 81, 81, 3)
                     # Dense feature extraction followed by subsampling.
                     output, _ = self._resnet_small(
                         inputs,
                         None,
                         is_training=False,
                         global_pool=False,
                         output_stride=output_stride)
                     if output_stride is None:
                         factor = 1
                     else:
                         factor = nominal_stride // output_stride
                     output = resnet_utils.subsample(output, factor)
                     # Make the two networks use the same weights.
                     variable_scope.get_variable_scope().reuse_variables()
                     # Feature extraction at the nominal network rate.
                     expected, _ = self._resnet_small(inputs,
                                                      None,
                                                      is_training=False,
                                                      global_pool=False)
                     sess.run(variables.global_variables_initializer())
                     self.assertAllClose(output.eval(),
                                         expected.eval(),
                                         atol=2e-4,
                                         rtol=1e-4)
Пример #2
0
 def testEndPointsV1(self):
     """Test the end points of a tiny v1 bottleneck network."""
     blocks = [
         resnet_v1.resnet_v1_block('block1',
                                   base_depth=1,
                                   num_units=2,
                                   stride=2),
         resnet_v1.resnet_v1_block('block2',
                                   base_depth=2,
                                   num_units=2,
                                   stride=1),
     ]
     inputs = create_input(2, 32, 16, 3)
     with arg_scope(resnet_utils.resnet_arg_scope()):
         _, end_points = self._resnet_plain(inputs, blocks, scope='tiny')
     expected = [
         'tiny/block1/unit_1/bottleneck_v1/shortcut',
         'tiny/block1/unit_1/bottleneck_v1/conv1',
         'tiny/block1/unit_1/bottleneck_v1/conv2',
         'tiny/block1/unit_1/bottleneck_v1/conv3',
         'tiny/block1/unit_2/bottleneck_v1/conv1',
         'tiny/block1/unit_2/bottleneck_v1/conv2',
         'tiny/block1/unit_2/bottleneck_v1/conv3',
         'tiny/block2/unit_1/bottleneck_v1/shortcut',
         'tiny/block2/unit_1/bottleneck_v1/conv1',
         'tiny/block2/unit_1/bottleneck_v1/conv2',
         'tiny/block2/unit_1/bottleneck_v1/conv3',
         'tiny/block2/unit_2/bottleneck_v1/conv1',
         'tiny/block2/unit_2/bottleneck_v1/conv2',
         'tiny/block2/unit_2/bottleneck_v1/conv3'
     ]
     self.assertItemsEqual(expected, end_points)
Пример #3
0
    def _build_tail(self, inputs, is_training=False):
        if not self._use_tail:
            return inputs

        if self._architecture == "resnet_v1_101":
            train_batch_norm = is_training and self._config.get("train_batch_norm")
            with self._enter_variable_scope():
                weight_decay = self._config.get("arg_scope", {}).get("weight_decay", 0)
                with tf.variable_scope(self._architecture, reuse=True):
                    resnet_arg_scope = resnet_utils.resnet_arg_scope(
                        batch_norm_epsilon=1e-5, batch_norm_scale=True, weight_decay=weight_decay
                    )
                    with slim.arg_scope(resnet_arg_scope):
                        with slim.arg_scope([slim.batch_norm], is_training=train_batch_norm):
                            blocks = [
                                resnet_utils.Block(
                                    "block4",
                                    resnet_v1.bottleneck,
                                    [{"depth": 2048, "depth_bottleneck": 512, "stride": 1}] * 3,
                                )
                            ]
                            proposal_classifier_features = resnet_utils.stack_blocks_dense(inputs, blocks)
        else:
            proposal_classifier_features = inputs

        return proposal_classifier_features
Пример #4
0
 def testClassificationEndPoints(self):
     global_pool = True
     num_classes = 10
     inputs = create_input(2, 224, 224, 3)
     with arg_scope(resnet_utils.resnet_arg_scope()):
         logits, end_points = self._resnet_small(inputs,
                                                 num_classes,
                                                 global_pool=global_pool,
                                                 scope='resnet')
     self.assertTrue(logits.op.name.startswith('resnet/logits'))
     self.assertListEqual(logits.get_shape().as_list(),
                          [2, 1, 1, num_classes])
     self.assertTrue('predictions' in end_points)
     self.assertListEqual(end_points['predictions'].get_shape().as_list(),
                          [2, 1, 1, num_classes])
Пример #5
0
 def testFullyConvolutionalUnknownHeightWidth(self):
     batch = 2
     height, width = 65, 65
     global_pool = False
     inputs = create_input(batch, None, None, 3)
     with arg_scope(resnet_utils.resnet_arg_scope()):
         output, _ = self._resnet_small(inputs,
                                        None,
                                        global_pool=global_pool)
     self.assertListEqual(output.get_shape().as_list(),
                          [batch, None, None, 32])
     images = create_input(batch, height, width, 3)
     with self.cached_session() as sess:
         sess.run(variables.global_variables_initializer())
         output = sess.run(output, {inputs: images.eval()})
         self.assertEqual(output.shape, (batch, 3, 3, 32))
Пример #6
0
    def testAtrousValuesBottleneck(self):
        """Verify the values of dense feature extraction by atrous convolution.

    Make sure that dense feature extraction by stack_blocks_dense() followed by
    subsampling gives identical results to feature extraction at the nominal
    network output stride using the simple self._stack_blocks_nondense() above.
    """
        block = resnet_v1.resnet_v1_block
        blocks = [
            block('block1', base_depth=1, num_units=2, stride=2),
            block('block2', base_depth=2, num_units=2, stride=2),
            block('block3', base_depth=4, num_units=2, stride=2),
            block('block4', base_depth=8, num_units=2, stride=1),
        ]
        nominal_stride = 8

        # Test both odd and even input dimensions.
        height = 30
        width = 31
        with arg_scope(resnet_utils.resnet_arg_scope()):
            with arg_scope([layers.batch_norm], is_training=False):
                for output_stride in [1, 2, 4, 8, None]:
                    with ops.Graph().as_default():
                        with self.cached_session() as sess:
                            random_seed.set_random_seed(0)
                            inputs = create_input(1, height, width, 3)
                            # Dense feature extraction followed by subsampling.
                            output = resnet_utils.stack_blocks_dense(
                                inputs, blocks, output_stride)
                            if output_stride is None:
                                factor = 1
                            else:
                                factor = nominal_stride // output_stride

                            output = resnet_utils.subsample(output, factor)
                            # Make the two networks use the same weights.
                            variable_scope.get_variable_scope(
                            ).reuse_variables()
                            # Feature extraction at the nominal network rate.
                            expected = self._stack_blocks_nondense(
                                inputs, blocks)
                            sess.run(variables.global_variables_initializer())
                            output, expected = sess.run([output, expected])
                            self.assertAllClose(output,
                                                expected,
                                                atol=1e-4,
                                                rtol=1e-4)
Пример #7
0
 def testUnknownBatchSize(self):
     batch = 2
     height, width = 65, 65
     global_pool = True
     num_classes = 10
     inputs = create_input(None, height, width, 3)
     with arg_scope(resnet_utils.resnet_arg_scope()):
         logits, _ = self._resnet_small(inputs,
                                        num_classes,
                                        global_pool=global_pool,
                                        scope='resnet')
     self.assertTrue(logits.op.name.startswith('resnet/logits'))
     self.assertListEqual(logits.get_shape().as_list(),
                          [None, 1, 1, num_classes])
     images = create_input(batch, height, width, 3)
     with self.cached_session() as sess:
         sess.run(variables.global_variables_initializer())
         output = sess.run(logits, {inputs: images.eval()})
         self.assertEqual(output.shape, (batch, 1, 1, num_classes))
Пример #8
0
 def testFullyConvolutionalEndpointShapes(self):
     global_pool = False
     num_classes = 10
     inputs = create_input(2, 321, 321, 3)
     with arg_scope(resnet_utils.resnet_arg_scope()):
         _, end_points = self._resnet_small(inputs,
                                            num_classes,
                                            global_pool=global_pool,
                                            scope='resnet')
         endpoint_to_shape = {
             'resnet/block1': [2, 41, 41, 4],
             'resnet/block2': [2, 21, 21, 8],
             'resnet/block3': [2, 11, 11, 16],
             'resnet/block4': [2, 11, 11, 32]
         }
         for endpoint in endpoint_to_shape:
             shape = endpoint_to_shape[endpoint]
             self.assertListEqual(
                 end_points[endpoint].get_shape().as_list(), shape)
Пример #9
0
 def testClassificationShapes(self):
     global_pool = True
     num_classes = 10
     inputs = create_input(2, 224, 224, 3)
     with arg_scope(resnet_utils.resnet_arg_scope()):
         _, end_points = self._resnet_small(inputs,
                                            num_classes,
                                            global_pool=global_pool,
                                            scope='resnet')
         endpoint_to_shape = {
             'resnet/block1': [2, 28, 28, 4],
             'resnet/block2': [2, 14, 14, 8],
             'resnet/block3': [2, 7, 7, 16],
             'resnet/block4': [2, 7, 7, 32]
         }
         for endpoint in endpoint_to_shape:
             shape = endpoint_to_shape[endpoint]
             self.assertListEqual(
                 end_points[endpoint].get_shape().as_list(), shape)
Пример #10
0
    def _build_tail(self, inputs, is_training=False):
        if not self._use_tail:
            return inputs

        if self._architecture == 'resnet_v1_101':
            train_batch_norm = (
                is_training and self._config.get('train_batch_norm')
            )
            with self._enter_variable_scope():
                weight_decay = (
                    self._config.get('arg_scope', {}).get('weight_decay', 0)
                )
                with tf.variable_scope(self._architecture, reuse=True):
                    resnet_arg_scope = resnet_utils.resnet_arg_scope(
                            batch_norm_epsilon=1e-5,
                            batch_norm_scale=True,
                            weight_decay=weight_decay
                        )
                    with slim.arg_scope(resnet_arg_scope):
                        with slim.arg_scope(
                            [slim.batch_norm], is_training=train_batch_norm
                        ):
                            blocks = [
                                resnet_utils.Block(
                                    'block4',
                                    resnet_v1.bottleneck,
                                    [{
                                        'depth': 2048,
                                        'depth_bottleneck': 512,
                                        'stride': 1
                                    }] * 3
                                )
                            ]
                            proposal_classifier_features = (
                                resnet_utils.stack_blocks_dense(inputs, blocks)
                            )
        else:
            proposal_classifier_features = inputs

        return proposal_classifier_features