{"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"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":65542,"databundleVersionId":7217587,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras import layers, models\nimport numpy as np\nimport cv2\nimport matplotlib.pyplot as plt\nimport os\n\n# Define dataset path\ndata_dir = \"/kaggle/input/congenital-heart-disease\"  # Replace with actual dataset path\n\n# Image Parameters\nIMG_SIZE = (500, 500)\nBATCH_SIZE = 32\n\n# Data Augmentation & Preprocessing\ndatagen = ImageDataGenerator(\n    rescale=1./255,   # Normalize pixels\n    rotation_range=20, # Random rotation\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    validation_split=0.2  # 80-20 split\n)\n\n# Load Data\ntrain_data = datagen.flow_from_directory(\n    data_dir,\n    target_size=IMG_SIZE,\n    batch_size=BATCH_SIZE,\n    class_mode='categorical',\n    subset='training'\n)\nval_data = datagen.flow_from_directory(\n    data_dir,\n    target_size=IMG_SIZE,\n    batch_size=BATCH_SIZE,\n    class_mode='categorical',\n    subset='validation'\n)\n\n# Build CNN Model\nmodel = models.Sequential([\n    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(500, 500, 3)),\n    layers.MaxPooling2D(2, 2),\n    layers.Conv2D(64, (3, 3), activation='relu'),\n    layers.MaxPooling2D(2, 2),\n    layers.Conv2D(128, (3, 3), activation='relu'),\n    layers.MaxPooling2D(2, 2),\n    layers.Flatten(),\n    layers.Dense(128, activation='relu'),\n    layers.Dropout(0.5),\n    layers.Dense(train_data.num_classes, activation='softmax')\n])\n\n# Compile Model\nmodel.compile(optimizer='adam',\n              loss='categorical_crossentropy',\n              metrics=['accuracy'])\n\n# Train Model\nepochs = 20\nhistory = model.fit(train_data, validation_data=val_data, epochs=epochs)\n\n# Evaluate Model\nval_loss, val_acc = model.evaluate(val_data)\nprint(f\"Validation Accuracy: {val_acc * 100:.2f}%\")\n\n# Save Model\nmodel.save(\"chd_classifier.h5\")\n\n# Grad-CAM Implementation\ndef grad_cam(model, img_array, layer_name):\n    grad_model = tf.keras.models.Model([model.inputs], [model.get_layer(layer_name).output, model.output])\n    with tf.GradientTape() as tape:\n        conv_outputs, predictions = grad_model(img_array)\n        class_idx = np.argmax(predictions[0])\n        loss = predictions[:, class_idx]\n    grads = tape.gradient(loss, conv_outputs)\n    pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))\n    conv_outputs = conv_outputs[0]\n    heatmap = tf.reduce_mean(tf.multiply(pooled_grads, conv_outputs), axis=-1)\n    heatmap = np.maximum(heatmap, 0) / np.max(heatmap)\n    return heatmap\n\n# Load an image for Grad-CAM\ndef process_image(img_path):\n    img = cv2.imread(img_path)\n    img = cv2.resize(img, IMG_SIZE)\n    img = np.expand_dims(img, axis=0) / 255.0\n    return img\n\n# Visualize Grad-CAM\ndef visualize_grad_cam(model, img_path, layer_name='conv2d_2'):\n    img_array = process_image(img_path)\n    heatmap = grad_cam(model, img_array, layer_name)\n    heatmap = cv2.resize(heatmap, (IMG_SIZE[0], IMG_SIZE[1]))\n    img = cv2.imread(img_path)\n    img = cv2.resize(img, IMG_SIZE)\n    heatmap = np.uint8(255 * heatmap)\n    heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)\n    superimposed_img = cv2.addWeighted(img, 0.6, heatmap, 0.4, 0)\n    plt.figure(figsize=(10, 5))\n    plt.subplot(1, 2, 1)\n    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))\n    plt.title(\"Original Image\")\n    plt.axis(\"off\")\n    plt.subplot(1, 2, 2)\n    plt.imshow(cv2.cvtColor(superimposed_img, cv2.COLOR_BGR2RGB))\n    plt.title(\"Grad-CAM\")\n    plt.axis(\"off\")\n    plt.show()\n\n# Example Usage\n# Replace 'sample_image.jpg' with an actual test image path\n# visualize_grad_cam(model, 'sample_image.jpg')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-12T08:43:18.181770Z","iopub.execute_input":"2025-03-12T08:43:18.181993Z"}},"outputs":[],"execution_count":null}]}