{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"papermill":{"default_parameters":{},"duration":18323.842364,"end_time":"2021-07-07T00:22:51.855711","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2021-07-06T19:17:28.013347","version":"2.3.3"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":8078,"databundleVersionId":862231,"sourceType":"competition"}],"dockerImageVersionId":31011,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nimport cv2\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nimport albumentations as A\n\nfrom sklearn.metrics import f1_score, classification_report\nimport pickle\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.preprocessing import OneHotEncoder, LabelEncoder\nfrom numpy import array\nfrom random import shuffle, seed","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","id":"dcO2IxLbiqQY","papermill":{"duration":6.383448,"end_time":"2021-07-06T19:17:41.011649","exception":false,"start_time":"2021-07-06T19:17:34.628201","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"list_paths = []\nfor subdir, dirs, files in os.walk(\"../input\"):\n    for file in files:\n        filepath = subdir + os.sep + file\n        list_paths.append(filepath)\n        \nlist_train = [filepath for filepath in list_paths if \"train/\" in filepath]\nseed(420)\nshuffle(list_train)\nlist_test = [filepath for filepath in list_paths if \"test/\" in filepath]","metadata":{"id":"sBo5sya-iqQc","papermill":{"duration":3.652441,"end_time":"2021-07-06T19:17:44.695022","exception":false,"start_time":"2021-07-06T19:17:41.042581","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"list_train[:5]","metadata":{"id":"jBtM1tHSiqQd","outputId":"a065480b-8b49-46da-fca4-0634b3b4dfcf","papermill":{"duration":0.040226,"end_time":"2021-07-06T19:17:44.765984","exception":false,"start_time":"2021-07-06T19:17:44.725758","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def get_class_from_path(filepath):\n    return os.path.dirname(filepath).split(os.sep)[-1]","metadata":{"id":"6oa-5IQtiqQf","papermill":{"duration":0.036783,"end_time":"2021-07-06T19:17:44.834041","exception":false,"start_time":"2021-07-06T19:17:44.797258","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"labels = [get_class_from_path(filepath) for filepath in list_train]","metadata":{"id":"ThwZsJumiqQf","papermill":{"duration":0.042386,"end_time":"2021-07-06T19:17:44.907254","exception":false,"start_time":"2021-07-06T19:17:44.864868","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"labels[:5]","metadata":{"id":"HD66I9YLiqQf","outputId":"122acab9-fd91-41b9-dcea-4a7388e9335e","papermill":{"duration":0.037311,"end_time":"2021-07-06T19:17:44.975987","exception":false,"start_time":"2021-07-06T19:17:44.938676","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data = pd.DataFrame(labels, columns=['class'])\ntrain_data['path'] = list_train\ntrain_data.head()","metadata":{"id":"l9eW-fUviqQg","outputId":"52944f46-c1f0-4718-96e3-bac1fe179949","papermill":{"duration":0.053928,"end_time":"2021-07-06T19:17:45.060643","exception":false,"start_time":"2021-07-06T19:17:45.006715","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data['class'].value_counts().sort_values().plot(kind='bar')","metadata":{"id":"MORnNa2JiqQi","outputId":"873a62bf-4d96-4dbb-e0dc-8060e83078cf","papermill":{"duration":0.210437,"end_time":"2021-07-06T19:17:45.37054","exception":false,"start_time":"2021-07-06T19:17:45.160103","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = train_data['path']\ny = train_data['class']","metadata":{"id":"UmClv0eQiqQi","papermill":{"duration":0.04297,"end_time":"2021-07-06T19:17:45.451361","exception":false,"start_time":"2021-07-06T19:17:45.408391","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y.shape","metadata":{"id":"yP5qjuQTiqQj","outputId":"01cc4295-17a6-4876-fc64-8c17c4dd6257","papermill":{"duration":0.038832,"end_time":"2021-07-06T19:17:45.600704","exception":false,"start_time":"2021-07-06T19:17:45.561872","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y = pd.get_dummies(y)\ny.head()","metadata":{"id":"YCiaU66DiqQk","outputId":"4c00d237-6325-486b-df7a-999707a4c04e","papermill":{"duration":0.047199,"end_time":"2021-07-06T19:17:45.680334","exception":false,"start_time":"2021-07-06T19:17:45.633135","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dict_map = {\"0\": \"HTC-1-M7\", \n            \"1\": \"LG-Nexus-5x\", \n            \"2\": \"Motorola-Droid-Maxx\", \n            \"3\": \"Motorola-Nexus-6\", \n            \"4\": \"Motorola-X\", \n            \"5\": \"Samsung-Galaxy-Note3\",\n            \"6\": \"Samsung-Galaxy-S4\",\n            \"7\": \"Sony-NEX-7\",\n            \"8\": \"iPhone-4s\",\n            \"9\": \"iPhone-6\"}","metadata":{"id":"l7n6ZreuiqQk","papermill":{"duration":0.039056,"end_time":"2021-07-06T19:17:45.752481","exception":false,"start_time":"2021-07-06T19:17:45.713425","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"id":"5-w86rRNiqQk","papermill":{"duration":0.032838,"end_time":"2021-07-06T19:17:45.818583","exception":false,"start_time":"2021-07-06T19:17:45.785745","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def open_image(img_path):\n    image = cv2.imread(img_path)\n#     array_img = np.array(image)\n    return image","metadata":{"id":"2CCRFsD5iqQl","papermill":{"duration":0.039239,"end_time":"2021-07-06T19:17:45.891114","exception":false,"start_time":"2021-07-06T19:17:45.851875","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def preprocess(images):\n    return (images / 127.5) - 1.0","metadata":{"id":"bT_Ov_EWiqQl","papermill":{"duration":0.03881,"end_time":"2021-07-06T19:17:45.96297","exception":false,"start_time":"2021-07-06T19:17:45.92416","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"SHAPE = 512\n\ntrain_augmentations = A.Compose([#A.RGBShift(),\n                                 A.RandomCrop(height=SHAPE,width=SHAPE),\n                                 A.RandomGamma(gamma_limit=(80, 120), p=0.8),\n                                #  A.Blur(),\n                                #  A.GaussNoise(),\n                                 # A.JpegCompression(quality_lower=70, quality_upper=90, p=0.9),\n                                 A.GridDistortion(interpolation=cv2.INTER_CUBIC, p=0.9)\n                                 ])\n\nteste_augmentations = A.Compose([#A.RGBShift(),\n                                 A.CenterCrop(height=SHAPE,width=SHAPE)\n#                                  A.RandomGamma(),\n                                #  A.Blur(),\n                                #  A.GaussNoise(),\n#                                  A.JpegCompression(quality_lower=70, quality_upper=100, p=0.5),\n#                                  A.GridDistortion(interpolation=cv2.INTER_CUBIC, p=0.5)                                 \n                                 ])","metadata":{"id":"vNXtb6FUiqQl","papermill":{"duration":0.040472,"end_time":"2021-07-06T19:17:46.036405","exception":false,"start_time":"2021-07-06T19:17:45.995933","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class CameraDataset(tf.keras.utils.Sequence):\n    def __init__(self, X_set, y_set, batch_size, augmenter=None, test=False, *args, **kwargs):\n        \n        self.batch_size = batch_size\n        self.x_set = X_set\n        self.y_set = y_set\n        self.test = test\n        self.augmenter = augmenter\n        \n    def __len__(self):\n        return int(len(self.x_set) / self.batch_size)\n    \n    \n    def __getitem__(self, index):\n        X = self.x_set[index * self.batch_size : (index + 1) * self.batch_size]        \n        y = self.y_set[index * self.batch_size : (index + 1) * self.batch_size]\n        \n        X = [(self.augmenter(image=open_image(x))['image']) for x in X]\n        \n        if self.test:\n            return np.array(X)\n        \n        return np.array(X), y.values","metadata":{"id":"3ppMFlmiiqQm","papermill":{"duration":0.042476,"end_time":"2021-07-06T19:17:46.180187","exception":false,"start_time":"2021-07-06T19:17:46.137711","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = CameraDataset(X, y, batch_size=8, augmenter=train_augmentations)","metadata":{"id":"7_5V1Nj6iqQn","papermill":{"duration":0.03877,"end_time":"2021-07-06T19:17:46.252006","exception":false,"start_time":"2021-07-06T19:17:46.213236","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"x_set, y_set = train_dataset.__getitem__(50)","metadata":{"id":"JI3nF2RHiqQo","papermill":{"duration":1.551845,"end_time":"2021-07-06T19:17:47.837103","exception":false,"start_time":"2021-07-06T19:17:46.285258","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"x_set[0].shape","metadata":{"id":"6hF83IR9iqQo","outputId":"adc9a688-94d4-4b9c-f7f6-41eef75e2789","papermill":{"duration":0.04217,"end_time":"2021-07-06T19:17:47.913089","exception":false,"start_time":"2021-07-06T19:17:47.870919","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_set[0]","metadata":{"id":"-sekgQXoiqQo","outputId":"f9bca4ec-040c-48ff-e44f-1cc712bb6714","papermill":{"duration":0.042342,"end_time":"2021-07-06T19:17:47.989123","exception":false,"start_time":"2021-07-06T19:17:47.946781","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.imshow(x_set[3])","metadata":{"id":"jRosfbPXiqQp","outputId":"7bc65ed1-044b-4d8b-b9a4-6cad6e6bf325","papermill":{"duration":0.197937,"end_time":"2021-07-06T19:17:48.221105","exception":false,"start_time":"2021-07-06T19:17:48.023168","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def build_model():\n#     inputs =tf.keras.layers.Input(shape=(112,112,3))    \n#     model = tf.keras.applications.EfficientNetB0(include_top=False, input_tensor=inputs, weights=\"imagenet\", classes=10)\n#     model.trainable = True    \n#     x = tf.keras.layers.GlobalAveragePooling2D(name=\"avg_pool\")(model.output)\n#     x = tf.keras.layers.BatchNormalization()(x)\n#     top_dropout_rate = 0.5\n#     x = tf.keras.layers.Dropout(top_dropout_rate)(x)\n#     x = tf.keras.layers.Dense(512, activation='relu')(x)\n#     x = tf.keras.layers.Dropout(top_dropout_rate)(x)\n#     x = tf.keras.layers.BatchNormalization()(x)\n#     x = tf.keras.layers.Dropout(top_dropout_rate)(x)\n#     x = tf.keras.layers.Dense(512, activation='relu')(x)\n#     x = tf.keras.layers.BatchNormalization()(x)\n#     x = tf.keras.layers.Flatten()(x)    \n#     outputs = tf.keras.layers.Dense(10, activation='softmax')(x)    \n#     model =tf.keras.Model(inputs=inputs, outputs=outputs)    \n#     model.compile(optimizer=tf.keras.optimizers.Adam(lr=1e-4), loss='categorical_crossentropy', metrics=['accuracy'])\n#     model.summary()\n    #-------------------------------------------------------------------\n    # Load the base ResNet50 model with pre-trained weights\n    base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False, input_shape=[SHAPE, SHAPE, 3])\n    base_model.trainable = True  # Allow fine-tuning of the ResNet50 model\n\n    # Define the input layer\n    inputs = tf.keras.layers.Input(shape=(SHAPE, SHAPE, 3))\n\n    # Preprocess the input using ResNet-specific preprocessing\n    x = tf.keras.applications.resnet.preprocess_input(inputs)\n\n    # Pass the input through the base ResNet50 model\n    x = base_model(x, training=True)\n\n    # Add global average pooling layer to reduce dimensions\n    x = tf.keras.layers.GlobalAveragePooling2D()(x)\n\n    # Add fully connected dense layers\n    x = tf.keras.layers.Dense(64, activation='relu')(x)\n    x = tf.keras.layers.Dropout(0.3)(x)\n    x = tf.keras.layers.Dense(32, activation='relu')(x)\n    x = tf.keras.layers.Dropout(0.3)(x)\n\n    # Output layer for classification\n    outputs = tf.keras.layers.Dense(10, activation='softmax')(x)\n\n    # Create the model\n    model = tf.keras.Model(inputs=inputs, outputs=outputs)\n\n    # Compile the model with optimizer, loss, and metrics\n    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4), \n                  loss='categorical_crossentropy', \n                  metrics=['accuracy'])\n\n    # Print the model summary\n    model.summary()\n    \n    return model","metadata":{"id":"Aywspy-liqQp","papermill":{"duration":0.048451,"end_time":"2021-07-06T19:17:48.307514","exception":false,"start_time":"2021-07-06T19:17:48.259063","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# model = build_model()","metadata":{"id":"eHphXy6viqQq","papermill":{"duration":0.043199,"end_time":"2021-07-06T19:17:48.388196","exception":false,"start_time":"2021-07-06T19:17:48.344997","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def create_inception_model(SHAPE):\n    # Load the base InceptionV3 model with pre-trained weights\n    base_model = tf.keras.applications.InceptionV3(weights='imagenet', include_top=False, input_shape=[SHAPE, SHAPE, 3])\n    base_model.trainable = True  # Allow fine-tuning of the InceptionV3 model\n\n    # Define the input layer\n    inputs = tf.keras.layers.Input(shape=(SHAPE, SHAPE, 3))\n\n    # Preprocess the input using Inception-specific preprocessing\n    x = tf.keras.applications.inception_v3.preprocess_input(inputs)\n\n    # Pass the input through the base InceptionV3 model\n    x = base_model(x, training=True)\n\n    # Add global average pooling layer to reduce dimensions\n    x = tf.keras.layers.GlobalAveragePooling2D()(x)\n\n    # Add fully connected dense layers\n    x = tf.keras.layers.Dense(64, activation='relu')(x)\n    x = tf.keras.layers.Dropout(0.3)(x)\n    x = tf.keras.layers.Dense(32, activation='relu')(x)\n    x = tf.keras.layers.Dropout(0.3)(x)\n\n    # Output layer for classification\n    outputs = tf.keras.layers.Dense(10, activation='softmax')(x)\n\n    # Create the model\n    model = tf.keras.Model(inputs=inputs, outputs=outputs)\n\n    # Compile the model with optimizer, loss, and metrics\n    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4), \n                  loss='categorical_crossentropy', \n                  metrics=['accuracy'])\n\n    # Print the model summary\n    model.summary()\n    \n    return model\n","metadata":{"id":"KfW25Su1iqQq","papermill":{"duration":0.080832,"end_time":"2021-07-06T19:17:48.522321","exception":false,"start_time":"2021-07-06T19:17:48.441489","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def create_resnet_model(SHAPE):\n    # Load the base ResNet50 model with pre-trained weights\n    base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False, input_shape=[SHAPE, SHAPE, 3])\n    base_model.trainable = True  # Allow fine-tuning of the ResNet50 model\n\n    # Define the input layer\n    inputs = tf.keras.layers.Input(shape=(SHAPE, SHAPE, 3))\n\n    # Preprocess the input using ResNet-specific preprocessing\n    x = tf.keras.applications.resnet.preprocess_input(inputs)\n\n    # Pass the input through the base ResNet50 model\n    x = base_model(x, training=True)\n\n    # Add global average pooling layer to reduce dimensions\n    x = tf.keras.layers.GlobalAveragePooling2D()(x)\n\n    # Add fully connected dense layers\n    x = tf.keras.layers.Dense(64, activation='relu')(x)\n    x = tf.keras.layers.Dropout(0.3)(x)\n    x = tf.keras.layers.Dense(32, activation='relu')(x)\n    x = tf.keras.layers.Dropout(0.3)(x)\n\n    # Output layer for classification\n    outputs = tf.keras.layers.Dense(10, activation='softmax')(x)\n\n    # Create the model\n    model = tf.keras.Model(inputs=inputs, outputs=outputs)\n\n    # Compile the model with optimizer, loss, and metrics\n    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4), \n                  loss='categorical_crossentropy', \n                  metrics=['accuracy'])\n\n    # Print the model summary\n    model.summary()\n    \n    return model\n","metadata":{"id":"WBy5rxbUiqQq","papermill":{"duration":0.071153,"end_time":"2021-07-06T19:17:48.654201","exception":false,"start_time":"2021-07-06T19:17:48.583048","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\n# First split: 80% training + 20% test\nX_train_full, X_test, y_train_full, y_test = train_test_split(\n    X, y, test_size=0.2, random_state=42, shuffle=True, stratify=y)\n\n# Second split: 10% of total data as validation (12.5% of 80%)\nX_train, X_val, y_train, y_val = train_test_split(\n    X_train_full, y_train_full, test_size=0.125, random_state=42, shuffle=True, stratify=y_train_full)\n\n# Verify the splits\nprint(f\"Training data: {len(X_train)}, Validation data: {len(X_val)}, Test data: {len(X_test)}\")\n\n# Create datasets\ntrain_dataset = CameraDataset(X_train, y_train, batch_size=10, augmenter=train_augmentations)\nval_dataset = CameraDataset(X_val, y_val, batch_size=10, augmenter=teste_augmentations)\ntest_dataset = CameraDataset(X_test, y_test, batch_size=10, augmenter=None)\n","metadata":{"id":"4xJs9aO3oNh4","papermill":{"duration":0.151461,"end_time":"2021-07-06T19:17:48.872401","exception":false,"start_time":"2021-07-06T19:17:48.72094","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"denseNet_model = build_model()","metadata":{"id":"iWk54FjwO_OB","papermill":{"duration":8.359684,"end_time":"2021-07-06T19:17:57.293623","exception":false,"start_time":"2021-07-06T19:17:48.933939","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"file_path = \"output/weights.best.keras\"\nn = 0\n\ncheckpoint = tf.keras.callbacks.ModelCheckpoint(file_path, monitor=\"val_accuracy\", save_best_only=True, mode='max')\n\nreduce_lr = tf.keras.callbacks.ReduceLROnPlateau(monitor=\"val_accuracy\", factor=0.9, patience=2, min_lr=1e-6, mode=\"max\", verbose=True)\n\nearly_stopping = tf.keras.callbacks.EarlyStopping(monitor=\"val_accuracy\", patience=5, mode=\"max\", verbose=True)\n\ncallbacks_list = [checkpoint, reduce_lr, early_stopping]\n\n# model = tf.keras.models.load_model(file_path)\n\nhistory = denseNet_model.fit(train_dataset, validation_data=val_dataset, epochs=10, callbacks=callbacks_list)\n\nwhile(n<5):\n  print(n)\n  if n>0:\n    denseNet_model = tf.keras.models.load_model(file_path)\n\n  n += 1\n\n  history = denseNet_model.fit(train_dataset, validation_data=val_dataset, epochs=10, batch_size=10, callbacks=callbacks_list)","metadata":{"id":"IE3mrj0uqGHw","outputId":"790eea60-c159-42d3-bbd3-b0aab1eb5505","papermill":{"duration":18129.324275,"end_time":"2021-07-07T00:20:06.658627","exception":false,"start_time":"2021-07-06T19:17:57.334352","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"file_path = \"output/weights.best.keras\"\nmodel = tf.keras.models.load_model(file_path)\nmodel.save('/kaggle/working/inceptionModelFinal.keras')\nimport os\nprint(os.listdir('/kaggle/working'))\n","metadata":{"id":"q7rIVBen5L4r","outputId":"8ccd3617-78ff-4935-c148-21b98986cd1c","papermill":{"duration":1.834267,"end_time":"2021-07-07T00:20:10.253061","exception":false,"start_time":"2021-07-07T00:20:08.418794","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T11:38:50.339819Z","iopub.execute_input":"2025-04-27T11:38:50.340182Z","iopub.status.idle":"2025-04-27T11:38:53.989482Z","shell.execute_reply.started":"2025-04-27T11:38:50.34016Z","shell.execute_reply":"2025-04-27T11:38:53.988696Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# X_test = '../input/sp-society-camera-model-identification/test/test/' + sample_submission['fname']","metadata":{"id":"I71hhaDd54V1","papermill":{"duration":2.126222,"end_time":"2021-07-07T00:20:14.146975","exception":false,"start_time":"2021-07-07T00:20:12.020753","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_test[:5]","metadata":{"id":"u7VUDzqAuKVJ","outputId":"a6385d4b-75a5-426f-9c84-115532de7d3f","papermill":{"duration":1.796429,"end_time":"2021-07-07T00:20:17.66783","exception":false,"start_time":"2021-07-07T00:20:15.871401","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# def read_and_resize(filepath):\n#     im_array = np.array(Image.open((filepath)), dtype=\"uint8\")\n#     pil_im = Image.fromarray(im_array)\n#     new_array = np.array(pil_im)\n#     return new_array\ndef read_and_resize(filepath, target_size=(512, 512)):\n    img = tf.keras.utils.load_img(filepath, target_size=target_size)  # Load and resize the image\n    img_array = tf.keras.utils.img_to_array(img)  # Convert to NumPy array\n    return img_array","metadata":{"id":"t6icVzxS6rG4","papermill":{"duration":1.76491,"end_time":"2021-07-07T00:20:21.187493","exception":false,"start_time":"2021-07-07T00:20:19.422583","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def crop(img):\n    width, height = img.size  # Get dimensions\n\n    left = (width - 224) / 2\n    top = (height - 224) / 2\n    right = (width + 224) / 2\n    bottom = (height + 224) / 2\n\n    return img.crop((left, top, right, bottom))","metadata":{"id":"JnXIbHOC6wK1","papermill":{"duration":1.953658,"end_time":"2021-07-07T00:20:24.884393","exception":false,"start_time":"2021-07-07T00:20:22.930735","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nimport numpy as np\nfile_path = \"output/weights.best.keras\"\nmodel = tf.keras.models.load_model(file_path)\n# X_test = np.array([read_and_resize(filepath) for filepath in X_test])\npred_mean = model.predict(X_test)","metadata":{"id":"ighrzBmHqaFC","papermill":{"duration":109.792501,"end_time":"2021-07-07T00:22:16.49666","exception":false,"start_time":"2021-07-07T00:20:26.704159","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import accuracy_score\n\nlabels_test=[]\nfor item in pred_mean.argmax(axis=1):\n    labels_test.append(dict_map[str(item)])\n    \ntrue_classes = np.array(y_test)  # Ground truth strings\npredicted_classes = np.array(labels_test) \n# # Calculate accuracy, precision, recall, and F1 score\naccuracy = accuracy_score(true_classes, predicted_classes)\n\n# # Print the metrics\nprint(f\"Accuracy: {accuracy}\")\n\n# # If you need to map predictions back to labels (e.g., to names)\n# labels_test = []\n# for item in predicted_classes:\n#     labels_test.append(dict_map[str(item)])  # Ensure dict_map maps class indices to names\nprint(f\"Shape of y_test: {pred_mean[:5]}\")\nprint(f\"Sample of y_test: {labels_test[:20]}\")\nprint(f\"Sample of y_test: {y_test[:20]}\")","metadata":{"id":"p-JoHZcTqVfS","papermill":{"duration":1.77915,"end_time":"2021-07-07T00:22:20.055402","exception":false,"start_time":"2021-07-07T00:22:18.276252","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred_mean.argmax(axis=1)[:10]","metadata":{"id":"xoTqrRQUlZGN","outputId":"fd12fbaa-d0f2-46ae-980c-cc27b4163df7","papermill":{"duration":1.739393,"end_time":"2021-07-07T00:22:23.526564","exception":false,"start_time":"2021-07-07T00:22:21.787171","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"labels_test[:10]","metadata":{"id":"gQh7XRbEl3Ma","outputId":"f2976cfe-8404-49f0-943a-e9dcc3d31cac","papermill":{"duration":1.729289,"end_time":"2021-07-07T00:22:27.290085","exception":false,"start_time":"2021-07-07T00:22:25.560796","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_submission['camera'] = labels_test\nsample_submission.head()","metadata":{"id":"W16SuUPFmAk7","outputId":"5190573d-bed5-44b0-9087-96f896512150","papermill":{"duration":1.773357,"end_time":"2021-07-07T00:22:30.795584","exception":false,"start_time":"2021-07-07T00:22:29.022227","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"  sample_submission['camera'].value_counts()","metadata":{"id":"HO4DFP6UsBaR","outputId":"af05b6d6-4723-4118-989c-47e4a659221e","papermill":{"duration":1.741005,"end_time":"2021-07-07T00:22:34.327117","exception":false,"start_time":"2021-07-07T00:22:32.586112","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_submission.to_csv(\"submission.csv\", index=False)","metadata":{"id":"mcSR_8gpfx5G","papermill":{"duration":2.724296,"end_time":"2021-07-07T00:22:39.099858","exception":false,"start_time":"2021-07-07T00:22:36.375562","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_submission['camera'].value_counts().sort_values().plot(kind='bar')","metadata":{"id":"KXk1itbSfxvj","outputId":"99efa709-af89-459c-e71f-103118036407","papermill":{"duration":1.948886,"end_time":"2021-07-07T00:22:42.878467","exception":false,"start_time":"2021-07-07T00:22:40.929581","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}