{"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":"none","dataSources":[{"sourceId":9988,"databundleVersionId":868324,"sourceType":"competition"}],"dockerImageVersionId":30673,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Importing necessary libraries\n\nimport numpy as np \nimport pandas as pd \nimport os\nimport matplotlib.pyplot as plt\n\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport cv2\nfrom glob import glob\n\nfrom PIL import Image\nfrom sklearn.model_selection import train_test_split\nfrom keras.optimizers import RMSprop","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-04-24T07:38:15.693403Z","iopub.execute_input":"2024-04-24T07:38:15.694653Z","iopub.status.idle":"2024-04-24T07:38:34.458935Z","shell.execute_reply.started":"2024-04-24T07:38:15.694596Z","shell.execute_reply":"2024-04-24T07:38:34.457555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/airbus-ship-detection/train_ship_segmentations_v2.csv')","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:34.461331Z","iopub.execute_input":"2024-04-24T07:38:34.462226Z","iopub.status.idle":"2024-04-24T07:38:35.915665Z","shell.execute_reply.started":"2024-04-24T07:38:34.462182Z","shell.execute_reply":"2024-04-24T07:38:35.914336Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# new_df = df[:40]\n\n# new_df.to_csv('segmentations_sample.csv', index=False)\n\n# import os\n# import shutil\n\n# # Папка с вашими фотографиями\n# source_folder = '/kaggle/input/airbus-ship-detection/train_v2'\n\n# # Папка, в которую вы хотите скопировать первые 100 фотографий\n# destination_folder = '/kaggle/working/sample'\n\n# # Создаем целевую папку, если она еще не существует\n# if not os.path.exists(destination_folder):\n#     os.makedirs(destination_folder)\n\n# # Получаем список файлов в исходной папке\n# files = sorted(os.listdir(source_folder))\n\n# # Копируем первые 100 файлов\n# for i, file in enumerate(files):\n#     if i < 100:\n#         source_path = os.path.join(source_folder, file)\n#         destination_path = os.path.join(destination_folder, file)\n#         shutil.copyfile(source_path, destination_path)\n#     else:\n#         break\n# shutil.make_archive('images', 'zip', '/kaggle/working/sample')\n\n# folder_path = '/kaggle/input/airbus-ship-detection/train_v2'\n\n# # Получаем список файлов в папке\n# files = sorted(os.listdir(folder_path))\n\n# # Проверяем, есть ли в папке хотя бы 100 файлов\n# if len(files) >= 100:\n#     # Получаем имя 100-го файла (индексация начинается с 0)\n#     file_name = files[99]\n#     print(\"Имя 100-го файла:\", file_name)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:35.917239Z","iopub.execute_input":"2024-04-24T07:38:35.917594Z","iopub.status.idle":"2024-04-24T07:38:35.925055Z","shell.execute_reply.started":"2024-04-24T07:38:35.917566Z","shell.execute_reply":"2024-04-24T07:38:35.923496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def decode_rle(encoded_pixels, shape=(768, 768)):\n    \"\"\"\n    Decodes a string of encoded pixels into an image mask.\n    \n    Parameters:\n        encoded_pixels (str): string with encoded pixels (RLE).\n        shape (tuple): the shape (shape) of the source image.\n    \n    Returns:\n        mask (np.array): a NumPy array representing the image mask.\n    \"\"\"\n    if isinstance(encoded_pixels, float) and np.isnan(encoded_pixels):\n        return np.zeros((shape[1], shape[0]), dtype=np.uint8) \n    mask = np.zeros(shape[0] * shape[1], dtype=np.uint8)\n    encoded_pixels = encoded_pixels.split()\n    for i in range(0, len(encoded_pixels), 2):\n        start_pixel = int(encoded_pixels[i]) - 1  # Indexation starts from 1\n        num_pixels = int(encoded_pixels[i+1])\n        mask[start_pixel:start_pixel+num_pixels] = 1\n    mask = mask.reshape((shape[1], shape[0])).T  # Flip the image\n    return mask\n\ndef load_masks_from_csv(csv_file, num_records=100, target_size=(256, 256)):\n    \"\"\"\n    Loads ship masks from a CSV file.\n    \n    Parameters:\n        csv_file (str): path to the CSV file.\n    \n    Returns:\n        masks (list): a list of NumPy arrays representing ship masks.\n    \"\"\"\n    df = pd.read_csv(csv_file)\n    unique_images = df['ImageId'].unique()\n    unique_images.sort()\n    masks = []\n    for image_id in unique_images[:num_records]:\n        \n        #print(\"Image ID:\", image_id)\n        image_df = df[df['ImageId'] == image_id]\n        image_path = f\"/kaggle/input/airbus-ship-detection/train_v2/{image_id}\"  \n        image = Image.open(image_path)\n        shape = image.size[::-1]  # Инвертируем форму (width, height) -> (height, width)\n        mask = np.zeros((shape[1], shape[0]), dtype=np.uint8)\n        for _, row in image_df.iterrows():\n            encoded_pixels = row['EncodedPixels']\n            mask += decode_rle(encoded_pixels, shape)\n        \n        # Создаем два канала маски, один для объекта, другой для фона\n        background_channel = np.ones(shape, dtype=np.uint8) - mask\n        mask_tensor = np.stack([background_channel, mask], axis=-1)\n        mask_tensor = tf.convert_to_tensor(mask_tensor, dtype=tf.float32)\n        \n        mask_tensor.set_shape([768, 768, 2])\n        masks.append(mask_tensor)\n    return masks\n\nmasks = load_masks_from_csv('/kaggle/input/airbus-ship-detection/train_ship_segmentations_v2.csv')\n\nmasks[3].shape","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:35.927975Z","iopub.execute_input":"2024-04-24T07:38:35.928400Z","iopub.status.idle":"2024-04-24T07:38:44.872888Z","shell.execute_reply.started":"2024-04-24T07:38:35.928368Z","shell.execute_reply":"2024-04-24T07:38:44.871581Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(masks)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:44.874489Z","iopub.execute_input":"2024-04-24T07:38:44.874901Z","iopub.status.idle":"2024-04-24T07:38:44.883096Z","shell.execute_reply.started":"2024-04-24T07:38:44.874868Z","shell.execute_reply":"2024-04-24T07:38:44.881933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"type(masks[0])\n#type(masks)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:44.884533Z","iopub.execute_input":"2024-04-24T07:38:44.884922Z","iopub.status.idle":"2024-04-24T07:38:44.917260Z","shell.execute_reply.started":"2024-04-24T07:38:44.884892Z","shell.execute_reply":"2024-04-24T07:38:44.916038Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mask_to_visualize = masks[3][:, :, 1]\n\nplt.imshow(mask_to_visualize, cmap='gray')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:44.918652Z","iopub.execute_input":"2024-04-24T07:38:44.919075Z","iopub.status.idle":"2024-04-24T07:38:45.299338Z","shell.execute_reply.started":"2024-04-24T07:38:44.919043Z","shell.execute_reply":"2024-04-24T07:38:45.298229Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def load_image(path, target_size=(256, 256)):\n#     path = path.decode()\n#     image = cv2.imread(path, cv2.IMREAD_COLOR)\n#     #image = cv2.resize(image, target_size)\n#     image = image / 255.0        \n#     return image\n\n# height = 768\n# width = 768\n\n# def tf_parse(x):\n#     def _parse(x):\n#         x = load_image(x)\n#         return x\n#     x = tf.numpy_function(_parse, [x], [tf.float32])\n#     x = tf.convert_to_tensor(x, dtype=tf.float32)\n#     x.set_shape([height, width, 3])\n    \nimg_paths = glob('/kaggle/input/airbus-ship-detection/train_v2/*')[:100]#     return x","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:45.300625Z","iopub.execute_input":"2024-04-24T07:38:45.300971Z","iopub.status.idle":"2024-04-24T07:38:53.933170Z","shell.execute_reply.started":"2024-04-24T07:38:45.300942Z","shell.execute_reply":"2024-04-24T07:38:53.931858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_image(paths_str):\n    img_paths = glob(paths_str)\n    img_paths.sort()  \n    img_paths = img_paths[:100] \n    \n    images= []\n    \n    for img in img_paths:\n        #print(\"Image ID:\", img.split(\"/\")[-1])\n#         image = tf.io.read_file(img)\n#         image = tf.image.decode_jpeg(image, channels=3)\n#         image = tf.image.convert_image_dtype(image, tf.float32)  \n        image = cv2.imread(img)\n        image = image / 255.0\n        images.append(image)\n    # Размер изображения можно изменить здесь, если нужно\n    # image = tf.image.resize(image, target_size)\n    #img = cv2.resize(img, self.image_size)\n    return images","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:53.934925Z","iopub.execute_input":"2024-04-24T07:38:53.935466Z","iopub.status.idle":"2024-04-24T07:38:53.945484Z","shell.execute_reply.started":"2024-04-24T07:38:53.935418Z","shell.execute_reply":"2024-04-24T07:38:53.943866Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"paths = '/kaggle/input/airbus-ship-detection/train_v2/*'\n\nimages = load_image(paths)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:53.950271Z","iopub.execute_input":"2024-04-24T07:38:53.950619Z","iopub.status.idle":"2024-04-24T07:38:57.504138Z","shell.execute_reply.started":"2024-04-24T07:38:53.950591Z","shell.execute_reply":"2024-04-24T07:38:57.502843Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(images[3])","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:57.505921Z","iopub.execute_input":"2024-04-24T07:38:57.506394Z","iopub.status.idle":"2024-04-24T07:38:58.144281Z","shell.execute_reply.started":"2024-04-24T07:38:57.506352Z","shell.execute_reply":"2024-04-24T07:38:58.143030Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# images = tf.data.Dataset.from_tensor_slices(images)\n\n# batch_size = 32\n# images = images.batch(batch_size)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:58.145847Z","iopub.execute_input":"2024-04-24T07:38:58.146344Z","iopub.status.idle":"2024-04-24T07:38:58.151430Z","shell.execute_reply.started":"2024-04-24T07:38:58.146310Z","shell.execute_reply":"2024-04-24T07:38:58.150092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset = tf.data.Dataset.from_tensor_slices((images, masks))","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:38:58.153273Z","iopub.execute_input":"2024-04-24T07:38:58.153844Z","iopub.status.idle":"2024-04-24T07:40:59.926368Z","shell.execute_reply.started":"2024-04-24T07:38:58.153779Z","shell.execute_reply":"2024-04-24T07:40:59.924997Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 32\ndataset = dataset.batch(batch_size)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:40:59.928066Z","iopub.execute_input":"2024-04-24T07:40:59.928446Z","iopub.status.idle":"2024-04-24T07:40:59.939292Z","shell.execute_reply.started":"2024-04-24T07:40:59.928416Z","shell.execute_reply":"2024-04-24T07:40:59.937706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_x, val_x = train_test_split(img_paths, test_size=0.2, random_state=42)\n\n# images = tf.data.Dataset.from_tensor_slices(img_paths)\n\n# images = images.map(load_image, num_parallel_calls=tf.data.experimental.AUTOTUNE)\n\n# batch_size = 32\n# images = images.batch(batch_size)\n\n# #images = images.shuffle(buffer_size=len(img_paths))\n\n# # #dataset = dataset.repeat()","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:40:59.941113Z","iopub.execute_input":"2024-04-24T07:40:59.941539Z","iopub.status.idle":"2024-04-24T07:40:59.950284Z","shell.execute_reply.started":"2024-04-24T07:40:59.941505Z","shell.execute_reply":"2024-04-24T07:40:59.948960Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"masks = tf.data.Dataset.from_tensor_slices(masks)\n\nbatch_size = 32\nmasks = masks.batch(batch_size)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:40:59.952256Z","iopub.execute_input":"2024-04-24T07:40:59.953199Z","iopub.status.idle":"2024-04-24T07:41:00.352577Z","shell.execute_reply.started":"2024-04-24T07:40:59.953155Z","shell.execute_reply":"2024-04-24T07:41:00.351547Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def tf_datasets(x, y, batch=64):\n    \n#     train_x, val_x, train_y, val_y = train_test_split(x, y, test_size=0.2, random_state=42)\n                                                     \n#     tr_im_dataset = tf.data.Dataset.from_tensor_slices(train_x)\n#     tr_im_dataset = tr_im_dataset.map(tf_parse, num_parallel_calls=tf.data.AUTOTUNE)\n    \n#     tr_masks_dataset = tf.data.Dataset.from_tensor_slices(train_y)\n    \n#     tr_dataset = tf.data.Dataset.zip((tr_im_dataset, tr_masks_dataset))\n#     #tr_dataset = tr_dataset.map(lambda x, y: (x, tf.squeeze(y, axis=2)))\n#     tr_dataset = tr_dataset.batch(batch)\n#     tr_dataset = tr_dataset.prefetch(tf.data.AUTOTUNE)\n    \n#     val_im_dataset = tf.data.Dataset.from_tensor_slices(val_x)\n#     val_im_dataset = val_im_dataset.map(tf_parse, num_parallel_calls=tf.data.AUTOTUNE)\n    \n#     val_masks_dataset = tf.data.Dataset.from_tensor_slices(val_y)\n    \n#     val_dataset = tf.data.Dataset.zip((val_im_dataset, val_masks_dataset))\n#     val_dataset = val_dataset.batch(batch)\n#     val_dataset = val_dataset.prefetch(tf.data.AUTOTUNE)\n    \n#     return tr_dataset, val_dataset\n\n# train_dataset, val_dataset = tf_datasets(images, masks)\n\n# train_dataset.element_spec\n\n# val_dataset.element_spec","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:41:00.353980Z","iopub.execute_input":"2024-04-24T07:41:00.354411Z","iopub.status.idle":"2024-04-24T07:41:00.360775Z","shell.execute_reply.started":"2024-04-24T07:41:00.354373Z","shell.execute_reply":"2024-04-24T07:41:00.359540Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Defining a Unet model\n\n# convolutional part of an encoder block\ndef conv2d_block(input_tensor, n_filters, kernel_size = 3):\n    x = input_tensor\n    \n    for i in range(2):\n        x = tf.keras.layers.Conv2D(filters = n_filters, \n         kernel_size = (kernel_size, kernel_size), padding='same')(x)\n\n        x = tf.keras.layers.Activation('relu')(x)\n    return x\n\n# encoder block itself\ndef encoder_block(inputs, n_filters, pool_size, dropout):\n    f = conv2d_block(inputs, n_filters=n_filters)\n    p = tf.keras.layers.MaxPooling2D(pool_size)(f)\n    p = tf.keras.layers.Dropout(dropout)(p)\n\n    return f, p\n\n# encoder part of the model\ndef encoder(inputs):\n    f1, p1 = encoder_block(inputs, n_filters=64, pool_size=(2,2), dropout=0.3)\n    f2, p2 = encoder_block(p1, n_filters=128, pool_size=(2,2), dropout=0.3)\n    f3, p3 = encoder_block(p2, n_filters=256, pool_size=(2,2), dropout=0.3)\n    f4, p4 = encoder_block(p3, n_filters=512, pool_size=(2,2), dropout=0.3)\n    return p4, (f1, f2, f3, f4)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:41:00.362437Z","iopub.execute_input":"2024-04-24T07:41:00.362963Z","iopub.status.idle":"2024-04-24T07:41:00.376368Z","shell.execute_reply.started":"2024-04-24T07:41:00.362922Z","shell.execute_reply":"2024-04-24T07:41:00.375061Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# bottleneck of the moodel\ndef bottleneck(inputs):\n    bottle_neck = conv2d_block(inputs, n_filters=1024)\n    return bottle_neck","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:41:00.377738Z","iopub.execute_input":"2024-04-24T07:41:00.378157Z","iopub.status.idle":"2024-04-24T07:41:00.393979Z","shell.execute_reply.started":"2024-04-24T07:41:00.378126Z","shell.execute_reply":"2024-04-24T07:41:00.392791Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# decoder block of the model\ndef decoder_block(inputs, conv_output, n_filters, kernel_size, strides, dropout):\n    u = tf.keras.layers.Conv2DTranspose(n_filters, kernel_size, strides = strides, \n    padding = 'same')(inputs)\n    c = tf.keras.layers.concatenate([u, conv_output])\n    c = tf.keras.layers.Dropout(dropout)(c)\n    c = conv2d_block(c, n_filters, kernel_size=3)\n    return c\n\n# decoder part of the model\ndef decoder(inputs, convs):\n    f1, f2, f3, f4 = convs\n    c6 = decoder_block(inputs, f4, n_filters=512, kernel_size=(3,3), strides=(2,2), dropout=0.3)\n    c7 = decoder_block(c6, f3, n_filters=256, kernel_size=(3,3), strides=(2,2), dropout=0.3)\n    c8 = decoder_block(c7, f2, n_filters=128, kernel_size=(3,3), strides=(2,2), dropout=0.3)\n    c9 = decoder_block(c8, f1, n_filters=64, kernel_size=(3,3), strides=(2,2), dropout=0.3)\n    outputs = tf.keras.layers.Conv2D(2, (1, 1), activation='sigmoid')(c9)\n    return outputs\n\n# joining everything into Unet model\ndef unet():\n    inputs = tf.keras.layers.Input(shape=(768,768,3))\n    encoder_output, convs = encoder(inputs)\n    \n    bottle_neck = bottleneck(encoder_output)\n    \n    outputs = decoder(bottle_neck, convs)\n    model = tf.keras.Model(inputs=inputs, outputs=outputs)\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:41:00.395748Z","iopub.execute_input":"2024-04-24T07:41:00.396780Z","iopub.status.idle":"2024-04-24T07:41:00.410845Z","shell.execute_reply.started":"2024-04-24T07:41:00.396728Z","shell.execute_reply":"2024-04-24T07:41:00.409642Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = unet()\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:41:00.412202Z","iopub.execute_input":"2024-04-24T07:41:00.413181Z","iopub.status.idle":"2024-04-24T07:41:01.012002Z","shell.execute_reply.started":"2024-04-24T07:41:00.413135Z","shell.execute_reply":"2024-04-24T07:41:01.010857Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#dataset_size = train_dataset.cardinality().numpy()\n#dataset_size","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:41:01.013654Z","iopub.execute_input":"2024-04-24T07:41:01.014131Z","iopub.status.idle":"2024-04-24T07:41:01.019426Z","shell.execute_reply.started":"2024-04-24T07:41:01.014085Z","shell.execute_reply":"2024-04-24T07:41:01.018301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# sample_image = next(iter(images))\n# sample_mask = next(iter(masks))\n\n# # Check the shape of the sample image and mask\n# print(\"Sample image shape:\", sample_image.shape)\n# print(\"Sample mask shape:\", sample_mask.shape)\n\n# print(\"Shape of masks tensor:\", masks.element_spec)\n# print(\"Shape of image tensor:\", images.element_spec)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:41:01.020647Z","iopub.execute_input":"2024-04-24T07:41:01.021309Z","iopub.status.idle":"2024-04-24T07:41:01.032175Z","shell.execute_reply.started":"2024-04-24T07:41:01.021260Z","shell.execute_reply":"2024-04-24T07:41:01.030976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#dataset = tf.data.Dataset.from_tensor_slices((images, masks))","metadata":{"execution":{"iopub.status.busy":"2024-04-23T12:37:27.827332Z","iopub.execute_input":"2024-04-23T12:37:27.827751Z","iopub.status.idle":"2024-04-23T12:37:28.284566Z","shell.execute_reply.started":"2024-04-23T12:37:27.827722Z","shell.execute_reply":"2024-04-23T12:37:28.282527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#training model\n\n\n# defining parameters \nepochs = 5\nbatch_size = 64\n\nmodel.compile(loss=tf.keras.losses.BinaryCrossentropy(), optimizer=RMSprop(learning_rate=0.001), metrics=['accuracy'])\n\nmodel_history = model.fit(dataset,\n                          epochs=epochs)\n                          #steps_per_epoch=dataset_size // batch_size,\n                          #validation_data=val_dataset)\n\n\n# model_history = model.fit(train_dataset,\n#                           epochs=epochs,\n#                           #steps_per_epoch=dataset_size // batch_size,\n#                           validation_data=val_dataset)","metadata":{"execution":{"iopub.status.busy":"2024-04-23T14:08:13.515843Z","iopub.execute_input":"2024-04-23T14:08:13.516502Z","iopub.status.idle":"2024-04-23T14:08:14.858076Z","shell.execute_reply.started":"2024-04-23T14:08:13.516468Z","shell.execute_reply":"2024-04-23T14:08:14.856670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}