{"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"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":63134,"databundleVersionId":6880857,"sourceType":"competition"}],"dockerImageVersionId":30579,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers, models\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau\nfrom tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.regularizers import l2\nimport os\nfrom PIL import Image\nimport numpy as np\nimport keras\nimport pandas\nimport re\n\nroot = '/kaggle/input/anyas-gojo-revival-aerospace-enigma'\npath_to_test = f\"{root}/test\"\npath_to_train = f\"{root}/train\"\npath_to_res = f\"{root}/sample_submission.csv\"\n\ntrain_val_datagen = ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=20,      # Degree range for random rotations\n    width_shift_range=0.2,  # Fraction of total width for random horizontal shift\n    height_shift_range=0.2, # Fraction of total height for random vertical shift\n    shear_range=0.2,        # Shear intensity (shear angle in radians)\n    zoom_range=0.2,         # Range for random zoom\n    horizontal_flip=True,   # Randomly flip inputs horizontally\n    vertical_flip=True,     # Randomly flip inputs vertically\n    fill_mode='nearest',     # Strategy for filling in newly created pixels (e.g., 'nearest')\n    validation_split=0.25,\n)\n# test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n\n\nfile_names = []\nfor i in range(1,258):\n    file_names.append(f\"data\\image{i}.jpg\")\n\nbatch_size = 32\n\n\n#creating dataset\n# image_size = (180,180)\nbatch_size = 32\n# input_shape = (180,180,3)\nimage_size = (256,256)\ninput_shape = (256,256,3)\n\nres = pandas.read_csv(path_to_res)\nclass_names = [\"commercial\",\"glider\",\"helicopter\",\"mig-29\",\"sukhoi\"]\n\ntrain_ds = train_val_datagen.flow_from_directory(path_to_train, target_size=image_size, batch_size=batch_size, class_mode='categorical', subset='training')\nval_ds = train_val_datagen.flow_from_directory(path_to_train, target_size=image_size, batch_size=batch_size, class_mode='categorical', subset='validation')\nfile_names = sorted(os.listdir(path_to_test),key = lambda x: int(re.search(r\"image(\\d+).jpg\", x).group(1)))\nimages = []\n\nfor file_name in file_names:\n    img = Image.open(os.path.join(path_to_test,file_name))\n    img = img.resize(image_size)\n    img = np.array(img)\n    img_array = np.array(img)/255.0\n    images.append(img_array)\n\nimages_array_rgb = np.array([img if img.shape[-1] == 3 else np.stack([img, img, img], axis=-1) for img in images])\n\n\nnum_classes = 5\nfrom tensorflow.keras.applications import InceptionV3\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D\n\nbase_model = InceptionV3(weights='imagenet', include_top=False, input_shape=input_shape)\n# base_model.trainable = False\n# for layer in base_model.layers:\n#     layer.trainable = False\n\n# Build your custom model on top of InceptionV3\nmodel = Sequential()\n# model.add(InceptionV3(include_top=False, weights='imagenet', input_shape=(256,256,3)))\nmodel.add(base_model)\nmodel.add(GlobalAveragePooling2D())\nmodel.add(Dense(128, activation='relu'))\nmodel.add(Dense(5, activation='softmax'))\n\ncallback = EarlyStopping(monitor='val_loss', patience=3, verbose=1, mode='auto', restore_best_weights=True)\n# callback2 = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=2, verbose=1, mode='auto', min_delta=1e-6)\n\nepochs = 40\nmodel.compile(\n    optimizer=keras.optimizers.Adam(1e-5),\n    loss=tf.keras.losses.CategoricalCrossentropy(),\n    metrics=[\"accuracy\"],\n)\nmodel.fit(\n    train_ds,\n    epochs=epochs,\n#     callbacks=[callback],\n    validation_data=val_ds,\n)\n\n\n\nr = model.predict(images_array_rgb)\nr = np.argmax(r, axis=1)\nr = [class_names[i] for i in r]\n\nresult = []\nfor img_name in res['image_path']:\n    num = int(re.search(r\"image(\\d+).jpg\", img_name).group(1))\n    result.append(r[num-1])\n\nres['Class'] = result\n\nres.to_csv(\"/kaggle/working/submission.csv\",index=False)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-13T20:45:45.670990Z","iopub.execute_input":"2023-11-13T20:45:45.671514Z","iopub.status.idle":"2023-11-13T20:45:53.654632Z","shell.execute_reply.started":"2023-11-13T20:45:45.671476Z","shell.execute_reply":"2023-11-13T20:45:53.653270Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nprint(os.listdir(\"/kaggle/input/anyas-gojo-revival-aerospace-enigma\"))","metadata":{"execution":{"iopub.status.busy":"2023-11-13T21:05:27.157786Z","iopub.execute_input":"2023-11-13T21:05:27.158152Z","iopub.status.idle":"2023-11-13T21:05:27.164037Z","shell.execute_reply.started":"2023-11-13T21:05:27.158125Z","shell.execute_reply":"2023-11-13T21:05:27.163266Z"},"trusted":true},"execution_count":null,"outputs":[]}]}