Где fast_rcnn_resnet101 (например, где слои) определены в тензорном потоке - PullRequest
0 голосов
/ 15 апреля 2019

Я действительно новичок в машинном обучении, и в настоящее время я использую Tensorflow Object Detection API для выполнения обнаружения объектов, и я использую модель rapid_rcnn_resnet101.

То, что я ищу, - это код на python, который определил архитектуру, например, количество слоев (например, код, который я прикрепил, который взят из Tensorflow Tutorial по адресу (https://cv -tricks.com / tenorflow-). учебное пособие / обучение-сверточная-нейронная сеть-для-классификации изображений / ). Tensorflow не похож на YOLO, где я легко могу найти, где определяется архитектура ...

Большое спасибо за вашу помощь! Я хотел бы знать, где я мог найти файл, который определил архитектуру, fast_Rcnn_resnet101 ?

def create_convolutional_layer (вход, num_input_channels, conv_filter_size,
num_filters):

## We shall define the weights that will be trained using create_weights function.
weights = create_weights(shape=[conv_filter_size, conv_filter_size, num_input_channels, num_filters])
## We create biases using the create_biases function. These are also trained.
biases = create_biases(num_filters)

## Creating the convolutional layer
layer = tf.nn.conv2d(input=input,
                 filter=weights,
                 strides=[1, 1, 1, 1],
                 padding='SAME')

layer += biases

## We shall be using max-pooling.  
layer = tf.nn.max_pool(value=layer,
                        ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1],
                        padding='SAME')
## Output of pooling is fed to Relu which is the activation function for us.
layer = tf.nn.relu(layer)

return layer

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

Tensorflow использует Feature Extraction, который использует представления, изученные предыдущей сетью, для извлечения значимых функций из новых образцов.

Faster_RCNN_ResNet_101 Извлечение функции определено в этом классе: https://github.com/tensorflow/models/blob/master/research/object_detection/models/faster_rcnn_resnet_v1_feature_extractor.py

class FasterRCNNResnet101FeatureExtractor(FasterRCNNResnetV1FeatureExtractor):
  """Faster R-CNN Resnet 101 feature extractor implementation."""

  def __init__(self,
               is_training,
               first_stage_features_stride,
               batch_norm_trainable=False,
               reuse_weights=None,
               weight_decay=0.0):
    """Constructor.
    Args:
      is_training: See base class.
      first_stage_features_stride: See base class.
      batch_norm_trainable: See base class.
      reuse_weights: See base class.
      weight_decay: See base class.
    Raises:
      ValueError: If `first_stage_features_stride` is not 8 or 16,
        or if `architecture` is not supported.
    """
    super(FasterRCNNResnet101FeatureExtractor, self).__init__(
        'resnet_v1_101', resnet_v1.resnet_v1_101, is_training,
        first_stage_features_stride, batch_norm_trainable,
        reuse_weights, weight_decay)

Как вы можете видеть в верхней части полного кода, есть from object_detection.meta_architectures import faster_rcnn_meta_arch, так что, вероятно, общая реализация тензорного потокаБолее быстрые модели обнаружения R-CNN определены в https://github.com/tensorflow/models/blob/master/research/object_detection/meta_architectures/faster_rcnn_meta_arch.py

0 голосов
/ 15 апреля 2019

API для обнаружения объектов использовал tf-slim для построения моделей. Tf-slim - это API тензорного потока, который содержит множество предопределенных CNN и предоставляет строительные блоки CNN. В API обнаружения объектов используемые CNN называются экстракторами объектов, для этих экстракторов объектов существуют классы-обертки, и они предоставляют единый интерфейс для различных архитектур моделей.

Например, модель faster_rcnn_resnet101 использовала resnet101 в качестве экстрактора возможностей, поэтому в файле faster_rcnn_resnet_v1_feature_extractor.py в каталоге models имеется соответствующий класс оболочки FasterRCNNResnetV1FeatureExtractor.

from nets import resnet_utils
from nets import resnet_v1    
slim = tf.contrib.slim

В этом классе вы обнаружите, что они использовали slim для создания экстракторов функций. nets - это модуль из slim, который содержит много предопределенных CNN. Что касается вашей модели, определяющей код (слои), вы должны быть в состоянии найти его в модуле nets, вот класс resnet_v1.

def resnet_v1_block(scope, base_depth, num_units, stride):
  """Helper function for creating a resnet_v1 bottleneck block.
  Args:
    scope: The scope of the block.
    base_depth: The depth of the bottleneck layer for each unit.
    num_units: The number of units in the block.
    stride: The stride of the block, implemented as a stride in the last unit.
      All other units have stride=1.
  Returns:
    A resnet_v1 bottleneck block.
  """
  return resnet_utils.Block(scope, bottleneck, [{
      'depth': base_depth * 4,
      'depth_bottleneck': base_depth,
      'stride': 1
  }] * (num_units - 1) + [{
      'depth': base_depth * 4,
      'depth_bottleneck': base_depth,
      'stride': stride
  }])


def resnet_v1_50(inputs,
                 num_classes=None,
                 is_training=True,
                 global_pool=True,
                 output_stride=None,
                 spatial_squeeze=True,
                 store_non_strided_activations=False,
                 min_base_depth=8,
                 depth_multiplier=1,
                 reuse=None,
                 scope='resnet_v1_50'):
  """ResNet-50 model of [1]. See resnet_v1() for arg and return description."""
  depth_func = lambda d: max(int(d * depth_multiplier), min_base_depth)
  blocks = [
      resnet_v1_block('block1', base_depth=depth_func(64), num_units=3,
                      stride=2),
      resnet_v1_block('block2', base_depth=depth_func(128), num_units=4,
                      stride=2),
      resnet_v1_block('block3', base_depth=depth_func(256), num_units=6,
                      stride=2),
      resnet_v1_block('block4', base_depth=depth_func(512), num_units=3,
                      stride=1),
  ]
  return resnet_v1(inputs, blocks, num_classes, is_training,
                   global_pool=global_pool, output_stride=output_stride,
                   include_root_block=True, spatial_squeeze=spatial_squeeze,
                   store_non_strided_activations=store_non_strided_activations,
                   reuse=reuse, scope=scope)

В приведенном выше примере кода поясняется, как создается модель resnet50 (выберите resnet50, поскольку та же концепция, что и для resnet101, но с меньшим количеством слоев). Примечательно, что resnet50 имеет 4 блока, каждый из которых содержит [3,4,6,3] единиц. А вот диаграмма resnet50 , там вы видите 4 блока.

enter image description here* * 1030

Итак, мы закончили с частью resnet, эти функции, извлеченные экстрактором функций первого этапа (resnet101), будут поданы в генератор предложений , и он будет генерировать регионы, эти регионы вместе с объектами, затем будет передан в коробочный классификатор для прогнозирования класса и регрессии bbox.

Часть faster_rcnn, указанная как meta_architectures, meta_architectures - это рецепт преобразования архитектур классификации в архитектуры обнаружения, в данном случае от resnet101 до faster_rcnn. Вот диаграмма faster_rcnn_meta_architecture ( источник ).

enter image description here

Здесь вы видите в части классификатора блока также есть операции объединения (для обрезанной области) и сверточные операции (для извлечения элементов из обрезанной области) . И в классе faster_rcnn_meta_arch, эта строка является операцией maxpool, и более поздняя операция свертки выполняется в классе снова и снова, но для второго этапа. И вы можете четко видеть, как используется другой блок.

def _extract_box_classifier_features(self, proposal_feature_maps, scope):
    """Extracts second stage box classifier 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 (unused).
    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(self._architecture, reuse=self._reuse_weights):
      with slim.arg_scope(
          resnet_utils.resnet_arg_scope(
              batch_norm_epsilon=1e-5,
              batch_norm_scale=True,
              weight_decay=self._weight_decay)):
        with slim.arg_scope([slim.batch_norm],
                            is_training=self._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(
              proposal_feature_maps, blocks)
    return proposal_classifier_features
...