{"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":[{"sourceType":"competition","sourceId":126777,"databundleVersionId":15314950}],"dockerImageVersionId":31259,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Competition  \n[https://www.kaggle.com/competitions/jaguar-re-id/overview](http://)\n\n# Summary of Code  \nThis script performs an image-based re-identification task using AutoGluon.\nThe overall idea is:\n\n1. Train an image classifier on the Jaguar training set.\n1. Use the classifier’s output probabilities as feature vectors (embeddings).\n1. Compare query and gallery images using cosine similarity metrics.\n1. Generate a submission file for the competition.","metadata":{}},{"cell_type":"code","source":"is_debug = False","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:29:33.989807Z","iopub.execute_input":"2026-02-23T07:29:33.990829Z","iopub.status.idle":"2026-02-23T07:29:33.996763Z","shell.execute_reply.started":"2026-02-23T07:29:33.990779Z","shell.execute_reply":"2026-02-23T07:29:33.995188Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install autogluon","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:29:33.99872Z","iopub.execute_input":"2026-02-23T07:29:33.999036Z","iopub.status.idle":"2026-02-23T07:29:41.751598Z","shell.execute_reply.started":"2026-02-23T07:29:33.999Z","shell.execute_reply":"2026-02-23T07:29:41.750311Z"},"_kg_hide-input":true,"_kg_hide-output":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from pathlib import Path\nimport warnings\nwarnings.filterwarnings('ignore')\n\nfrom autogluon.multimodal import MultiModalPredictor\nimport cv2\nimport numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:29:41.753276Z","iopub.execute_input":"2026-02-23T07:29:41.753709Z","iopub.status.idle":"2026-02-23T07:29:41.759607Z","shell.execute_reply.started":"2026-02-23T07:29:41.753654Z","shell.execute_reply":"2026-02-23T07:29:41.758661Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"path_input = Path(\"/kaggle/input/competitions/jaguar-re-id\")\ndf_train = pd.read_csv(path_input/\"train.csv\")\ndf_test = pd.read_csv(path_input/\"test.csv\")\ndf_sub = pd.read_csv(path_input/\"sample_submission.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:29:41.760928Z","iopub.execute_input":"2026-02-23T07:29:41.761384Z","iopub.status.idle":"2026-02-23T07:29:41.912053Z","shell.execute_reply.started":"2026-02-23T07:29:41.761346Z","shell.execute_reply":"2026-02-23T07:29:41.91113Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train[\"filename\"] = df_train[\"filename\"].apply(lambda x: path_input/\"train\"/\"train\"/x)\ndf_train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:29:41.91469Z","iopub.execute_input":"2026-02-23T07:29:41.91504Z","iopub.status.idle":"2026-02-23T07:29:41.93839Z","shell.execute_reply.started":"2026-02-23T07:29:41.91501Z","shell.execute_reply":"2026-02-23T07:29:41.937259Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test[\"query_image\"] = df_test[\"query_image\"].apply(lambda x:path_input/\"test\"/\"test\"/x)\ndf_test[\"gallery_image\"] = df_test[\"gallery_image\"].apply(lambda x:path_input/\"test\"/\"test\"/x)\ndf_test.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:29:41.939534Z","iopub.execute_input":"2026-02-23T07:29:41.939828Z","iopub.status.idle":"2026-02-23T07:29:44.433471Z","shell.execute_reply.started":"2026-02-23T07:29:41.9398Z","shell.execute_reply":"2026-02-23T07:29:44.432533Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_sub.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:29:44.434703Z","iopub.execute_input":"2026-02-23T07:29:44.435193Z","iopub.status.idle":"2026-02-23T07:29:44.444655Z","shell.execute_reply.started":"2026-02-23T07:29:44.43515Z","shell.execute_reply":"2026-02-23T07:29:44.443771Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train, df_val = train_test_split(df_train,\n                                    test_size=0.25,\n                                    shuffle=True,\n                                    stratify=df_train[\"ground_truth\"],\n                                   )\ndf_train, df_val","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:29:44.445755Z","iopub.execute_input":"2026-02-23T07:29:44.446094Z","iopub.status.idle":"2026-02-23T07:29:44.478292Z","shell.execute_reply.started":"2026-02-23T07:29:44.446061Z","shell.execute_reply":"2026-02-23T07:29:44.477339Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictor = MultiModalPredictor(label=\"ground_truth\",\n                                problem_type=\"multiclass\",\n                                presets=\"high_quality\",\n                                eval_metric=\"f1_macro\",\n                               )\n\npredictor.fit(train_data=df_train,\n              tuning_data=df_val,\n              time_limit=60*3 if is_debug else 60*60*11, #sec              \n             )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:29:44.479867Z","iopub.execute_input":"2026-02-23T07:29:44.480292Z","iopub.status.idle":"2026-02-23T07:32:31.853955Z","shell.execute_reply.started":"2026-02-23T07:29:44.480256Z","shell.execute_reply":"2026-02-23T07:32:31.851395Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictor.fit_summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:32:31.855558Z","iopub.status.idle":"2026-02-23T07:32:31.855901Z","shell.execute_reply.started":"2026-02-23T07:32:31.855754Z","shell.execute_reply":"2026-02-23T07:32:31.855773Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test_img_set = pd.DataFrame([path_input/\"test\"/\"test/test_{0:04d}.png\".format(i) \n                                for i in range(1,372)], \n                               columns=[\"filename\"]\n                              )\ndf_test_img_set","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:32:31.857912Z","iopub.status.idle":"2026-02-23T07:32:31.858444Z","shell.execute_reply.started":"2026-02-23T07:32:31.858166Z","shell.execute_reply":"2026-02-23T07:32:31.858192Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictions = predictor.predict_proba(df_test_img_set)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:32:31.861402Z","iopub.status.idle":"2026-02-23T07:32:31.861742Z","shell.execute_reply.started":"2026-02-23T07:32:31.861606Z","shell.execute_reply":"2026-02-23T07:32:31.861622Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test_img_set = pd.concat([df_test_img_set, predictions], axis=1)\ndf_test_img_set.to_csv(\"df_test_img_set.csv\", index=False)\ndf_test_img_set","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:32:31.863619Z","iopub.status.idle":"2026-02-23T07:32:31.863933Z","shell.execute_reply.started":"2026-02-23T07:32:31.863784Z","shell.execute_reply":"2026-02-23T07:32:31.863799Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"proba_query = df_test[[\"query_image\"]]\nproba_gallery = df_test[[\"gallery_image\"]]\n\nproba_query = proba_query.merge(df_test_img_set,\n                                left_on=\"query_image\",\n                                right_on=\"filename\"\n                               )\nproba_gallery = proba_gallery.merge(df_test_img_set,\n                                left_on=\"gallery_image\",\n                                right_on=\"filename\"\n                               )\n\nproba_query = proba_query.drop([\"query_image\", \"filename\"], axis=1)\nproba_gallery = proba_gallery.drop([\"gallery_image\", \"filename\"], axis=1)\n\nproba_query","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:32:31.86508Z","iopub.status.idle":"2026-02-23T07:32:31.865399Z","shell.execute_reply.started":"2026-02-23T07:32:31.86525Z","shell.execute_reply":"2026-02-23T07:32:31.865267Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_sub[\"similarity\"] = ((proba_query * proba_gallery).sum(axis=1) \n                        / (((proba_query ** 2).sum(axis=1) ** (1 / 2)) \n                           * ((proba_gallery ** 2).sum(axis=1) ** (1 / 2))\n                          )\n                       )\n\ndf_sub[\"similarity\"] = df_sub[\"similarity\"].apply(lambda x: max(min(x, 1), 0))\ndf_sub.to_csv(\"submission.csv\", index=False)\ndf_sub","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-23T07:32:31.866619Z","iopub.status.idle":"2026-02-23T07:32:31.866916Z","shell.execute_reply.started":"2026-02-23T07:32:31.866777Z","shell.execute_reply":"2026-02-23T07:32:31.866791Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}