├── CLNetModel.py ├── README.md └── clnet_model /CLNetModel.py: -------------------------------------------------------------------------------- 1 | from keras.layers import Add,ZeroPadding2D,Input, Conv2D, MaxPooling2D, Conv2DTranspose, concatenate, BatchNormalization 2 | from keras.models import Model 3 | 4 | def Left_Block(input_tensor,outplane,mode="None"): 5 | x = Basic_block(input_tensor, outplane,mode=mode) 6 | x=MaxPooling2D(pool_size=(2,2),strides=(2,2))(x) 7 | return x 8 | 9 | def Right_Block(input_tensor,outplane,mode="None"): 10 | x=Basic_block_right(input_tensor,outplane,mode=mode) 11 | x=MaxPooling2D(pool_size=(2,2),strides=(2,2))(x) 12 | return x 13 | 14 | def Basic_block(input_tensor,output_tensor,mode="None"): 15 | x=Conv2D(output_tensor,kernel_size=(3,3),strides=(1,1),padding="same",activation="relu" 16 | )(input_tensor) 17 | x0=x 18 | x=BatchNormalization()(x) 19 | #x = GroupNormalization()(x) 20 | x = Conv2D(output_tensor, kernel_size=(3, 3), strides=(1, 1), padding="same",activation="relu" 21 | )(x) 22 | x = BatchNormalization()(x) 23 | #x = GroupNormalization()(x) 24 | if mode=="None": 25 | return x 26 | if mode =="residual": 27 | x=Add()([x,x0]) 28 | return x 29 | def Basic_block_right(input_tensor,output_tensor,mode="None"): 30 | x=ZeroPadding2D(padding=(1,1),data_format=None)(input_tensor) 31 | x=Conv2D(output_tensor,kernel_size=(3,3),strides=(2,2),padding="same",activation="relu" 32 | )(x) 33 | x0=x 34 | x=BatchNormalization()(x) 35 | #x = GroupNormalization()(x) 36 | x = Conv2D(output_tensor, kernel_size=(3, 3), strides=(1, 1), padding="same",activation="relu" 37 | )(x) 38 | x=BatchNormalization()(x) 39 | #x = GroupNormalization()(x) 40 | if mode=="None": 41 | return x 42 | if mode =="residual": 43 | x=Add()([x,x0]) 44 | return x 45 | 46 | 47 | def CLN(input_shape,num_class=1): 48 | nb_filter = 24 49 | a = nb_filter 50 | inputs = Input(shape=input_shape) 51 | con_axis = 3 52 | conv1_1 = Left_Block(inputs, a, mode="None") 53 | conv2_1 = Left_Block(conv1_1, 2 * a) 54 | conv2_2 = Right_Block(inputs, a, mode="None") 55 | conv2_3 = concatenate([conv2_1, conv2_2], axis=con_axis) 56 | conv3_1 = Right_Block(conv1_1, 2 * a) 57 | conv3_2 = Left_Block(conv2_3, 6 * a) 58 | conv3_3 = concatenate([conv3_1, conv3_2], axis=con_axis) 59 | conv4_1 = Left_Block(conv3_2,12*a) 60 | conv4_2 = Right_Block(conv2_3, 6 * a) 61 | conv4_3 = concatenate([conv4_1, conv4_2], axis=con_axis) 62 | conv4_3=Conv2D(filters=6*a,kernel_size=1,padding="same",strides=1)(conv4_3) 63 | conv4_4=Left_Block(conv3_3,16*a) 64 | conv4_4=concatenate([conv4_3,conv4_4],axis=con_axis) 65 | conv_bottom = Basic_block(conv4_4, 2 * 8 * a) 66 | up423 = Conv2DTranspose(8 * a, kernel_size=(2, 2), strides=(2, 2), padding="same")(conv_bottom) 67 | #up423 = BatchNormalization()(up423) 68 | up3 = concatenate([conv3_3, up423], axis=con_axis) 69 | #up3 = Activation("relu")(up3) 70 | conv3_4 = Basic_block(up3, 2 * 3 * a) 71 | up322 = Conv2DTranspose(3 * a, kernel_size=(2, 2), strides=(2, 2), padding="same")(conv3_4) 72 | #up322 = BatchNormalization()(up322) 73 | up2 = concatenate([conv2_3, up322], axis=con_axis) 74 | #up2 = Activation("relu")(up2) 75 | conv2_4 = Basic_block(up2, 2 * a) 76 | up221 = Conv2DTranspose(a, kernel_size=(2, 2), strides=(2, 2), padding="same")(conv2_4) 77 | #up221 = BatchNormalization()(up221) 78 | up1 = concatenate([conv1_1, up221], axis=con_axis) 79 | #up1 = Activation("relu")(up1) 80 | conv1_2 = Basic_block(up1, a) 81 | up0 = Conv2DTranspose(a, kernel_size=(2, 2), strides=(2, 2), padding="same")(conv1_2) 82 | #up0 = BatchNormalization()(up0) 83 | strangenet_output = Conv2D(num_class, kernel_size=(1, 1), activation="sigmoid", padding="same", name='output')(up0) 84 | model = Model(inputs, [strangenet_output]) 85 | # model.compile(optimizer=Adam(lr=1e-4), loss=weighted_bce_dice_loss, 86 | # metrics=['accuracy']) 87 | model.summary() 88 | return model -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CLNet 2 | the code of cross layer network will be released soon 3 | -------------------------------------------------------------------------------- /clnet_model: -------------------------------------------------------------------------------- 1 | def Left_Block(input_tensor,outplane,mode="None"): 2 | x = Basic_block(input_tensor, outplane,mode=mode) 3 | x=MaxPooling2D(pool_size=(2,2),strides=(2,2))(x) 4 | return x 5 | 6 | def Right_Block(input_tensor,outplane,mode="None"): 7 | x=Basic_block_right(input_tensor,outplane,mode=mode) 8 | x=MaxPooling2D(pool_size=(2,2),strides=(2,2))(x) 9 | return x 10 | 11 | def Basic_block(input_tensor,output_tensor,mode="None"): 12 | x=Conv2D(output_tensor,kernel_size=(3,3),strides=(1,1),padding="same",activation="relu" 13 | )(input_tensor) 14 | x0=x 15 | x=BatchNormalization()(x) 16 | #x = GroupNormalization()(x) 17 | x = Conv2D(output_tensor, kernel_size=(3, 3), strides=(1, 1), padding="same",activation="relu" 18 | )(x) 19 | x = BatchNormalization()(x) 20 | #x = GroupNormalization()(x) 21 | if mode=="None": 22 | return x 23 | if mode =="residual": 24 | x=Add()([x,x0]) 25 | return x 26 | def StrangeNet_Change_2(input_shape,num_class=1): 27 | nb_filter = 24 28 | a = nb_filter 29 | inputs = Input(shape=input_shape) 30 | con_axis = 3 31 | conv1_1 = Left_Block(inputs, a, mode="None") 32 | conv2_1 = Left_Block(conv1_1, 2 * a) 33 | conv2_2 = Right_Block(inputs, a, mode="None") 34 | conv2_3 = concatenate([conv2_1, conv2_2], axis=con_axis) 35 | conv3_1 = Right_Block(conv1_1, 2 * a) 36 | conv3_2 = Left_Block(conv2_3, 6 * a) 37 | conv3_3 = concatenate([conv3_1, conv3_2], axis=con_axis) 38 | conv4_1 = Left_Block(conv3_2,12*a) 39 | conv4_2 = Right_Block(conv2_3, 6 * a) 40 | conv4_3 = concatenate([conv4_1, conv4_2], axis=con_axis) 41 | conv4_3=Conv2D(filters=6*a,kernel_size=1,padding="same",strides=1)(conv4_3) 42 | conv4_4=Left_Block(conv3_3,16*a) 43 | conv4_4=concatenate([conv4_3,conv4_4],axis=con_axis) 44 | conv_bottom = Basic_block(conv4_4, 2 * 8 * a) 45 | up423 = Conv2DTranspose(8 * a, kernel_size=(2, 2), strides=(2, 2), padding="same")(conv_bottom) 46 | #up423 = BatchNormalization()(up423) 47 | up3 = concatenate([conv3_3, up423], axis=con_axis) 48 | #up3 = Activation("relu")(up3) 49 | conv3_4 = Basic_block(up3, 2 * 3 * a) 50 | up322 = Conv2DTranspose(3 * a, kernel_size=(2, 2), strides=(2, 2), padding="same")(conv3_4) 51 | #up322 = BatchNormalization()(up322) 52 | up2 = concatenate([conv2_3, up322], axis=con_axis) 53 | #up2 = Activation("relu")(up2) 54 | conv2_4 = Basic_block(up2, 2 * a) 55 | up221 = Conv2DTranspose(a, kernel_size=(2, 2), strides=(2, 2), padding="same")(conv2_4) 56 | #up221 = BatchNormalization()(up221) 57 | up1 = concatenate([conv1_1, up221], axis=con_axis) 58 | #up1 = Activation("relu")(up1) 59 | conv1_2 = Basic_block(up1, a) 60 | up0 = Conv2DTranspose(a, kernel_size=(2, 2), strides=(2, 2), padding="same")(conv1_2) 61 | #up0 = BatchNormalization()(up0) 62 | strangenet_output = Conv2D(num_class, kernel_size=(1, 1), activation="sigmoid", padding="same", name='output')(up0) 63 | model = Model(inputs, [strangenet_output]) 64 | # model.compile(optimizer=Adam(lr=1e-4), loss=weighted_bce_dice_loss, 65 | # metrics=['accuracy']) 66 | model.summary() 67 | return model 68 | --------------------------------------------------------------------------------