{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":10338,"databundleVersionId":862042,"sourceType":"competition"},{"sourceId":1019494,"sourceType":"datasetVersion","datasetId":560711},{"sourceId":1022626,"sourceType":"datasetVersion","datasetId":562468},{"sourceId":1426603,"sourceType":"datasetVersion","datasetId":835414},{"sourceId":7079240,"sourceType":"datasetVersion","datasetId":4077867},{"sourceId":482,"sourceType":"datasetVersion","datasetId":228},{"sourceId":7773,"sourceType":"datasetVersion","datasetId":4667},{"sourceId":18613,"sourceType":"datasetVersion","datasetId":5839},{"sourceId":20797,"sourceType":"datasetVersion","datasetId":15700},{"sourceId":23812,"sourceType":"datasetVersion","datasetId":17810},{"sourceId":477177,"sourceType":"datasetVersion","datasetId":216167},{"sourceId":519715,"sourceType":"datasetVersion","datasetId":246422},{"sourceId":951996,"sourceType":"datasetVersion","datasetId":516716},{"sourceId":1157383,"sourceType":"datasetVersion","datasetId":548681},{"sourceId":1166777,"sourceType":"datasetVersion","datasetId":661308},{"sourceId":1432479,"sourceType":"datasetVersion","datasetId":839140},{"sourceId":1494905,"sourceType":"datasetVersion","datasetId":724418},{"sourceId":2047221,"sourceType":"datasetVersion","datasetId":1226038},{"sourceId":2332307,"sourceType":"datasetVersion","datasetId":891819}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"id":"988c17b0-22ed-4943-b306-c386ee4cbae7","cell_type":"markdown","source":"# Import Libraries & Reading Dataset","metadata":{}},{"id":"a48c08fb-f48f-4511-88dc-a7f21e03186e","cell_type":"code","source":"import os, shutil\nimport random\nimport numpy as np\nimport pandas as pd\nimport cv2\nimport skimage\nimport matplotlib.pyplot as plt\nimport skimage.segmentation\nimport seaborn as sns\n%matplotlib inline\nplt.style.use('ggplot')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-28T08:47:46.316336Z","iopub.execute_input":"2024-11-28T08:47:46.317280Z","iopub.status.idle":"2024-11-28T08:47:49.614546Z","shell.execute_reply.started":"2024-11-28T08:47:46.317244Z","shell.execute_reply":"2024-11-28T08:47:49.613563Z"}},"outputs":[],"execution_count":null},{"id":"161b2237-02d6-4b94-8118-07a2aa775bf5","cell_type":"code","source":"labels = ['PNEUMONIA','NORMAL']\nimg_size = 128\ndef get_data(data_dir):\n    data=[]\n    for label in labels:\n#         train/PNEUMONIA\n        path = os.path.join(data_dir, label)\n        class_num = labels.index(label)\n        for img in os.listdir(path):\n            try:\n                img_arr = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)\n                resized_arr = cv2.resize(img_arr, (img_size, img_size))\n                data.append([resized_arr, class_num])\n            except Exception as e:\n                print(e)\n    return np.array(data)","metadata":{},"outputs":[],"execution_count":null},{"id":"9a4f81dc-e694-4b15-8f06-d90dfa56fec6","cell_type":"code","source":"train = get_data(\"chest_xray/chest_xray/train\")\ntest = get_data(\"chest_xray/chest_xray/test\")\nval = get_data(\"chest_xray/chest_xray/val\")","metadata":{},"outputs":[],"execution_count":null},{"id":"1e44d3e6-13f2-44df-80eb-47e8dd39813f","cell_type":"code","source":"pneumonia = os.listdir(\"chest_xray/train/PNEUMONIA\")\npenomina_dir = \"chest_xray/train/PNEUMONIA\"","metadata":{},"outputs":[],"execution_count":null},{"id":"6a733529-ccc3-48f5-ab1f-e084295a582b","cell_type":"code","source":"plt.figure(figsize=(20,10))\n\nfor i in range(9):\n    plt.subplot(3,3, i+1)\n    img = plt.imread(os.path.join(penomina_dir, pneumonia[i]))\n    plt.imshow(img, cmap='gray')\n    plt.axis(\"off\")\n    plt.title(\"Pneumonia X-ray\")\nplt.tight_layout()","metadata":{},"outputs":[],"execution_count":null},{"id":"ce90588c-efda-4be0-817b-c8e507df3020","cell_type":"code","source":"normal = os.listdir(\"chest_xray/train/NORMAL\")\nnormal_dir = \"chest_xray/train/NORMAL\"","metadata":{},"outputs":[],"execution_count":null},{"id":"12a4a67f-17a7-43fb-a25b-011d091f7a9c","cell_type":"code","source":"plt.figure(figsize=(20,10))\n\nfor i in range(9):\n    plt.subplot(3,3, i+1)\n    img = plt.imread(os.path.join(normal_dir, normal[i]))\n    plt.imshow(img, cmap='gray')\n    plt.axis(\"off\")\n    plt.title(\"Normal X-ray\")\nplt.tight_layout()","metadata":{},"outputs":[],"execution_count":null},{"id":"47f8d9e1-eaeb-4313-9039-9d0a3754d5a9","cell_type":"code","source":"listx = []\nfor i in train:\n    if(i[1] == 0):\n        listx.append(\"Pneumonia\")\n    else:\n        listx.append(\"Normal\")\nsns.countplot(listx)","metadata":{},"outputs":[],"execution_count":null},{"id":"55273c10-41ae-4bea-b8d0-02cbce5107cd","cell_type":"markdown","source":"# Data Augmentation & Resizing","metadata":{}},{"id":"e51689eb-d668-449d-a275-71ed3790c5f4","cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.models import load_model\nfrom tensorflow.keras.layers import Input, Dense, Flatten, Conv2D,Dropout\nfrom tensorflow.keras.applications.vgg19 import VGG19\nfrom tensorflow.keras.optimizers import SGD, RMSprop, Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau","metadata":{},"outputs":[],"execution_count":null},{"id":"15a834b7-5816-4834-b449-4cf4335ad27e","cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale = 1. / 255, \n                  horizontal_flip=0.4,\n                  vertical_flip=0.4,\n                  rotation_range=40,\n                  shear_range=0.2,\n                  width_shift_range=0.4,\n                  height_shift_range=0.4,\n                  fill_mode=\"nearest\")\nvalid_datagen = ImageDataGenerator(rescale = 1./255)\ntest_datagen = ImageDataGenerator(rescale = 1./255)","metadata":{},"outputs":[],"execution_count":null},{"id":"744d0e39-3dc4-442a-b03a-c3faa2138862","cell_type":"code","source":"train_generator = train_datagen.flow_from_directory(\"chest_xray/chest_xray/train\",\n                                 batch_size = 32,\n                                 target_size=(128,128),\n                                 class_mode = 'categorical',\n                                 shuffle=True,\n                                 seed = 42,\n                                 color_mode = 'rgb')\nvalid_generator = valid_datagen.flow_from_directory(\"chest_xray/chest_xray/val\",\n                                 batch_size = 32,\n                                 target_size=(128,128),\n                                 class_mode = 'categorical',\n                                 shuffle=True,\n                                 seed = 42,\n                                 color_mode = 'rgb')","metadata":{},"outputs":[],"execution_count":null},{"id":"0e25aedf-9a31-4260-a54d-3f3791fb00c6","cell_type":"code","source":"class_labels = train_generator.class_indices","metadata":{},"outputs":[],"execution_count":null},{"id":"c5c2ffc9-31b1-49a3-bc96-9a552f57ea73","cell_type":"code","source":"class_labels","metadata":{},"outputs":[],"execution_count":null},{"id":"8a874954-d22f-4e63-9f6e-5cac547857ab","cell_type":"code","source":"class_name = {value:key for (key, value) in class_labels.items()}","metadata":{},"outputs":[],"execution_count":null},{"id":"f1c81ec6-ee37-4d75-8288-356831d95195","cell_type":"code","source":"class_name","metadata":{},"outputs":[],"execution_count":null},{"id":"c7bcdae7-17bc-4c2c-9223-3b1302bb4ee3","cell_type":"markdown","source":"# VGG19 CNN Architecture","metadata":{}},{"id":"daa2e771-d3cf-45ca-bc11-2aa67a7c57c0","cell_type":"code","source":"base_model = VGG19(input_shape = (128,128,3),\n                     include_top = False,\n                     weights = 'imagenet')\nfor layer in base_model.layers:\n    layer.trainable = False\n\nx = base_model.output\nflat = Flatten()(x)\n\n\nclass_1 = Dense(4608, activation = 'relu')(flat)\ndropout = Dropout(0.2)(class_1)\nclass_2 = Dense(1152, activation = 'relu')(dropout)\noutput = Dense(2, activation = 'softmax')(class_2)\n\nmodel_01 = Model(base_model.inputs, output)\nmodel_01.summary()","metadata":{},"outputs":[],"execution_count":null},{"id":"0ef5a75c-6879-4d3d-8e16-b36bca76b2b7","cell_type":"code","source":"filepath = \"model.h5\"\nes = EarlyStopping(monitor=\"val_loss\", verbose=1, mode=\"min\", patience=4)\ncp=ModelCheckpoint(filepath, monitor=\"val_loss\", save_best_only=True, save_weights_only=False,mode=\"auto\", save_freq=\"epoch\")\nlrr = ReduceLROnPlateau(monitor=\"val_accuracy\", patience=3, verbose=1, factor=0.5, min_lr=0.0001)\n\nsgd = SGD(learning_rate=0.0001, decay = 1e-6, momentum=0, nesterov = True)\n\nmodel_01.compile(loss=\"categorical_crossentropy\", optimizer=sgd, metrics=['accuracy'])","metadata":{},"outputs":[],"execution_count":null},{"id":"8ac14ee7-9a9a-4f43-8e54-4b32dd0a96b0","cell_type":"code","source":"history_01 = model_01.fit(train_generator, \n            steps_per_epoch=50,\n            epochs=1, \n            callbacks=[es, cp, lrr],\n            validation_data=valid_generator)","metadata":{},"outputs":[],"execution_count":null},{"id":"65f41d90-4c28-48e7-b90a-616b44f796fb","cell_type":"code","source":"if not os.path.isdir('model_weights/'):\n    os.mkdir(\"model_weights/\")\nmodel_01.save(filepath = \"model_weights/vgg19_model_01.h5\", overwrite=True)","metadata":{},"outputs":[],"execution_count":null},{"id":"7c9c2621-55cd-495a-9373-93de678ee000","cell_type":"code","source":"test_generator = test_datagen.flow_from_directory(\"chest_xray/chest_xray/test\",\n                                 batch_size = 32,\n                                 target_size=(128,128),\n                                 class_mode = 'categorical',\n                                 shuffle=True,\n                                 seed = 42,\n                                 color_mode = 'rgb')","metadata":{},"outputs":[],"execution_count":null},{"id":"b7abc789-0462-47f9-918f-262b8584da00","cell_type":"code","source":"model_01.load_weights(\"model_weights/vgg19_model_01.h5\")\n\nvgg_val_eval_01 = model_01.evaluate(valid_generator)\nvgg_test_eval_01 = model_01.evaluate(test_generator)","metadata":{},"outputs":[],"execution_count":null},{"id":"9e77528d-9a7d-45e0-85aa-2aca98962e19","cell_type":"code","source":"print(f\"Validation Loss: {vgg_val_eval_01[0]}\")\nprint(f\"Validation Accuarcy: {vgg_val_eval_01[1]}\")\nprint(f\"Test Loss: {vgg_test_eval_01[0]}\")\nprint(f\"Test Accuarcy: {vgg_test_eval_01[1]}\")","metadata":{},"outputs":[],"execution_count":null},{"id":"cb2dee4b-67fe-41a9-9529-a0638bc86796","cell_type":"markdown","source":"# Increamental unfreezing & fine tuning","metadata":{}},{"id":"50e77658-890e-4163-845f-f5d20c155601","cell_type":"code","source":"base_model = VGG19(include_top=False, input_shape=(128,128,3))\nbase_model_layer_names = [layer.name for layer in base_model.layers]\n\nx = base_model.output\nflat = Flatten()(x)\n\n\nclass_1 = Dense(4608, activation = 'relu')(flat)\ndropout = Dropout(0.2)(class_1)\nclass_2 = Dense(1152, activation = 'relu')(dropout)\noutput = Dense(2, activation = 'softmax')(class_2)\n\nmodel_02 = Model(base_model.inputs, output)\nmodel_02.load_weights(\"model_weights/vgg19_model_01.h5\")\n\nset_trainable = False\nfor layer in base_model.layers:\n    if layer.name in [ 'block5_conv3','block5_conv4']:\n        set_trainable=True\n    if set_trainable:\n        set_trainable=True\n    else:\n        set_trainable=False\nprint(model_02.summary())","metadata":{},"outputs":[],"execution_count":null},{"id":"72c39d26-145c-46ed-b39c-93640f6ceca6","cell_type":"code","source":"base_model_layer_names","metadata":{},"outputs":[],"execution_count":null},{"id":"2cfc4780-f269-47d1-aa2d-c906f3d8bc46","cell_type":"code","source":"sgd = SGD(learning_rate=0.0001, decay = 1e-6, momentum=0, nesterov = True)\n\nmodel_02.compile(loss=\"categorical_crossentropy\", optimizer=sgd, metrics=['accuracy'])","metadata":{},"outputs":[],"execution_count":null},{"id":"cffd9b69-d410-40f6-99a4-ae872711a641","cell_type":"code","source":"history_02 = model_02.fit(train_generator, \n            steps_per_epoch=10,\n            epochs=1, \n            callbacks=[es, cp, lrr],\n            validation_data=valid_generator)","metadata":{},"outputs":[],"execution_count":null},{"id":"9bc83c4f-ffc9-410f-b2a4-b13fa28cef33","cell_type":"code","source":"if not os.path.isdir('model_weights/'):\n    os.mkdir(\"model_weights/\")\nmodel_02.save(filepath = \"model_weights/vgg19_model_02.h5\", overwrite=True)","metadata":{},"outputs":[],"execution_count":null},{"id":"88d3aa6a-ada7-4911-add8-b63acdd2ee08","cell_type":"code","source":"model_02.load_weights(\"model_weights/vgg19_model_02.h5\")\n\nvgg_val_eval_02 = model_02.evaluate(valid_generator)\nvgg_test_eval_02 = model_02.evaluate(test_generator)\n\nprint(f\"Validation Loss: {vgg_val_eval_02[0]}\")\nprint(f\"Validation Accuarcy: {vgg_val_eval_02[1]}\")\nprint(f\"Test Loss: {vgg_test_eval_02[0]}\")\nprint(f\"Test Accuarcy: {vgg_test_eval_02[1]}\")","metadata":{},"outputs":[],"execution_count":null},{"id":"bdc5cab0-74f0-4439-abfa-af2fb774b0d5","cell_type":"markdown","source":"# Unfreezing and fine tuning the entire network","metadata":{}},{"id":"8ad27283-2d3e-4a8b-9593-4b2fc9718193","cell_type":"code","source":"base_model = VGG19(include_top=False, input_shape=(128,128,3))\n\nx = base_model.output\nflat = Flatten()(x)\n\nclass_1 = Dense(4608, activation = 'relu')(flat)\ndropout = Dropout(0.2)(class_1)\nclass_2 = Dense(1152, activation = 'relu')(dropout)\noutput = Dense(2, activation = 'softmax')(class_2)\n\nmodel_03 = Model(base_model.inputs, output)\nmodel_03.load_weights(\"model_weights/vgg19_model_01.h5\")\n\nprint(model_03.summary())","metadata":{},"outputs":[],"execution_count":null},{"id":"a162340c-3602-491c-be1f-046e315068a2","cell_type":"code","source":"sgd = SGD(learning_rate=0.0001, decay = 1e-6, momentum=0, nesterov = True)\n\nmodel_03.compile(loss=\"categorical_crossentropy\", optimizer=sgd, metrics=['accuracy'])","metadata":{},"outputs":[],"execution_count":null},{"id":"1bd8a7f9-ca29-44d3-afa9-49b4e9581437","cell_type":"code","source":"history_03 = model_02.fit(train_generator, \n            steps_per_epoch=100,\n            epochs=1, \n            callbacks=[es, cp, lrr],\n            validation_data=valid_generator)","metadata":{},"outputs":[],"execution_count":null}]}