{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":23870,"databundleVersionId":1781260,"sourceType":"competition"},{"sourceId":4014792,"sourceType":"datasetVersion","datasetId":2379638}],"dockerImageVersionId":30042,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nimport numpy as np\nimport os\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport imageio\nimport matplotlib.pyplot as plt\n\nfrom tensorflow.keras.layers import Input\nfrom tensorflow.keras.layers import Conv2D\nfrom tensorflow.keras.layers import MaxPooling2D\nfrom tensorflow.keras.layers import Dropout \nfrom tensorflow.keras.layers import Conv2DTranspose\nfrom tensorflow.keras.layers import concatenate\n\nimg_height = 224\nimg_width =  224\n\nfrom tensorflow.keras.losses import binary_crossentropy\ndef DiceLoss(targets, inputs, smooth=1e-6):\n    \n    #flatten label and prediction tensors\n    inputs = K.flatten(inputs)\n    targets = K.flatten(targets)\n    \n    intersection = K.sum(K.dot(targets, inputs))\n    dice = (2*intersection + smooth) / (K.sum(targets) + K.sum(inputs) + smooth)\n    return 1 - dice\n\ndef dice_coefficient(y_true, y_pred):\n    numerator = 2 * tf.reduce_sum(y_true * y_pred)\n    denominator = tf.reduce_sum(y_true + y_pred)\n    return numerator / (denominator + tf.keras.backend.epsilon())\n\ndef loss(y_true, y_pred):\n    return binary_crossentropy(y_true, y_pred) - tf.math.log(dice_coefficient(y_true, y_pred) + tf.keras.backend.epsilon())\n\ndef append_ext(fn):\n    return fn+\".jpg\"\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%matplotlib inline\nimage_list = []\nmask_list = []\npath = '../input/ranzcr-clip-catheter-line-classification'\nTRAIN_ANNOT_CSV = os.path.join(path,'train_annotations.csv')\nimage_path = os.path.join('', '../input/segmentation/masksline/masksline/')\nmask_path = os.path.join('', '../input/segmentation/imgline/imgline/')\n\ntest_df = pd.read_csv(TRAIN_ANNOT_CSV)\n\ntest_df[\"StudyInstanceUID\"]=test_df[\"StudyInstanceUID\"].apply(append_ext)\n\nfor i in range(test_df.shape[0]):\n    image_list.append(image_path+test_df['StudyInstanceUID'][i])\n    mask_list.append(mask_path+test_df['StudyInstanceUID'][i])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"N = 10\nimg = imageio.imread(image_list[N])\nmask = imageio.imread(mask_list[N])\n\nfig, arr = plt.subplots(1, 2, figsize=(14, 10))\narr[0].imshow(img)\narr[0].set_title('Image')\narr[1].imshow(mask)\narr[1].set_title('Segmentation')\nprint(len(mask_list))\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_filenames = tf.constant(image_list)\nmasks_filenames = tf.constant(mask_list)\nmasks_filenames.shape\n#masks_filenames = masks_filenames[0:9095]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset = tf.data.Dataset.from_tensor_slices((image_filenames, masks_filenames))\n\nfor image, mask in dataset.take(2):\n    #print(image)\n    #print(mask)\n    pass","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def process_path(image_path, mask_path):\n    img = tf.io.read_file(image_path)\n    img = tf.image.decode_png(img, channels=3)\n    img = tf.image.convert_image_dtype(img, tf.float32)\n    \n\n    mask = tf.io.read_file(mask_path)\n    mask = tf.image.decode_png(mask, channels=3)\n    mask = tf.math.reduce_max(mask, axis=-1, keepdims=True)\n    return img, mask\n\ndef preprocess(image, mask):\n    input_image = tf.image.resize(image, (img_height, img_width), method='nearest')\n    input_mask = tf.image.resize(mask, (img_height, img_width), method='nearest')\n\n    return input_image, input_mask\n\nimage_ds = dataset.map(process_path)\nprocessed_image_ds = image_ds.map(preprocess)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# UNQ_C1\n# GRADED FUNCTION: conv_block\ndef conv_block(inputs=None, n_filters=32, dropout_prob=0, max_pooling=True):\n    \"\"\"\n    Convolutional downsampling block\n    \n    Arguments:\n        inputs -- Input tensor\n        n_filters -- Number of filters for the convolutional layers\n        dropout_prob -- Dropout probability\n        max_pooling -- Use MaxPooling2D to reduce the spatial dimensions of the output volume\n    Returns: \n        next_layer, skip_connection --  Next layer and skip connection outputs\n    \"\"\"\n\n  \n    conv = Conv2D(n_filters, \n                  (3,3),     \n                  activation='relu',\n                  padding='same',\n                  kernel_initializer='he_normal')(inputs)\n    conv = Conv2D(n_filters, # Number of filters\n                  (3,3),   # Kernel size\n                  activation='relu',\n                  padding='same',\n                  kernel_initializer='he_normal')(conv)\n \n    if dropout_prob > 0:\n         ### START CODE HERE\n        conv = Dropout(dropout_prob)(conv)\n\n    if max_pooling:\n        ### START CODE HERE\n        next_layer = MaxPooling2D((2,2))(conv)\n        ### END CODE HERE\n        \n    else:\n        next_layer = conv\n        \n    skip_connection = conv\n    \n    return next_layer, skip_connection","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def upsampling_block(expansive_input, contractive_input, n_filters=32):\n    \"\"\"\n    Convolutional upsampling block\n    \n    Arguments:\n        expansive_input -- Input tensor from previous layer\n        contractive_input -- Input tensor from previous skip layer\n        n_filters -- Number of filters for the convolutional layers\n    Returns: \n        conv -- Tensor output\n    \"\"\"\n\n    up = Conv2DTranspose(\n                 n_filters,    # number of filters\n                 (3,3),    # Kernel size\n                 strides=(2,2),\n                 padding='same')(expansive_input)\n    \n  \n    merge = concatenate([up, contractive_input], axis=3)\n    conv = Conv2D(n_filters,   # Number of filters\n                 (3,3),     # Kernel size\n                 activation='relu',\n                 padding='same',\n                 kernel_initializer='he_normal')(merge)\n    conv = Conv2D(n_filters,  # Number of filters\n                 (3,3),   # Kernel size\n                 activation='relu',\n                 padding='same',\n                 kernel_initializer='he_normal')(conv)\n\n\n    \n    return conv","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def unet_model(input_size=(img_height, img_width, 3), n_filters=32, n_classes=23):\n    \"\"\"\n    Unet model\n    \n    Arguments:\n        input_size -- Input shape \n        n_filters -- Number of filters for the convolutional layers\n        n_classes -- Number of output classes\n    Returns: \n        model -- tf.keras.Model\n    \"\"\"\n    inputs = Input(input_size)\n\n    cblock1 = conv_block(inputs, n_filters)\n\n    cblock2 = conv_block(cblock1[0], n_filters*2)\n    cblock3 = conv_block(cblock2[0], n_filters*4)\n    cblock4 = conv_block(cblock3[0], n_filters*8, dropout_prob=0.3)\n    cblock5 = conv_block(cblock4[0], n_filters*16, dropout_prob=0.3, max_pooling=False) \n\n    ublock6 = upsampling_block(cblock5[0], cblock4[1],  n_filters * 8)\n\n    ublock7 = upsampling_block(ublock6, cblock3[1],  n_filters*4)\n    ublock8 = upsampling_block(ublock7, cblock2[1],   n_filters*2)\n    ublock9 = upsampling_block(ublock8, cblock1[1],  n_filters*1)\n\n\n    conv9 = Conv2D(n_filters,\n                 3,\n                 activation='relu',\n                 padding='same',\n                 kernel_initializer='he_normal')(ublock9)\n\n\n    conv10 = Conv2D(n_classes, 1, padding='same')(conv9)\n   \n    \n    model = tf.keras.Model(inputs=inputs, outputs=conv10)\n\n    return model","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#img_height = 224\n#img_width = 224\nnum_channels = 3\n\nunet = unet_model((img_height, img_width, num_channels))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#unet.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])\n\nunet.compile(optimizer='sgd', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=[dice_coefficient])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def display(display_list):\n    plt.figure(figsize=(15, 15))\n\n    title = ['Input Image', 'True Mask', 'Predicted Mask']\n\n    for i in range(len(display_list)):\n        plt.subplot(1, len(display_list), i+1)\n        plt.title(title[i])\n        plt.imshow(tf.keras.preprocessing.image.array_to_img(display_list[i]))\n        plt.axis('off')\n    plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for image, mask in image_ds.take(1):\n    sample_image, sample_mask = image, mask\n    print(mask.shape)\ndisplay([sample_image, sample_mask])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for image, mask in processed_image_ds.take(1):\n    sample_image, sample_mask = image, mask\n    print(mask.shape)\ndisplay([sample_image, sample_mask])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EPOCHS = 10\nVAL_SUBSPLITS = 5\nBUFFER_SIZE = 500\nBATCH_SIZE = 4\nprocessed_image_ds.batch(BATCH_SIZE)\ntrain_dataset = processed_image_ds.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE)\n#print(processed_image_ds.element_spec)\nmodel_history = unet.fit(train_dataset, epochs=EPOCHS)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_mask(pred_mask):\n    pred_mask = tf.argmax(pred_mask, axis=-1)\n    pred_mask = pred_mask[..., tf.newaxis]\n    return pred_mask[0]\n\nunet.save('/kaggle/working/GenerateLine-todel.h5')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(model_history.history[\"dice_coefficient\"])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_predictions(dataset=None, num=1):\n    \"\"\"\n    Displays the first image of each of the num batches\n    \"\"\"\n    if dataset:\n        for image, mask in dataset.take(num):\n            pred_mask = unet.predict(image)\n            display([image[0], mask[0], create_mask(pred_mask)])\n    else:\n        display([sample_image, sample_mask,\n             create_mask(unet.predict(sample_image[tf.newaxis, ...]))])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\nimport os\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport tensorflow as tf\n\nimport imageio\nunet = tf.keras.models.load_model(\"/kaggle/working/GenerateLine-todel.h5\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BUFFER_SIZE = 500\nBATCH_SIZE = 32\nprocessed_image_ds.batch(BATCH_SIZE)\ntrain_dataset = processed_image_ds.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE)\nshow_predictions(train_dataset, 2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}