{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":8089,"databundleVersionId":44321,"sourceType":"competition"}],"dockerImageVersionId":31193,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nimport zipfile\nimport numpy as np\nimport random\nimport os\nfrom tqdm import tqdm\nfrom skimage.io import imread, imshow\nfrom skimage.transform import resize\nimport matplotlib.pyplot as plt\n\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:35:18.951489Z","iopub.execute_input":"2025-11-11T13:35:18.952090Z","iopub.status.idle":"2025-11-11T13:35:18.956077Z","shell.execute_reply.started":"2025-11-11T13:35:18.952065Z","shell.execute_reply":"2025-11-11T13:35:18.955293Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"SEED = 42\nnp.random.seed = SEED\n\nUNZIP_PATH = '../input/data-science-bowl-2018/'\nTRAIN_PATH = './train/'\nTEST_PATH = './test/'\n\nIMG_WIDTH = 128\nIMG_HEIGHT = 128\nIMG_CHANNELS = 3","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:35:21.091268Z","iopub.execute_input":"2025-11-11T13:35:21.091749Z","iopub.status.idle":"2025-11-11T13:35:21.095635Z","shell.execute_reply.started":"2025-11-11T13:35:21.091724Z","shell.execute_reply":"2025-11-11T13:35:21.094985Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"with zipfile.ZipFile(UNZIP_PATH + 'stage1_train.zip', 'r') as zip_ref:\n    zip_ref.extractall('./train')\n    \nwith zipfile.ZipFile(UNZIP_PATH + 'stage1_test.zip', 'r') as zip_ref:\n    zip_ref.extractall('./test')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:35:49.722407Z","iopub.execute_input":"2025-11-11T13:35:49.722677Z","iopub.status.idle":"2025-11-11T13:35:54.142654Z","shell.execute_reply.started":"2025-11-11T13:35:49.722658Z","shell.execute_reply":"2025-11-11T13:35:54.142047Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_ids = next(os.walk(TRAIN_PATH))[1]\ntest_ids = next(os.walk(TEST_PATH))[1]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:35:59.309170Z","iopub.execute_input":"2025-11-11T13:35:59.309406Z","iopub.status.idle":"2025-11-11T13:35:59.314384Z","shell.execute_reply.started":"2025-11-11T13:35:59.309391Z","shell.execute_reply":"2025-11-11T13:35:59.313720Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)\nY_train = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, 1), dtype=bool)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:37:29.892967Z","iopub.execute_input":"2025-11-11T13:37:29.893706Z","iopub.status.idle":"2025-11-11T13:37:29.898384Z","shell.execute_reply.started":"2025-11-11T13:37:29.893683Z","shell.execute_reply":"2025-11-11T13:37:29.897510Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for n, id_ in enumerate(tqdm(train_ids, desc='train images'), start=0):\n    path = os.path.join(TRAIN_PATH, id_)\n    img = imread(os.path.join(path, 'images', f'{id_}.png'))[:, :, :IMG_CHANNELS]\n    img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)\n    X_train[n] = img.astype(np.uint8)\n    mask = np.zeros((IMG_HEIGHT, IMG_WIDTH, 1), dtype=bool)\n    for mask_file in next(os.walk(os.path.join(path, 'masks')))[2]:\n        mask_ = imread(os.path.join(path, 'masks', mask_file))\n        mask_ = resize(mask_, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)\n        mask_ = (np.expand_dims(mask_, axis=-1) > 0)\n        mask = np.logical_or(mask, mask_)\n    Y_train[n] = mask","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:39:19.092177Z","iopub.execute_input":"2025-11-11T13:39:19.092719Z","iopub.status.idle":"2025-11-11T13:43:33.630783Z","shell.execute_reply.started":"2025-11-11T13:39:19.092694Z","shell.execute_reply":"2025-11-11T13:43:33.629808Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_test = np.zeros((len(test_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)\nsizes_test = []\nfor n, id_ in tqdm(enumerate(test_ids), total=len(test_ids)):\n    path = TEST_PATH + id_\n    img = imread(path + '/images/' + id_ + '.png')[:, :, :IMG_CHANNELS]\n    sizes_test.append([img.shape[0], img.shape[1]])\n    img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)\n    X_test[n] = img","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:43:55.137259Z","iopub.execute_input":"2025-11-11T13:43:55.137543Z","iopub.status.idle":"2025-11-11T13:43:56.432759Z","shell.execute_reply.started":"2025-11-11T13:43:55.137523Z","shell.execute_reply":"2025-11-11T13:43:56.432049Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def conv_block(inputs, num_filters):\n    x = tf.keras.layers.Conv2D(num_filters, (3, 3), activation=\"relu\", kernel_initializer=\"he_normal\", padding=\"same\")(inputs)\n    x = tf.keras.layers.Dropout(0.1)(x)\n    x = tf.keras.layers.Conv2D(num_filters, (3, 3), activation=\"relu\", kernel_initializer=\"he_normal\", padding=\"same\")(x)\n    return x\ndef upsample_block(inputs, conv_prev, num_filters):\n    up = tf.keras.layers.Conv2DTranspose(num_filters, (2, 2), strides=(2, 2), padding=\"same\")(inputs)\n    concat = tf.keras.layers.concatenate([up, conv_prev])\n    conv = conv_block(concat, num_filters)\n    return conv","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:44:23.999802Z","iopub.execute_input":"2025-11-11T13:44:24.000374Z","iopub.status.idle":"2025-11-11T13:44:24.005260Z","shell.execute_reply.started":"2025-11-11T13:44:24.000349Z","shell.execute_reply":"2025-11-11T13:44:24.004467Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"inputs = tf.keras.layers.Input((IMG_WIDTH, IMG_HEIGHT, IMG_CHANNELS))\n\n\ns = tf.keras.layers.Lambda(lambda x: x/255.0)(inputs) \n\n\nc1 = conv_block(s, 16)\np1 = tf.keras.layers.MaxPooling2D((2, 2))(c1)\n\nc2 = conv_block(p1, 32)\np2 = tf.keras.layers.MaxPooling2D((2, 2))(c2)\n\nc3 = conv_block(p2, 64)\np3 = tf.keras.layers.MaxPooling2D((2, 2))(c3)\n\nc4 = conv_block(p3, 128)\np4 = tf.keras.layers.MaxPooling2D((2, 2))(c4)\n\n\nc5 = conv_block(p4, 256)\n\n\nc6 = upsample_block(c5, c4, 128)\nc7 = upsample_block(c6, c3, 64)\nc8 = upsample_block(c7, c2, 32)\nc9 = upsample_block(c8, c1, 16)\n\noutputs = tf.keras.layers.Conv2D(1, (1, 1), activation='sigmoid')(c9)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:45:39.310327Z","iopub.execute_input":"2025-11-11T13:45:39.311184Z","iopub.status.idle":"2025-11-11T13:45:41.460189Z","shell.execute_reply.started":"2025-11-11T13:45:39.311145Z","shell.execute_reply":"2025-11-11T13:45:41.459378Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = tf.keras.Model(inputs=[inputs], outputs=[outputs])\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\nmodel.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:46:00.492430Z","iopub.execute_input":"2025-11-11T13:46:00.493232Z","iopub.status.idle":"2025-11-11T13:46:00.551645Z","shell.execute_reply.started":"2025-11-11T13:46:00.493204Z","shell.execute_reply":"2025-11-11T13:46:00.551120Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"checkpoint = tf.keras.callbacks.ModelCheckpoint('model.h5', verbose = 1, save_best_only = True)\ncallbacks = [\n    tf.keras.callbacks.EarlyStopping(patience = 5, monitor = 'val_loss'),\n    tf.keras.callbacks.TensorBoard(log_dir = 'logs')\n            ]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:46:23.008596Z","iopub.execute_input":"2025-11-11T13:46:23.008858Z","iopub.status.idle":"2025-11-11T13:46:23.012961Z","shell.execute_reply.started":"2025-11-11T13:46:23.008838Z","shell.execute_reply":"2025-11-11T13:46:23.012132Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"results = model.fit(\n    X_train, \n    Y_train, \n    validation_split = 0.1, \n    batch_size = 16, \n    epochs = 25, \n    callbacks = callbacks)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:46:31.191719Z","iopub.execute_input":"2025-11-11T13:46:31.192207Z","iopub.status.idle":"2025-11-11T13:47:43.167748Z","shell.execute_reply.started":"2025-11-11T13:46:31.192182Z","shell.execute_reply":"2025-11-11T13:47:43.167199Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"idx = random.randint(0, len(X_train))\n\npreds_train = model.predict(X_train[:int(X_train.shape[0]*0.9)], verbose = 1)\npreds_val = model.predict(X_train[int(X_train.shape[0]*0.9):], verbose = 1)\npreds_test = model.predict(X_test, verbose = 1)\n\npreds_train_t = (preds_train > 0.5).astype(np.uint8)\npreds_val_t = (preds_val > 0.5).astype(np.uint8)\npreds_test_t = (preds_test > 0.5).astype(np.uint8)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:48:11.607244Z","iopub.execute_input":"2025-11-11T13:48:11.607503Z","iopub.status.idle":"2025-11-11T13:48:18.471718Z","shell.execute_reply.started":"2025-11-11T13:48:11.607484Z","shell.execute_reply":"2025-11-11T13:48:18.471108Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def display_images(image):\n    plt.imshow(image)\n    plt.axis('off')\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:48:27.065623Z","iopub.execute_input":"2025-11-11T13:48:27.065864Z","iopub.status.idle":"2025-11-11T13:48:27.069566Z","shell.execute_reply.started":"2025-11-11T13:48:27.065847Z","shell.execute_reply":"2025-11-11T13:48:27.068810Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ix = random.randint(0, len(preds_train_t))\n\nprint(\"Input Image:\")\ndisplay_images(X_train[ix])\n\nprint(\"Ground Truth Mask:\")\ndisplay_images(np.squeeze(Y_train[ix]))\n\nprint(\"Predicted Mask:\")\ndisplay_images(np.squeeze(preds_train_t[ix]))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:48:41.493549Z","iopub.execute_input":"2025-11-11T13:48:41.494417Z","iopub.status.idle":"2025-11-11T13:48:41.696217Z","shell.execute_reply.started":"2025-11-11T13:48:41.494391Z","shell.execute_reply":"2025-11-11T13:48:41.695672Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ix = random.randint(0, len(preds_val_t))\n\nval_data_start = int(X_train.shape[0] * 0.9)\n\nprint(\"Validation Input Image:\")\ndisplay_images(X_train[val_data_start:][ix])\n\nprint(\"Validation Ground Truth Mask:\")\ndisplay_images(np.squeeze(Y_train[val_data_start:][ix]))\n\nprint(\"Validation Predicted Mask:\")\ndisplay_images(np.squeeze(preds_val_t[ix]))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T13:49:00.573707Z","iopub.execute_input":"2025-11-11T13:49:00.574446Z","iopub.status.idle":"2025-11-11T13:49:00.789967Z","shell.execute_reply.started":"2025-11-11T13:49:00.574423Z","shell.execute_reply":"2025-11-11T13:49:00.789423Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### FIIIIIINALLYYYY THIIS ENDED LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL","metadata":{}}]}