text: #-------------------------------------------------------------#
  #   ResNet50的网络部分
  #-------------------------------------------------------------#
  from __future__ import print_function
  
  from keras.initializers import random_normal
  from keras import layers
  from keras.layers import (Activation, BatchNormalization, Conv2D, MaxPooling2D,
                            ZeroPadding2D)
  
  
  def identity_block(input_tensor, kernel_size, filters, stage, block):
  
      filters1, filters2, filters3 = filters
  
      conv_name_base = 'res' + str(stage) + block + '_branch'
      bn_name_base = 'bn' + str(stage) + block + '_branch'
  
      x = Conv2D(filters1, (1, 1), kernel_initializer=random_normal(stddev=0.02), name=conv_name_base + '2a')(input_tensor)
      x = BatchNormalization(name=bn_name_base + '2a')(x)
      x = Activation('relu')(x)
  
      x = Conv2D(filters2, kernel_size, padding='same', kernel_initializer=random_normal(stddev=0.02), name=conv_name_base + '2b')(x)
      x = BatchNormalization(name=bn_name_base + '2b')(x)
      x = Activation('relu')(x)
  
      x = Conv2D(filters3, (1, 1), kernel_initializer=random_normal(stddev=0.02), name=conv_name_base + '2c')(x)
      x = BatchNormalization(name=bn_name_base + '2c')(x)
  
      x = layers.add([x, input_tensor])
      x = Activation('relu')(x)
      return x
  
  
  def conv_block(input_tensor, kernel_size, filters, stage, block, strides=(2, 2)):
  
      filters1, filters2, filters3 = filters
  
      conv_name_base = 'res' + str(stage) + block + '_branch'
      bn_name_base = 'bn' + str(stage) + block + '_branch'
  
      x = Conv2D(filters1, (1, 1), strides=strides, kernel_initializer=random_normal(stddev=0.02), 
                 name=conv_name_base + '2a')(input_tensor)
      x = BatchNormalization(name=bn_name_base + '2a')(x)
      x = Activation('relu')(x)
  
      x = Conv2D(filters2, kernel_size, padding='same', kernel_initializer=random_normal(stddev=0.02), 
                 name=conv_name_base + '2b')(x)
      x = BatchNormalization(name=bn_name_base + '2b')(x)
      x = Activation('relu')(x)
  
      x = Conv2D(filters3, (1, 1), kernel_initializer=random_normal(stddev=0.02), name=conv_name_base + '2c')(x)
      x = BatchNormalization(name=bn_name_base + '2c')(x)
  
      shortcut = Conv2D(filters3, (1, 1), strides=strides, kernel_initializer=random_normal(stddev=0.02), 
                        name=conv_name_base + '1')(input_tensor)
      shortcut = BatchNormalization(name=bn_name_base + '1')(shortcut)
  
      x = layers.add([x, shortcut])
      x = Activation('relu')(x)
      return x
  
  
  def ResNet50(inputs):
  
      img_input = inputs
      x = ZeroPadding2D((3, 3))(img_input)
  
      x = Conv2D(64, (7, 7), strides=(2, 2), kernel_initializer=random_normal(stddev=0.02), name='conv1')(x)
      x = BatchNormalization(name='bn_conv1')(x)
      x = Activation('relu')(x)
  
      x = MaxPooling2D((3, 3), strides=(2, 2), padding="same")(x)
      x = conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1))
      x = identity_block(x, 3, [64, 64, 256], stage=2, block='b')
      x = identity_block(x, 3, [64, 64, 256], stage=2, block='c')
  
      x = conv_block(x, 3, [128, 128, 512], stage=3, block='a')
      x = identity_block(x, 3, [128, 128, 512], stage=3, block='b')
      x = identity_block(x, 3, [128, 128, 512], stage=3, block='c')
      x = identity_block(x, 3, [128, 128, 512], stage=3, block='d')
      feat1 = x
  
      x = conv_block(x, 3, [256, 256, 1024], stage=4, block='a')
      x = identity_block(x, 3, [256, 256, 1024], stage=4, block='b')
      x = identity_block(x, 3, [256, 256, 1024], stage=4, block='c')
      x = identity_block(x, 3, [256, 256, 1024], stage=4, block='d')
      x = identity_block(x, 3, [256, 256, 1024], stage=4, block='e')
      x = identity_block(x, 3, [256, 256, 1024], stage=4, block='f')
      feat2 = x
      
      x = conv_block(x, 3, [512, 512, 2048], stage=5, block='a')
      x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b')
      x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c')
      feat3 = x
  
      return feat1, feat2, feat3
  