{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":61446,"databundleVersionId":6962461,"sourceType":"competition"},{"sourceId":1497540,"sourceType":"datasetVersion","datasetId":879685}],"dockerImageVersionId":30616,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nimport os\nimport glob as gb\nimport os\n\nimport tensorflow as tf\nfrom keras import backend as K\nfrom keras.losses import binary_crossentropy\nfrom keras.layers import Layer\nfrom tensorflow.keras.layers import Activation, Reshape\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import GlobalAveragePooling2D, Input, Conv2D, MaxPooling2D, Flatten, Dense, Dropout, BatchNormalization, UpSampling2D, Concatenate\nfrom sklearn.model_selection import train_test_split\nfrom keras.callbacks import EarlyStopping, ModelCheckpoint, LearningRateScheduler, TensorBoard\nfrom tensorflow.keras.applications import EfficientNetB4\n\nfrom tensorflow.data import Dataset\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-01-03T20:42:28.650625Z","iopub.execute_input":"2024-01-03T20:42:28.651000Z","iopub.status.idle":"2024-01-03T20:42:37.290505Z","shell.execute_reply.started":"2024-01-03T20:42:28.650970Z","shell.execute_reply":"2024-01-03T20:42:37.289261Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Check if a GPU is available\nprint(\"Num GPUs Available: \", len(tf.config.experimental.list_physical_devices('GPU')))\n\n# Check TensorFlow version and GPU availability\nprint(\"TensorFlow Version: \", tf.__version__)\nprint(\"GPU Available: \", tf.config.list_physical_devices('GPU'))","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:42:37.292140Z","iopub.execute_input":"2024-01-03T20:42:37.292716Z","iopub.status.idle":"2024-01-03T20:42:37.698378Z","shell.execute_reply.started":"2024-01-03T20:42:37.292686Z","shell.execute_reply":"2024-01-03T20:42:37.697391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data preprocess","metadata":{}},{"cell_type":"code","source":"base_path = '/kaggle/input/blood-vessel-segmentation/'\n\n\nimage_files = []\nlabel_files = []\n\nimage_files = gb.glob(base_path+'train/kidney_1_dense/images/*')\nlabel_files = gb.glob(base_path+'train/kidney_1_dense/labels/*')\n\n# datasets = gb.glob(base_path+'train/*')\n# for dataset in datasets:\n#     image_files += gb.glob(dataset+'/images/*')\n#     label_files += gb.glob(dataset+'/labels/*')\n    \ndef plot_image_path(path, idx=0):\n    all_path = gb.glob(path)\n    image = get_image(all_path[idx])\n    print(image.shape)\n    tmp = plt.imshow(image, cmap='gray')\n    plt.colorbar(tmp)\n    \ndef plot_image(image):\n    tmp = plt.imshow(image, cmap='gray')\n    plt.colorbar(tmp)\n    \ndef light_intensity(path, idx=0):\n    fig = plt.figure('Light')\n    ax = fig.add_subplot(111)\n    all_path = gb.glob(path)\n    image = np.array(Image.open(all_path[idx]))[:100]\n    w, h = image.shape\n    thresh = image.max() / 2.5\n    ax.imshow(image, cmap='gray')\n    for x in range(w):\n        for y in range(h):\n            ax.annotate(str(round(image[x][y], 2)), xy=(x, y), horizontalalignment='center', verticalalignment='center', color='white')\n            \ndef get_image(path):\n    return np.array(Image.open(path))","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:42:37.699828Z","iopub.execute_input":"2024-01-03T20:42:37.700478Z","iopub.status.idle":"2024-01-03T20:42:37.954326Z","shell.execute_reply.started":"2024-01-03T20:42:37.700438Z","shell.execute_reply":"2024-01-03T20:42:37.953595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TILE_SIZE = 512\nTILE_SIZE_F = 512.0\nSIZE = 256\nSIZE_F = 256\nTH = 0.44","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:43:11.882052Z","iopub.execute_input":"2024-01-03T20:43:11.882439Z","iopub.status.idle":"2024-01-03T20:43:11.887190Z","shell.execute_reply.started":"2024-01-03T20:43:11.882408Z","shell.execute_reply":"2024-01-03T20:43:11.886280Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def augmentation(images, labels):\n    new_images = []\n    new_labels = []\n    img_shape = get_image(images[0]).shape\n    print(img_shape)\n    for i in range(len(images)):\n        img = get_image(images[i])\n        label = get_image(labels[i])\n        for j in range(int(img_shape[0]/TILE_SIZE)):\n            ax2 = j*TILE_SIZE\n            ax3 = (j+1)*TILE_SIZE\n            for k in range(int(img_shape[1]/TILE_SIZE)):\n                ax0 = k*TILE_SIZE\n                ax1 = (k+1)*TILE_SIZE\n                new_images += [img[ax2:ax3, ax0:ax1]]\n                new_labels += [label[ax2:ax3, ax0:ax1]]\n    return np.array(new_images), np.array(new_labels)","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:43:14.922448Z","iopub.execute_input":"2024-01-03T20:43:14.923509Z","iopub.status.idle":"2024-01-03T20:43:14.933533Z","shell.execute_reply.started":"2024-01-03T20:43:14.923465Z","shell.execute_reply":"2024-01-03T20:43:14.932493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"new_images, new_labels = augmentation(image_files, label_files)","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:43:17.674820Z","iopub.execute_input":"2024-01-03T20:43:17.675656Z","iopub.status.idle":"2024-01-03T20:44:43.922062Z","shell.execute_reply.started":"2024-01-03T20:43:17.675626Z","shell.execute_reply":"2024-01-03T20:44:43.920956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def preprocess_image(source, is_image=False):\n    if is_image:\n        image = source\n    else:\n        image = get_image(source)\n    \n    if image.ndim > 2 and image.shape[2] > 1:\n        image = image[...,0]\n        \n    image = image / SIZE_F\n    \n    image = tf.convert_to_tensor(image, dtype=tf.float32)\n    \n    if image.ndim == 2:\n        image = image[..., tf.newaxis]\n        \n    if image.ndim != 3:\n        raise ValueError('Image tensor must be 3 dimensions [height, width, channels]')\n        \n    return tf.image.resize(image, [SIZE, SIZE])\n\ndef preprocess_label(source, is_image=False):\n    if is_image:\n        label = source\n    else:\n        label = get_image(source)\n    \n    if label.ndim > 2 and label.shape[2] > 1:\n        label = label[..., 0]\n        \n    label = label / SIZE_F if label.max() > 1 else label\n    \n    label = tf.convert_to_tensor(label, dtype=tf.float32)\n    \n    if label.ndim == 2:\n        label = label[..., tf.newaxis]\n    \n    # Ensure mask tensor is 3D at this point\n    if label.ndim != 3:\n        raise ValueError('Label tensor must be 3 dimensions [height, width, channels]')\n        \n    label = tf.image.resize(label, [SIZE, SIZE], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)\n    \n    label = tf.where(label > TH, 1., 0.)\n    \n    return label","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:44:43.923725Z","iopub.execute_input":"2024-01-03T20:44:43.924043Z","iopub.status.idle":"2024-01-03T20:44:43.934082Z","shell.execute_reply.started":"2024-01-03T20:44:43.924015Z","shell.execute_reply":"2024-01-03T20:44:43.933087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ORIGINIAL_SHAPE = get_image(image_files[0]).shape","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:44:43.935126Z","iopub.execute_input":"2024-01-03T20:44:43.935399Z","iopub.status.idle":"2024-01-03T20:44:43.951563Z","shell.execute_reply.started":"2024-01-03T20:44:43.935375Z","shell.execute_reply":"2024-01-03T20:44:43.950585Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"subset_size = int(0.9 * len(image_files))\n\nimage_subset = image_files[:subset_size]\nlabel_subset = label_files[:subset_size]","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:49:32.132613Z","iopub.execute_input":"2024-01-03T20:49:32.133047Z","iopub.status.idle":"2024-01-03T20:49:32.138706Z","shell.execute_reply.started":"2024-01-03T20:49:32.133013Z","shell.execute_reply":"2024-01-03T20:49:32.137491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"processed_new_images = np.array([preprocess_image(i, True) for i in new_images])\ndel new_images","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:46:37.824979Z","iopub.execute_input":"2024-01-03T20:46:37.825908Z","iopub.status.idle":"2024-01-03T20:46:48.387835Z","shell.execute_reply.started":"2024-01-03T20:46:37.825868Z","shell.execute_reply":"2024-01-03T20:46:48.386949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"processed_new_labels = np.array([preprocess_image(i, True) for i in new_labels])\ndel new_labels","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:47:32.453083Z","iopub.execute_input":"2024-01-03T20:47:32.453874Z","iopub.status.idle":"2024-01-03T20:47:43.125011Z","shell.execute_reply.started":"2024-01-03T20:47:32.453834Z","shell.execute_reply":"2024-01-03T20:47:43.124143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images = np.array([preprocess_image(i) for i in image_subset])\ndel image_subset","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:44:58.345040Z","iopub.execute_input":"2024-01-03T20:44:58.345425Z","iopub.status.idle":"2024-01-03T20:45:18.796379Z","shell.execute_reply.started":"2024-01-03T20:44:58.345395Z","shell.execute_reply":"2024-01-03T20:45:18.795530Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = np.array([preprocess_label(i) for i in label_subset])\ndel label_subset","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:50:06.232887Z","iopub.execute_input":"2024-01-03T20:50:06.233875Z","iopub.status.idle":"2024-01-03T20:50:23.890410Z","shell.execute_reply.started":"2024-01-03T20:50:06.233834Z","shell.execute_reply":"2024-01-03T20:50:23.889324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(images.shape)\nprint(images.dtype)","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:50:43.781504Z","iopub.execute_input":"2024-01-03T20:50:43.782450Z","iopub.status.idle":"2024-01-03T20:50:43.787702Z","shell.execute_reply.started":"2024-01-03T20:50:43.782413Z","shell.execute_reply":"2024-01-03T20:50:43.786605Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(labels.shape)\nprint(labels.dtype)","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:50:44.457054Z","iopub.execute_input":"2024-01-03T20:50:44.457333Z","iopub.status.idle":"2024-01-03T20:50:44.462243Z","shell.execute_reply.started":"2024-01-03T20:50:44.457309Z","shell.execute_reply":"2024-01-03T20:50:44.461335Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(processed_new_images.shape)\nprint(processed_new_images.dtype)","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:50:46.632118Z","iopub.execute_input":"2024-01-03T20:50:46.632461Z","iopub.status.idle":"2024-01-03T20:50:46.637440Z","shell.execute_reply.started":"2024-01-03T20:50:46.632433Z","shell.execute_reply":"2024-01-03T20:50:46.636439Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(processed_new_labels.shape)\nprint(processed_new_labels.dtype)","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:50:49.371816Z","iopub.execute_input":"2024-01-03T20:50:49.372469Z","iopub.status.idle":"2024-01-03T20:50:49.377486Z","shell.execute_reply.started":"2024-01-03T20:50:49.372434Z","shell.execute_reply":"2024-01-03T20:50:49.376459Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del image_files\ndel label_files","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:50:59.482164Z","iopub.execute_input":"2024-01-03T20:50:59.483041Z","iopub.status.idle":"2024-01-03T20:50:59.487208Z","shell.execute_reply.started":"2024-01-03T20:50:59.483007Z","shell.execute_reply":"2024-01-03T20:50:59.486177Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images = np.concatenate((images, processed_new_images), axis=0)\nlabels = np.concatenate((labels, processed_new_labels), axis=0)","metadata":{"execution":{"iopub.status.busy":"2024-01-03T20:50:55.772082Z","iopub.execute_input":"2024-01-03T20:50:55.773024Z","iopub.status.idle":"2024-01-03T20:50:57.008950Z","shell.execute_reply.started":"2024-01-03T20:50:55.772974Z","shell.execute_reply":"2024-01-03T20:50:57.008108Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Custom Classes","metadata":{}},{"cell_type":"code","source":"class SentimentSegmentation():\n\n    def __init__(self, x, y,input_shape=(SIZE,SIZE,1), encoders=None, decoders=None):\n        self.seed = 2024\n        self.encoders = encoders\n        self.decoders = decoders\n        self.x = x\n        self.y = y\n        self.x_train, self.x_test, self.y_train, self.y_test= train_test_split(self.x, self.y, test_size=0.3)\n        self.input_shape = input_shape\n        self.early_stopping = EarlyStopping(monitor='val_loss', patience=10, verbose=1)\n        self.generate()\n        self.gpus = tf.config.experimental.list_physical_devices('GPU')\n\n    def seed_everything(seed=2024):\n        import random\n        random.seed(seed)\n        np.random.seed(seed)\n\n    def create_encoder(self, x, conv_num=2, filters_num=64, kernel_size=3, stride=1, padding='same', pool_size=(2, 2)):\n        for _ in range(conv_num):\n            x = Conv2D(filters=filters_num, kernel_size=(kernel_size, kernel_size), strides=stride, padding=padding)(x)\n            x = BatchNormalization()(x)\n            x = Activation('relu')(x)\n        x_prime = None\n\n        x = MaxPooling2D(pool_size)(x)\n        return x\n\n    def create_decoder(self,x,extra=None, conv_num=2, filters_num=64, kernel_size=3, stride=1, padding='same', pool_size=(2, 2), is_output=False):\n        \n        \n        x = UpSampling2D(pool_size)(x)\n        if extra is not None:\n            x = Concatenate()([x, extra])\n        print('decoder:')\n        for i in range(conv_num):\n            x = Conv2D(filters=filters_num, kernel_size=(kernel_size, kernel_size), strides=stride, padding=padding)(x)\n            x = BatchNormalization()(x)\n            x = Activation('relu')(x)\n            print(x.shape)\n            \n        if is_output:\n            x = Conv2D(1, (1, 1), 1, padding=\"valid\")(x)\n            x = BatchNormalization()(x)\n            print('last_layer:', x.shape)\n            x = Reshape((self.input_shape[0]*self.input_shape[1], 1), input_shape=self.input_shape,)(x)\n            x = Activation('sigmoid')(x)\n            x = Reshape((self.input_shape[0], self.input_shape[1], 1), input_shape=x.shape,)(x)\n            \n        return x\n\n    def generate(self):\n        inputs = Input(shape=self.input_shape)\n        base_filter_number = 64\n#         backbone = EfficientNetB4(input_shape = self.input_shape, include_top = False,\n#                            weights='/kaggle/input/tensorflow-keras-efficientnet-imagenet-weights/efficientnetb4_notop.h5',\n#                            drop_connect_rate=0.4)(inputs)\n\n        \n        \n        # Encoders    \n#         print(x.shape)\n        c1 = self.create_encoder(inputs, filters_num=base_filter_number * 1)\n        print(c1.shape)\n        c2 = self.create_encoder(c1, filters_num=base_filter_number * 2)\n        print(c2.shape)\n        c3 = self.create_encoder(c2, conv_num=3, filters_num=base_filter_number * 3)\n        print(c3.shape)\n        c4 = self.create_encoder(c3, conv_num=3, filters_num=base_filter_number * 4)\n        print(c4.shape)\n        c5 = self.create_encoder(c4, conv_num=3, filters_num=base_filter_number * 5)\n        print('ta-da',c5.shape,'\\n\\n')\n        \n        # Decoders\n        dec5 = self.create_decoder(c5, c4, conv_num=3, filters_num=base_filter_number * 5)\n        print('after:',dec5.shape)\n        dec4 = self.create_decoder(dec5, c3, conv_num=3, filters_num=base_filter_number * 4)\n        print('after:',dec4.shape)\n        dec3 = self.create_decoder(dec4, c2, conv_num=3, filters_num=base_filter_number * 3)\n        print('after:',dec3.shape)\n        dec2 = self.create_decoder(dec3, c1, filters_num=base_filter_number * 2)\n        print('after:',dec2.shape)\n        dec1 = self.create_decoder(dec2, filters_num=base_filter_number * 1, is_output=True)\n        print('after:',dec1.shape)\n\n        self.model = Model(inputs=inputs, outputs=dec1, name=\"SegNet\")\n        return self.model\n\n    def lr_scheduler(self, epoch, lr):\n        decay_rate = 0.1\n        decay_step = 20\n        \n        if epoch % decay_step == 0 and epoch:\n            return lr * decay_rate\n        return lr\n\n    def dice_coef(self,y_true, y_pred, smooth=1):\n        y_true_f = K.flatten(y_true)\n        y_pred_f = K.flatten(y_pred)\n        intersection = K.sum(y_true_f * y_pred_f)\n        return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)\n\n    def iou_coef(self,y_true, y_pred, smooth=1):\n        intersection = K.sum(K.abs(y_true * y_pred), axis=[1,2,3])\n        union = K.sum(y_true,[1,2,3])+K.sum(y_pred,[1,2,3])-intersection\n        iou = K.mean((intersection + smooth) / (union + smooth), axis=0)\n        return iou\n\n    def dice_loss(self,y_true, y_pred):\n        smooth = 1.\n        y_true_f = K.flatten(y_true)\n        y_pred_f = K.flatten(y_pred)\n        intersection = y_true_f * y_pred_f\n        score = (2. * K.sum(intersection) + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)\n        return 1. - score\n\n    def bce_dice_loss(self,y_true, y_pred):\n        return binary_crossentropy(tf.cast(y_true, tf.float32), y_pred) + 0.5 * self.dice_loss(tf.cast(y_true, tf.float32), y_pred)\n\n    def summary(self):\n        return self.model.summary()\n\n    def compile(self):\n        self.model.compile(optimizer='adam', loss=self.bce_dice_loss, metrics=[self.dice_coef,self.iou_coef])\n\n    def fit(self):\n        scheduler = LearningRateScheduler(self.lr_scheduler, verbose=1)\n        self.model.fit(self.x_train,\n                       self.y_train,\n                       batch_size=16,\n                       epochs=10,\n                       validation_data=(self.x_test, self.y_test),\n                       callbacks=[self.early_stopping, scheduler])\n\n    def fit_gpu(self):\n        if self.gpus:\n            with tf.device('/GPU:0'):\n                results = self.fit()\n                print(\"GPU is available and used.\")\n        else:\n            print(\"No GPU available.\")\n            \n    def get_model(self):\n        return self.model","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:03:02.301213Z","iopub.execute_input":"2024-01-03T21:03:02.301632Z","iopub.status.idle":"2024-01-03T21:03:02.333830Z","shell.execute_reply.started":"2024-01-03T21:03:02.301599Z","shell.execute_reply":"2024-01-03T21:03:02.332714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"SS = SentimentSegmentation(images, labels)\nSS.compile()\nSS.summary()\nSS.fit_gpu()\nmodel = SS.get_model()","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:03:06.528400Z","iopub.execute_input":"2024-01-03T21:03:06.529368Z","iopub.status.idle":"2024-01-03T21:21:44.217631Z","shell.execute_reply.started":"2024-01-03T21:03:06.529329Z","shell.execute_reply":"2024-01-03T21:21:44.216589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import random\nnum_samples = 5 \nsample_indices = random.sample(range(len(SS.x_test)), num_samples)\nsample_images = SS.x_test[sample_indices]\nsample_true_masks = SS.y_test[sample_indices]\nsample_pred_masks = model.predict(sample_images)\n\n# Thresholding example (adjust threshold as needed)\nsample_pred_masks = (sample_pred_masks > 0.44).astype(np.uint8)\nprint(np.mean(sample_pred_masks[0]))\nfor i in range(num_samples):\n    plt.figure(figsize=(12, 5))\n\n    # Display original image\n    plt.subplot(1, 3, 1)\n    plt.imshow(sample_images[i], cmap='gray')\n    plt.title('Original Image')\n    plt.axis('off')\n\n    # Display true mask\n    plt.subplot(1, 3, 2)\n    plt.imshow(sample_true_masks[i], cmap='gray')\n    plt.title('True Mask')\n    plt.axis('off')\n\n    # Display predicted mask\n    plt.subplot(1, 3, 3)\n    plt.imshow(sample_pred_masks[i], cmap='gray')\n    plt.title('Predicted Mask')\n    plt.axis('off')\n\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:26:37.152881Z","iopub.execute_input":"2024-01-03T21:26:37.153291Z","iopub.status.idle":"2024-01-03T21:26:39.236047Z","shell.execute_reply.started":"2024-01-03T21:26:37.153258Z","shell.execute_reply":"2024-01-03T21:26:39.235058Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_set_path = '/kaggle/input/blood-vessel-segmentation/test'\ntest_images_path = []\n\nfor dirs in gb.glob(test_set_path + '/*'):\n    test_images_path += gb.glob(dirs+'/images/*')\n        \ntest_images = np.array([preprocess_image(i) for i in sorted(test_images_path)])","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:22:40.374668Z","iopub.execute_input":"2024-01-03T21:22:40.375079Z","iopub.status.idle":"2024-01-03T21:22:40.608793Z","shell.execute_reply.started":"2024-01-03T21:22:40.375046Z","shell.execute_reply":"2024-01-03T21:22:40.607915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# make predictions\npredicted_labels = model.predict(test_images)","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:22:41.277567Z","iopub.execute_input":"2024-01-03T21:22:41.278401Z","iopub.status.idle":"2024-01-03T21:22:41.391379Z","shell.execute_reply.started":"2024-01-03T21:22:41.278370Z","shell.execute_reply":"2024-01-03T21:22:41.390424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predicted_labels = tf.image.resize(predicted_labels, [1303, 912], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:22:47.803470Z","iopub.execute_input":"2024-01-03T21:22:47.804414Z","iopub.status.idle":"2024-01-03T21:22:47.811485Z","shell.execute_reply.started":"2024-01-03T21:22:47.804373Z","shell.execute_reply":"2024-01-03T21:22:47.810524Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.mean(predicted_labels)","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:22:49.051928Z","iopub.execute_input":"2024-01-03T21:22:49.052246Z","iopub.status.idle":"2024-01-03T21:22:49.067283Z","shell.execute_reply.started":"2024-01-03T21:22:49.052219Z","shell.execute_reply":"2024-01-03T21:22:49.066457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"int_labels = (predicted_labels > TH)","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:24:47.527292Z","iopub.execute_input":"2024-01-03T21:24:47.528002Z","iopub.status.idle":"2024-01-03T21:24:47.532819Z","shell.execute_reply.started":"2024-01-03T21:24:47.527965Z","shell.execute_reply":"2024-01-03T21:24:47.531761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_image(int_labels[4])\n\nprint(int_labels[4].shape)\nprint(np.mean(int_labels[4]))\nprint(np.max(int_labels[4]))","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:25:18.748783Z","iopub.execute_input":"2024-01-03T21:25:18.749441Z","iopub.status.idle":"2024-01-03T21:25:19.203573Z","shell.execute_reply.started":"2024-01-03T21:25:18.749405Z","shell.execute_reply":"2024-01-03T21:25:19.202609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_image(test_images[4])\nnp.mean(test_images[4])\nnp.max(test_images[4])","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:25:24.675050Z","iopub.execute_input":"2024-01-03T21:25:24.675434Z","iopub.status.idle":"2024-01-03T21:25:25.101287Z","shell.execute_reply.started":"2024-01-03T21:25:24.675403Z","shell.execute_reply":"2024-01-03T21:25:25.100409Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rle_encode(img):\n    '''\n    img: numpy array, 1 - mask, 0 - background\n    Returns run length as string formated\n    '''\n    img = np.array(img)\n    pixels = img.flatten()\n    pixels = np.concatenate([[0], pixels, [0]])\n    runs = np.where(pixels[1:] != pixels[:-1])[0] + 1\n    runs[1::2] -= runs[::2]\n    rle = ' '.join(str(x) for x in runs)\n    if rle=='':\n        rle = '1 0'\n    return rle","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:25:32.116104Z","iopub.execute_input":"2024-01-03T21:25:32.116755Z","iopub.status.idle":"2024-01-03T21:25:32.123205Z","shell.execute_reply.started":"2024-01-03T21:25:32.116722Z","shell.execute_reply":"2024-01-03T21:25:32.122192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_rle = [rle_encode(label) for label in int_labels]\nids = [f'{p.split(\"/\")[-3]}_{os.path.basename(p).split(\".\")[0]}' for p in test_images_path]","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:25:32.923209Z","iopub.execute_input":"2024-01-03T21:25:32.923516Z","iopub.status.idle":"2024-01-03T21:25:32.944171Z","shell.execute_reply.started":"2024-01-03T21:25:32.923488Z","shell.execute_reply":"2024-01-03T21:25:32.943408Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame({\n    \"id\": ids,\n    \"rle\": all_rle\n})","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:25:33.616763Z","iopub.execute_input":"2024-01-03T21:25:33.617103Z","iopub.status.idle":"2024-01-03T21:25:33.622122Z","shell.execute_reply.started":"2024-01-03T21:25:33.617077Z","shell.execute_reply":"2024-01-03T21:25:33.621068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.head()","metadata":{"execution":{"iopub.status.busy":"2024-01-03T21:25:33.963076Z","iopub.execute_input":"2024-01-03T21:25:33.963343Z","iopub.status.idle":"2024-01-03T21:25:33.973698Z","shell.execute_reply.started":"2024-01-03T21:25:33.963319Z","shell.execute_reply":"2024-01-03T21:25:33.972614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}