{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":45867,"databundleVersionId":6924515,"sourceType":"competition"},{"sourceId":992,"sourceType":"modelInstanceVersion","modelInstanceId":846}],"dockerImageVersionId":30588,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom PIL import Image\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\nfrom tensorflow.keras.models import Sequential, Model\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, GlobalAveragePooling2D\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input\nfrom tensorflow.keras.callbacks import EarlyStopping\nimport tensorflow as tf\nimport tensorflow_hub as hub\nfrom tqdm import tqdm\nimport warnings\nwarnings.filterwarnings(\"ignore\")\nImage.MAX_IMAGE_PIXELS = None\nfrom keras.layers import BatchNormalization\nimport joblib\nfrom tensorflow.keras.models import load_model\n\ndef data_generator(image_paths, labels ):\n    num_samples = len(image_paths)\n    batch_size = 8\n    while True:\n        try:\n            indices = np.random.choice(num_samples, batch_size, replace=False)\n            batch_images = load_images([image_paths[i] for i in indices])\n            batch_labels = labels[indices]\n            yield batch_images, batch_labels\n        except Exception as e:\n            print(f\"Error processing image {image_path}: {e}\")\n            continue\n            \n\n\ndef load_images(image_paths):\n    images = [np.array(Image.open(path).resize((256, 256))) for path in image_paths]\n    return np.array(images)\n\n# Define a function to download the ResNet50 model from TensorFlow Hub\ndef download_resnet_model():\n    resnet_url = \"https://www.kaggle.com/models/tensorflow/resnet-50/frameworks/TensorFlow2/variations/classification/versions/1\"  # ResNet50\n    resnet_model = hub.KerasLayer(resnet_url, input_shape=(224, 224, 3), trainable=False, arguments=dict(weights='imagenet', include_top=False))\n    resnet_model.trainable = False\n    return resnet_model\ndef create_optimized_cnn_model(input_shape, num_classes):\n    model = Sequential()\n    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=input_shape))\n    model.add(MaxPooling2D((2, 2)))\n    model.add(Conv2D(64, (3, 3), activation='relu'))\n    model.add(MaxPooling2D((2, 2)))\n    model.add(Conv2D(64, (3, 3), activation='relu'))\n    model.add(Flatten())\n    model.add(Dense(64, activation='relu'))\n    model.add(Dense(num_classes, activation='softmax'))\n    return model\n\n# Load metadata from CSV files\ntrain_metadata = pd.read_csv('/kaggle/input/UBC-OCEAN/train.csv')\ntest_metadata = pd.read_csv('/kaggle/input/UBC-OCEAN/test.csv')\n\n# Filter rows where \"is_tma\" is False\ntrain_metadata = train_metadata[train_metadata['is_tma'] == False]\n\n# Split the training data into training and validation sets\ntrain_data, val_data = train_test_split(train_metadata, test_size=0.2, random_state=42)\n\n\n# Define paths to image files\ntrain_path_prefix = '/kaggle/input/UBC-OCEAN/train_thumbnails/'\ntest_path_prefix = '/kaggle/input/UBC-OCEAN/test_thumbnails/'\ntrain_image_paths = [train_path_prefix + f\"{img_id}_thumbnail.png\" for img_id in train_data['image_id']]\nval_image_paths = [train_path_prefix + f\"{img_id}_thumbnail.png\" for img_id in val_data['image_id']]\ntest_image_paths = [test_path_prefix + f\"{img_id}_thumbnail.png\" for img_id in test_metadata['image_id']]\n\n\nlabel_encoder = LabelEncoder()\ntrain_labels = label_encoder.fit_transform(train_data['label'])\nval_labels = label_encoder.transform(val_data['label'])\n\nbatch_size=8\ntrain_gen = data_generator(train_image_paths , train_labels)\nval_gen = data_generator(val_image_paths , val_labels)\n\n\n# Create a new model with ResNet50 as the base\ninput_shape = (256, 256, 3)\nnum_classes = len(label_encoder.classes_)\nmodel = create_optimized_cnn_model(input_shape, num_classes)\n\n# Compile the model\nmodel.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])","metadata":{"_uuid":"6b8d5fcd-450f-486e-88f8-b7b7466576de","_cell_guid":"c4e69d2f-76b5-4389-98dc-1f7dabaf171a","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2023-11-30T06:54:30.349787Z","iopub.execute_input":"2023-11-30T06:54:30.35022Z","iopub.status.idle":"2023-11-30T06:54:30.450774Z","shell.execute_reply.started":"2023-11-30T06:54:30.350176Z","shell.execute_reply":"2023-11-30T06:54:30.449761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create early stopping callback\nearly_stopping = EarlyStopping(monitor='val_loss', patience=5)\n\n# Train the model\nhistory = model.fit(train_gen,steps_per_epoch=len(train_image_paths)//8, epochs=2, validation_data=val_gen,validation_steps=len(val_image_paths)//8  ,callbacks=[early_stopping])\n\nmodel.save_weights(\"ucb_ocean_checkpoint.weights.h5\")\njoblib.dump(label_encoder, 'label_encoder.joblib')","metadata":{"execution":{"iopub.status.busy":"2023-11-30T06:54:30.452642Z","iopub.execute_input":"2023-11-30T06:54:30.452976Z","iopub.status.idle":"2023-11-30T06:58:31.496422Z","shell.execute_reply.started":"2023-11-30T06:54:30.45295Z","shell.execute_reply":"2023-11-30T06:58:31.49548Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save(\"UBC_model.h5\")","metadata":{"execution":{"iopub.status.busy":"2023-11-30T07:16:31.182197Z","iopub.execute_input":"2023-11-30T07:16:31.182595Z","iopub.status.idle":"2023-11-30T07:16:31.56378Z","shell.execute_reply.started":"2023-11-30T07:16:31.182566Z","shell.execute_reply":"2023-11-30T07:16:31.562856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Inference","metadata":{}}]}