{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"tpu1vmV38","dataSources":[{"sourceId":4104,"databundleVersionId":46661,"sourceType":"competition"},{"sourceId":7866129,"sourceType":"datasetVersion","datasetId":4614938},{"sourceId":7869237,"sourceType":"datasetVersion","datasetId":4617269}],"dockerImageVersionId":30762,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nfrom glob import glob\nfrom PIL import Image\nfrom tqdm.notebook import tqdm\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\nimport tensorflow as tf\nfrom keras import layers\nfrom keras.models import Model, load_model\nfrom keras.applications import EfficientNetB0\nfrom tensorflow.keras.callbacks import ModelCheckpoint\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator","metadata":{"execution":{"iopub.status.busy":"2024-08-28T22:04:41.306411Z","iopub.execute_input":"2024-08-28T22:04:41.306818Z","iopub.status.idle":"2024-08-28T22:04:41.313329Z","shell.execute_reply.started":"2024-08-28T22:04:41.306779Z","shell.execute_reply":"2024-08-28T22:04:41.312407Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip /kaggle/input/diabetic-retinopathy-detection/trainLabels.csv.zip\n! unzip /kaggle/input/diabetic-retinopathy-detection/sampleSubmission.csv.zip","metadata":{"execution":{"iopub.status.busy":"2024-08-28T20:03:46.497467Z","iopub.execute_input":"2024-08-28T20:03:46.498447Z","iopub.status.idle":"2024-08-28T20:03:48.532645Z","shell.execute_reply.started":"2024-08-28T20:03:46.498399Z","shell.execute_reply":"2024-08-28T20:03:48.531504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_lbl = pd.read_csv('/kaggle/working/trainLabels.csv')\ntrain_img = glob('/kaggle/input/diabetic-retinopathy-train-unzipped/train/*.jpeg')\ntrain_names = [os.path.basename(path).replace('.jpeg', '') for path in train_img]\ntrain_df = pd.DataFrame({'image': train_names, 'image_path': train_img})\ntrain_df = pd.merge(train_lbl, train_df, on='image')\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-08-28T20:08:35.340383Z","iopub.execute_input":"2024-08-28T20:08:35.340861Z","iopub.status.idle":"2024-08-28T20:08:35.564436Z","shell.execute_reply.started":"2024-08-28T20:08:35.340813Z","shell.execute_reply":"2024-08-28T20:08:35.563364Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"samplesub = pd.read_csv('/kaggle/working/sampleSubmission.csv')\ntest_img = glob('/kaggle/input/diabetic-retinopathy-test-unzipped/test/*.jpeg')\ntest_names = [os.path.basename(path).replace('.jpeg', '') for path in test_img]\ntest_df = pd.DataFrame({'image': test_names, 'image_path': test_img})\ntest_df = pd.merge(samplesub, test_df, on='image')\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-08-28T20:09:13.766115Z","iopub.execute_input":"2024-08-28T20:09:13.767001Z","iopub.status.idle":"2024-08-28T20:09:14.102221Z","shell.execute_reply.started":"2024-08-28T20:09:13.76696Z","shell.execute_reply":"2024-08-28T20:09:14.101253Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(20, 10))\nax = axes.flatten()\n\nfor i in range(10):\n    row = train_df.sample(10).iloc[i]\n    img = Image.open(row['image_path'])\n    ax[i].imshow(img)\n    ax[i].set_title(f\"Label: {row['level']}\")\n    ax[i].axis('off')\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-08-28T20:03:50.057438Z","iopub.execute_input":"2024-08-28T20:03:50.057739Z","iopub.status.idle":"2024-08-28T20:04:04.033151Z","shell.execute_reply.started":"2024-08-28T20:03:50.057694Z","shell.execute_reply":"2024-08-28T20:04:04.031941Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['level'] = train_df['level'].astype(str)\n\ntrain_df, val_df = train_test_split(train_df, test_size=0.2, random_state=42)\n\ntrain_df = ImageDataGenerator(rescale = 1./255).flow_from_dataframe(train_df,\n                                                                 x_col='image_path',\n                                                                 y_col='level',\n                                                                 target_size=(224, 224),\n                                                                 color_mode='rgb',\n                                                                 class_mode='categorical',\n                                                                 batch_size=32)\n\nval_df = ImageDataGenerator(rescale = 1./255).flow_from_dataframe(val_df,\n                                                                 x_col='image_path',\n                                                                 y_col='level',\n                                                                 target_size=(224, 224),\n                                                                 color_mode='rgb',\n                                                                 class_mode='categorical',\n                                                                 batch_size=32)\n\ntest_df = ImageDataGenerator(rescale = 1./255).flow_from_dataframe( test_df,\n                                                                    x_col='image_path',\n                                                                    y_col=None,\n                                                                    target_size=(224, 224),\n                                                                    color_mode='rgb',\n                                                                    class_mode=None,\n                                                                    batch_size=32,\n                                                                    shuffle=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inputs = layers.Input(shape=(224, 224, 3))\nmodel = EfficientNetB0(include_top=False, input_tensor=inputs, weights='imagenet')\nmodel.trainable = False\nx = layers. GlobalAveragePooling2D()(model.output)\nx = layers.BatchNormalization()(x)\nx = layers.Dropout(0.25)(x)\noutputs = layers.Dense(5, activation='softmax')(x)\nmodel = Model(inputs, outputs)","metadata":{"execution":{"iopub.status.busy":"2024-08-28T20:09:45.234565Z","iopub.execute_input":"2024-08-28T20:09:45.235007Z","iopub.status.idle":"2024-08-28T20:09:48.467392Z","shell.execute_reply.started":"2024-08-28T20:09:45.234971Z","shell.execute_reply":"2024-08-28T20:09:48.466586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2024-08-28T20:07:12.038895Z","iopub.status.idle":"2024-08-28T20:07:12.03939Z","shell.execute_reply.started":"2024-08-28T20:07:12.03913Z","shell.execute_reply":"2024-08-28T20:07:12.039155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)\nmodel.compile(optimizer=optimizer, loss=\"categorical_crossentropy\", metrics=[\"accuracy\"])\n\nmodel_checkpoint = ModelCheckpoint('best_model.keras', save_best_only=True)\n\nmodel.fit(train_df, epochs=10, validation_data=val_df, callbacks=[model_checkpoint])","metadata":{"execution":{"iopub.status.busy":"2024-08-28T20:11:33.019032Z","iopub.execute_input":"2024-08-28T20:11:33.019398Z","iopub.status.idle":"2024-08-28T20:47:32.394197Z","shell.execute_reply.started":"2024-08-28T20:11:33.019365Z","shell.execute_reply":"2024-08-28T20:47:32.393162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"best_model = load_model('best_model.keras')\ntest_labels = best_model.predict(test_df)\ny_pred = np.argmax(test_labels, axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-08-28T22:04:53.750415Z","iopub.execute_input":"2024-08-28T22:04:53.750843Z","iopub.status.idle":"2024-08-28T22:04:56.01619Z","shell.execute_reply.started":"2024-08-28T22:04:53.750801Z","shell.execute_reply":"2024-08-28T22:04:56.014881Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv('/kaggle/working/sampleSubmission.csv')\nsub['level'] = y_pred\nsub.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}