forked from ZFTurbo/KAGGLE_CERVICAL_CANCER_2017
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patha02_zf_unet_model.py
105 lines (78 loc) · 4.05 KB
/
a02_zf_unet_model.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# coding: utf-8
'''
- ZF-UNET Model based on UNET code from following paper: https://arxiv.org/abs/1505.04597
- This model used to get 2nd place in DSTL competition: https://www.kaggle.com/c/dstl-satellite-imagery-feature-detection
- For training used DICE coefficient: https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient
- Input shape for model 224x224 (the same as for other popular CNNs like VGG or ResNet)
- It has 3 input channels (to process standard RGB (BGR) images)
- It trained on random image generator with random light shapes (ellipses) on dark background with noise (< 10%).
'''
__author__ = 'ZFTurbo: https://kaggle.com/zfturbo'
def preprocess_batch(batch):
batch /= 256.0
batch -= 0.5
return batch
def dice_coef(y_true, y_pred):
from keras import backend as K
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2.0 * intersection + 1.0) / (K.sum(y_true_f) + K.sum(y_pred_f) + 1.0)
def jacard_coef(y_true, y_pred):
from keras import backend as K
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (intersection + 1.0) / (K.sum(y_true_f) + K.sum(y_pred_f) - intersection + 1.0)
def jacard_coef_loss(y_true, y_pred):
return -jacard_coef(y_true, y_pred)
def dice_coef_loss(y_true, y_pred):
return -dice_coef(y_true, y_pred)
def double_conv_layer(x, size, dropout, batch_norm):
from keras.models import Model
from keras.layers import Input, merge, Convolution2D, MaxPooling2D, UpSampling2D
from keras.layers.normalization import BatchNormalization
from keras.layers.core import Dropout, Activation
conv = Convolution2D(size, 3, 3, border_mode='same')(x)
if batch_norm == True:
conv = BatchNormalization(mode=0, axis=1)(conv)
conv = Activation('relu')(conv)
conv = Convolution2D(size, 3, 3, border_mode='same')(conv)
if batch_norm == True:
conv = BatchNormalization(mode=0, axis=1)(conv)
conv = Activation('relu')(conv)
if dropout > 0:
conv = Dropout(dropout)(conv)
return conv
def ZF_UNET_224(dropout_val=0.05, batch_norm=True):
from keras.models import Model
from keras.layers import Input, merge, Convolution2D, MaxPooling2D, UpSampling2D
from keras.layers.normalization import BatchNormalization
from keras.layers.core import Dropout, Activation
inputs = Input((3, 224, 224))
conv1 = double_conv_layer(inputs, 32, dropout_val, batch_norm)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = double_conv_layer(pool1, 64, dropout_val, batch_norm)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
conv3 = double_conv_layer(pool2, 128, dropout_val, batch_norm)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
conv4 = double_conv_layer(pool3, 256, dropout_val, batch_norm)
pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)
conv5 = double_conv_layer(pool4, 512, dropout_val, batch_norm)
pool5 = MaxPooling2D(pool_size=(2, 2))(conv5)
conv6 = double_conv_layer(pool5, 1024, dropout_val, batch_norm)
up6 = merge([UpSampling2D(size=(2, 2))(conv6), conv5], mode='concat', concat_axis=1)
conv7 = double_conv_layer(up6, 512, dropout_val, batch_norm)
up7 = merge([UpSampling2D(size=(2, 2))(conv7), conv4], mode='concat', concat_axis=1)
conv8 = double_conv_layer(up7, 256, dropout_val, batch_norm)
up8 = merge([UpSampling2D(size=(2, 2))(conv8), conv3], mode='concat', concat_axis=1)
conv9 = double_conv_layer(up8, 128, dropout_val, batch_norm)
up9 = merge([UpSampling2D(size=(2, 2))(conv9), conv2], mode='concat', concat_axis=1)
conv10 = double_conv_layer(up9, 64, dropout_val, batch_norm)
up10 = merge([UpSampling2D(size=(2, 2))(conv10), conv1], mode='concat', concat_axis=1)
conv11 = double_conv_layer(up10, 32, 0, batch_norm)
conv12 = Convolution2D(1, 1, 1)(conv11)
conv12 = BatchNormalization(mode=0, axis=1)(conv12)
conv12 = Activation('sigmoid')(conv12)
model = Model(input=inputs, output=conv12)
return model