{"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":91498,"databundleVersionId":11655853,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import cv2\nimport os\nimport numpy as np\nimport pandas as pd\nimport matplotlib\nimport matplotlib.pyplot as plt\nimport mpl_toolkits.mplot3d  \nfrom colorama import Fore, Back, Style\nfrom prettytable import PrettyTable\nfrom graphviz import Digraph\nfrom IPython.display import display, Image\n\nprint(Back.YELLOW + Fore.BLACK + \"✅ OpenCV Version: \" + cv2.__version__ + Style.RESET_ALL)\nprint(Back.YELLOW + Fore.BLACK + \"✅ NumPy Version: \" + np.__version__ + Style.RESET_ALL)\nprint(Back.YELLOW + Fore.BLACK + \"✅ Pandas Version: \" + pd.__version__ + Style.RESET_ALL)\nprint(Back.YELLOW + Fore.BLACK + \"✅ Matplotlib Version: \" + matplotlib.__version__ + Style.RESET_ALL)\nprint(Back.YELLOW + Fore.BLACK + \"✅ mpl_toolkits.mplot3d: Part of Matplotlib (No separate version)\" + Style.RESET_ALL)\n\n# Additional Libraries\nprint(Back.YELLOW + Fore.BLACK + \"✅ PrettyTable Version: \" + PrettyTable.__module__ + Style.RESET_ALL)\nprint(Back.YELLOW + Fore.BLACK + \"✅ Graphviz Version: \" + Digraph.__module__ + Style.RESET_ALL)\nprint(Back.YELLOW + Fore.BLACK + \"✅ IPython Display Module: Available (No version attribute)\" + Style.RESET_ALL)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:55.844201Z","iopub.execute_input":"2025-04-04T12:11:55.844698Z","iopub.status.idle":"2025-04-04T12:11:55.856409Z","shell.execute_reply.started":"2025-04-04T12:11:55.844661Z","shell.execute_reply":"2025-04-04T12:11:55.855130Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_labels = pd.read_csv(\"/kaggle/input/image-matching-challenge-2025/train_labels.csv\")\nprint(Back.GREEN + Fore.BLACK + Style.BRIGHT + \"✅ Successfully imported and stored the dataset.\" + Style.RESET_ALL)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:55.857731Z","iopub.execute_input":"2025-04-04T12:11:55.858119Z","iopub.status.idle":"2025-04-04T12:11:55.910462Z","shell.execute_reply.started":"2025-04-04T12:11:55.858069Z","shell.execute_reply":"2025-04-04T12:11:55.909376Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_head = train_labels.head(4)\ntable = PrettyTable()\ntable.field_names = df_head.columns.tolist()\nfor row in df_head.itertuples(index=False):\n    table.add_row(row)\nprint(table)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:55.912348Z","iopub.execute_input":"2025-04-04T12:11:55.912667Z","iopub.status.idle":"2025-04-04T12:11:55.921247Z","shell.execute_reply.started":"2025-04-04T12:11:55.912635Z","shell.execute_reply":"2025-04-04T12:11:55.920295Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"missing_values = train_labels.isnull().sum()\nmissing_table = PrettyTable()\nmissing_table.title = \"🔍 Missing Values in Dataset\"  # Set the table title\nmissing_table.field_names = [\"Column Name\", \"Missing Values\"]\nfor col, missing in missing_values.items():\n    missing_table.add_row([col, missing])\nprint(missing_table)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:55.922866Z","iopub.execute_input":"2025-04-04T12:11:55.923214Z","iopub.status.idle":"2025-04-04T12:11:55.946111Z","shell.execute_reply.started":"2025-04-04T12:11:55.923182Z","shell.execute_reply":"2025-04-04T12:11:55.944998Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dot = Digraph()\ndot.node('A', \"train_labels['dataset']\")\ndot.node('B', \"train_labels['scene']\")\ndot.node('C', \"train_labels['dataset_scene']\\n= train_labels['dataset'] + '/' + train_labels['scene']\", shape='oval')\ndot.edge('A', 'C')\ndot.edge('B', 'C')\ndot.render('dataset_scene_graph', format='png', cleanup=False)\ndot\ndisplay(Image('dataset_scene_graph.png'))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:55.947411Z","iopub.execute_input":"2025-04-04T12:11:55.947688Z","iopub.status.idle":"2025-04-04T12:11:56.191521Z","shell.execute_reply.started":"2025-04-04T12:11:55.947664Z","shell.execute_reply":"2025-04-04T12:11:56.190454Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_labels[\"dataset_scene\"] = train_labels[\"dataset\"]+\"/\"+train_labels[\"scene\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:56.192598Z","iopub.execute_input":"2025-04-04T12:11:56.192981Z","iopub.status.idle":"2025-04-04T12:11:56.204657Z","shell.execute_reply.started":"2025-04-04T12:11:56.192945Z","shell.execute_reply":"2025-04-04T12:11:56.203400Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from graphviz import Source\ngraph_code = \"\"\"\ndigraph dataset_scene_deduplication {\n    graph [size=\"15,10\"]; // Adjust size width=8, height=5\n    rankdir=TB;\n    node [shape=box];\n    \n    subgraph cluster_original {\n        label=\"Original train_labels\";\n        columns [label=\"Columns: dataset_scene | image | rotation_matrix | translation_vector\", shape=plaintext];\n        dataset1 [label=\"dataset1/sceneA\\nimage1, R1, T1\"];\n        dataset2 [label=\"dataset1/sceneA\\nimage2, R2, T2\"];\n        dataset3 [label=\"dataset2/sceneB\\nimage3, R3, T3\"];\n        dataset4 [label=\"dataset2/sceneB\\nimage4, R4, T4\"];\n        columns -> dataset1 [style=invis];\n    }\n    \n    subgraph cluster_unique {\n        label=\"Unique dataset_scene Rows\";\n        unique_columns [label=\"Columns: dataset_scene | image | rotation_matrix | translation_vector\", shape=plaintext];\n        unique1 [label=\"dataset1/sceneA\\nimage1, R1, T1\"];\n        unique2 [label=\"dataset2/sceneB\\nimage3, R3, T3\"];\n        unique_columns -> unique1 [style=invis];\n    }\n    \n    dataset1 -> unique1 [label=\"Keep First\"];\n    dataset2 -> unique1 [style=dashed, label=\"Dropped\"];\n    dataset3 -> unique2 [label=\"Keep First\"];\n    dataset4 -> unique2 [style=dashed, label=\"Dropped\"];\n}\n\"\"\"\ngraph = Source(graph_code)\ngraph.render('dataset_scene_deduplication', format='png', cleanup=False)\ngraph\ndisplay(Image('dataset_scene_deduplication.png'))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:56.205664Z","iopub.execute_input":"2025-04-04T12:11:56.205928Z","iopub.status.idle":"2025-04-04T12:11:56.274678Z","shell.execute_reply.started":"2025-04-04T12:11:56.205905Z","shell.execute_reply":"2025-04-04T12:11:56.273539Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unique_rows = train_labels.drop_duplicates(subset=['dataset_scene'], keep='first')[['dataset_scene', 'image', 'rotation_matrix', 'translation_vector']]\nprint(f\"The unique combination of dataset and scene with first associated image (including outliers combinations): {len(unique_rows)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:56.275783Z","iopub.execute_input":"2025-04-04T12:11:56.276116Z","iopub.status.idle":"2025-04-04T12:11:56.292984Z","shell.execute_reply.started":"2025-04-04T12:11:56.276089Z","shell.execute_reply":"2025-04-04T12:11:56.292000Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"outlier_code= \"\"\"\ndigraph dataset_scene_outliers {\n    graph [size=\"30,20\"]; // Adjust size width=8, height=5\n    rankdir=LR;\n    node [shape=box];\n    \n    subgraph cluster_dataset_scene {\n        label=\"dataset_scene Column Values\";\n        ds1 [label=\"imc2023_haiper/fountain\"];\n        ds2 [label=\"imc2023_haiper/bike\"];\n        ds3 [label=\"imc2023_haiper/chairs\"];\n        ds4 [label=\"imc2023_heritage/outliers\", color=red, style=filled, fillcolor=pink];\n        ds5 [label=\"imc2023_heritage/dioscuri\"];\n        ds6 [label=\"imc2023_heritage/cyprus\"];\n        ds7 [label=\"imc2023_heritage/wall\"];\n        ds8 [label=\"imc2023_theather_imc2024_church/church\"];\n        ds9 [label=\"imc2023_theather_imc2024_church/kyiv-puppet-theater\"];\n        ds10 [label=\"imc2024_dioscuri_baalshamin/baalshamin\"];\n        ds11 [label=\"imc2024_dioscuri_baalshamin/outliers\", color=red, style=filled, fillcolor=pink];\n        ds12 [label=\"imc2024_dioscuri_baalshamin/dioscuri\"];\n        ds13 [label=\"imc2024_lizard_pond/lizard\"];\n        ds14 [label=\"imc2024_lizard_pond/outliers\", color=red, style=filled, fillcolor=pink];\n        ds15 [label=\"imc2024_lizard_pond/pond\"];\n        ds16 [label=\"ETs/outliers\", color=red, style=filled, fillcolor=pink];\n        ds17 [label=\"ETs/ET\"];\n        ds18 [label=\"ETs/another_ET\"];\n        ds19 [label=\"16 more values...\"]\n    }    \n    subgraph cluster_outliers {\n        label=\"Identified Outliers (4)\";\n        rankdir=LR;\n        out1 [label=\"ETs/outliers\", color=red, style=filled, fillcolor=pink];\n        out2 [label=\"imc2023_heritage/outliers\", color=red, style=filled, fillcolor=pink];\n        out3 [label=\"imc2024_dioscuri_baalshamin/outliers\", color=red, style=filled, fillcolor=pink];\n        out4 [label=\"imc2024_lizard_pond/outliers\", color=red, style=filled, fillcolor=pink];\n    }\n    ds4 -> out2 [style=dashed, color=red];\n    ds11 -> out3 [style=dashed, color=red];\n    ds14 -> out4 [style=dashed, color=red];\n    ds16 -> out1 [style=dashed, color=red];\n}\n\"\"\"\n# Render and display the graph\noutlier_graph = Source(outlier_code)\noutlier_graph.render('outlier', format='png', cleanup=False)\noutlier_graph\nfrom IPython.display import display, Image\ndisplay(Image('outlier.png'))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:56.295228Z","iopub.execute_input":"2025-04-04T12:11:56.295515Z","iopub.status.idle":"2025-04-04T12:11:56.410070Z","shell.execute_reply.started":"2025-04-04T12:11:56.295491Z","shell.execute_reply":"2025-04-04T12:11:56.408760Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unique_rows.to_csv(\"Image_for_Visual.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:56.411225Z","iopub.execute_input":"2025-04-04T12:11:56.411532Z","iopub.status.idle":"2025-04-04T12:11:56.423702Z","shell.execute_reply.started":"2025-04-04T12:11:56.411507Z","shell.execute_reply":"2025-04-04T12:11:56.422257Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data = pd.read_csv(\"/kaggle/working/Image_for_Visual.csv\")\ndata.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:56.424857Z","iopub.execute_input":"2025-04-04T12:11:56.425175Z","iopub.status.idle":"2025-04-04T12:11:56.441379Z","shell.execute_reply.started":"2025-04-04T12:11:56.425126Z","shell.execute_reply":"2025-04-04T12:11:56.440276Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if 'dataset_scene' not in train_labels.columns:\n    train_labels['dataset_scene'] = train_labels['dataset'] + \"_\" + train_labels['scene']\nunique_rows = train_labels.drop_duplicates(subset=['dataset_scene'], keep='first')[['dataset_scene', 'image', 'rotation_matrix', 'translation_vector']]\n\nbase_path = \"/kaggle/input/image-matching-challenge-2025/train\"\nimage_paths = [f\"{base_path}/{row['dataset_scene'].split('/')[0]}/{row['image']}\" for _, row in unique_rows.iterrows()]\n\n# Function to display images\ndef show_images(image_paths, title=\"Unique Scene Images\", rows=6, cols=6):\n    fig, axes = plt.subplots(rows, cols, figsize=(15, 15))\n    axes = axes.flatten()\n\n    for i in range(len(axes)):\n        if i < len(image_paths) and os.path.exists(image_paths[i]):  # Ensure the image exists\n            img = cv2.imread(image_paths[i])\n            if img is not None:\n                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n                axes[i].imshow(img)\n            else:\n                axes[i].text(0.5, 0.5, \"Image Not Loaded\", ha='center', va='center', fontsize=12)\n        else:\n            axes[i].text(0.5, 0.5, \"No Image\", ha='center', va='center', fontsize=12)\n\n        axes[i].axis(\"off\")\n\n    plt.suptitle(title, fontsize=16)\n    plt.show()\n\nshow_images(image_paths[:34])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:11:56.442558Z","iopub.execute_input":"2025-04-04T12:11:56.442928Z","iopub.status.idle":"2025-04-04T12:12:07.862964Z","shell.execute_reply.started":"2025-04-04T12:11:56.442895Z","shell.execute_reply":"2025-04-04T12:12:07.861611Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Sharpening Kernel for Image Enhancement\nsharpen_kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])\n\n# Function to display images and camera angles\ndef show_images_with_camera_angles(image_paths, train_labels, rows=34, cols=2):\n    fig, axes = plt.subplots(rows, cols, figsize=(14, rows * 3))\n    \n    for i in range(rows):\n        if i >= len(image_paths):\n            break\n        \n        img_path = image_paths[i]\n        dataset_scene = data.iloc[i][\"dataset_scene\"]\n        \n        # Load Image\n        if os.path.exists(img_path):\n            img = cv2.imread(img_path)\n            if img is not None:\n                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n                img = cv2.filter2D(img, -1, sharpen_kernel)\n                axes[i, 0].imshow(img)\n                axes[i, 0].set_title(f\"Scene: {dataset_scene}\", fontsize=10)\n            else:\n                axes[i, 0].text(0.5, 0.5, \"Image Not Loaded\", ha='center', va='center', fontsize=12)\n        else:\n            axes[i, 0].text(0.5, 0.5, \"No Image\", ha='center', va='center', fontsize=12)\n        \n        axes[i, 0].axis(\"off\")\n\n        #Camera Pose\n        rotation_matrix = np.array(data.iloc[i][\"rotation_matrix\"].split(\";\"), dtype=float).reshape(3, 3)\n        translation_vector = np.array(data.iloc[i][\"translation_vector\"].split(\";\"), dtype=float)\n        \n        #Displaying Rotation Matrix and Translation Vector\n        rm_text = f\"Rotation Matrix:\\n{rotation_matrix}\"\n        tv_text = f\"Translation Vector:\\n{translation_vector}\"\n        axes[i, 0].text(0.5, -0.1, rm_text, ha='center', va='center', fontsize=8, transform=axes[i, 0].transAxes)\n        axes[i, 0].text(0.5, -0.3, tv_text, ha='center', va='center', fontsize=8, transform=axes[i, 0].transAxes)\n        \n        # Compute camera center: -R⁻¹ * T\n        camera_center = -np.linalg.inv(rotation_matrix) @ translation_vector\n        \n        # Plot Camera Position\n        ax = fig.add_subplot(rows, cols, 2 * i + 2, projection='3d')\n        ax.scatter(camera_center[0], camera_center[1], camera_center[2], c='red', marker='o', label=\"Camera Position\")\n        ax.set_xlabel(\"X\")\n        ax.set_ylabel(\"Y\")\n        ax.set_zlabel(\"Z\")\n        ax.legend()\n        ax.set_title(\"Camera Position\", fontsize=10)\n    \n    plt.tight_layout()\n    plt.show()\n\nshow_images_with_camera_angles(image_paths[:34], train_labels)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T12:12:07.863973Z","iopub.execute_input":"2025-04-04T12:12:07.864338Z","iopub.status.idle":"2025-04-04T12:12:31.781234Z","shell.execute_reply.started":"2025-04-04T12:12:07.864306Z","shell.execute_reply":"2025-04-04T12:12:31.780002Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<!-- Futuristic Glassmorphism Banner -->\n<div style=\"\n    width: 100%;\n    max-width: 900px;\n    margin: 20px auto;\n    padding: 15px;\n    border-radius: 20px;\n    background: rgba(255, 255, 255, 0.2);\n    backdrop-filter: blur(10px);\n    -webkit-backdrop-filter: blur(10px);\n    box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.1);\n    font-family: 'Orbitron', sans-serif;\n    text-align: center;\n    color: #222;\n    font-size: 20px;\n    font-weight: bold;\n    letter-spacing: 2px;\n    text-transform: uppercase;\n    border: 2px solid rgba(0, 114, 255, 0.5);\n    animation: fadeIn 1s ease-in-out;\n\">\n    A lot of insight yet to Upload. Thank you for viewing my notebook. \n</div>","metadata":{}}]}