def pspnet(n_classes, inputs_size, downsample_factor=8, backbone='mobilenet', aux_branch=True): if backbone == "mobilenet": #----------------------------------# # 获得两个特征层 # f4为辅助分支 [30,30,96] # o为主干部分 [30,30,320] #----------------------------------# img_input, f4, o = get_mobilenet_encoder( inputs_size, downsample_factor=downsample_factor) out_channel = 320 elif backbone == "resnet50": img_input, f4, o = get_resnet50_encoder( inputs_size, downsample_factor=downsample_factor) out_channel = 2048 else: raise ValueError( 'Unsupported backbone - `{}`, Use mobilenet, resnet50.'.format( backbone)) #--------------------------------------------------------------# # PSP模块,分区域进行池化 # 分别分割成1x1的区域,2x2的区域,3x3的区域,6x6的区域 #--------------------------------------------------------------# pool_factors = [1, 2, 3, 6] pool_outs = [o] for p in pool_factors: pooled = pool_block(o, p, out_channel) pool_outs.append(pooled) #--------------------------------------------------------------------------------# # 利用获取到的特征层进行堆叠 # 30, 30, 320 + 30, 30, 80 + 30, 30, 80 + 30, 30, 80 + 30, 30, 80 = 30, 30, 640 #--------------------------------------------------------------------------------# o = Concatenate(axis=MERGE_AXIS)(pool_outs) # 30, 30, 640 -> 30, 30, 80 o = Conv2D(out_channel // 4, (3, 3), data_format=IMAGE_ORDERING, padding='same', use_bias=False)(o) o = BatchNormalization()(o) o = Activation('relu')(o) # 防止过拟合 o = Dropout(0.1)(o) #---------------------------------------------------# # 利用特征获得预测结果 # 30, 30, 80 -> 30, 30, 21 -> 473, 473, 21 #---------------------------------------------------# o = Conv2D(n_classes, (1, 1), data_format=IMAGE_ORDERING, padding='same')(o) o = Lambda(resize_images)([o, img_input]) #---------------------------------------------------# # 获得每一个像素点属于每一个类的概率 #---------------------------------------------------# o = Activation("softmax", name="main")(o) if aux_branch: # 30, 30, 96 -> 30, 30, 40 f4 = Conv2D(out_channel // 8, (3, 3), data_format=IMAGE_ORDERING, padding='same', use_bias=False, name="branch_conv1")(f4) f4 = BatchNormalization(name="branch_batchnor1")(f4) f4 = Activation('relu', name="branch_relu1")(f4) f4 = Dropout(0.1)(f4) #---------------------------------------------------# # 利用特征获得预测结果 # 30, 30, 40 -> 30, 30, 21 -> 473, 473, 21 #---------------------------------------------------# f4 = Conv2D(n_classes, (1, 1), data_format=IMAGE_ORDERING, padding='same', name="branch_conv2")(f4) f4 = Lambda(resize_images, name="branch_resize")([f4, img_input]) f4 = Activation("softmax", name="aux")(f4) model = Model(img_input, [f4, o]) return model else: model = Model(img_input, [o]) return model
def pspnet(n_classes, inputs_size, downsample_factor=8, backbone='mobilenet', aux_branch=True): if backbone == "mobilenet": img_input, f4, o = get_mobilenet_encoder( inputs_size, downsample_factor=downsample_factor) out_channel = 320 elif backbone == "resnet50": img_input, f4, o = get_resnet50_encoder( inputs_size, downsample_factor=downsample_factor) out_channel = 2048 else: raise ValueError( 'Unsupported backbone - `{}`, Use mobilenet, resnet50.'.format( backbone)) #-------------------------------------# # PSP模块 # 分区域进行池化 #-------------------------------------# pool_factors = [1, 2, 3, 6] pool_outs = [o] for p in pool_factors: pooled = pool_block(o, p, out_channel) pool_outs.append(pooled) # 连接 # 60x60xout_channel*2 o = Concatenate(axis=MERGE_AXIS)(pool_outs) #-------------------------------------# # 利用特征获得预测结果 #-------------------------------------# # 卷积 # 60x60xout_channel//4 o = Conv2D(out_channel // 4, (3, 3), data_format=IMAGE_ORDERING, padding='same', use_bias=False)(o) o = BatchNormalization()(o) o = Activation('relu')(o) # 正则化,防止过拟合 o = Dropout(0.1)(o) # 60x60x21 o = Conv2D(n_classes, (1, 1), data_format=IMAGE_ORDERING, padding='same')(o) # [473,473,nclasses] o = Lambda(lambda x: tf.image.resize_images( x, (inputs_size[1], inputs_size[0]), align_corners=True))(o) # 获得每一个像素点属于每一个类的概率了 o = Activation("softmax", name="main")(o) if aux_branch: f4 = Conv2D(out_channel // 8, (3, 3), data_format=IMAGE_ORDERING, padding='same', use_bias=False)(f4) f4 = BatchNormalization()(f4) f4 = Activation('relu')(f4) # 防止过拟合 f4 = Dropout(0.1)(f4) # 60x60x21 f4 = Conv2D(n_classes, (1, 1), data_format=IMAGE_ORDERING, padding='same')(f4) # [473,473,nclasses] f4 = Lambda(lambda x: tf.image.resize_images( x, (inputs_size[1], inputs_size[0]), align_corners=True))(f4) # 获得每一个像素点属于每一个类的概率了 f4 = Activation("softmax", name="aux")(f4) model = Model(img_input, [f4, o]) return model else: model = Model(img_input, [o]) return model