import cv2
import numpy as np
import pandas as pd
from keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint, TensorBoard
from keras.models import Model
from keras.layers import Input, concatenate, Conv2D, MaxPooling2D, Activation, UpSampling2D, BatchNormalization
from keras.optimizers import RMSprop
from keras.losses import binary_crossentropy
import keras.backend as K
from sklearn.model_selection import train_test_split
Using TensorFlow backend.
def dice_loss(y_true, y_pred):
smooth = 1.
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. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
def bce_dice_loss(y_true, y_pred):
return binary_crossentropy(y_true, y_pred) + (1 - dice_loss(y_true, y_pred))
def unet_down_one_block(inputs, num_filters):
x = Conv2D(num_filters, (3, 3), padding='same')(inputs)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = Conv2D(num_filters, (3, 3), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
return x
def unet_max_pool(inputs):
x = MaxPooling2D((2, 2), strides=(2, 2))(inputs)
return x
def unet_up_one_block(up_input, down_input, num_filters):
x = UpSampling2D((2,2))(up_input)
x = concatenate([down_input, x], axis=3)
x = Conv2D(num_filters, (3,3), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = Conv2D(num_filters, (3,3), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = Conv2D(num_filters, (3,3), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
return x
def get_unet(input_shape = (256, 256, 3),
num_classes = 1,
initial_filters = 32,
central_filters = 1024):
num_filters = initial_filters
out_list = [Input(shape=input_shape)]
down_interim_list = []
while num_filters <= central_filters/2:
x = unet_down_one_block(out_list[-1], num_filters)
down_interim_list.append(x)
num_filters = num_filters * 2
y = unet_max_pool(x)
out_list.append(y)
x = unet_down_one_block(out_list[-1], num_filters)
out_list.append(x)
num_filters = int(num_filters / 2)
while num_filters >= initial_filters:
x = unet_up_one_block(out_list[-1], down_interim_list.pop(), num_filters)
out_list.append(x)
num_filters = int(num_filters / 2)
classify = Conv2D(num_classes, (1,1), activation = 'sigmoid')(out_list[-1])
model = Model(inputs=out_list[0], outputs=classify)
model.compile(optimizer=RMSprop(lr=0.0001),
loss=bce_dice_loss,
metrics=[dice_loss])
return model
model = get_unet(input_shape=(512,512,3), initial_filters=16)
model.summary()
____________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ==================================================================================================== input_1 (InputLayer) (None, 512, 512, 3) 0 ____________________________________________________________________________________________________ conv2d_1 (Conv2D) (None, 512, 512, 16) 448 input_1[0][0] ____________________________________________________________________________________________________ batch_normalization_1 (BatchNorm (None, 512, 512, 16) 64 conv2d_1[0][0] ____________________________________________________________________________________________________ activation_1 (Activation) (None, 512, 512, 16) 0 batch_normalization_1[0][0] ____________________________________________________________________________________________________ conv2d_2 (Conv2D) (None, 512, 512, 16) 2320 activation_1[0][0] ____________________________________________________________________________________________________ batch_normalization_2 (BatchNorm (None, 512, 512, 16) 64 conv2d_2[0][0] ____________________________________________________________________________________________________ activation_2 (Activation) (None, 512, 512, 16) 0 batch_normalization_2[0][0] ____________________________________________________________________________________________________ max_pooling2d_1 (MaxPooling2D) (None, 256, 256, 16) 0 activation_2[0][0] ____________________________________________________________________________________________________ conv2d_3 (Conv2D) (None, 256, 256, 32) 4640 max_pooling2d_1[0][0] ____________________________________________________________________________________________________ batch_normalization_3 (BatchNorm (None, 256, 256, 32) 128 conv2d_3[0][0] ____________________________________________________________________________________________________ activation_3 (Activation) (None, 256, 256, 32) 0 batch_normalization_3[0][0] ____________________________________________________________________________________________________ conv2d_4 (Conv2D) (None, 256, 256, 32) 9248 activation_3[0][0] ____________________________________________________________________________________________________ batch_normalization_4 (BatchNorm (None, 256, 256, 32) 128 conv2d_4[0][0] ____________________________________________________________________________________________________ activation_4 (Activation) (None, 256, 256, 32) 0 batch_normalization_4[0][0] ____________________________________________________________________________________________________ max_pooling2d_2 (MaxPooling2D) (None, 128, 128, 32) 0 activation_4[0][0] ____________________________________________________________________________________________________ conv2d_5 (Conv2D) (None, 128, 128, 64) 18496 max_pooling2d_2[0][0] ____________________________________________________________________________________________________ batch_normalization_5 (BatchNorm (None, 128, 128, 64) 256 conv2d_5[0][0] ____________________________________________________________________________________________________ activation_5 (Activation) (None, 128, 128, 64) 0 batch_normalization_5[0][0] ____________________________________________________________________________________________________ conv2d_6 (Conv2D) (None, 128, 128, 64) 36928 activation_5[0][0] ____________________________________________________________________________________________________ batch_normalization_6 (BatchNorm (None, 128, 128, 64) 256 conv2d_6[0][0] ____________________________________________________________________________________________________ activation_6 (Activation) (None, 128, 128, 64) 0 batch_normalization_6[0][0] ____________________________________________________________________________________________________ max_pooling2d_3 (MaxPooling2D) (None, 64, 64, 64) 0 activation_6[0][0] ____________________________________________________________________________________________________ conv2d_7 (Conv2D) (None, 64, 64, 128) 73856 max_pooling2d_3[0][0] ____________________________________________________________________________________________________ batch_normalization_7 (BatchNorm (None, 64, 64, 128) 512 conv2d_7[0][0] ____________________________________________________________________________________________________ activation_7 (Activation) (None, 64, 64, 128) 0 batch_normalization_7[0][0] ____________________________________________________________________________________________________ conv2d_8 (Conv2D) (None, 64, 64, 128) 147584 activation_7[0][0] ____________________________________________________________________________________________________ batch_normalization_8 (BatchNorm (None, 64, 64, 128) 512 conv2d_8[0][0] ____________________________________________________________________________________________________ activation_8 (Activation) (None, 64, 64, 128) 0 batch_normalization_8[0][0] ____________________________________________________________________________________________________ max_pooling2d_4 (MaxPooling2D) (None, 32, 32, 128) 0 activation_8[0][0] ____________________________________________________________________________________________________ conv2d_9 (Conv2D) (None, 32, 32, 256) 295168 max_pooling2d_4[0][0] ____________________________________________________________________________________________________ batch_normalization_9 (BatchNorm (None, 32, 32, 256) 1024 conv2d_9[0][0] ____________________________________________________________________________________________________ activation_9 (Activation) (None, 32, 32, 256) 0 batch_normalization_9[0][0] ____________________________________________________________________________________________________ conv2d_10 (Conv2D) (None, 32, 32, 256) 590080 activation_9[0][0] ____________________________________________________________________________________________________ batch_normalization_10 (BatchNor (None, 32, 32, 256) 1024 conv2d_10[0][0] ____________________________________________________________________________________________________ activation_10 (Activation) (None, 32, 32, 256) 0 batch_normalization_10[0][0] ____________________________________________________________________________________________________ max_pooling2d_5 (MaxPooling2D) (None, 16, 16, 256) 0 activation_10[0][0] ____________________________________________________________________________________________________ conv2d_11 (Conv2D) (None, 16, 16, 512) 1180160 max_pooling2d_5[0][0] ____________________________________________________________________________________________________ batch_normalization_11 (BatchNor (None, 16, 16, 512) 2048 conv2d_11[0][0] ____________________________________________________________________________________________________ activation_11 (Activation) (None, 16, 16, 512) 0 batch_normalization_11[0][0] ____________________________________________________________________________________________________ conv2d_12 (Conv2D) (None, 16, 16, 512) 2359808 activation_11[0][0] ____________________________________________________________________________________________________ batch_normalization_12 (BatchNor (None, 16, 16, 512) 2048 conv2d_12[0][0] ____________________________________________________________________________________________________ activation_12 (Activation) (None, 16, 16, 512) 0 batch_normalization_12[0][0] ____________________________________________________________________________________________________ max_pooling2d_6 (MaxPooling2D) (None, 8, 8, 512) 0 activation_12[0][0] ____________________________________________________________________________________________________ conv2d_13 (Conv2D) (None, 8, 8, 1024) 4719616 max_pooling2d_6[0][0] ____________________________________________________________________________________________________ batch_normalization_13 (BatchNor (None, 8, 8, 1024) 4096 conv2d_13[0][0] ____________________________________________________________________________________________________ activation_13 (Activation) (None, 8, 8, 1024) 0 batch_normalization_13[0][0] ____________________________________________________________________________________________________ conv2d_14 (Conv2D) (None, 8, 8, 1024) 9438208 activation_13[0][0] ____________________________________________________________________________________________________ batch_normalization_14 (BatchNor (None, 8, 8, 1024) 4096 conv2d_14[0][0] ____________________________________________________________________________________________________ activation_14 (Activation) (None, 8, 8, 1024) 0 batch_normalization_14[0][0] ____________________________________________________________________________________________________ up_sampling2d_1 (UpSampling2D) (None, 16, 16, 1024) 0 activation_14[0][0] ____________________________________________________________________________________________________ concatenate_1 (Concatenate) (None, 16, 16, 1536) 0 activation_12[0][0] up_sampling2d_1[0][0] ____________________________________________________________________________________________________ conv2d_15 (Conv2D) (None, 16, 16, 512) 7078400 concatenate_1[0][0] ____________________________________________________________________________________________________ batch_normalization_15 (BatchNor (None, 16, 16, 512) 2048 conv2d_15[0][0] ____________________________________________________________________________________________________ activation_15 (Activation) (None, 16, 16, 512) 0 batch_normalization_15[0][0] ____________________________________________________________________________________________________ conv2d_16 (Conv2D) (None, 16, 16, 512) 2359808 activation_15[0][0] ____________________________________________________________________________________________________ batch_normalization_16 (BatchNor (None, 16, 16, 512) 2048 conv2d_16[0][0] ____________________________________________________________________________________________________ activation_16 (Activation) (None, 16, 16, 512) 0 batch_normalization_16[0][0] ____________________________________________________________________________________________________ conv2d_17 (Conv2D) (None, 16, 16, 512) 2359808 activation_16[0][0] ____________________________________________________________________________________________________ batch_normalization_17 (BatchNor (None, 16, 16, 512) 2048 conv2d_17[0][0] ____________________________________________________________________________________________________ activation_17 (Activation) (None, 16, 16, 512) 0 batch_normalization_17[0][0] ____________________________________________________________________________________________________ up_sampling2d_2 (UpSampling2D) (None, 32, 32, 512) 0 activation_17[0][0] ____________________________________________________________________________________________________ concatenate_2 (Concatenate) (None, 32, 32, 768) 0 activation_10[0][0] up_sampling2d_2[0][0] ____________________________________________________________________________________________________ conv2d_18 (Conv2D) (None, 32, 32, 256) 1769728 concatenate_2[0][0] ____________________________________________________________________________________________________ batch_normalization_18 (BatchNor (None, 32, 32, 256) 1024 conv2d_18[0][0] ____________________________________________________________________________________________________ activation_18 (Activation) (None, 32, 32, 256) 0 batch_normalization_18[0][0] ____________________________________________________________________________________________________ conv2d_19 (Conv2D) (None, 32, 32, 256) 590080 activation_18[0][0] ____________________________________________________________________________________________________ batch_normalization_19 (BatchNor (None, 32, 32, 256) 1024 conv2d_19[0][0] ____________________________________________________________________________________________________ activation_19 (Activation) (None, 32, 32, 256) 0 batch_normalization_19[0][0] ____________________________________________________________________________________________________ conv2d_20 (Conv2D) (None, 32, 32, 256) 590080 activation_19[0][0] ____________________________________________________________________________________________________ batch_normalization_20 (BatchNor (None, 32, 32, 256) 1024 conv2d_20[0][0] ____________________________________________________________________________________________________ activation_20 (Activation) (None, 32, 32, 256) 0 batch_normalization_20[0][0] ____________________________________________________________________________________________________ up_sampling2d_3 (UpSampling2D) (None, 64, 64, 256) 0 activation_20[0][0] ____________________________________________________________________________________________________ concatenate_3 (Concatenate) (None, 64, 64, 384) 0 activation_8[0][0] up_sampling2d_3[0][0] ____________________________________________________________________________________________________ conv2d_21 (Conv2D) (None, 64, 64, 128) 442496 concatenate_3[0][0] ____________________________________________________________________________________________________ batch_normalization_21 (BatchNor (None, 64, 64, 128) 512 conv2d_21[0][0] ____________________________________________________________________________________________________ activation_21 (Activation) (None, 64, 64, 128) 0 batch_normalization_21[0][0] ____________________________________________________________________________________________________ conv2d_22 (Conv2D) (None, 64, 64, 128) 147584 activation_21[0][0] ____________________________________________________________________________________________________ batch_normalization_22 (BatchNor (None, 64, 64, 128) 512 conv2d_22[0][0] ____________________________________________________________________________________________________ activation_22 (Activation) (None, 64, 64, 128) 0 batch_normalization_22[0][0] ____________________________________________________________________________________________________ conv2d_23 (Conv2D) (None, 64, 64, 128) 147584 activation_22[0][0] ____________________________________________________________________________________________________ batch_normalization_23 (BatchNor (None, 64, 64, 128) 512 conv2d_23[0][0] ____________________________________________________________________________________________________ activation_23 (Activation) (None, 64, 64, 128) 0 batch_normalization_23[0][0] ____________________________________________________________________________________________________ up_sampling2d_4 (UpSampling2D) (None, 128, 128, 128) 0 activation_23[0][0] ____________________________________________________________________________________________________ concatenate_4 (Concatenate) (None, 128, 128, 192) 0 activation_6[0][0] up_sampling2d_4[0][0] ____________________________________________________________________________________________________ conv2d_24 (Conv2D) (None, 128, 128, 64) 110656 concatenate_4[0][0] ____________________________________________________________________________________________________ batch_normalization_24 (BatchNor (None, 128, 128, 64) 256 conv2d_24[0][0] ____________________________________________________________________________________________________ activation_24 (Activation) (None, 128, 128, 64) 0 batch_normalization_24[0][0] ____________________________________________________________________________________________________ conv2d_25 (Conv2D) (None, 128, 128, 64) 36928 activation_24[0][0] ____________________________________________________________________________________________________ batch_normalization_25 (BatchNor (None, 128, 128, 64) 256 conv2d_25[0][0] ____________________________________________________________________________________________________ activation_25 (Activation) (None, 128, 128, 64) 0 batch_normalization_25[0][0] ____________________________________________________________________________________________________ conv2d_26 (Conv2D) (None, 128, 128, 64) 36928 activation_25[0][0] ____________________________________________________________________________________________________ batch_normalization_26 (BatchNor (None, 128, 128, 64) 256 conv2d_26[0][0] ____________________________________________________________________________________________________ activation_26 (Activation) (None, 128, 128, 64) 0 batch_normalization_26[0][0] ____________________________________________________________________________________________________ up_sampling2d_5 (UpSampling2D) (None, 256, 256, 64) 0 activation_26[0][0] ____________________________________________________________________________________________________ concatenate_5 (Concatenate) (None, 256, 256, 96) 0 activation_4[0][0] up_sampling2d_5[0][0] ____________________________________________________________________________________________________ conv2d_27 (Conv2D) (None, 256, 256, 32) 27680 concatenate_5[0][0] ____________________________________________________________________________________________________ batch_normalization_27 (BatchNor (None, 256, 256, 32) 128 conv2d_27[0][0] ____________________________________________________________________________________________________ activation_27 (Activation) (None, 256, 256, 32) 0 batch_normalization_27[0][0] ____________________________________________________________________________________________________ conv2d_28 (Conv2D) (None, 256, 256, 32) 9248 activation_27[0][0] ____________________________________________________________________________________________________ batch_normalization_28 (BatchNor (None, 256, 256, 32) 128 conv2d_28[0][0] ____________________________________________________________________________________________________ activation_28 (Activation) (None, 256, 256, 32) 0 batch_normalization_28[0][0] ____________________________________________________________________________________________________ conv2d_29 (Conv2D) (None, 256, 256, 32) 9248 activation_28[0][0] ____________________________________________________________________________________________________ batch_normalization_29 (BatchNor (None, 256, 256, 32) 128 conv2d_29[0][0] ____________________________________________________________________________________________________ activation_29 (Activation) (None, 256, 256, 32) 0 batch_normalization_29[0][0] ____________________________________________________________________________________________________ up_sampling2d_6 (UpSampling2D) (None, 512, 512, 32) 0 activation_29[0][0] ____________________________________________________________________________________________________ concatenate_6 (Concatenate) (None, 512, 512, 48) 0 activation_2[0][0] up_sampling2d_6[0][0] ____________________________________________________________________________________________________ conv2d_30 (Conv2D) (None, 512, 512, 16) 6928 concatenate_6[0][0] ____________________________________________________________________________________________________ batch_normalization_30 (BatchNor (None, 512, 512, 16) 64 conv2d_30[0][0] ____________________________________________________________________________________________________ activation_30 (Activation) (None, 512, 512, 16) 0 batch_normalization_30[0][0] ____________________________________________________________________________________________________ conv2d_31 (Conv2D) (None, 512, 512, 16) 2320 activation_30[0][0] ____________________________________________________________________________________________________ batch_normalization_31 (BatchNor (None, 512, 512, 16) 64 conv2d_31[0][0] ____________________________________________________________________________________________________ activation_31 (Activation) (None, 512, 512, 16) 0 batch_normalization_31[0][0] ____________________________________________________________________________________________________ conv2d_32 (Conv2D) (None, 512, 512, 16) 2320 activation_31[0][0] ____________________________________________________________________________________________________ batch_normalization_32 (BatchNor (None, 512, 512, 16) 64 conv2d_32[0][0] ____________________________________________________________________________________________________ activation_32 (Activation) (None, 512, 512, 16) 0 batch_normalization_32[0][0] ____________________________________________________________________________________________________ conv2d_33 (Conv2D) (None, 512, 512, 1) 17 activation_32[0][0] ==================================================================================================== Total params: 34,632,753 Trainable params: 34,618,577 Non-trainable params: 14,176 ____________________________________________________________________________________________________
from keras.utils import plot_model
plot_model(model, to_file='model-512.png', show_shapes=True, show_layer_names=True)
from IPython.display import FileLink
FileLink('model-512.png')
input_size = 512
max_epochs = 50
orig_width = 1918
orig_height= 1280
threshold = 0.5
train_batch_size = 14
val_batch_size = 32
df_train = pd.read_csv('data/train_masks.csv')
df_train.head()
img | rle_mask | |
---|---|---|
0 | 00087a6bd4dc_01.jpg | 879386 40 881253 141 883140 205 885009 17 8850... |
1 | 00087a6bd4dc_02.jpg | 873779 4 875695 7 877612 9 879528 12 881267 15... |
2 | 00087a6bd4dc_03.jpg | 864300 9 866217 13 868134 15 870051 16 871969 ... |
3 | 00087a6bd4dc_04.jpg | 879735 20 881650 26 883315 92 883564 30 885208... |
4 | 00087a6bd4dc_05.jpg | 883365 74 883638 28 885262 119 885550 34 88716... |
ids_train = df_train['img'].map(lambda s: s.split('.')[0])
ids_train_split, ids_valid_split = train_test_split(ids_train, test_size=0.2, random_state=42)
def randomHueSaturationValue(image, hue_shift_limit=(-180, 180),
sat_shift_limit=(-255, 255),
val_shift_limit=(-255, 255), u=0.5):
if np.random.random() < u:
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(image)
hue_shift = np.random.uniform(hue_shift_limit[0], hue_shift_limit[1])
h = cv2.add(h, hue_shift)
sat_shift = np.random.uniform(sat_shift_limit[0], sat_shift_limit[1])
s = cv2.add(s, sat_shift)
val_shift = np.random.uniform(val_shift_limit[0], val_shift_limit[1])
v = cv2.add(v, val_shift)
image = cv2.merge((h, s, v))
image = cv2.cvtColor(image, cv2.COLOR_HSV2BGR)
return image
def randomShiftScaleRotate(image, mask,
shift_limit=(-0.0625, 0.0625),
scale_limit=(-0.1, 0.1),
rotate_limit=(-45, 45), aspect_limit=(0, 0),
borderMode=cv2.BORDER_CONSTANT, u=0.5):
if np.random.random() < u:
height, width, channel = image.shape
angle = np.random.uniform(rotate_limit[0], rotate_limit[1]) # degree
scale = np.random.uniform(1 + scale_limit[0], 1 + scale_limit[1])
aspect = np.random.uniform(1 + aspect_limit[0], 1 + aspect_limit[1])
sx = scale * aspect / (aspect ** 0.5)
sy = scale / (aspect ** 0.5)
dx = round(np.random.uniform(shift_limit[0], shift_limit[1]) * width)
dy = round(np.random.uniform(shift_limit[0], shift_limit[1]) * height)
cc = np.math.cos(angle / 180 * np.math.pi) * sx
ss = np.math.sin(angle / 180 * np.math.pi) * sy
rotate_matrix = np.array([[cc, -ss], [ss, cc]])
box0 = np.array([[0, 0], [width, 0], [width, height], [0, height], ])
box1 = box0 - np.array([width / 2, height / 2])
box1 = np.dot(box1, rotate_matrix.T) + np.array([width / 2 + dx, height / 2 + dy])
box0 = box0.astype(np.float32)
box1 = box1.astype(np.float32)
mat = cv2.getPerspectiveTransform(box0, box1)
image = cv2.warpPerspective(image, mat, (width, height), flags=cv2.INTER_LINEAR, borderMode=borderMode,
borderValue=(
0, 0,
0,))
mask = cv2.warpPerspective(mask, mat, (width, height), flags=cv2.INTER_LINEAR, borderMode=borderMode,
borderValue=(
0, 0,
0,))
return image, mask
def randomHorizontalFlip(image, mask, u=0.5):
if np.random.random() < u:
image = cv2.flip(image, 1)
mask = cv2.flip(mask, 1)
return image, mask
all_imgs = {}
all_masks = {}
for id in ids_train:
img = cv2.imread('data/train/{}.jpg'.format(id))
img = cv2.resize(img, (input_size, input_size))
mask = cv2.imread('data/train_masks/{}_mask.png'.format(id), cv2.IMREAD_GRAYSCALE)
mask = cv2.resize(mask, (input_size, input_size))
all_imgs[id] = img
all_masks[id] = mask
import random
def train_generator(train_batch_size):
while True:
this_ids_train_split = random.sample(list(ids_train_split), len(ids_train_split))
for start in range(0, len(ids_train_split), train_batch_size):
x_batch = []
y_batch = []
end = min(start + train_batch_size, len(ids_train_split))
ids_train_batch = this_ids_train_split[start:end]
for id in ids_train_batch:
img = all_imgs[id]
mask = all_masks[id]
img = randomHueSaturationValue(img,
hue_shift_limit=(-50, 50),
sat_shift_limit=(-5, 5),
val_shift_limit=(-15, 15))
img, mask = randomShiftScaleRotate(img, mask,
shift_limit=(-0.0625, 0.0625),
scale_limit=(-0.1, 0.1),
rotate_limit=(-0, 0))
img, mask = randomHorizontalFlip(img, mask)
mask = np.expand_dims(mask, axis=2)
x_batch.append(img)
y_batch.append(mask)
x_batch = np.array(x_batch, np.float32) / 255
y_batch = np.array(y_batch, np.float32) / 255
yield x_batch, y_batch
def valid_generator(val_batch_size):
while True:
for start in range(0, len(ids_valid_split), val_batch_size):
x_batch = []
y_batch = []
end = min(start + val_batch_size, len(ids_valid_split))
ids_valid_batch = ids_valid_split[start:end]
for id in ids_valid_batch.values:
img = all_imgs[id]
mask = all_masks[id]
mask = np.expand_dims(mask, axis=2)
x_batch.append(img)
y_batch.append(mask)
x_batch = np.array(x_batch, np.float32) / 255
y_batch = np.array(y_batch, np.float32) / 255
yield x_batch, y_batch
callbacks = [EarlyStopping(monitor='val_dice_loss',
patience=8,
verbose=1,
min_delta=1e-4,
mode='max'),
ReduceLROnPlateau(monitor='val_dice_loss',
factor=0.1,
patience=4,
verbose=1,
epsilon=1e-4,
mode='max'),
ModelCheckpoint(monitor='val_dice_loss',
filepath='weights/best_weights_512.hdf5',
save_best_only=True,
save_weights_only=True,
mode='max')]
history = model.fit_generator(generator=train_generator(train_batch_size),
steps_per_epoch=np.ceil(float(len(ids_train_split)) / float(train_batch_size)),
epochs=max_epochs,
verbose=2,
callbacks=callbacks,
validation_data=valid_generator(val_batch_size),
validation_steps=np.ceil(float(len(ids_valid_split)) / float(val_batch_size)))
Epoch 1/50 1095s - loss: 0.6683 - dice_loss: 0.6175 - val_loss: 1.2824 - val_dice_loss: 0.2345 Epoch 2/50 1067s - loss: 0.5082 - dice_loss: 0.6943 - val_loss: 0.4517 - val_dice_loss: 0.7234 Epoch 3/50 1067s - loss: 0.4092 - dice_loss: 0.7463 - val_loss: 0.3579 - val_dice_loss: 0.7762 Epoch 4/50
history.history
{'dice_loss': [0.61744884248154752, 0.69425383410816988, 0.74630680787182557, 0.79495358329440213, 0.83816823004504681, 0.87534160611084699, 0.9078067352789333, 0.93272636519603125, 0.95118491757999768, 0.96488442769507521, 0.9746827342879274, 0.98127262747551358, 0.98564540426034009, 0.98859289618030521, 0.9904549333621594, 0.99160921377397582, 0.99242575801268251, 0.99290880817160265, 0.99320635268377733, 0.99342375973225816, 0.99358152025161861, 0.99366723606568885, 0.99383761367282353, 0.99392326865207947, 0.99397791064634955, 0.99405429621000552, 0.99410069331490147, 0.99414823125562735, 0.99423592283919049, 0.99427576533699502, 0.99431950000345848, 0.99431004966506209, 0.99442397701652396, 0.9944121579866152, 0.99448055310097017, 0.9944686188744678, 0.99454326524195569, 0.99459396492351182, 0.99482175782505944, 0.9948549615956056, 0.99490524348814302, 0.99490636921046116, 0.99494183781105994, 0.99495059187347823, 0.99496883446812923, 0.99497079257590182, 0.99496076780689435, 0.99498443946205717], 'loss': [0.66841880209030036, 0.50823800437866329, 0.40928781025239819, 0.32248296556074435, 0.24949827446105732, 0.1895606334584351, 0.13930651215282647, 0.10176707857290708, 0.074229784192705039, 0.0542785540296346, 0.040054628728026252, 0.030542902691468268, 0.024226485006053559, 0.019963611600147126, 0.017201596975363151, 0.01554734146849456, 0.014259865787566734, 0.013505067274029336, 0.013070961734604923, 0.012713886436798064, 0.012420306074677872, 0.012396878230612021, 0.011940476309315872, 0.011777136994740887, 0.011652066597499924, 0.011513725860863558, 0.011431652343207262, 0.011358456446329265, 0.011137520666497345, 0.011070121688818609, 0.010989574467447525, 0.011025011272647897, 0.010798917452207507, 0.010810443521442958, 0.010661932421935132, 0.01069010610140732, 0.010533724443790221, 0.010432561164772189, 0.0099339865912346937, 0.0098853363854586353, 0.0097839915703899737, 0.0097887853979698267, 0.0097257058600682296, 0.0097020854486990042, 0.0096347765315150154, 0.0096709222187281244, 0.0096844008963564258, 0.009632596608791363], 'lr': [9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-05, 9.9999997e-06, 9.9999997e-06, 9.9999997e-06, 9.9999997e-06, 9.9999997e-06, 9.9999997e-06, 1e-06, 1e-06, 1e-06, 1e-06], 'val_dice_loss': [0.23445685661611951, 0.72335488271619575, 0.77619176681477331, 0.82087879576711154, 0.86215297716774031, 0.89381552843307466, 0.92300009516695392, 0.94353963256116469, 0.95988216826395811, 0.97089279025851627, 0.97956433956655864, 0.98496472858961059, 0.9881427419209059, 0.99039188349410923, 0.99168999548745296, 0.99262581253332804, 0.99315148943299625, 0.99315360779846584, 0.99370651113963548, 0.99407805932762583, 0.99419447410785844, 0.99411707484183476, 0.99430670508701346, 0.99449666825165217, 0.99435656232309244, 0.99450015787525592, 0.99455630018106844, 0.99453271278463784, 0.9947532081650845, 0.99479136157832115, 0.99479335675305136, 0.99478538940369732, 0.99490086081454232, 0.99487784253122291, 0.99493206015738611, 0.99479996244659119, 0.99477226314938139, 0.99495304848684074, 0.99525089067185557, 0.99527068644000882, 0.99528971285154866, 0.99529140707551844, 0.995303592302476, 0.99529900215932099, 0.99532424771247074, 0.99532530115723372, 0.99532489540066371, 0.99532818349264929], 'val_loss': [1.282365691685255, 0.45170711112631329, 0.35787376661900216, 0.28063450709775761, 0.21184550240372393, 0.16172000449626525, 0.11686140461321665, 0.085856742688504087, 0.061758562278419672, 0.045891106458040495, 0.032873205943051396, 0.024755646458192049, 0.020389028116767908, 0.016947689416776237, 0.015081807090909987, 0.013563497244492026, 0.012988545134121987, 0.013450146753392192, 0.011880259558353536, 0.011280009228450728, 0.011183277698332527, 0.011217410679840736, 0.010799803688741619, 0.010595721450647109, 0.010779668948446603, 0.010521987250005214, 0.010516110708852883, 0.010383914579767258, 0.010077549005567676, 0.0099914280664768571, 0.010044238542907364, 0.0099972024567293507, 0.0097153538065891127, 0.0097491325671493663, 0.0097302093055311491, 0.0098336106733453773, 0.0099923133334119327, 0.0096908644288192791, 0.0091370680920179557, 0.0091063531265687375, 0.009073051728293563, 0.0090772418235748834, 0.0090657494237650123, 0.0090557416985159074, 0.0090188086728157368, 0.0090179827635145371, 0.0090176296184362736, 0.0090150413064977748]}
model.load_weights('./weights/best_weights_512.hdf5')
model.compile(optimizer=RMSprop(lr=0.00001),
loss=bce_dice_loss,
metrics=[dice_loss])
max_epochs = 10
callbacks = [EarlyStopping(monitor='val_dice_loss',
patience=8,
verbose=1,
min_delta=1e-4,
mode='max'),
ReduceLROnPlateau(monitor='val_dice_loss',
factor=0.1,
patience=4,
verbose=1,
epsilon=1e-4,
mode='max'),
ModelCheckpoint(monitor='val_dice_loss',
filepath='weights/best_weights_512_2.hdf5',
save_best_only=True,
save_weights_only=True,
mode='max')]
history = model.fit_generator(generator=train_generator(train_batch_size),
steps_per_epoch=np.ceil(float(len(ids_train_split)) / float(train_batch_size)),
epochs=max_epochs,
verbose=2,
callbacks=callbacks,
validation_data=valid_generator(val_batch_size),
validation_steps=np.ceil(float(len(ids_valid_split)) / float(val_batch_size)))
Epoch 1/10 1058s - loss: 0.0097 - dice_loss: 0.9949 - val_loss: 0.0090 - val_dice_loss: 0.9953 Epoch 2/10 1035s - loss: 0.0097 - dice_loss: 0.9950 - val_loss: 0.0090 - val_dice_loss: 0.9953 Epoch 3/10 1036s - loss: 0.0096 - dice_loss: 0.9950 - val_loss: 0.0090 - val_dice_loss: 0.9953 Epoch 4/10 1036s - loss: 0.0096 - dice_loss: 0.9950 - val_loss: 0.0090 - val_dice_loss: 0.9953 Epoch 5/10 1037s - loss: 0.0096 - dice_loss: 0.9950 - val_loss: 0.0090 - val_dice_loss: 0.9954 Epoch 6/10 Epoch 00005: reducing learning rate to 9.999999747378752e-07. 1037s - loss: 0.0096 - dice_loss: 0.9950 - val_loss: 0.0090 - val_dice_loss: 0.9954 Epoch 7/10 1036s - loss: 0.0095 - dice_loss: 0.9950 - val_loss: 0.0089 - val_dice_loss: 0.9954 Epoch 8/10 1036s - loss: 0.0096 - dice_loss: 0.9950 - val_loss: 0.0089 - val_dice_loss: 0.9954 Epoch 9/10 1037s - loss: 0.0096 - dice_loss: 0.9950 - val_loss: 0.0089 - val_dice_loss: 0.9954 Epoch 10/10 Epoch 00009: reducing learning rate to 9.999999974752428e-08. 1036s - loss: 0.0095 - dice_loss: 0.9951 - val_loss: 0.0089 - val_dice_loss: 0.9954 Epoch 00009: early stopping
history.history
{'dice_loss': [0.99494539534430537, 0.99495211432548358, 0.99498290312670956, 0.99498643227818562, 0.99500851918204114, 0.99501778798255636, 0.99503850734790367, 0.99501852104646271, 0.99501814027969027, 0.99505049901160914], 'loss': [0.0097230667362781364, 0.009700357252205619, 0.0096289480777791443, 0.0096364085770759, 0.0095760124186351353, 0.009560881669493506, 0.0095138971526770692, 0.0095830219111311503, 0.0095739817498503507, 0.0095085102609411363], 'lr': [9.9999997e-06, 9.9999997e-06, 9.9999997e-06, 9.9999997e-06, 9.9999997e-06, 9.9999997e-06, 1e-06, 1e-06, 1e-06, 1e-06], 'val_dice_loss': [0.9953225075847274, 0.99534502736711783, 0.99534967383607664, 0.99533991846448078, 0.99535552820662854, 0.99536956269989318, 0.99537191866423147, 0.99537215251585354, 0.99537093185020098, 0.99537680366887094], 'val_loss': [0.0090009434503633048, 0.0089679044709780591, 0.0089681455334886355, 0.0089795740764068484, 0.0089647368745684394, 0.0089701113541755095, 0.0089395029547172343, 0.0089338437703480184, 0.0089326244403840523, 0.0089297916498657301]}
from tqdm import tqdm
df_test = pd.read_csv('data/sample_submission.csv')
ids_test = df_test['img'].map(lambda s: s.split('.')[0])
names = []
for id in ids_test:
names.append('{}.jpg'.format(id))
# https://www.kaggle.com/stainsby/fast-tested-rle
def run_length_encode(mask):
'''
img: numpy array, 1 - mask, 0 - background
Returns run length as string formated
'''
inds = mask.flatten()
runs = np.where(inds[1:] != inds[:-1])[0] + 2
runs[1::2] = runs[1::2] - runs[:-1:2]
rle = ' '.join([str(r) for r in runs])
return rle
rles = []
model.load_weights(filepath='weights/best_weights_512_2.hdf5')
val_batch_size = 32
print('Predicting on {} samples with batch_size = {}...'.format(len(ids_test), val_batch_size))
for start in tqdm(range(0, len(ids_test), val_batch_size)):
x_batch = []
end = min(start + val_batch_size, len(ids_test))
ids_test_batch = ids_test[start:end]
for id in ids_test_batch.values:
img = cv2.imread('data/test/{}.jpg'.format(id))
img = cv2.resize(img, (input_size, input_size))
x_batch.append(img)
x_batch = np.array(x_batch, np.float32) / 255
preds = model.predict_on_batch(x_batch)
preds = np.squeeze(preds, axis=3)
for pred in preds:
prob = cv2.resize(pred, (orig_width, orig_height))
mask = prob > threshold
rle = run_length_encode(mask)
rles.append(rle)
0%| | 0/3127 [00:00<?, ?it/s]
Predicting on 100064 samples with batch_size = 32...
100%|██████████| 3127/3127 [3:40:15<00:00, 4.19s/it]
print("Generating submission file...")
df = pd.DataFrame({'img': names, 'rle_mask': rles})
df.to_csv('submit/submission3.csv.gz', index=False, compression='gzip')
Generating submission file...