{"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"},{"sourceId":7242880,"sourceType":"datasetVersion","datasetId":4195248},{"sourceId":11270134,"sourceType":"datasetVersion","datasetId":7044932},{"sourceId":11271225,"sourceType":"datasetVersion","datasetId":7045760},{"sourceId":11271545,"sourceType":"datasetVersion","datasetId":7045999},{"sourceId":11274480,"sourceType":"datasetVersion","datasetId":7048007},{"sourceId":11370336,"sourceType":"datasetVersion","datasetId":7117893},{"sourceId":212591711,"sourceType":"kernelVersion"}],"dockerImageVersionId":30918,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install opencv-python-headless\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:48:59.777843Z","iopub.execute_input":"2025-04-27T08:48:59.778189Z","iopub.status.idle":"2025-04-27T08:49:03.144193Z","shell.execute_reply.started":"2025-04-27T08:48:59.778157Z","shell.execute_reply":"2025-04-27T08:49:03.142927Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# آماده‌سازی کتابخانه‌ها\nimport os\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nfrom tqdm.notebook import tqdm\nimport torch\n\n# مسیر اصلی دیتاست رقابت\nBASE_DIR = \"/kaggle/input/image-matching-challenge-2025\"\n\n# بررسی اینکه CUDA در دسترس هست یا نه\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nprint(\"✅ Torch device:\", device)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:03.145539Z","iopub.execute_input":"2025-04-27T08:49:03.145815Z","iopub.status.idle":"2025-04-27T08:49:03.152448Z","shell.execute_reply.started":"2025-04-27T08:49:03.145780Z","shell.execute_reply":"2025-04-27T08:49:03.150978Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sentence_transformers import SentenceTransformer\nimport torch\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nmodel_path = \"/kaggle/input/clip-vit-b32-savedmodel-offline\"\nmodel = SentenceTransformer(model_path, device=device)\n\nprint(\"✅ CLIP model loaded successfully!\")\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:03.154846Z","iopub.execute_input":"2025-04-27T08:49:03.155246Z","iopub.status.idle":"2025-04-27T08:49:03.642926Z","shell.execute_reply.started":"2025-04-27T08:49:03.155209Z","shell.execute_reply":"2025-04-27T08:49:03.641830Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import CLIPProcessor, CLIPModel\nimport torch\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\n# مسیر دیتاستت رو تنظیم کردم\nmodel_path = \"/kaggle/input/clip-vit-b32-savedmodel-offline\"\n\n# لود مدل و پردازشگر\nmodel = CLIPModel.from_pretrained(model_path).to(device)\nprocessor = CLIPProcessor.from_pretrained(model_path)\n\nprint(\"✅ CLIP model & processor loaded successfully!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:03.644578Z","iopub.execute_input":"2025-04-27T08:49:03.644862Z","iopub.status.idle":"2025-04-27T08:49:04.491611Z","shell.execute_reply.started":"2025-04-27T08:49:03.644834Z","shell.execute_reply":"2025-04-27T08:49:04.490490Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport torch\nfrom torchvision import transforms\n\ndef extract_clip_features(image_path, model, processor, device):\n    image = Image.open(image_path).convert(\"RGB\")\n    inputs = processor(images=image, return_tensors=\"pt\").to(device)\n    with torch.no_grad():\n        features = model.get_image_features(**inputs)\n        features = features / features.norm(p=2, dim=-1, keepdim=True)\n    return features.cpu().numpy()\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:04.492509Z","iopub.execute_input":"2025-04-27T08:49:04.492833Z","iopub.status.idle":"2025-04-27T08:49:04.498388Z","shell.execute_reply.started":"2025-04-27T08:49:04.492809Z","shell.execute_reply":"2025-04-27T08:49:04.497075Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfor root, dirs, files in os.walk(\"/kaggle/input/test-image\"):\n    for file in files:\n        print(file)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:04.499151Z","iopub.execute_input":"2025-04-27T08:49:04.499400Z","iopub.status.idle":"2025-04-27T08:49:04.517630Z","shell.execute_reply.started":"2025-04-27T08:49:04.499370Z","shell.execute_reply":"2025-04-27T08:49:04.516643Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_path = \"/kaggle/input/test-image/H2604-L374320503_original.jpg\"\nfeatures = extract_clip_features(sample_path, model, processor, device)\nprint(\"✅ Embedding shape:\", features.shape)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:04.518474Z","iopub.execute_input":"2025-04-27T08:49:04.518777Z","iopub.status.idle":"2025-04-27T08:49:04.827310Z","shell.execute_reply.started":"2025-04-27T08:49:04.518746Z","shell.execute_reply":"2025-04-27T08:49:04.826574Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\ntest_image_dir = \"/kaggle/input/image-matching-challenge-2025/test\"\nimage_list = []\n\n# پیمایش همه زیرپوشه‌ها و جمع‌کردن تصاویر .png\nfor root, dirs, files in os.walk(test_image_dir):\n    for file in files:\n        if file.lower().endswith(\".png\"):\n            image_list.append(file)\n\nimage_list = sorted(image_list)\n\nprint(f\"✅ تعداد تصاویر تست: {len(image_list)}\")\nprint(f\"🔍 نمونه‌ها: {image_list[:3]}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:04.829461Z","iopub.execute_input":"2025-04-27T08:49:04.829683Z","iopub.status.idle":"2025-04-27T08:49:04.877117Z","shell.execute_reply.started":"2025-04-27T08:49:04.829666Z","shell.execute_reply":"2025-04-27T08:49:04.876201Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom PIL import Image\nimport matplotlib.pyplot as plt\n\n# مسیر تصاویر تست\ntest_dir = \"/kaggle/input/test-image\"\n\n# لیست تصاویر\ntest_images = [f for f in os.listdir(test_dir) if f.endswith((\".jpg\", \".png\", \".jpeg\"))]\n\nprint(f\"✅ تعداد تصاویر موجود در test-image: {len(test_images)}\")\nprint(\"🖼️ چند نمونه تصویر:\")\nfor i, name in enumerate(test_images[:5]):  # نمایش فقط ۵ تصویر اول\n    print(f\"{i+1}. {name}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:04.878315Z","iopub.execute_input":"2025-04-27T08:49:04.878597Z","iopub.status.idle":"2025-04-27T08:49:04.884602Z","shell.execute_reply.started":"2025-04-27T08:49:04.878566Z","shell.execute_reply":"2025-04-27T08:49:04.883592Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport matplotlib.pyplot as plt\nimport os\n\ntest_image_dir = \"/kaggle/input/image-matching-challenge-2025/test\"\ntest_image_name = \"H2604-L374320503_original.jpg\"\nimage_path = os.path.join(test_dir, test_image_name)\n\nimage = Image.open(image_path)\n\nplt.imshow(image)\nplt.title(\"Test Image\")\nplt.axis(\"off\")\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:04.885610Z","iopub.execute_input":"2025-04-27T08:49:04.885839Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# مسیر تصویر دیتابیس\n\ndb_image_path = \"/kaggle/input/solasali/sol.jpg\"\n\n# استخراج ویژگی\ndb_feature = extract_clip_features(db_image_path, model, processor, device)\nprint(\"✅ Database feature shape:\", db_feature.shape)\n\n","metadata":{"trusted":true,"execution":{"iopub.execute_input":"2025-04-27T08:49:05.533404Z","iopub.status.idle":"2025-04-27T08:49:05.770582Z","shell.execute_reply.started":"2025-04-27T08:49:05.533380Z","shell.execute_reply":"2025-04-27T08:49:05.769438Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport numpy as np\n\n# محاسبه شباهت کسینوسی بین تصویر تست و دیتابیس\nsimilarity = torch.nn.functional.cosine_similarity(\n    torch.tensor(features),\n    torch.tensor(db_feature)\n).item()\n\nprint(f\"🎯 Cosine Similarity: {similarity:.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:05.771294Z","iopub.execute_input":"2025-04-27T08:49:05.771519Z","iopub.status.idle":"2025-04-27T08:49:05.777181Z","shell.execute_reply.started":"2025-04-27T08:49:05.771497Z","shell.execute_reply":"2025-04-27T08:49:05.776190Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\ntest_image_dir = \"/kaggle/input/image-matching-challenge-2025/test\"  \nimage_list = []\n\nfor root, dirs, files in os.walk(test_image_dir):\n    for file in files:\n        if file.lower().endswith(\".png\"):  \n            image_list.append(file)\n\nimage_list = sorted(image_list)\n\nprint(f\"✅ تعداد تصاویر تست: {len(image_list)}\")\nprint(f\"🖼️ نمونه‌ای از لیست تصاویر: {image_list[:5]}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:05.778220Z","iopub.execute_input":"2025-04-27T08:49:05.778491Z","iopub.status.idle":"2025-04-27T08:49:05.807166Z","shell.execute_reply.started":"2025-04-27T08:49:05.778466Z","shell.execute_reply":"2025-04-27T08:49:05.806023Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\n# فرض کنیم قبلاً لیست اسامی عکس ها آماده شده\n# مثلا: image_list = ['another_et_another_et001.png', 'another_et_another_et002.png', ...]\n\nnum_images = len(image_list)\n\n# ساخت مقدارهای درست برای ستون ها\nrotation_matrix_list = [\"1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0\"] * num_images\ntranslation_vector_list = [\"0.0 0.0 0.0\"] * num_images\n\n# ساخت دیتافریم\nsubmission = pd.DataFrame({\n    \"dataset\": [\"test\"] * num_images,\n    \"scene\": [f\"scene{i+1}\" for i in range(num_images)],\n    \"image\": image_list,\n    \"rotation_matrix\": rotation_matrix_list,\n    \"translation_vector\": translation_vector_list,\n})\n\n# ذخیره فایل CSV\nsubmission.to_csv(\"/kaggle/working/submission.csv\", index=False)\n\nprint(\"✅ فایل نهایی submission.csv ساخته شد!\")\nsubmission.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:05.807911Z","iopub.execute_input":"2025-04-27T08:49:05.808195Z","iopub.status.idle":"2025-04-27T08:49:05.821270Z","shell.execute_reply.started":"2025-04-27T08:49:05.808170Z","shell.execute_reply":"2025-04-27T08:49:05.820064Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Import libraries\nimport pandas as pd\nimport numpy as np\nimport os\n\n# مسیر عکس‌ها (جایی که فایل‌های تستت هستن)\ntest_image_dir = \"/kaggle/input/image-matching-challenge-2025/test\"\n\n# ساخت لیست اسم فایل‌های عکس\nimage_list = []\nfor root, dirs, files in os.walk(test_image_dir):\n    for file in files:\n        if file.lower().endswith('.png'):\n            image_list.append(file)\n\nimage_list = sorted(image_list)\n\n# تعداد عکس ها\nnum_images = len(image_list)\n\n# ساخت ستون‌ها\nrotation_matrix_list = [\"1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0\"] * num_images\ntranslation_vector_list = [\"0.0 0.0 0.0\"] * num_images\n\n# ساخت دیتافریم نهایی\nsubmission = pd.DataFrame({\n    \"dataset\": [\"test\"] * num_images,\n    \"scene\": [f\"scene{i+1}\" for i in range(num_images)],\n    \"image\": image_list,\n    \"rotation_matrix\": rotation_matrix_list,\n    \"translation_vector\": translation_vector_list,\n})\n\n# ذخیره فایل نهایی\nsubmission.to_csv(\"/kaggle/working/submission.csv\", index=False)\n\nprint(\"✅ فایل سالم submission.csv ساخته شد!\")\nsubmission.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:51:04.273803Z","iopub.execute_input":"2025-04-27T08:51:04.274175Z","iopub.status.idle":"2025-04-27T08:51:04.295627Z","shell.execute_reply.started":"2025-04-27T08:51:04.274145Z","shell.execute_reply":"2025-04-27T08:51:04.294733Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\ndf = pd.read_csv(\"/kaggle/working/submission.csv\")\nprint(df[\"rotation_matrix\"].head(3))\nprint(df[\"translation_vector\"].head(3))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:05.822165Z","iopub.execute_input":"2025-04-27T08:49:05.822455Z","iopub.status.idle":"2025-04-27T08:49:05.838057Z","shell.execute_reply.started":"2025-04-27T08:49:05.822423Z","shell.execute_reply":"2025-04-27T08:49:05.836842Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!ls /kaggle/working/\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:05.838880Z","iopub.execute_input":"2025-04-27T08:49:05.839205Z","iopub.status.idle":"2025-04-27T08:49:06.001635Z","shell.execute_reply.started":"2025-04-27T08:49:05.839173Z","shell.execute_reply":"2025-04-27T08:49:06.000358Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\ndf = pd.read_csv(\"/kaggle/working/submission.csv\")\nprint(df.head())\nprint(df.columns)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:06.002621Z","iopub.execute_input":"2025-04-27T08:49:06.002939Z","iopub.status.idle":"2025-04-27T08:49:06.014735Z","shell.execute_reply.started":"2025-04-27T08:49:06.002901Z","shell.execute_reply":"2025-04-27T08:49:06.013485Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.listdir(\"/kaggle/working\"))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:06.015613Z","iopub.execute_input":"2025-04-27T08:49:06.015903Z","iopub.status.idle":"2025-04-27T08:49:06.035225Z","shell.execute_reply.started":"2025-04-27T08:49:06.015876Z","shell.execute_reply":"2025-04-27T08:49:06.034048Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!head /kaggle/working/submission.csv\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-27T08:49:06.036187Z","iopub.execute_input":"2025-04-27T08:49:06.036491Z","iopub.status.idle":"2025-04-27T08:49:06.198172Z","shell.execute_reply.started":"2025-04-27T08:49:06.036458Z","shell.execute_reply":"2025-04-27T08:49:06.197150Z"}},"outputs":[],"execution_count":null}]}