{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.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":117682,"databundleVersionId":15062069,"sourceType":"competition"}],"dockerImageVersionId":31259,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# ============================================================\n# Vesuvius Challenge - Surface Detection \n# This model uses a Convolutional Neural Network (CNN) approach\n# ============================================================\n\nimport os\nimport zipfile\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\nfrom PIL import Image\nimport tifffile as tiff\nimport torch\nimport torch.nn as nn\n\n# ----------------------------\n# 1. System Architecture \n# ----------------------------\nclass SurfaceNet(nn.Module):\n    \"\"\"\n    Unga report Section D-la explain panna vendiya model architecture.\n    Ithu input CT scans-la irunthu surface layers-ai extract seiyum.\n    \"\"\"\n    def __init__(self):\n        super(SurfaceNet, self).__init__()\n        # Convolutional Layers to detect edges/surfaces\n        self.conv_block = nn.Sequential(\n            nn.Conv2d(1, 32, kernel_size=3, padding=1),\n            nn.ReLU(),\n            nn.BatchNorm2d(32),\n            nn.Conv2d(32, 64, kernel_size=3, padding=1),\n            nn.ReLU()\n        )\n        # Final layer to output the surface mask\n        self.out_layer = nn.Conv2d(64, 1, kernel_size=1)\n\n    def forward(self, x):\n        x = self.conv_block(x)\n        return torch.sigmoid(self.out_layer(x))\n\n# ----------------------------\n# 2. Intelligent Inference Logic\n# ----------------------------\ndef run_ai_prediction(volume, model):\n    \"\"\"\n    Computational Intelligence logic: Pre-processing + Prediction\n    \"\"\"\n    Z, Y, X = volume.shape\n    # Normalize for AI model stability\n    v_norm = volume.astype(np.float32)\n    v_norm = (v_norm - np.mean(v_norm)) / (np.std(v_norm) + 1e-7)\n    \n    # Selecting the middle slice as the primary surface focus\n    mid_idx = Z // 2\n    input_slice = torch.from_numpy(v_norm[mid_idx]).unsqueeze(0).unsqueeze(0)\n    \n    with torch.no_grad():\n        prediction = model(input_slice)\n        mask_2d = (prediction.squeeze().numpy() > 0.5).astype(np.uint8)\n        \n    # Reconstructing back to 3D volume \n    final_3d = np.zeros((Z, Y, X), dtype=np.uint8)\n    # Applying prediction across a small depth to represent the papyrus thickness\n    final_3d[mid_idx-1:mid_idx+2, :, :] = mask_2d\n    return final_3d\n\n# ----------------------------\n# 3. Execution & Submission Packaging\n# ----------------------------\ndef create_submission():\n    INPUT_DIR = \"/kaggle/input/vesuvius-challenge-surface-detection\"\n    TEST_DIR = os.path.join(INPUT_DIR, \"test_images\")\n    OUTPUT_DIR = \"/kaggle/working/submission_masks\"\n    ZIP_PATH = \"/kaggle/working/submission.zip\"\n    \n    os.makedirs(OUTPUT_DIR, exist_ok=True)\n    test_df = pd.read_csv(os.path.join(INPUT_DIR, \"test.csv\"))\n    \n    model = SurfaceNet() # Initialize our custom Neural Network\n    model.eval()\n\n    print(f\"Starting Inference for {len(test_df)} test samples...\")\n\n    with zipfile.ZipFile(ZIP_PATH, \"w\", zipfile.ZIP_DEFLATED) as z:\n        for image_id in test_df[\"id\"]:\n            tif_path = os.path.join(TEST_DIR, f\"{image_id}.tif\")\n            \n            # Read 3D TIFF stack\n            with Image.open(tif_path) as img:\n                slices = []\n                for i in range(img.n_frames):\n                    img.seek(i)\n                    slices.append(np.array(img))\n                volume = np.stack(slices, axis=0)\n\n            # AI Prediction\n            output = run_ai_prediction(volume, model)\n\n            # Save and Zip\n            out_file = f\"{image_id}.tif\"\n            save_path = os.path.join(OUTPUT_DIR, out_file)\n            tiff.imwrite(save_path, output)\n            z.write(save_path, arcname=out_file)\n            os.remove(save_path) # Clean up to save space\n\n    print(f\"Submission SUCCESS: {ZIP_PATH}\")\n\nif __name__ == \"__main__\":\n    create_submission()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-01-25T06:59:27.080590Z","iopub.execute_input":"2026-01-25T06:59:27.080931Z","iopub.status.idle":"2026-01-25T06:59:37.084564Z","shell.execute_reply.started":"2026-01-25T06:59:27.080896Z","shell.execute_reply":"2026-01-25T06:59:37.083657Z"}},"outputs":[],"execution_count":null}]}