{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import mixed_precision\nfrom sklearn.model_selection import *\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.layers import *\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras import backend as K\nfrom tensorflow.keras.callbacks import *\nfrom tensorflow.keras.applications import ResNet50\nfrom tensorflow.keras.models import Model\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-04-03T03:06:42.435499Z","iopub.execute_input":"2023-04-03T03:06:42.435917Z","iopub.status.idle":"2023-04-03T03:06:42.450031Z","shell.execute_reply.started":"2023-04-03T03:06:42.435871Z","shell.execute_reply":"2023-04-03T03:06:42.448860Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"policy = tf.keras.mixed_precision.Policy('mixed_float16')\ntf.keras.mixed_precision.set_global_policy(policy)","metadata":{"execution":{"iopub.status.busy":"2023-04-03T03:06:42.453578Z","iopub.execute_input":"2023-04-03T03:06:42.454586Z","iopub.status.idle":"2023-04-03T03:06:42.800060Z","shell.execute_reply.started":"2023-04-03T03:06:42.454546Z","shell.execute_reply":"2023-04-03T03:06:42.797312Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/early-detection-of-3d-printing-issues/train.csv')\ntest_df = pd.read_csv('/kaggle/input/early-detection-of-3d-printing-issues/test.csv')","metadata":{"execution":{"iopub.status.busy":"2023-04-03T03:06:42.802339Z","iopub.execute_input":"2023-04-03T03:06:42.802986Z","iopub.status.idle":"2023-04-03T03:06:43.096041Z","shell.execute_reply.started":"2023-04-03T03:06:42.802945Z","shell.execute_reply":"2023-04-03T03:06:43.094438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clean_train_df = train_df.drop_duplicates(subset=['printer_id'])","metadata":{"execution":{"iopub.status.busy":"2023-04-03T03:15:55.287403Z","iopub.execute_input":"2023-04-03T03:15:55.288549Z","iopub.status.idle":"2023-04-03T03:15:55.308474Z","shell.execute_reply.started":"2023-04-03T03:15:55.288498Z","shell.execute_reply":"2023-04-03T03:15:55.307264Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_dir = '/kaggle/input/early-detection-of-3d-printing-issues/images/'\n\nclean_train_df['printer_id'] = train_df['printer_id'].astype(str)","metadata":{"execution":{"iopub.status.busy":"2023-04-03T03:17:01.277900Z","iopub.execute_input":"2023-04-03T03:17:01.279083Z","iopub.status.idle":"2023-04-03T03:17:01.289839Z","shell.execute_reply.started":"2023-04-03T03:17:01.279027Z","shell.execute_reply":"2023-04-03T03:17:01.288372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import imgaug.augmenters as iaa\n# from PIL import Image\n# import os\n\n# # Define augmentations\n# seq = iaa.Sequential([\n#     iaa.Fliplr(0.5),  # flip horizontally with probability 0.5\n#     iaa.Crop(percent=(0, 0.1)),  # crop images by 0-10% of their height/width\n#     iaa.Sometimes(0.5, iaa.GaussianBlur(sigma=(0, 0.5))),  # blur images with probability 0.5\n#     iaa.ContrastNormalization((0.75, 1.5)),  # apply contrast normalization\n#     iaa.Affine(rotate=(-10, 10))  # rotate images by -10 to 10 degrees\n# ])\n\n# # Define path to images\n# image_path = \"/kaggle/input/early-detection-of-3d-printing-issues/images\"\n\n# # Create directory for augmented images\n# output_path = \"/kaggle/working/images\"\n# os.makedirs(output_path, exist_ok=True)\n\n# # Loop over subfolders\n# for subdir, dirs, files in os.walk(image_path):\n#     for filename in files:\n#         # Check if file is an image\n#         if filename.endswith(\".jpg\"):\n#             # Load image\n#             image = Image.open(os.path.join(subdir, filename))\n#             image_array = np.array(image)\n#             # Apply augmentations\n#             augmented_images = seq(images=[image_array])\n#             for i, image_aug in enumerate(augmented_images):\n#                 # Save augmented image\n#                 image_aug = Image.fromarray(image_aug)\n#                 output_filename = f\"{subdir.replace(image_path, output_path)}_{filename[:-4]}_aug_{i}.jpg\"\n#                 os.makedirs(os.path.dirname(output_filename), exist_ok=True)\n#                 image_aug.save(output_filename)\n","metadata":{"execution":{"iopub.status.busy":"2023-04-03T03:15:59.564666Z","iopub.execute_input":"2023-04-03T03:15:59.565447Z","iopub.status.idle":"2023-04-03T03:15:59.571679Z","shell.execute_reply.started":"2023-04-03T03:15:59.565405Z","shell.execute_reply":"2023-04-03T03:15:59.570435Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMG_SIZE = 224\nBATCH_SIZE = 32\nEPOCHS = 10\n\n\ntrain_datagen = ImageDataGenerator(rescale=1./255, \n                                rotation_range=90,\n                                horizontal_flip=True,\n                                   validation_split=0.2)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    train_df,\n    directory=img_dir,\n    x_col=\"img_path\",\n    y_col=\"printer_id\",\n    target_size=(IMG_SIZE, IMG_SIZE),\n    batch_size=BATCH_SIZE,\n    shuffle=True,\n    class_mode = \"categorical\",\n    subset=\"training\",\n    seed=42\n)\n\nval_generator = train_datagen.flow_from_dataframe(\n    train_df,\n    directory=img_dir,\n    x_col=\"img_path\",\n    y_col=\"printer_id\",\n    target_size=(IMG_SIZE, IMG_SIZE),\n    batch_size=BATCH_SIZE,\n    class_mode = \"categorical\",\n    shuffle=True,\n    subset=\"validation\"\n)","metadata":{"execution":{"iopub.status.busy":"2023-04-03T03:17:11.510902Z","iopub.execute_input":"2023-04-03T03:17:11.511286Z","iopub.status.idle":"2023-04-03T03:17:11.537765Z","shell.execute_reply.started":"2023-04-03T03:17:11.511254Z","shell.execute_reply":"2023-04-03T03:17:11.536612Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def recall_m(y_true, y_pred):\n    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))\n    recall = true_positives / (possible_positives + K.epsilon())\n    return recall\n\ndef precision_m(y_true, y_pred):\n    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))\n    precision = true_positives / (predicted_positives + K.epsilon())\n    return precision\n\ndef f1_m(y_true, y_pred):\n    precision = precision_m(y_true, y_pred)\n    recall = recall_m(y_true, y_pred)\n    return 2*((precision*recall)/(precision+recall+K.epsilon()))","metadata":{"execution":{"iopub.status.busy":"2023-04-03T03:11:28.449160Z","iopub.execute_input":"2023-04-03T03:11:28.449635Z","iopub.status.idle":"2023-04-03T03:11:28.459421Z","shell.execute_reply.started":"2023-04-03T03:11:28.449596Z","shell.execute_reply":"2023-04-03T03:11:28.457900Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define the model architecture\nwith tf.device('/GPU:0'): \n    model = Sequential()\n    model.add(Conv2D(16,(3,3),activation='relu',input_shape=(224,224,3)))\n    model.add(MaxPooling2D(pool_size = (3,3), strides=3, padding=\"same\"))\n    model.add(Dropout(0.4))\n\n    model.add(Conv2D(32,(3,3),activation='relu'))\n    model.add(MaxPooling2D(pool_size = (3,3), strides=3, padding=\"same\"))\n    model.add(Dropout(0.5))\n\n    model.add(Flatten())\n    model.add(Dense(64,activation='relu'))\n    model.add(Dropout(0.5))\n\n    model.add(Dense(5,activation='softmax'))\n\n# Compile the model\nmodel.compile(loss=\"binary_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\", recall_m, precision_m, f1_m])\ncallback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)\n\n# Train the model\nhistory = model.fit(\n    train_generator,\n    steps_per_epoch=train_generator.samples // BATCH_SIZE,\n    epochs=15,\n    validation_data=val_generator,\n    validation_steps=val_generator.samples // BATCH_SIZE,\n    callbacks = callback\n)","metadata":{"execution":{"iopub.status.busy":"2023-04-03T03:11:28.461430Z","iopub.execute_input":"2023-04-03T03:11:28.461996Z","iopub.status.idle":"2023-04-03T03:15:33.809740Z","shell.execute_reply.started":"2023-04-03T03:11:28.461955Z","shell.execute_reply":"2023-04-03T03:15:33.807674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the test dataframe\ntest_df = pd.read_csv('/kaggle/input/early-detection-of-3d-printing-issues/test.csv')\n\n# Create a test data generator\ntest_datagen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_datagen.flow_from_dataframe(\n    test_df,\n    directory='/kaggle/input/early-detection-of-3d-printing-issues/images',\n    x_col='img_path',\n    y_col=None,\n    class_mode=None,\n    target_size=(IMG_SIZE, IMG_SIZE),\n    batch_size=BATCH_SIZE,\n    shuffle=False\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generate predictions for the test data generator\npredictions = model.predict_generator(\n    test_generator,\n    steps=test_generator.n // BATCH_SIZE + 1,\n    verbose=1\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = predictions.astype(np.int64)\n\n# Save the predictions to a CSV file\nsubmission_df = pd.DataFrame({'img_path': test_df['img_path'], 'has_under_extrusion': predictions.flatten()})\nsubmission_df.to_csv('submission_normal_cnn_removed_dupl.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with tf.device('/GPU:0'): \n    model = Sequential()\n    model.add(Conv2D(16,(3,3),activation='relu',input_shape=(224,224,3)))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size = (3,3), strides=3, padding=\"same\"))\n    model.add(Dropout(0.4))\n\n    model.add(Conv2D(32,(3,3),activation='relu'))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size = (3,3), strides=3, padding=\"same\"))\n    model.add(Dropout(0.5))\n    \n    model.add(Conv2D(64,(3,3),activation='relu'))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size = (3,3), strides=3, padding=\"same\"))\n    model.add(Dropout(0.5))\n\n    model.add(Flatten())\n    model.add(Dense(64,activation='relu'))\n    model.add(Dropout(0.5))\n\n    model.add(Dense(1,activation='sigmoid'))\n\n# Compile the model\nmodel.compile(loss=\"binary_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\", recall_m, precision_m, f1_m])\ncallback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)\n\n# Train the model\nhistory = model.fit(\n    train_generator,\n    steps_per_epoch=train_generator.samples // BATCH_SIZE,\n    epochs=15,\n    validation_data=val_generator,\n    validation_steps=val_generator.samples // BATCH_SIZE,\n    callbacks = callback\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generate predictions for the test data generator\npredictions = model.predict_generator(\n    test_generator,\n    steps=test_generator.n // BATCH_SIZE + 1,\n    verbose=1\n)\n\npredictions = predictions.astype(np.int64)\n\n# Save the predictions to a CSV file\nsubmission_df = pd.DataFrame({'img_path': test_df['img_path'], 'has_under_extrusion': predictions.flatten()})\nsubmission_df.to_csv('submission_batchnormal_removed_dupl.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}