+++ /dev/null
-# -*- coding: utf-8 -*-
-
-from __future__ import absolute_import, print_function, division
-import tensorflow.contrib.slim as slim
-import tensorflow as tf
-
-from libs.networks.mobilenet import mobilenet_v2
-from libs.networks.mobilenet.mobilenet import training_scope
-from libs.networks.mobilenet.mobilenet_v2 import op
-from libs.networks.mobilenet.mobilenet_v2 import ops
-expand_input = ops.expand_input_by_factor
-
-V2_BASE_DEF = dict(
- defaults={
- # Note: these parameters of batch norm affect the architecture
- # that's why they are here and not in training_scope.
- (slim.batch_norm,): {'center': True, 'scale': True},
- (slim.conv2d, slim.fully_connected, slim.separable_conv2d): {
- 'normalizer_fn': slim.batch_norm, 'activation_fn': tf.nn.relu6
- },
- (ops.expanded_conv,): {
- 'expansion_size': expand_input(6),
- 'split_expansion': 1,
- 'normalizer_fn': slim.batch_norm,
- 'residual': True
- },
- (slim.conv2d, slim.separable_conv2d): {'padding': 'SAME'}
- },
- spec=[
- op(slim.conv2d, stride=2, num_outputs=32, kernel_size=[3, 3]),
- op(ops.expanded_conv,
- expansion_size=expand_input(1, divisible_by=1),
- num_outputs=16, scope='expanded_conv'),
- op(ops.expanded_conv, stride=2, num_outputs=24, scope='expanded_conv_1'),
- op(ops.expanded_conv, stride=1, num_outputs=24, scope='expanded_conv_2'),
- op(ops.expanded_conv, stride=2, num_outputs=32, scope='expanded_conv_3'),
- op(ops.expanded_conv, stride=1, num_outputs=32, scope='expanded_conv_4'),
- op(ops.expanded_conv, stride=1, num_outputs=32, scope='expanded_conv_5'),
- op(ops.expanded_conv, stride=2, num_outputs=64, scope='expanded_conv_6'),
- op(ops.expanded_conv, stride=1, num_outputs=64, scope='expanded_conv_7'),
- op(ops.expanded_conv, stride=1, num_outputs=64, scope='expanded_conv_8'),
- op(ops.expanded_conv, stride=1, num_outputs=64, scope='expanded_conv_9'),
- op(ops.expanded_conv, stride=1, num_outputs=96, scope='expanded_conv_10'),
- op(ops.expanded_conv, stride=1, num_outputs=96, scope='expanded_conv_11'),
- op(ops.expanded_conv, stride=1, num_outputs=96, scope='expanded_conv_12')
- ],
-)
-
-
-V2_HEAD_DEF = dict(
- defaults={
- # Note: these parameters of batch norm affect the architecture
- # that's why they are here and not in training_scope.
- (slim.batch_norm,): {'center': True, 'scale': True},
- (slim.conv2d, slim.fully_connected, slim.separable_conv2d): {
- 'normalizer_fn': slim.batch_norm, 'activation_fn': tf.nn.relu6
- },
- (ops.expanded_conv,): {
- 'expansion_size': expand_input(6),
- 'split_expansion': 1,
- 'normalizer_fn': slim.batch_norm,
- 'residual': True
- },
- (slim.conv2d, slim.separable_conv2d): {'padding': 'SAME'}
- },
- spec=[
- op(ops.expanded_conv, stride=2, num_outputs=160, scope='expanded_conv_13'),
- op(ops.expanded_conv, stride=1, num_outputs=160, scope='expanded_conv_14'),
- op(ops.expanded_conv, stride=1, num_outputs=160, scope='expanded_conv_15'),
- op(ops.expanded_conv, stride=1, num_outputs=320, scope='expanded_conv_16'),
- op(slim.conv2d, stride=1, kernel_size=[1, 1], num_outputs=1280, scope='Conv_1')
- ],
-)
-def mobilenetv2_scope(is_training=True,
- trainable=True,
- weight_decay=0.00004,
- stddev=0.09,
- dropout_keep_prob=0.8,
- bn_decay=0.997):
- """Defines Mobilenet training scope.
- In default. We do not use BN
-
- ReWrite the scope.
- """
- batch_norm_params = {
- 'is_training': False,
- 'trainable': False,
- 'decay': bn_decay,
- }
- with slim.arg_scope(training_scope(is_training=is_training, weight_decay=weight_decay)):
- with slim.arg_scope([slim.conv2d, slim.fully_connected, slim.separable_conv2d],
- trainable=trainable):
- with slim.arg_scope([slim.batch_norm], **batch_norm_params) as sc:
- return sc
-
-
-
-def mobilenetv2_base(img_batch, is_training=True):
-
- with slim.arg_scope(mobilenetv2_scope(is_training=is_training, trainable=True)):
-
- feature_to_crop, endpoints = mobilenet_v2.mobilenet_base(input_tensor=img_batch,
- num_classes=None,
- is_training=False,
- depth_multiplier=1.0,
- scope='MobilenetV2',
- conv_defs=V2_BASE_DEF,
- finegrain_classification_mode=False)
-
- # feature_to_crop = tf.Print(feature_to_crop, [tf.shape(feature_to_crop)], summarize=10, message='rpn_shape')
- return feature_to_crop
-
-
-def mobilenetv2_head(inputs, is_training=True):
- with slim.arg_scope(mobilenetv2_scope(is_training=is_training, trainable=True)):
- net, _ = mobilenet_v2.mobilenet(input_tensor=inputs,
- num_classes=None,
- is_training=False,
- depth_multiplier=1.0,
- scope='MobilenetV2',
- conv_defs=V2_HEAD_DEF,
- finegrain_classification_mode=False)
-
- net = tf.squeeze(net, [1, 2])
-
- return net
\ No newline at end of file