{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":9988,"databundleVersionId":868324,"sourceType":"competition"}],"dockerImageVersionId":30648,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport cv2\nfrom tensorflow import keras\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.metrics import MeanIoU\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.losses import binary_crossentropy\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Dropout, Conv2DTranspose, concatenate\n\n\ndata = pd.read_csv('/kaggle/input/airbus-ship-detection/train_ship_segmentations_v2.csv')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-02-22T19:18:58.974754Z","iopub.execute_input":"2024-02-22T19:18:58.975174Z","iopub.status.idle":"2024-02-22T19:18:59.567839Z","shell.execute_reply.started":"2024-02-22T19:18:58.975131Z","shell.execute_reply":"2024-02-22T19:18:59.566928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm","metadata":{"execution":{"iopub.status.busy":"2024-02-22T19:19:01.608581Z","iopub.execute_input":"2024-02-22T19:19:01.608932Z","iopub.status.idle":"2024-02-22T19:19:01.617881Z","shell.execute_reply.started":"2024-02-22T19:19:01.608903Z","shell.execute_reply":"2024-02-22T19:19:01.617126Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define a function to load and preprocess images in batches\ndef load_images_batch(image_paths, batch_size=32):\n    images = []\n    for i in range(0, len(image_paths), batch_size):\n        batch_paths = image_paths[i:i+batch_size]\n        batch_images = [load_image(path) for path in batch_paths]\n        images.extend(batch_images)\n    return np.array(images)\n\n# Define a function to create a data generator for masks\ndef mask_generator(mask_data, batch_size=32):\n    num_samples = len(mask_data)\n    while True:\n        for offset in range(0, num_samples, batch_size):\n            batch_masks = mask_data[offset:offset+batch_size]\n            yield np.array(batch_masks)\n\ndef load_image(image_path):\n    try:\n        # Завантаження зображення за вказаним шляхом\n        image = cv2.imread(image_path)\n        \n        # Перевірка, чи вдалося завантажити зображення\n        if image is None:\n            raise FileNotFoundError(f\"Failed to load image at path: {image_path}\")\n        \n        return image\n        \n    except Exception as e:\n        # Обробка помилок\n        print(f\"Error loading image: {e}\")\n        return None\n\n# Функція для перетворення run-length encoding у маску зображення\ndef rle_to_mask(rle_string, width, height):\n    mask = np.zeros(width * height, dtype=np.uint8)\n    rle_numbers = [int(num_string) for num_string in rle_string.split(' ')]\n    for i in range(len(rle_numbers) // 2):\n        start = rle_numbers[2 * i] - 1\n        length = rle_numbers[2 * i + 1]\n        mask[start:start + length] = 1\n    mask = mask.reshape((height, width), order='F')\n    return mask\n\n# Load data paths and preprocess images in batches\ndata = pd.read_csv('/kaggle/input/airbus-ship-detection/train_ship_segmentations_v2.csv')\nimage_paths = ['/kaggle/input/airbus-ship-detection/train_v2/' + row['ImageId'] for i, row in data.iterrows()]\nimages = load_images_batch(image_paths, batch_size=32)\n\n# Generate masks in batches using a data generator\nmasks_data = [rle_to_mask(row['EncodedPixels'], width, height) if isinstance(row['EncodedPixels'], str) else np.zeros((height, width)) for i, row in data.iterrows()]\nmask_gen = mask_generator(masks_data, batch_size=32)\n","metadata":{"execution":{"iopub.status.busy":"2024-02-22T19:19:04.635952Z","iopub.execute_input":"2024-02-22T19:19:04.636395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Split data into training and validation sets\ntrain_images, val_images, train_masks, val_masks = train_test_split(image_paths, masks_data, test_size=0.2, random_state=42)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Створення Unet моделі\n\ndef build_unet(input_shape):\n    inputs = Input(input_shape)\n\n    # Encoder\n    conv1 = Conv2D(64, 3, activation='relu', padding='same')(inputs)\n    conv1 = Conv2D(64, 3, activation='relu', padding='same')(conv1)\n    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)\n\n    conv2 = Conv2D(128, 3, activation='relu', padding='same')(pool1)\n    conv2 = Conv2D(128, 3, activation='relu', padding='same')(conv2)\n    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)\n\n    # Decoder\n    conv3 = Conv2D(256, 3, activation='relu', padding='same')(pool2)\n    conv3 = Conv2D(256, 3, activation='relu', padding='same')(conv3)\n    up1 = Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(conv3)\n    up1 = concatenate([up1, conv2], axis=3)\n\n    conv4 = Conv2D(128, 3, activation='relu', padding='same')(up1)\n    conv4 = Conv2D(128, 3, activation='relu', padding='same')(conv4)\n    up2 = Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(conv4)\n    up2 = concatenate([up2, conv1], axis=3)\n\n    conv5 = Conv2D(64, 3, activation='relu', padding='same')(up2)\n    conv5 = Conv2D(64, 3, activation='relu', padding='same')(conv5)\n\n    outputs = Conv2D(1, 1, activation='sigmoid')(conv5)\n\n    model = Model(inputs=inputs, outputs=outputs)\n    return model\n\n# Компіляція моделі\nmodel = build_unet(input_shape=(256, 256, 3))\nmodel.compile(optimizer=Adam(), loss=binary_crossentropy, metrics=[dice_score])\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Навчання моделі\nhistory = model.fit(train_images, train_masks, epochs=20, batch_size=32, validation_data=(val_images, val_masks))\n\n# Оцінка моделі\ntest_loss, test_dice_score = model.evaluate(test_images, test_masks)\nprint(f'Test Loss: {test_loss}, Test Dice Score: {test_dice_score}')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport tensorflow as tf\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.metrics import MeanIoU\n\n# Step 1: Data Preprocessing\ntrain_df = pd.read_csv(\"/kaggle/input/airbus-ship-detection/train_ship_segmentations_v2.csv\")\n\n# Convert run-length encoded masks to binary masks\ndef rle_decode(mask_rle, shape=(768, 768)):\n    s = mask_rle.split()\n    starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]\n    starts -= 1\n    ends = starts + lengths\n    img = np.zeros(shape[0]*shape[1], dtype=np.uint8)\n    for lo, hi in zip(starts, ends):\n        img[lo:hi] = 1\n    return img.reshape(shape).T  # Needed to align to RLE direction\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Implement UNet architecture\ndef unet_model(input_shape=(768, 768, 3)):\n    inputs = tf.keras.layers.Input(input_shape)\n\n    # Encoder\n    conv1 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same')(inputs)\n    conv1 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same')(conv1)\n    pool1 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(conv1)\n\n    conv2 = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same')(pool1)\n    conv2 = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same')(conv2)\n    pool2 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(conv2)\n\n    # Bottleneck\n    conv3 = tf.keras.layers.Conv2D(256, 3, activation='relu', padding='same')(pool2)\n    conv3 = tf.keras.layers.Conv2D(256, 3, activation='relu', padding='same')(conv3)\n\n    # Decoder\n    up4 = tf.keras.layers.Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(conv3)\n    up4 = tf.keras.layers.concatenate([up4, conv2], axis=3)\n    conv4 = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same')(up4)\n    conv4 = tf.keras.layers.Conv2D(128, 3, activation='relu', padding='same')(conv4)\n\n    up5 = tf.keras.layers.Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(conv4)\n    up5 = tf.keras.layers.concatenate([up5, conv1], axis=3)\n    conv5 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same')(up5)\n    conv5 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same')(conv5)\n\n    outputs = tf.keras.layers.Conv2D(1, 1, activation='sigmoid')(conv5)\n\n    model = tf.keras.Model(inputs=inputs, outputs=outputs)\n    return model\n\n# Step 3: Training\ntrain_images, val_images, train_masks, val_masks = train_test_split(images, masks, test_size=0.2)\n\n# Define loss function (e.g., Dice Loss) and metrics (e.g., Dice Score)\ndef dice_coefficient(y_true, y_pred, smooth=1):\n    intersection = tf.reduce_sum(y_true * y_pred)\n    return (2. * intersection + smooth) / (tf.reduce_sum(y_true) + tf.reduce_sum(y_pred) + smooth)\n\ndef dice_loss(y_true, y_pred):\n    return 1 - dice_coefficient(y_true, y_pred)\n\n# Compile the model\nmodel = unet_model()\nmodel.compile(optimizer='adam', loss=dice_loss, metrics=[dice_coefficient])\n\n# Train the model\nmodel.fit(train_images, train_masks, validation_data=(val_images, val_masks), epochs=epochs, batch_size=batch_size)\n\n# Step 4: Evaluation\n# Evaluate the model on the validation set\nval_loss, val_dice = model.evaluate(val_images, val_masks)\n\n# Step 5: Inference\n# Perform inference on the test set and generate predictions\ntest_predictions = model.predict(test_images)\n","metadata":{},"execution_count":null,"outputs":[]}]}