Commit 70c974d3 authored by syiming's avatar syiming
Browse files

Add coarse layers for faster rcnn fpn keras model

1. Add coarse layers
2. Update corresponding unit test to check the size of the coarse layer
is correct
parent 7d0dc183
...@@ -98,6 +98,7 @@ class FasterRCNNResnetV1FpnKerasFeatureExtractor( ...@@ -98,6 +98,7 @@ class FasterRCNNResnetV1FpnKerasFeatureExtractor(
self._resnet_block_names = ['block1', 'block2', 'block3', 'block4'] self._resnet_block_names = ['block1', 'block2', 'block3', 'block4']
self.classification_backbone = None self.classification_backbone = None
self._fpn_features_generator = None self._fpn_features_generator = None
self._coarse_feature_layers = []
def preprocess(self, resized_inputs): def preprocess(self, resized_inputs):
"""Faster R-CNN Resnet V1 preprocessing. """Faster R-CNN Resnet V1 preprocessing.
...@@ -177,10 +178,41 @@ class FasterRCNNResnetV1FpnKerasFeatureExtractor( ...@@ -177,10 +178,41 @@ class FasterRCNNResnetV1FpnKerasFeatureExtractor(
(feature_block, feature_block_map[feature_block]) (feature_block, feature_block_map[feature_block])
for feature_block in feature_block_list] for feature_block in feature_block_list]
fpn_features = self._fpn_features_generator(fpn_input_image_features) fpn_features = self._fpn_features_generator(fpn_input_image_features)
features_maps = [fpn_feature for _, fpn_feature in fpn_features.items()]
# Construct coarse feature layers
for i in range(self._base_fpn_max_level, self._fpn_max_level):
layers = []
layer_name = 'bottom_up_block{}'.format(i)
layers.append(
tf.keras.layers.Conv2D(
self._additional_layer_depth,
[3, 3],
padding='SAME',
strides=2,
name=layer_name + '_conv',
**self._conv_hyperparams.params()))
layers.append(
self._conv_hyperparams.build_batch_norm(
training=(self._is_training and not self._freeze_batchnorm),
name=layer_name + '_batchnorm'))
layers.append(
self._conv_hyperparams.build_activation_layer(
name=layer_name))
self._coarse_feature_layers.append(layers)
feature_maps = []
for level in range(self._fpn_min_level, self._base_fpn_max_level + 1):
feature_maps.append(fpn_features['top_down_block{}'.format(level-1)])
last_feature_map = fpn_features['top_down_block{}'.format(
self._base_fpn_max_level - 1)]
for coarse_feature_layers in self._coarse_feature_layers:
for layer in coarse_feature_layers:
last_feature_map = layer(last_feature_map)
feature_maps.append(last_feature_map)
feature_extractor_model = tf.keras.models.Model( feature_extractor_model = tf.keras.models.Model(
inputs=full_resnet_v1_model.inputs, outputs=features_maps) inputs=full_resnet_v1_model.inputs, outputs=feature_maps)
return feature_extractor_model return feature_extractor_model
def get_box_classifier_feature_extractor_model(self, name=None): def get_box_classifier_feature_extractor_model(self, name=None):
......
...@@ -64,6 +64,8 @@ class FasterRCNNResnetV1FpnKerasFeatureExtractorTest(tf.test.TestCase): ...@@ -64,6 +64,8 @@ class FasterRCNNResnetV1FpnKerasFeatureExtractorTest(tf.test.TestCase):
self.assertAllEqual(features_shapes[1].numpy(), [2, 56, 56, 256]) self.assertAllEqual(features_shapes[1].numpy(), [2, 56, 56, 256])
self.assertAllEqual(features_shapes[2].numpy(), [2, 28, 28, 256]) self.assertAllEqual(features_shapes[2].numpy(), [2, 28, 28, 256])
self.assertAllEqual(features_shapes[3].numpy(), [2, 14, 14, 256]) self.assertAllEqual(features_shapes[3].numpy(), [2, 14, 14, 256])
self.assertAllEqual(features_shapes[4].numpy(), [2, 7, 7, 256])
self.assertAllEqual(features_shapes[5].numpy(), [2, 4, 4, 256])
def test_extract_proposal_features_half_size_input(self): def test_extract_proposal_features_half_size_input(self):
feature_extractor = self._build_feature_extractor() feature_extractor = self._build_feature_extractor()
...@@ -78,6 +80,8 @@ class FasterRCNNResnetV1FpnKerasFeatureExtractorTest(tf.test.TestCase): ...@@ -78,6 +80,8 @@ class FasterRCNNResnetV1FpnKerasFeatureExtractorTest(tf.test.TestCase):
self.assertAllEqual(features_shapes[1].numpy(), [2, 28, 28, 256]) self.assertAllEqual(features_shapes[1].numpy(), [2, 28, 28, 256])
self.assertAllEqual(features_shapes[2].numpy(), [2, 14, 14, 256]) self.assertAllEqual(features_shapes[2].numpy(), [2, 14, 14, 256])
self.assertAllEqual(features_shapes[3].numpy(), [2, 7, 7, 256]) self.assertAllEqual(features_shapes[3].numpy(), [2, 7, 7, 256])
self.assertAllEqual(features_shapes[4].numpy(), [2, 4, 4, 256])
self.assertAllEqual(features_shapes[5].numpy(), [2, 2, 2, 256])
def test_extract_box_classifier_features_returns_expected_size(self): def test_extract_box_classifier_features_returns_expected_size(self):
feature_extractor = self._build_feature_extractor() feature_extractor = self._build_feature_extractor()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment