{"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":31254,"databundleVersionId":3103714,"sourceType":"competition"}],"dockerImageVersionId":30732,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport os\nimport glob\nfrom PIL import Image\nimport torch\nimport torchvision.transforms as transforms\nimport torchvision.models as models\nimport numpy as np","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-06-08T14:32:13.361425Z","iopub.execute_input":"2024-06-08T14:32:13.362413Z","iopub.status.idle":"2024-06-08T14:32:13.367011Z","shell.execute_reply.started":"2024-06-08T14:32:13.362376Z","shell.execute_reply":"2024-06-08T14:32:13.366035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(f\"Using device: {device}\")\n\nmodel = models.resnet50(pretrained = True).to(device)\nmodel.eval()\n\ntransform = transforms.Compose([\n    transforms.Resize(256),\n    transforms.CenterCrop(224),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n])\n\ndef extract_features(image_path):\n    image = Image.open(image_path).convert('RGB')\n    image = transform(image).unsqueeze(0).to(device)\n    with torch.no_grad():\n        features = model(image)\n    return features.cpu().detach().numpy().flatten()","metadata":{"execution":{"iopub.status.busy":"2024-06-08T14:33:51.394758Z","iopub.execute_input":"2024-06-08T14:33:51.395118Z","iopub.status.idle":"2024-06-08T14:33:52.005454Z","shell.execute_reply.started":"2024-06-08T14:33:51.395088Z","shell.execute_reply":"2024-06-08T14:33:52.004643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"csv_file = '/kaggle/input/h-and-m-personalized-fashion-recommendations/articles.csv'\nimage_dir = '/kaggle/input/h-and-m-personalized-fashion-recommendations/images'\n\ndf = pd.read_csv(csv_file)\n\nimage_paths = glob.glob(os.path.join(image_dir, '**', '*.jpg'), recursive=True)\n# 創建字典以映射圖片ID到完整路徑\nimage_path_dict = {os.path.basename(path): path for path in image_paths}\n\n# 將 article_id 轉換為字符串並添加 .jpg 擴展名\ndf['article_id_str'] = '0' + df['article_id'].astype(str) + '.jpg'\n\n# 添加完整的圖片路徑到DataFrame\ndf['image_path'] = df['article_id_str'].map(image_path_dict.get)\n\ndf.dropna(subset=['image_path'], inplace=True)\n\ndf.head()\n\n# image_path_dict['0108775015.jpg']","metadata":{"execution":{"iopub.status.busy":"2024-06-08T14:28:49.299645Z","iopub.execute_input":"2024-06-08T14:28:49.300328Z","iopub.status.idle":"2024-06-08T14:29:56.334851Z","shell.execute_reply.started":"2024-06-08T14:28:49.300287Z","shell.execute_reply":"2024-06-08T14:29:56.333807Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 提取圖片特徵\nfeatures_dict = {}\n\nfor idx, row in df.iterrows():\n    article_id = str(row['article_id']).zfill(10)\n    image_path = row['image_path']\n    \n    if os.path.exists(image_path):\n        features = extract_features(image_path)\n        features_dict[article_id] = features\n    else:\n        print(f\"Image not found: {image_path}\")\n        \nnp.save('features_dict.npy', features_dict)","metadata":{"execution":{"iopub.status.busy":"2024-06-08T14:33:58.194649Z","iopub.execute_input":"2024-06-08T14:33:58.195464Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def cosine_similarity(vec1, vec2):\n    return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))\n\ninput_image_path = 'path_to_input_image.jpg'  \ninput_features = extract_features(input_image_path)\n\nfeatures_dict = np.load('features_dict.npy', allow_pickle=True).item()\n\n# calculate similarity\nsimilarities = {}\nfor article_id, features in features_dict.items():\n    similarity = cosine_similarity(input_features, features)\n    similarities[article_id] = similarity\n\n# find most similar image\nmost_similar_article_id = max(similarities, key=similarities.get)\nprint(f'Most similar article ID: {most_similar_article_id}, Similarity: {similarities[most_similar_article_id]}')\n\n\nrecommended_product = df[df['article_id'] == int(most_similar_article_id)]\nprint(recommended_product)\n","metadata":{},"execution_count":null,"outputs":[]}]}