def _extract_box_classifier_features(self, proposal_feature_maps, scope):
    """Extracts second stage box classifier features.

    This function reconstructs the "second half" of the Inception ResNet v2
    network after the part defined in `_extract_proposal_features`.

    Args:
      proposal_feature_maps: A 4-D float tensor with shape
        [batch_size * self.max_num_proposals, crop_height, crop_width, depth]
        representing the feature map cropped to each proposal.
      scope: A scope name.

    Returns:
      proposal_classifier_features: A 4-D float tensor with shape
        [batch_size * self.max_num_proposals, height, width, depth]
        representing box classifier features for each proposal.
    """
    with tf.variable_scope('InceptionResnetV2', reuse=self._reuse_weights):
      with slim.arg_scope(inception_resnet_v2.inception_resnet_v2_arg_scope(
          weight_decay=self._weight_decay)):
        # Forces is_training to False to disable batch norm update.
        with slim.arg_scope([slim.batch_norm],
                            is_training=self._train_batch_norm):
          with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d],
                              stride=1, padding='SAME'):
            with tf.variable_scope('Mixed_7a'):
              with tf.variable_scope('Branch_0'):
                tower_conv = slim.conv2d(proposal_feature_maps,
                                         256, 1, scope='Conv2d_0a_1x1')
                tower_conv_1 = slim.conv2d(
                    tower_conv, 384, 3, stride=2,
                    padding='VALID', scope='Conv2d_1a_3x3')
              with tf.variable_scope('Branch_1'):
                tower_conv1 = slim.conv2d(
                    proposal_feature_maps, 256, 1, scope='Conv2d_0a_1x1')
                tower_conv1_1 = slim.conv2d(
                    tower_conv1, 288, 3, stride=2,
                    padding='VALID', scope='Conv2d_1a_3x3')
              with tf.variable_scope('Branch_2'):
                tower_conv2 = slim.conv2d(
                    proposal_feature_maps, 256, 1, scope='Conv2d_0a_1x1')
                tower_conv2_1 = slim.conv2d(tower_conv2, 288, 3,
                                            scope='Conv2d_0b_3x3')
                tower_conv2_2 = slim.conv2d(
                    tower_conv2_1, 320, 3, stride=2,
                    padding='VALID', scope='Conv2d_1a_3x3')
              with tf.variable_scope('Branch_3'):
                tower_pool = slim.max_pool2d(
                    proposal_feature_maps, 3, stride=2, padding='VALID',
                    scope='MaxPool_1a_3x3')
              net = tf.concat(
                  [tower_conv_1, tower_conv1_1, tower_conv2_2, tower_pool], 3)
            net = slim.repeat(net, 9, inception_resnet_v2.block8, scale=0.20)
            net = inception_resnet_v2.block8(net, activation_fn=None)
            proposal_classifier_features = slim.conv2d(
                net, 1536, 1, scope='Conv2d_7b_1x1')
        return proposal_classifier_features
    def _extract_box_classifier_features(self, proposal_feature_maps, scope):
        """Extracts second stage box classifier features.

        This function reconstructs the "second half" of the Inception ResNet v2
        network after the part defined in `_extract_proposal_features`.

        Args:
          proposal_feature_maps: A 4-D float tensor with shape
            [batch_size * self.max_num_proposals, crop_height, crop_width, depth]
            representing the feature map cropped to each proposal.
          scope: A scope name.

        Returns:
          proposal_classifier_features: A 4-D float tensor with shape
            [batch_size * self.max_num_proposals, height, width, depth]
            representing box classifier features for each proposal.
        """
        with tf.variable_scope('InceptionResnetV2', reuse=self._reuse_weights):
            with slim.arg_scope(inception_resnet_v2.inception_resnet_v2_arg_scope(
                    weight_decay=self._weight_decay)):
                # Forces is_training to False to disable batch norm update.
                with slim.arg_scope([slim.batch_norm],
                                    is_training=self._train_batch_norm):
                    with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d],
                                        stride=1, padding='SAME'):
                        with tf.variable_scope('Mixed_7a'):
                            with tf.variable_scope('Branch_0'):
                                tower_conv = slim.conv2d(proposal_feature_maps,
                                                         256, 1, scope='Conv2d_0a_1x1')
                                tower_conv_1 = slim.conv2d(
                                    tower_conv, 384, 3, stride=2,
                                    padding='VALID', scope='Conv2d_1a_3x3')
                            with tf.variable_scope('Branch_1'):
                                tower_conv1 = slim.conv2d(
                                    proposal_feature_maps, 256, 1, scope='Conv2d_0a_1x1')
                                tower_conv1_1 = slim.conv2d(
                                    tower_conv1, 288, 3, stride=2,
                                    padding='VALID', scope='Conv2d_1a_3x3')
                            with tf.variable_scope('Branch_2'):
                                tower_conv2 = slim.conv2d(
                                    proposal_feature_maps, 256, 1, scope='Conv2d_0a_1x1')
                                tower_conv2_1 = slim.conv2d(tower_conv2, 288, 3,
                                                            scope='Conv2d_0b_3x3')
                                tower_conv2_2 = slim.conv2d(
                                    tower_conv2_1, 320, 3, stride=2,
                                    padding='VALID', scope='Conv2d_1a_3x3')
                            with tf.variable_scope('Branch_3'):
                                tower_pool = slim.max_pool2d(
                                    proposal_feature_maps, 3, stride=2, padding='VALID',
                                    scope='MaxPool_1a_3x3')
                            net = tf.concat(
                                [tower_conv_1, tower_conv1_1, tower_conv2_2, tower_pool], 3)
                        net = slim.repeat(net, 9, inception_resnet_v2.block8, scale=0.20)
                        net = inception_resnet_v2.block8(net, activation_fn=None)
                        proposal_classifier_features = slim.conv2d(
                            net, 1536, 1, scope='Conv2d_7b_1x1')
                return proposal_classifier_features