{"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":"import os\nimport numpy as np\nimport pandas as pd\nimport cv2\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom keras.optimizers import Adam\nfrom keras.callbacks import EarlyStopping, ReduceLROnPlateau\nfrom sklearn.metrics import cohen_kappa_score\n\n# Set your data paths\nKAGGLE_DIR = '/kaggle/input/aptos2019-blindness-detection/'\nTRAIN_DF_PATH = KAGGLE_DIR + \"train.csv\"\nTEST_DF_PATH = KAGGLE_DIR + \"test.csv\"\nTRAIN_IMG_PATH = KAGGLE_DIR + \"train_images/\"\nTEST_IMG_PATH = KAGGLE_DIR + 'test_images/'\n\n# Load the training data\ntrain_df = pd.read_csv(TRAIN_DF_PATH)\ntrain_df['id_code'] = train_df['id_code'] + \".png\"\n\n# Image dimensions\nIMG_WIDTH = 256\nIMG_HEIGHT = 256\nCHANNELS = 3\n\n# Split the data into training and validation sets\ntrain, val = train_test_split(train_df, test_size=0.15, random_state=42)\n\n\n# Function for Cropping the image\ndef crop_image_from_gray(img, tol=7):\n    if img.ndim == 2:\n        mask = img > tol\n        return img[np.ix_(mask.any(1),mask.any(0))]\n    elif img.ndim == 3:\n        gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)\n        mask = gray_img > tol\n        check_shape = img[:,:,0][np.ix_(mask.any(1),mask.any(0))].shape[0]\n    if (check_shape == 0):\n        return img\n    else:\n        img1=img[:,:,0][np.ix_(mask.any(1),mask.any(0))]\n        img2=img[:,:,1][np.ix_(mask.any(1),mask.any(0))]\n        img3=img[:,:,2][np.ix_(mask.any(1),mask.any(0))]\n        img = np.stack([img1,img2,img3],axis=-1)\n        return img\n    \n# Define image preprocessing function\ndef preprocess_image(image, sigmaX=10):\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    image = crop_image_from_gray(image)\n    image = cv2.resize(image, (IMG_WIDTH, IMG_HEIGHT))\n    image = cv2.addWeighted(image,4, cv2.GaussianBlur(image, (0,0) ,sigmaX), -\n    4, 128)\n    return image","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-16T17:01:36.812060Z","iopub.execute_input":"2023-10-16T17:01:36.812408Z","iopub.status.idle":"2023-10-16T17:01:36.833030Z","shell.execute_reply.started":"2023-10-16T17:01:36.812380Z","shell.execute_reply":"2023-10-16T17:01:36.831827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create data generators\nBATCH_SIZE = 32\ntrain_datagen = ImageDataGenerator(\n    rotation_range=15,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    shear_range=0.1,\n    zoom_range=0.1,\n    horizontal_flip=True,\n    vertical_flip=True,\n    validation_split=0.15,\n    preprocessing_function=preprocess_image\n)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    train,\n    x_col='id_code',\n    y_col='diagnosis',\n    directory=TRAIN_IMG_PATH,\n    target_size=(IMG_WIDTH, IMG_HEIGHT),\n    batch_size=BATCH_SIZE,\n    class_mode='raw',\n    subset='training'\n)\n\nval_generator = train_datagen.flow_from_dataframe(\n    val,\n    x_col='id_code',\n    y_col='diagnosis',\n    directory=TRAIN_IMG_PATH,\n    target_size=(IMG_WIDTH, IMG_HEIGHT),\n    batch_size=BATCH_SIZE,\n    class_mode='raw',\n    subset='validation'\n)\n\n# Define a simple CNN model\nmodel = Sequential()\nmodel.add(Conv2D(32, (3, 3), activation='relu', input_shape=(IMG_WIDTH, IMG_HEIGHT, CHANNELS)))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Conv2D(128, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Flatten())\nmodel.add(Dense(256, activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(1, activation='linear'))\n\n# Compile the model\nmodel.compile(loss='mean_squared_error',\n              optimizer=Adam(learning_rate=0.001),\n              metrics=['mse', 'acc'])\n\n# Set up callbacks\nes = EarlyStopping(monitor='val_loss', mode='auto', verbose=1, patience=5)\nrlr = ReduceLROnPlateau(monitor='val_loss',\n                        factor=0.5,\n                        patience=2,\n                        verbose=1,\n                        mode='auto',\n                        min_lr=0.00001)\n\n# Train the model\nhistory = model.fit(train_generator,\n                    steps_per_epoch=len(train_generator),\n                    epochs=15,\n                    validation_data=val_generator,\n                    validation_steps=len(val_generator),\n                    callbacks=[es, rlr])\n\ndef get_preds_and_labels(model, generator):\n    preds = []\n    labels = []\n    for _ in range(int(np.ceil(generator.samples / BATCH_SIZE))):\n        x, y = next(generator)\n        preds.append(model.predict(x))\n        labels.append(y)\n    return np.concatenate(preds).ravel(), np.concatenate(labels).ravel()\n\n# Evaluate the model\ny_train_preds, train_labels = get_preds_and_labels(model, train_generator)\ny_train_preds = np.rint(y_train_preds).astype(np.uint8).clip(0, 4)\n# Calculate score\ntrain_score = cohen_kappa_score(train_labels, y_train_preds, weights=\"quadratic\")\n# Calculate QWK on validation set\ny_val_preds, val_labels = get_preds_and_labels(model, val_generator)\ny_val_preds = np.rint(y_val_preds).astype(np.uint8).clip(0, 4)\n# Calculate score\nval_score = cohen_kappa_score(val_labels, y_val_preds, weights=\"quadratic\")\n# y_val_preds = model.predict(val_generator)\n# val_labels = val['diagnosis'].values\n# val_preds = np.rint(y_val_preds).astype(np.uint8).clip(0, 4)\n# val_score = cohen_kappa_score(val_labels, val_preds, weights=\"quadratic\")\nprint(f\"The Training Cohen Kappa Score is: {round(train_score, 5)}\")\nprint(f\"The Validation Cohen Kappa Score is: {round(val_score, 5)}\")\n","metadata":{"execution":{"iopub.status.busy":"2023-10-16T17:01:37.403913Z","iopub.execute_input":"2023-10-16T17:01:37.404275Z","iopub.status.idle":"2023-10-16T18:41:08.015168Z","shell.execute_reply.started":"2023-10-16T17:01:37.404246Z","shell.execute_reply":"2023-10-16T18:41:08.013654Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# For the test data\ntest_df = pd.read_csv(TEST_DF_PATH)\ntest_df['id_code'] = test_df['id_code'] + \".png\"\ntest_datagen = ImageDataGenerator(preprocessing_function=preprocess_image)\ntest_generator = test_datagen.flow_from_dataframe(\n    test_df,\n    x_col='id_code',\n    directory=TEST_IMG_PATH,\n    target_size=(IMG_WIDTH, IMG_HEIGHT),\n    batch_size=1,  # Set batch size to 1 for inference\n    class_mode=None,\n    shuffle=False\n)\n\n# Make predictions on the test data\ntest_preds = model.predict(test_generator)\ntest_preds = np.rint(test_preds).astype(np.uint8).clip(0, 4)\n\n# Print the distribution of labels in the training dataset\ntrain['diagnosis'].value_counts().sort_index().plot(kind=\"bar\", figsize=(12, 5), rot=0)\nplt.title(\"Label Distribution (Training Set)\", weight='bold', fontsize=18)\nplt.xticks(fontsize=15)\nplt.yticks(fontsize=15)\nplt.xlabel(\"Label\", fontsize=17)\nplt.ylabel(\"Frequency\", fontsize=17)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-10-16T18:41:08.017232Z","iopub.execute_input":"2023-10-16T18:41:08.017869Z","iopub.status.idle":"2023-10-16T18:42:55.148010Z","shell.execute_reply.started":"2023-10-16T18:41:08.017830Z","shell.execute_reply":"2023-10-16T18:42:55.147036Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}