{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","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":"nvidiaTeslaT4","dataSources":[{"sourceId":71885,"databundleVersionId":8143495,"sourceType":"competition"}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"<div style=\"padding:20px;color:black;margin:0;font-size:350%;text-align:center;display:fill;border-radius:5px;background-color:safron;overflow:hidden;font-weight:700;border: 5px solid #21a3a3;\"> 📷Image Matching Challenge⛓</div>\n","metadata":{}},{"cell_type":"markdown","source":"<div style=\"border-radius:10px; border:#DEB887 solid; padding: 15px; background-color: white; font-size:100%; text-align:left\">\n\n<h3 align=\"center\"><font color='#DAA520'>💡 About The Competition :</font></h3>\n    \n**Competition Objective:** We have to Construct precise 3D maps using sets of images in diverse scenarios and environments, where we aim to generate accurate spatial representations through **Structure from Motion (SfM) techniques**.\n    \n**Problem Categories:** Here we look in for six distinct categories, each presenting unique challenges: **Phototourism and historical preservation** **Night vs day** and **temporal changes Aerial and mixed** aerial-ground Repeated structures Natural environments\n**Transparencies and reflections**\n    \n**Evaluation Metric:**  The evaluation is  based on the mean Average Accuracy (mAA) of registered camera centers. This involves computing the best similarity transformation that registers camera centers onto the **ground truth**, considering factors like **scale, rotation**, and **translation**. **RANSAC-like approach** is used for verification.\n    \nSubmission Format: Submissions should predict the pose for each image ID in the test set. The format includes:\n**Image path Dataset Scene Rotation matrix (3x3 matrix flattened into a vector) Translation vector (3-D vector)**\n    \nImages without predicted poses should contain at least one \"nan\" value in the corresponding rotation_matrix or translation_vector columns.\n    \n**Organization:** The competition is organized by a  researchers from various institute like Czech Technical University in Prague, Google, University of Palermo, University of Trento, Bruno Kessler Foundation, University of British Columbia, Haiper, and USDA-ARS-AFRS.\n    \n**Header Photos:** Header photos are credited to S**andro Gonzalez and Ljubomir Žarković on Unsplash.**\nThis competition aims to address the challenges of matching images across different viewpoints, lighting conditions, and environments, contributing to advancements in **computer vision techniques for 3D reconstruction**.","metadata":{}},{"cell_type":"markdown","source":"\n<div style=\"padding: 35px;color:white;margin:10;font-size:170%;text-align:left;display:fill;border-radius:10px;overflow:hidden;background-image: url(https://images.pexels.com/photos/532173/pexels-photo-532173.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1)\"><b><span style='color:black'> Import neccessary libraries </span></b> </div>","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport os\nimport cv2","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:54.564988Z","iopub.execute_input":"2024-06-08T08:11:54.565367Z","iopub.status.idle":"2024-06-08T08:11:54.570349Z","shell.execute_reply.started":"2024-06-08T08:11:54.565330Z","shell.execute_reply":"2024-06-08T08:11:54.569326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<div style=\"padding: 35px;color:white;margin:10;font-size:170%;text-align:left;display:fill;border-radius:10px;overflow:hidden;background-image: url(https://images.pexels.com/photos/532173/pexels-photo-532173.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1)\"><b><span style='color:black'> Helper Function To see Images  </span></b> </div>","metadata":{}},{"cell_type":"code","source":"def visualize_images_in_folder(folder_path, num_images=6, rows=2, cols=3):    \n    fig, axes = plt.subplots(rows, cols, figsize=(15, 10))\n    axes = axes.ravel()  \n    image_files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f)) and f.endswith(\".png\")]\n    num_images = min(num_images, len(image_files))    \n    for i in range(num_images):\n        img_file = image_files[i]\n        img_path = os.path.join(folder_path, img_file)       \n        img = cv2.imread(img_path)\n        if img is None:\n            print(f\"Failed to load image: {img_file}\")\n            continue       \n        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)       \n        axes[i].imshow(img)\n        axes[i].set_title(img_file)\n        axes[i].axis('off')  \n    for ax in axes[num_images:]:\n        ax.axis('off')    \n    plt.tight_layout()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:54.572126Z","iopub.execute_input":"2024-06-08T08:11:54.572762Z","iopub.status.idle":"2024-06-08T08:11:54.581474Z","shell.execute_reply.started":"2024-06-08T08:11:54.572736Z","shell.execute_reply":"2024-06-08T08:11:54.580506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"![Illustration-of-the-SIFT-algorithm-1-Differently-scaled-copies-of-the-input-image-are.png](attachment:f9aae0ec-c48c-4a4d-87c9-a21a960073f3.png)","metadata":{},"attachments":{"f9aae0ec-c48c-4a4d-87c9-a21a960073f3.png":{"image/png":"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"}}},{"cell_type":"code","source":"folder_path = \"/kaggle/input/image-matching-challenge-2024/train/church/images/\"\nvisualize_images_in_folder(folder_path, num_images=3, rows=1, cols=3)","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:54.582634Z","iopub.execute_input":"2024-06-08T08:11:54.582919Z","iopub.status.idle":"2024-06-08T08:11:55.714141Z","shell.execute_reply.started":"2024-06-08T08:11:54.582896Z","shell.execute_reply":"2024-06-08T08:11:55.713313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"border-radius:10px; border:#DEB887 solid; padding: 15px; background-color: white; font-size:120%; text-align:left\">\n\n<h3 align=\"center\"><font color='black'>💡 SIFT Algorithm: How to Use SIFT :</font></h3>\n    \n**Introduction:**\n\nHumans excel at identifying objects, people, and images through memory and pattern recognition.\nThe Scale Invariant Feature Transform (SIFT) algorithm mimics this human ability in machines.\nSIFT enables machines to recognize objects in images despite variations in angle or scale, a task challenging for traditional computer vision methods.\n    \n**Learning Objectives:**\n\nUnderstand the basics of the SIFT algorithm.\nLearn how SIFT performs feature matching, identifying key features in images and matching them across different images.\nGain hands-on experience with coding the SIFT algorithm in Python.\n    \n**Summary::**\n\nSIFT (Scale Invariant Feature Transform) is a powerful technique in computer vision.\nIt enables machines to recognize objects in images despite changes in scale or angle.\nThrough feature matching, SIFT identifies key features in images and matches them across different images.\nThis tutorial provides a beginner-friendly introduction to SIFT and includes hands-on coding exercises in Python.\n    \n","metadata":{}},{"cell_type":"code","source":"image1 = cv2.imread('/kaggle/input/image-matching-challenge-2024/train/church/images/00001.png', cv2.IMREAD_GRAYSCALE)\nimage2 = cv2.imread('/kaggle/input/image-matching-challenge-2024/test/church/images/00006.png', cv2.IMREAD_GRAYSCALE)","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:55.715296Z","iopub.execute_input":"2024-06-08T08:11:55.715613Z","iopub.status.idle":"2024-06-08T08:11:55.769333Z","shell.execute_reply.started":"2024-06-08T08:11:55.715578Z","shell.execute_reply":"2024-06-08T08:11:55.768631Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image1_rgb = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)\nimage2_rgb = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:55.771508Z","iopub.execute_input":"2024-06-08T08:11:55.771793Z","iopub.status.idle":"2024-06-08T08:11:55.778144Z","shell.execute_reply.started":"2024-06-08T08:11:55.771755Z","shell.execute_reply":"2024-06-08T08:11:55.777218Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" sift = cv2.SIFT_create()","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:55.779355Z","iopub.execute_input":"2024-06-08T08:11:55.779677Z","iopub.status.idle":"2024-06-08T08:11:55.784165Z","shell.execute_reply.started":"2024-06-08T08:11:55.779652Z","shell.execute_reply":"2024-06-08T08:11:55.783311Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"keypoints1, descriptors1 = sift.detectAndCompute(image1, None)\nkeypoints2, descriptors2 = sift.detectAndCompute(image2, None)","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:55.785323Z","iopub.execute_input":"2024-06-08T08:11:55.785717Z","iopub.status.idle":"2024-06-08T08:11:56.261111Z","shell.execute_reply.started":"2024-06-08T08:11:55.785687Z","shell.execute_reply":"2024-06-08T08:11:56.260021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"matcher = cv2.BFMatcher()\nmatches = matcher.match(descriptors1, descriptors2)\nmatches = sorted(matches, key=lambda x: x.distance)\nmatched_image = cv2.drawMatches(image1_rgb, keypoints1, image2_rgb, keypoints2, matches[:50], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:56.262366Z","iopub.execute_input":"2024-06-08T08:11:56.262679Z","iopub.status.idle":"2024-06-08T08:11:56.353140Z","shell.execute_reply.started":"2024-06-08T08:11:56.262654Z","shell.execute_reply":"2024-06-08T08:11:56.352495Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"matched_keypoints1 = np.float32([keypoints1[m.queryIdx].pt for m in matches[:50]])\nmatched_keypoints2 = np.float32([keypoints2[m.trainIdx].pt for m in matches[:50]])","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:56.354020Z","iopub.execute_input":"2024-06-08T08:11:56.354538Z","iopub.status.idle":"2024-06-08T08:11:56.360046Z","shell.execute_reply.started":"2024-06-08T08:11:56.354512Z","shell.execute_reply":"2024-06-08T08:11:56.359058Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for pt1, pt2 in zip(matched_keypoints1, matched_keypoints2):\n    x1, y1 = pt1\n    x2, y2 = pt2\n    #plt.plot([x1, x2 + image1.shape[1]], [y1, y2], 'r-', linewidth=1)\nplt.figure(figsize=(12, 8))\nplt.imshow(matched_image)\nplt.title('Feature Matching with Lines')\nplt.axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:56.361414Z","iopub.execute_input":"2024-06-08T08:11:56.361748Z","iopub.status.idle":"2024-06-08T08:11:56.837857Z","shell.execute_reply.started":"2024-06-08T08:11:56.361719Z","shell.execute_reply":"2024-06-08T08:11:56.836957Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"border-radius:10px; border:#DEB887 solid; padding: 15px; background-color: white\n            ; font-size:120%; text-align:left\">\n\n<h3 align=\"center\"><font color='black'>💡 AKAZE Algorithm: How to Use AKAZE :</font></h3>\n    \n**AKAZE (Accelerated-KAZE)** is a feature detection and description algorithm introduced as an **improvement over KAZE (KAZE (Kart-hikey Affine and Zernike Descriptors)**, which itself is an extension of the popular SIFT (Scale-Invariant Feature Transform) and SURF (Speeded-Up Robust Features) algorithms. A**KAZE is designed to be both fast and robust **to various transformations such as rotation, scale changes, and illumination changes.\n\n**Here are some key points about AKAZE**:\n\n**Speed and Efficiency**: AKAZE is designed to be computationally efficient while maintaining robustness. It achieves this by using a nonlinear scale space and various optimizations.\n    \n**Scale-Invariance**: Like SIFT and SURF, AKAZE is scale-invariant, meaning it can detect features at different scales in an image. This is crucial for matching objects that may appear at different sizes in different images.\n    \n**Rotation-Invariance**: AKAZE also exhibits rotation invariance, meaning it can detect and match features even when the images are rotated relative to each other.\n    \n**Affine Transformation Handling**: Unlike SIFT and SURF, which are not inherently affine-invariant, AKAZE is able to handle affine transformations such as shearing and stretching.\n    \n**Descriptor Generation**: AKAZE generates descriptors that capture both local and global information about the keypoints, making them robust to changes in viewpoint, lighting, and occlusion.\n    \n**Nonlinear Scale Space**: AKAZE uses a nonlinear scale space representation, which allows it to adaptively adjust the scale at each keypoint location, leading to improved performance compared to linear scale space methods.\n    ","metadata":{}},{"cell_type":"code","source":"image1_rgb = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)\nimage2_rgb = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)\nakaze = cv2.AKAZE_create()\nkeypoints1, descriptors1 = akaze.detectAndCompute(image1, None)\nkeypoints2, descriptors2 = akaze.detectAndCompute(image2, None)\nmatcher = cv2.BFMatcher()\nmatches = matcher.match(descriptors1, descriptors2)\nmatches = sorted(matches, key=lambda x: x.distance)\nmatched_image = cv2.drawMatches(image1_rgb, keypoints1, image2_rgb, keypoints2, matches[:50], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)\nmatched_keypoints1 = np.float32([keypoints1[m.queryIdx].pt for m in matches[:50]])\nmatched_keypoints2 = np.float32([keypoints2[m.trainIdx].pt for m in matches[:50]])\n\nfor pt1, pt2 in zip(matched_keypoints1, matched_keypoints2):\n    x1, y1 = pt1\n    x2, y2 = pt2\n    #plt.plot([x1, x2 + image1.shape[1]], [y1, y2], 'r-', linewidth=1)\nplt.figure(figsize=(12, 8))\nplt.imshow(matched_image)\nplt.title('Feature Matching with AKAZE')\nplt.axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:56.838984Z","iopub.execute_input":"2024-06-08T08:11:56.839289Z","iopub.status.idle":"2024-06-08T08:11:57.641149Z","shell.execute_reply.started":"2024-06-08T08:11:56.839237Z","shell.execute_reply":"2024-06-08T08:11:57.640227Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"border-radius:10px; border:#DEB887 solid; padding: 15px; background-color: white\n            ; font-size:120%; text-align:left\">\n\n<h3 align=\"center\"><font color='black'>💡 Oriented FAST and Rotated BRIEF (ORB) Algorithm: How to Use ORB :</font></h3>\n    \n**Oriented FAST and Rotated BRIEF (ORB)** is a feature detection and description algorithm **developed by Ethan Rublee, Vincent Rabaud, Kurt Konolige, and Gary Bradski at Willow Garage**. It is designed to be a fast alternative to existing feature detection methods like SIFT (Scale-Invariant Feature Transform) and SURF (Speeded-Up Robust Features), while also being robust to various transformations such as rotation and scale changes.\n\n**Here are some key points about ORB:**\n\n**FAST Key Point Detection:** ORB uses a modified version of the FAST (Features from Accelerated Segment Test) algorithm for key point detection. FAST is a corner detection algorithm known for its computational efficiency.\n    \n**Rotated BRIEF Descriptor:** Instead of using the complex gradient-based descriptors used in SIFT and SURF, ORB uses the BRIEF (Binary Robust Independent Elementary Features) descriptor. BRIEF generates binary descriptors by comparing pairs of pixel intensities at predetermined locations.\n    \n**Efficient Descriptor Matching:** ORB employs efficient techniques for descriptor matching, such as the Hamming distance, which allows for fast comparison of binary descriptors.\n    \n**Scale-Invariance:** ORB is inherently scale-invariant, allowing it to detect features at different scales in an image.\nRotation-Invariance: While ORB is not fully rotation-invariant, it can handle rotations to some extent by using oriented FAST key points and rotated BRIEF descriptors.\n    \n**Affine Invariance:** ORB does not inherently handle affine transformations like shearing and stretching. However, it is possible to achieve some level of affine invariance by using additional techniques such as image pyramids.\n    \n**OpenCV Implementation:** ORB is implemented in the OpenCV library.we can create an ORB detector using the cv2.ORB_create() function and then use it to detect key points and compute descriptors in images.","metadata":{}},{"cell_type":"code","source":"image1_rgb = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)\nimage2_rgb = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)\norb = cv2.ORB_create()\nkeypoints1, descriptors1 = orb.detectAndCompute(image1, None)\nkeypoints2, descriptors2 = orb.detectAndCompute(image2, None)\nmatcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)\nmatches = matcher.match(descriptors1, descriptors2)\nmatches = sorted(matches, key=lambda x: x.distance)\nmatched_image = cv2.drawMatches(image1_rgb, keypoints1, image2_rgb, keypoints2, matches[:50], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)\nmatched_keypoints1 = np.float32([keypoints1[m.queryIdx].pt for m in matches[:50]])\nmatched_keypoints2 = np.float32([keypoints2[m.trainIdx].pt for m in matches[:50]])\nfor pt1, pt2 in zip(matched_keypoints1, matched_keypoints2):\n    x1, y1 = pt1\n    x2, y2 = pt2\n    #plt.plot([x1, x2 + image1.shape[1]], [y1, y2], 'r-', linewidth=1)\nplt.figure(figsize=(12, 8))\nplt.imshow(matched_image)\nplt.title('Feature Matching with ORB')\nplt.axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-08T08:11:57.642218Z","iopub.execute_input":"2024-06-08T08:11:57.642494Z","iopub.status.idle":"2024-06-08T08:11:58.234004Z","shell.execute_reply.started":"2024-06-08T08:11:57.642467Z","shell.execute_reply":"2024-06-08T08:11:58.233091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Thank You! 🙏\n\n<div style=\"box-shadow: rgba(0, 0, 0, 0.4) -5px 5px inset, rgba(0, 0, 0, 0.3) -10px 10px inset, rgba(0, 0, 0, 0.2) -15px 15px inset, rgba(0, 0, 0, 0.1) -20px 20px inset, rgba(0, 0, 0, 0.05) -25px 25px inset; padding:20px; font-size:30px; font-family: consolas; display:fill; border-radius:15px; color: rgba(0, 0, 0, 0.7)\"> \n    <b>༼⁠ ⁠つ⁠ ⁠◕⁠‿⁠◕⁠ ⁠༽⁠つ Thank You!</b>\n</div>\n\n<p style=\"font-family:verdana; color:black; font-family: consolas; font-size: 16px;\"> \n    💌 Thanks for your time and attention! If you have any feedback or suggestions, please share them. <br><br> \n    🚀 If you enjoyed this notebook, consider giving it an upvote to help others find it too. Your support means a lot! <br><br> \n    ❤️ Once again, thank you for your support, and I look forward to seeing you again soon!\n</p>","metadata":{}},{"cell_type":"markdown","source":"\n## <div style=\"box-shadow: rgba(0, 0, 0, 0.18) 0px 2px 4px inset; padding:20px; font-size:24px; font-family: consolas; text-align:center; display:fill; border-radius:15px; color:rgb(67, 66, 66)\"> <b> Refrences</b></div>","metadata":{}},{"cell_type":"markdown","source":"# This work is Barrowed from here Credit to @ asarvazyan thanks to Evry one for there workhttps://www.kaggle.com/code/asarvazyan/imc-understanding-the-baseline/notebook?scriptVersionId=169208367\n\n# https://www.kaggle.com/datasets/oldufo/imc2024-packages-lightglue-rerun-kornia","metadata":{}},{"cell_type":"markdown","source":"<div style=\"background-color: black; padding: 20px; border-radius: 10px; margin: 20px auto; max-width: 600px;\">\n    <center>\n        <div style=\"background-color: white; padding: 20px; border-radius: 10px;\">\n            <b style=\"font-size: 24px; color: #ff6600;\">👏😊 &nbsp; IF YOU FIND THIS HELPFUL, PLEASE UPVOTE! &nbsp; 💢👏</b>\n            <div style=\"margin-top: 20px; font-size: 18px; color: black;\">\n                🥽🖥This took quite a bit of effort on my part, and while it might seem trivial, 🏆🏆receiving your appreciation means a lot to me! 😅🎃 Your upvotes inspire me to keep creating helpful content like this🖥🍱.\n            </div>\n        </div>\n    </center>\n</div>","metadata":{"execution":{"iopub.status.busy":"2024-04-25T09:47:28.812244Z","iopub.execute_input":"2024-04-25T09:47:28.812639Z","iopub.status.idle":"2024-04-25T09:47:28.823551Z","shell.execute_reply.started":"2024-04-25T09:47:28.812607Z","shell.execute_reply":"2024-04-25T09:47:28.821821Z"}}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}