{"metadata":{"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.4"},"colab":{"provenance":[],"gpuType":"T4"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false},"accelerator":"GPU"},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import kagglehub\n\n# Download latest version\npath = kagglehub.dataset_download(\"bmadushanirodrigo/fracture-multi-region-x-ray-data\")\n\nprint(\"Path to dataset files:\", path)","metadata":{"id":"bBViOPP1s-5O","outputId":"aeb7cad3-4ea2-4f65-d3f5-cff5265206dd","executionInfo":{"status":"ok","timestamp":1753904471028,"user_tz":-180,"elapsed":1652,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.layers import Dense, Input, Dropout,Flatten, Conv2D,BatchNormalization,MaxPooling2D,GlobalAveragePooling2D\nfrom tensorflow.keras.models import Model, Sequential\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau\nfrom tensorflow.keras.utils import plot_model\nfrom IPython.display import SVG, Image\nfrom sklearn.model_selection import train_test_split\nimport os\nimport cv2\nimport random\nfrom PIL import Image\nfrom tensorflow.keras.preprocessing.image import load_img\nfrom PIL import Image, UnidentifiedImageError\nimport shutil\nfrom shutil import copyfile\nimport plotly.express as px\nimport glob","metadata":{"id":"kI65RkFEtOS7","executionInfo":{"status":"ok","timestamp":1753904471031,"user_tz":-180,"elapsed":2,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Explore Data**","metadata":{"id":"Rs_JUkM0AP98"}},{"cell_type":"code","source":"train=path+'/Bone_Fracture_Binary_Classification/Bone_Fracture_Binary_Classification/train'\ntest=path+'/Bone_Fracture_Binary_Classification/Bone_Fracture_Binary_Classification/test'\nval=path+'/Bone_Fracture_Binary_Classification/Bone_Fracture_Binary_Classification/val'","metadata":{"id":"4hXmUQlntmeg","executionInfo":{"status":"ok","timestamp":1753904471044,"user_tz":-180,"elapsed":13,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"os.listdir(train)","metadata":{"id":"ht9QCSF_UBSd","executionInfo":{"status":"ok","timestamp":1753904471209,"user_tz":-180,"elapsed":164,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"531b118b-f620-40fa-a2dc-819f305cac49"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fractured_train_path = os.path.join(train, 'fractured')\nnot_fractured_train_path = os.path.join(train, 'not fractured')\n\nfractured_train_files = os.listdir(fractured_train_path)\nnot_fractured_train_files = os.listdir(not_fractured_train_path)\n\nprint(fractured_train_files[:5])\nprint(not_fractured_train_files[:5])\nprint(len(fractured_train_files))\nprint(len(not_fractured_train_files))","metadata":{"id":"37ECYMXmspQ1","executionInfo":{"status":"ok","timestamp":1753904471214,"user_tz":-180,"elapsed":4,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"237869ae-2ac4-4393-e20e-452b8d73392b"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10,10))\nfor i in range(9):\n    plt.subplot(3, 3, i+1)\n    img = cv2.imread(os.path.join(fractured_train_path, fractured_train_files[i]))\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    plt.imshow(img)\n    plt.axis('off')\n    plt.title('fractured')\n    plt.tight_layout()\nplt.show()","metadata":{"id":"PtsOp7GwS7Bv","executionInfo":{"status":"ok","timestamp":1753904473702,"user_tz":-180,"elapsed":2487,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"315537e3-97c8-4a7c-c121-51377ab7cfab"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10,10))\nfor i in range(9):\n    plt.subplot(3, 3, i+1)\n    img = cv2.imread(os.path.join(not_fractured_train_path, not_fractured_train_files[i]))\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    plt.imshow(img)\n    plt.axis('off')\n    plt.title('not fractured')\n    plt.tight_layout()\nplt.show()","metadata":{"id":"XaebXCUmu32f","executionInfo":{"status":"ok","timestamp":1753904475203,"user_tz":-180,"elapsed":1498,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"ab3136f1-28c1-4c37-8340-9d4fd8e99741"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"labels = {'fractured':1, 'not fractured':0}\ndata = [train, test, val]","metadata":{"id":"BRUlIrNZV06q","executionInfo":{"status":"ok","timestamp":1753904475206,"user_tz":-180,"elapsed":1,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10,10))\nfor i in data:\n    plt.subplot(2, 3, data.index(i)+1)\n    #pie\n    n_fractured = len(os.listdir(i+'/fractured'))\n    n_not_fractured = len(os.listdir(i+'/not fractured'))\n    plt.pie([n_fractured, n_not_fractured], labels=labels.keys(), autopct='%1.1f%%')\n    plt.title(i.split('/')[-1])\nplt.show()","metadata":{"id":"EKXcJZIpaj8H","executionInfo":{"status":"ok","timestamp":1753904475384,"user_tz":-180,"elapsed":177,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"f349f619-069a-4412-c187-4894affa4256"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import ImageFile, UnidentifiedImageError\n\ndef remove_truncate(path):\n    removed = 0\n    for folder in os.listdir(path):\n        for file in os.listdir(os.path.join(path, folder)):\n            try:\n                img = Image.open(os.path.join(path, folder, file))\n                img.verify()\n            except (UnidentifiedImageError, OSError, IOError, SyntaxError) as e:\n                print('Bad file:', os.path.join(path, folder, file))\n                os.remove(os.path.join(path, folder, file))\n                removed += 1\n    return removed\nprint(remove_truncate(train))\nprint(remove_truncate(test))\nprint(remove_truncate(val))","metadata":{"id":"K1ddJreLrb8P","executionInfo":{"status":"ok","timestamp":1753904477936,"user_tz":-180,"elapsed":2552,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"3ad2e8ff-aa25-40b1-a337-7bdff5bcdcfd"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ImageFile.LOAD_TRUNCATED_IMAGES = True\nimg_sizes =[]\nfor folder in os.listdir(train):\n    for file in os.listdir(os.path.join(train, folder)):\n      try:\n        img = plt.imread(os.path.join(train, folder, file))\n        img_sizes.append(img.shape)\n      except Exception as e:\n        print(e)","metadata":{"id":"E2mU5hHwwyIf","executionInfo":{"status":"ok","timestamp":1753904495535,"user_tz":-180,"elapsed":17587,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pd.Series(img_sizes).value_counts()","metadata":{"id":"VoFJncuGCdHE","executionInfo":{"status":"ok","timestamp":1753904495576,"user_tz":-180,"elapsed":25,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"9781241e-749e-4d37-ea35-8b12aaaa536a"},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Prepare for training","metadata":{"id":"aRQ1V8NtciMb"}},{"cell_type":"code","source":"print(len(os.listdir(train+'/fractured')))\nprint(len(os.listdir(train+'/not fractured')))\nprint(len(os.listdir(test+'/fractured')))\nprint(len(os.listdir(test+'/not fractured')))\nprint(len(os.listdir(val+'/fractured')))\nprint(len(os.listdir(val+'/not fractured')))","metadata":{"id":"vYuhGFIlz1HY","executionInfo":{"status":"ok","timestamp":1753904495603,"user_tz":-180,"elapsed":18,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"3451fffb-d6a9-4523-e124-0b7a772c2e93"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale = 1./255)\ntest_datagen = ImageDataGenerator(rescale = 1./255)\nval_datagen = ImageDataGenerator(rescale = 1./255)\n\ntraining_set = train_datagen.flow_from_directory(train,\n                                                 target_size = (224, 224),\n                                                 batch_size = 16,\n                                                 class_mode = 'binary',\n                                                 shuffle=True)\n\ntest_set = test_datagen.flow_from_directory(test,\n                                                 target_size = (224, 224),\n                                                 batch_size = 16,\n                                                 class_mode = 'binary')\nvalidation_set = val_datagen.flow_from_directory(val,\n                                                 target_size = (224, 224),\n                                                 batch_size = 16,\n                                                 class_mode = 'binary')","metadata":{"id":"1c3d5c27","executionInfo":{"status":"ok","timestamp":1753904495756,"user_tz":-180,"elapsed":152,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"7e41784f-9fae-4567-d243-42aae20a430f"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class_names = training_set.class_indices\nclass_names = {v: k for k, v in class_names.items()}\ndef plot_data(set, n_images):\n    images, labels = next(set)\n    plt.figure(figsize=(10, 10))\n    for i in range(9):\n        ax = plt.subplot(3, 3, i + 1)\n        plt.imshow(images[i])\n        plt.title(class_names[int(labels[i])])\n        plt.axis(\"off\")\n    plt.show()\nplot_data(training_set, 25)","metadata":{"id":"cX1GykfF0jsQ","executionInfo":{"status":"ok","timestamp":1753904497778,"user_tz":-180,"elapsed":2023,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"5532d045-2be4-4664-e588-603585ee677c"},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Train & Test","metadata":{"id":"4cgZJA4BdF7C"}},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)))\nmodel.add(Conv2D(64, (3, 3), activation='relu', padding='same'))\nmodel.add(Conv2D(128, (3, 3), activation='relu', padding='same'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(Conv2D(128, (3, 3), activation='relu', padding='same'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(Conv2D(128, (3, 3), activation='relu', padding='same'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(GlobalAveragePooling2D())\nmodel.add(Dense(1024, activation='relu'))\nmodel.add(Dense(512, activation='relu'))\n\nmodel.add(Dense(1, activation='sigmoid'))\n\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n\nmodel.summary()","metadata":{"id":"5701c8cf","executionInfo":{"status":"ok","timestamp":1753904497856,"user_tz":-180,"elapsed":77,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"0727b5dc-0b3e-4a23-b066-9290e4886db3"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"improvements = [\n    ReduceLROnPlateau(monitor='val_loss', patience=2, verbose=1, factor=0.5),\n    ModelCheckpoint('best_model.h5', monitor='val_loss', save_best_only=True, verbose=1),\n    tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True),\n]","metadata":{"id":"RoxrWJ9zDn7j","executionInfo":{"status":"ok","timestamp":1753904497882,"user_tz":-180,"elapsed":25,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(training_set, validation_data=validation_set, epochs=15, callbacks=improvements)","metadata":{"id":"qoe5L992I9_n","executionInfo":{"status":"ok","timestamp":1753906042584,"user_tz":-180,"elapsed":1544701,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"69ced00a-1e50-4a32-adc2-81bace4cec59"},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Evaluation","metadata":{"id":"IawcDcynV9co"}},{"cell_type":"code","source":"model.evaluate(test_set)","metadata":{"id":"67pixiKgV885","executionInfo":{"status":"ok","timestamp":1753906049814,"user_tz":-180,"elapsed":7228,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"3dcb4974-8f94-4436-e87c-6d033c21ff50"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(8, 5))\nplt.plot(history.history['accuracy'], color='green', linestyle='-', marker='o', markersize=5, label='Train Accuracy')\nplt.plot(history.history['val_accuracy'], color='red', linestyle='--', marker='x', markersize=5, label='Validation Accuracy')\n\nplt.title('Model Accuracy Over Epochs', fontsize=16)\nplt.xlabel('Epoch', fontsize=14)\nplt.ylabel('Accuracy', fontsize=14)\nplt.xticks(fontsize=12)\nplt.yticks(fontsize=12)\n\nplt.grid(True, linestyle='--', alpha=0.7)\n\nplt.legend(loc='upper left', fontsize=12)\n\nplt.ylim(0, 1)\n\nplt.tight_layout()\nplt.show()\n","metadata":{"id":"-Gq4jIloctjS","executionInfo":{"status":"ok","timestamp":1753906050137,"user_tz":-180,"elapsed":311,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"5c189848-b8b3-4eb0-ba3b-278fa92e286f"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(8, 5))\nplt.plot(history.history['loss'], color='green', linestyle='-', marker='o', markersize=5, label='Train Loss')\nplt.plot(history.history['val_loss'], color='red', linestyle='--', marker='x', markersize=5, label='Validation Loss')\n\nplt.title('Model Loss Over Epochs', fontsize=16)\nplt.xlabel('Epoch', fontsize=14)\nplt.ylabel('Loss', fontsize=14)\nplt.xticks(fontsize=12)\nplt.yticks(fontsize=12)\n\nplt.grid(True, linestyle='--', alpha=0.7)\n\nplt.legend(loc='upper left', fontsize=12)\n\nplt.xlim(0, len(history.history['loss']) - 1)\n\nplt.tight_layout()\nplt.show()\n","metadata":{"id":"O_BZ373MctLO","executionInfo":{"status":"ok","timestamp":1753906050270,"user_tz":-180,"elapsed":143,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"942aebfc-c234-46fc-fab9-45577f821ac7"},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model by transfer learning","metadata":{"id":"pzEY9i0fQ0MC"}},{"cell_type":"code","source":"from tensorflow.keras.applications.xception import Xception\nfrom tensorflow.keras.applications.xception import preprocess_input","metadata":{"id":"8XmPvSc7QVUa","executionInfo":{"status":"ok","timestamp":1753906050272,"user_tz":-180,"elapsed":1,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"input_shape = (224, 224, 3)","metadata":{"id":"TUSKAZ6Zd90W","executionInfo":{"status":"ok","timestamp":1753906050280,"user_tz":-180,"elapsed":1,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"xception_mode=Xception(weights='imagenet',include_top=False,input_shape=input_shape)\nxception_mode.summary()","metadata":{"id":"dRKRn6J8eGP3","executionInfo":{"status":"ok","timestamp":1753906051458,"user_tz":-180,"elapsed":1173,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"77df02de-d4a5-4f4e-d2f4-105e265d797a"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for layer in xception_mode.layers:\n      if isinstance(layer, BatchNormalization):\n          layer.trainable = True\n      else:\n          layer.trainable = False","metadata":{"id":"aVgl45neeatr","executionInfo":{"status":"ok","timestamp":1753906051460,"user_tz":-180,"elapsed":1,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model=Sequential()\nx = GlobalAveragePooling2D()(xception_mode.output)\nx = Dense(512, activation='relu')(x)\nx = Dropout(0.5)(x)\nx = Dense(256, activation='relu')(x)\nx = Dropout(0.5)(x)\nx = Dense(128, activation='relu')(x)\noutput_layer = Dense(1, activation='sigmoid')(x)\nmodel = Model(inputs=xception_mode.input, outputs=output_layer)\nmodel.summary()","metadata":{"id":"cOp654aRecJR","executionInfo":{"status":"ok","timestamp":1753906051616,"user_tz":-180,"elapsed":155,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"be052637-6e44-45a5-9b47-9ed2d866873b"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])","metadata":{"id":"e90f_gGxe4_z","executionInfo":{"status":"ok","timestamp":1753906051618,"user_tz":-180,"elapsed":0,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(training_set, validation_data=validation_set, epochs=15, callbacks=improvements)","metadata":{"id":"kXImqOIgfAWq","executionInfo":{"status":"ok","timestamp":1753907360010,"user_tz":-180,"elapsed":1308391,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"2c76d9ec-6020-4ce3-8b65-b8933d75a6bf"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.evaluate(test_set)","metadata":{"id":"bzC0tKtvfjjC","executionInfo":{"status":"ok","timestamp":1753907366290,"user_tz":-180,"elapsed":6288,"user":{"displayName":"Mohannad Ashraf","userId":"07607960765387605219"}},"outputId":"5569a4a3-e713-4eb2-9496-dece10e8e999"},"outputs":[],"execution_count":null}]}