{"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"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Loading Libiraries 😀","metadata":{}},{"cell_type":"code","source":"import os\nfrom tensorflow import keras\nimport numpy as np\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom sklearn.model_selection import train_test_split\n\ndata_folder = '/kaggle/input/bioverse-hackathon-a/train'\ncategories = os.listdir(data_folder)\nimage_data = []\nlabels = []\n\nfor category_id, category in enumerate(categories):\n    category_folder = os.path.join(data_folder, category)\n    subcategories = os.listdir(category_folder)\n    \n    for subcategory in subcategories:\n        subcategory_folder = os.path.join(category_folder, subcategory)\n        for image_name in os.listdir(subcategory_folder):\n            image_path = os.path.join(subcategory_folder, image_name)\n            image = Image.open(image_path)\n            image = image.resize((224, 224))\n            image_array = np.array(image)\n            \n            if len(image_array.shape) == 2:\n                image_array = np.stack((image_array,) * 3, axis=-1)\n            \n            image_data.append(image_array)\n            labels.append(category_id)\n\nimage_data = np.array(image_data)\nlabels = np.array(labels)\n\n# Create an ImageDataGenerator instance with augmentation settings\ndatagen = ImageDataGenerator(\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    vertical_flip=True,\n    brightness_range=[0.8, 1.2],\n    validation_split=0.2,\n    rescale=1.0/255  # Normalize pixel values\n)\n\naugmented_data = []\n\n# Generate augmented images and add to augmented_data\nfor image in image_data:\n    augmented_image = datagen.random_transform(image)\n    augmented_data.append(augmented_image)\n\n# Convert augmented_data to a numpy array\naugmented_data = np.array(augmented_data)\n\n# Concatenate original and augmented data\ncombined_data = np.concatenate((image_data, augmented_data), axis=0)\ncombined_labels = np.concatenate((labels, labels), axis=0)  # Labels stay the same\n\n# Split data into training and validation sets\nX_train, X_val, y_train, y_val = train_test_split(combined_data, combined_labels, test_size=0.2, random_state=42)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-08-31T17:42:37.639646Z","iopub.execute_input":"2023-08-31T17:42:37.640017Z","iopub.status.idle":"2023-08-31T17:43:15.320097Z","shell.execute_reply.started":"2023-08-31T17:42:37.639985Z","shell.execute_reply":"2023-08-31T17:43:15.319046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualize a few combined images\nplt.figure(figsize=(10, 10))\nfor i in range(9):\n    plt.subplot(3, 3, i + 1)\n    plt.imshow(combined_data[i].astype(np.uint8))\n    plt.title(categories[combined_labels[i]])\n    plt.axis('off')\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-08-31T18:02:28.729491Z","iopub.execute_input":"2023-08-31T18:02:28.729881Z","iopub.status.idle":"2023-08-31T18:02:29.559594Z","shell.execute_reply.started":"2023-08-31T18:02:28.729847Z","shell.execute_reply":"2023-08-31T18:02:29.558581Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train Model","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.optimizers import SGD\n\nmodel=keras.models.Sequential([\n    keras.layers.Conv2D(filters=128, kernel_size=(4,4), strides=(4,4), activation='relu', input_shape=(224,224,3)),\n    keras.layers.BatchNormalization(),\n    keras.layers.MaxPool2D(pool_size=(2,2)),\n    keras.layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), activation='relu', padding=\"same\"),\n    keras.layers.BatchNormalization(),\n    keras.layers.MaxPool2D(pool_size=(3,3)),\n    keras.layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), activation='relu', padding=\"same\"),\n    keras.layers.BatchNormalization(),\n    keras.layers.Conv2D(filters=256, kernel_size=(1,1), strides=(1,1), activation='relu', padding=\"same\"),\n    keras.layers.BatchNormalization(),\n    keras.layers.Conv2D(filters=256, kernel_size=(1,1), strides=(1,1), activation='relu', padding=\"same\"),\n    keras.layers.BatchNormalization(),\n    keras.layers.MaxPool2D(pool_size=(2,2)),\n    keras.layers.Flatten(),\n    keras.layers.Dense(1024,activation='relu'),\n    keras.layers.Dropout(0.5),\n    keras.layers.Dense(1024,activation='relu'),\n    keras.layers.Dropout(0.5),\n    keras.layers.Dense(10,activation='softmax')  \n    \n    \n])\n# Compile the model\nmodel.compile(optimizer=  SGD(learning_rate=.01, momentum=0.6), loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n\n# Train the model\nmodel.fit(X_train, y_train, epochs=100, batch_size=100, validation_data=(X_val, y_val))\n","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:51:45.699556Z","iopub.execute_input":"2023-08-31T17:51:45.699938Z","iopub.status.idle":"2023-08-31T17:53:09.763768Z","shell.execute_reply.started":"2023-08-31T17:51:45.699906Z","shell.execute_reply":"2023-08-31T17:53:09.762605Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Test Model","metadata":{}},{"cell_type":"code","source":"#Evaluate the model on the test set if available\ntest_loss, test_acc = model.evaluate(X_val, y_val)\nprint('Test accuracy:', test_acc)\n","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:53:09.765898Z","iopub.execute_input":"2023-08-31T17:53:09.766272Z","iopub.status.idle":"2023-08-31T17:53:10.402902Z","shell.execute_reply.started":"2023-08-31T17:53:09.766239Z","shell.execute_reply":"2023-08-31T17:53:10.401970Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"n = []\nfor i in model.predict(X_val):\n    n.append(np.argmax(i))\nn = np.array(n)\nfrom sklearn.metrics import f1_score\nf1_score(y_val,n,average='micro')","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:50:01.083026Z","iopub.execute_input":"2023-08-31T17:50:01.083430Z","iopub.status.idle":"2023-08-31T17:50:01.535457Z","shell.execute_reply.started":"2023-08-31T17:50:01.083395Z","shell.execute_reply":"2023-08-31T17:50:01.534428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_folder = '/kaggle/input/bioverse-hackathon-a/test'\nimage_data_test = []\n\n\n\nfor image_name in os.listdir(test_folder):\n    image_path = os.path.join(test_folder, image_name)\n    image = Image.open(image_path)\n    image = image.resize((224, 224))\n    image_array = np.array(image)\n            \n    if len(image_array.shape) == 2:\n        image_array = np.stack((image_array,) * 3, axis=-1)\n            \n    image_data_test.append(image_array)\n\n\nimage_data_test = np.array(image_data_test)\n","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:44:58.458124Z","iopub.execute_input":"2023-08-31T17:44:58.458505Z","iopub.status.idle":"2023-08-31T17:45:16.433207Z","shell.execute_reply.started":"2023-08-31T17:44:58.458474Z","shell.execute_reply":"2023-08-31T17:45:16.432156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"n = []\ndic = {0:'normal',\n1:'malignant',\n2:'beneign'}\nfor i in model.predict(image_data_test):\n    n.append(np.argmax(i))\nn =np.array(n)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:45:47.324316Z","iopub.execute_input":"2023-08-31T17:45:47.324708Z","iopub.status.idle":"2023-08-31T17:45:47.644147Z","shell.execute_reply.started":"2023-08-31T17:45:47.324678Z","shell.execute_reply":"2023-08-31T17:45:47.642953Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\ndf = pd.DataFrame()","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:45:50.665759Z","iopub.execute_input":"2023-08-31T17:45:50.666143Z","iopub.status.idle":"2023-08-31T17:45:50.675648Z","shell.execute_reply.started":"2023-08-31T17:45:50.666113Z","shell.execute_reply":"2023-08-31T17:45:50.674555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['filename'] = os.listdir(test_folder)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:45:56.416480Z","iopub.execute_input":"2023-08-31T17:45:56.416857Z","iopub.status.idle":"2023-08-31T17:45:56.433329Z","shell.execute_reply.started":"2023-08-31T17:45:56.416826Z","shell.execute_reply":"2023-08-31T17:45:56.432160Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['class'] = n","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:46:03.907361Z","iopub.execute_input":"2023-08-31T17:46:03.907730Z","iopub.status.idle":"2023-08-31T17:46:03.914947Z","shell.execute_reply.started":"2023-08-31T17:46:03.907701Z","shell.execute_reply":"2023-08-31T17:46:03.913110Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.replace({'class':dic},inplace = True)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:46:10.066796Z","iopub.execute_input":"2023-08-31T17:46:10.067233Z","iopub.status.idle":"2023-08-31T17:46:10.075429Z","shell.execute_reply.started":"2023-08-31T17:46:10.067184Z","shell.execute_reply":"2023-08-31T17:46:10.073659Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:46:15.176034Z","iopub.execute_input":"2023-08-31T17:46:15.176432Z","iopub.status.idle":"2023-08-31T17:46:15.192280Z","shell.execute_reply.started":"2023-08-31T17:46:15.176399Z","shell.execute_reply":"2023-08-31T17:46:15.191048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('moel')","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:58:16.919674Z","iopub.execute_input":"2023-08-31T17:58:16.920059Z","iopub.status.idle":"2023-08-31T17:58:20.035648Z","shell.execute_reply.started":"2023-08-31T17:58:16.920031Z","shell.execute_reply":"2023-08-31T17:58:20.033758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.to_csv('subm.csv')","metadata":{"execution":{"iopub.status.busy":"2023-08-31T17:46:32.420702Z","iopub.execute_input":"2023-08-31T17:46:32.421063Z","iopub.status.idle":"2023-08-31T17:46:32.430533Z","shell.execute_reply.started":"2023-08-31T17:46:32.421033Z","shell.execute_reply":"2023-08-31T17:46:32.429433Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# inference_time 😀","metadata":{}},{"cell_type":"code","source":"import time\n\n\n# Load the pre-trained model\nmodel = tf.keras.models.load_model('/kaggle/working/moel')\n\n# Prepare input data (replace with your actual data)\ninput_data = X_val[[0]]\ninput_data =np.array(input_data)\n# Measure inference time\nmodel.fit(input_data, y_val[[0]], epochs=1, batch_size=30)\nstart_time = time.time()\noutput = model.predict(input_data)\nend_time = time.time()\n\ninference_time = end_time - start_time\nprint(f\"Inference time for one sample: {inference_time:.4f} seconds\")","metadata":{"execution":{"iopub.status.busy":"2023-08-31T18:04:06.555413Z","iopub.execute_input":"2023-08-31T18:04:06.555783Z","iopub.status.idle":"2023-08-31T18:04:09.893866Z","shell.execute_reply.started":"2023-08-31T18:04:06.555754Z","shell.execute_reply":"2023-08-31T18:04:09.892861Z"},"trusted":true},"execution_count":null,"outputs":[]}],"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"}}