{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Setup","metadata":{}},{"cell_type":"code","source":"if False:\n    !pip install cloud-tpu-client==0.10 https://storage.googleapis.com/tpu-pytorch/wheels/torch_xla-1.7-cp37-cp37m-linux_x86_64.whl\n    import torch_xla\n    import torch_xla.core.xla_model as xm","metadata":{"execution":{"iopub.status.busy":"2022-06-06T19:18:47.191910Z","iopub.execute_input":"2022-06-06T19:18:47.192452Z","iopub.status.idle":"2022-06-06T19:18:47.197233Z","shell.execute_reply.started":"2022-06-06T19:18:47.192414Z","shell.execute_reply":"2022-06-06T19:18:47.196264Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nsys.path.append('../input/hotel-id-starter-similarity-training/pytorch-image-models/')\nsys.path.append('../input/timm-pretrained-efficientnet/efficientnet/')","metadata":{"executionInfo":{"elapsed":16271,"status":"ok","timestamp":1619310548121,"user":{"displayName":"Jeom Jin-Ho","photoUrl":"","userId":"00155613517919499503"},"user_tz":-120},"id":"alleged-legislation","outputId":"c6541e5f-ffb4-4609-d6c6-39784e6a07b1","papermill":{"duration":0.036572,"end_time":"2022-03-24T14:00:54.649254","exception":false,"start_time":"2022-03-24T14:00:54.612682","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:47.504798Z","iopub.execute_input":"2022-06-06T19:18:47.505484Z","iopub.status.idle":"2022-06-06T19:18:47.509747Z","shell.execute_reply.started":"2022-06-06T19:18:47.505449Z","shell.execute_reply":"2022-06-06T19:18:47.509053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Imports","metadata":{"id":"cZoSOL9Qm-Yr","papermill":{"duration":0.023644,"end_time":"2022-03-24T14:00:54.696898","exception":false,"start_time":"2022-03-24T14:00:54.673254","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport random\nimport os\nimport math\n\n!mkdir -p /root/.cache/torch/hub/checkpoints/\n!cp '../input/timm-pretrained-efficientnet/efficientnet/efficientnet_b1-533bc792.pth' '/root/.cache/torch/hub/checkpoints/efficientnet_b1-533bc792.pth'","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","executionInfo":{"elapsed":14459,"status":"ok","timestamp":1619310548121,"user":{"displayName":"Jeom Jin-Ho","photoUrl":"","userId":"00155613517919499503"},"user_tz":-120},"id":"expired-matter","papermill":{"duration":0.030271,"end_time":"2022-03-24T14:00:54.751131","exception":false,"start_time":"2022-03-24T14:00:54.72086","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:47.682058Z","iopub.execute_input":"2022-06-06T19:18:47.682644Z","iopub.status.idle":"2022-06-06T19:18:49.762328Z","shell.execute_reply.started":"2022-06-06T19:18:47.682602Z","shell.execute_reply":"2022-06-06T19:18:49.761402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image as pil_image\nfrom tqdm import tqdm","metadata":{"executionInfo":{"elapsed":16003,"status":"ok","timestamp":1619310550014,"user":{"displayName":"Jeom Jin-Ho","photoUrl":"","userId":"00155613517919499503"},"user_tz":-120},"id":"extreme-problem","papermill":{"duration":3.220402,"end_time":"2022-03-24T14:00:57.995239","exception":false,"start_time":"2022-03-24T14:00:54.774837","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:49.765537Z","iopub.execute_input":"2022-06-06T19:18:49.765760Z","iopub.status.idle":"2022-06-06T19:18:49.769398Z","shell.execute_reply.started":"2022-06-06T19:18:49.765734Z","shell.execute_reply":"2022-06-06T19:18:49.768708Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nfrom torch.utils.data import DataLoader\n\nimport timm\nfrom sklearn.metrics.pairwise import cosine_similarity","metadata":{"executionInfo":{"elapsed":19672,"status":"ok","timestamp":1619310554099,"user":{"displayName":"Jeom Jin-Ho","photoUrl":"","userId":"00155613517919499503"},"user_tz":-120},"id":"angry-domain","papermill":{"duration":2.727834,"end_time":"2022-03-24T14:01:00.766951","exception":false,"start_time":"2022-03-24T14:00:58.039117","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:49.770741Z","iopub.execute_input":"2022-06-06T19:18:49.771539Z","iopub.status.idle":"2022-06-06T19:18:54.103589Z","shell.execute_reply.started":"2022-06-06T19:18:49.771503Z","shell.execute_reply":"2022-06-06T19:18:54.102787Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Global","metadata":{"id":"0B00pe7mnBTj","papermill":{"duration":0.023573,"end_time":"2022-03-24T14:01:00.814976","exception":false,"start_time":"2022-03-24T14:01:00.791403","status":"completed"},"tags":[]}},{"cell_type":"code","source":"SEED = 42\nIMG_SIZE = 512 #256\nN_MATCHES = 5\n\nPROJECT_FOLDER = \"../input/hotel-id-to-combat-human-trafficking-2022-fgvc9/\"\nTRAIN_DATA_FOLDER = f\"../input/hotelid-2022-train-images-{IMG_SIZE}x{IMG_SIZE}/images/\"\nTEST_DATA_FOLDER = PROJECT_FOLDER + \"test_images/\"","metadata":{"executionInfo":{"elapsed":589,"status":"ok","timestamp":1619310979015,"user":{"displayName":"Jeom Jin-Ho","photoUrl":"","userId":"00155613517919499503"},"user_tz":-120},"id":"contained-brief","papermill":{"duration":0.03175,"end_time":"2022-03-24T14:01:00.871686","exception":false,"start_time":"2022-03-24T14:01:00.839936","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:54.105876Z","iopub.execute_input":"2022-06-06T19:18:54.106135Z","iopub.status.idle":"2022-06-06T19:18:54.112672Z","shell.execute_reply.started":"2022-06-06T19:18:54.106099Z","shell.execute_reply":"2022-06-06T19:18:54.112068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(os.listdir(PROJECT_FOLDER))","metadata":{"executionInfo":{"elapsed":879,"status":"ok","timestamp":1619310979515,"user":{"displayName":"Jeom Jin-Ho","photoUrl":"","userId":"00155613517919499503"},"user_tz":-120},"id":"PZvmFng7ctO3","outputId":"dce0cc91-8e70-4acc-a0b8-6763ffffd5ca","papermill":{"duration":0.031651,"end_time":"2022-03-24T14:01:00.927239","exception":false,"start_time":"2022-03-24T14:01:00.895588","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:54.113745Z","iopub.execute_input":"2022-06-06T19:18:54.114009Z","iopub.status.idle":"2022-06-06T19:18:54.126624Z","shell.execute_reply.started":"2022-06-06T19:18:54.113974Z","shell.execute_reply":"2022-06-06T19:18:54.125750Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def seed_everything(seed):\n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = True","metadata":{"executionInfo":{"elapsed":600,"status":"ok","timestamp":1619310981653,"user":{"displayName":"Jeom Jin-Ho","photoUrl":"","userId":"00155613517919499503"},"user_tz":-120},"id":"eastern-content","papermill":{"duration":0.032105,"end_time":"2022-03-24T14:01:01.031949","exception":false,"start_time":"2022-03-24T14:01:00.999844","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:54.128222Z","iopub.execute_input":"2022-06-06T19:18:54.128921Z","iopub.status.idle":"2022-06-06T19:18:54.135054Z","shell.execute_reply.started":"2022-06-06T19:18:54.128885Z","shell.execute_reply":"2022-06-06T19:18:54.134212Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dataset and transformations","metadata":{"id":"xaJKvvuKnW4k","papermill":{"duration":0.023988,"end_time":"2022-03-24T14:01:01.080488","exception":false,"start_time":"2022-03-24T14:01:01.0565","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import albumentations as A\nimport albumentations.pytorch as APT\nimport cv2 \n\nbase_transform = A.Compose([\n    A.ToFloat(),\n    APT.transforms.ToTensorV2(),\n])","metadata":{"executionInfo":{"elapsed":1519,"status":"ok","timestamp":1619310984075,"user":{"displayName":"Jeom Jin-Ho","photoUrl":"","userId":"00155613517919499503"},"user_tz":-120},"id":"revolutionary-membership","papermill":{"duration":0.747421,"end_time":"2022-03-24T14:01:01.852072","exception":false,"start_time":"2022-03-24T14:01:01.104651","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:54.136593Z","iopub.execute_input":"2022-06-06T19:18:54.136993Z","iopub.status.idle":"2022-06-06T19:18:55.356706Z","shell.execute_reply.started":"2022-06-06T19:18:54.136958Z","shell.execute_reply":"2022-06-06T19:18:55.355939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def pad_image(img):\n    w, h, c = np.shape(img)\n    if w > h:\n        pad = int((w - h) / 2)\n        img = cv2.copyMakeBorder(img, 0, 0, pad, pad, cv2.BORDER_CONSTANT, value=0)\n    else:\n        pad = int((h - w) / 2)\n        img = cv2.copyMakeBorder(img, pad, pad, 0, 0, cv2.BORDER_CONSTANT, value=0)\n    return img\n\ndef open_and_preprocess_image(image_path):\n    img = cv2.imread(image_path)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    img = pad_image(img)\n    return cv2.resize(img, (IMG_SIZE, IMG_SIZE))","metadata":{"execution":{"iopub.status.busy":"2022-06-06T19:18:55.358079Z","iopub.execute_input":"2022-06-06T19:18:55.358330Z","iopub.status.idle":"2022-06-06T19:18:55.364758Z","shell.execute_reply.started":"2022-06-06T19:18:55.358297Z","shell.execute_reply":"2022-06-06T19:18:55.364102Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class HotelImageDataset:\n    def __init__(self, data, transform=None, data_folder=\"train_images/\"):\n        self.data = data\n        self.data_folder = data_folder\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.data)\n    \n    def __getitem__(self, idx):\n        record = self.data.iloc[idx]\n        image_path = self.data_folder + record[\"image_id\"]\n        \n        image = np.array(open_and_preprocess_image(image_path)).astype(np.uint8)\n\n        if self.transform:\n            transformed = self.transform(image=image)\n            image = transformed[\"image\"]\n        \n        return {\n            \"image\" : image,\n        }","metadata":{"executionInfo":{"elapsed":1058,"status":"ok","timestamp":1619310984077,"user":{"displayName":"Jeom Jin-Ho","photoUrl":"","userId":"00155613517919499503"},"user_tz":-120},"id":"found-mouth","papermill":{"duration":0.037507,"end_time":"2022-03-24T14:01:01.914352","exception":false,"start_time":"2022-03-24T14:01:01.876845","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:55.366062Z","iopub.execute_input":"2022-06-06T19:18:55.366456Z","iopub.status.idle":"2022-06-06T19:18:55.376361Z","shell.execute_reply.started":"2022-06-06T19:18:55.366420Z","shell.execute_reply":"2022-06-06T19:18:55.375613Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{"id":"NMDM4PwPnced","papermill":{"duration":0.023902,"end_time":"2022-03-24T14:01:01.962307","exception":false,"start_time":"2022-03-24T14:01:01.938405","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# class EmbeddingModel(nn.Module):\n#     def __init__(self, n_classes=100, embedding_size=64, backbone_name=\"efficientnet_b0\"):\n#         super(EmbeddingModel, self).__init__()\n        \n#         self.backbone = timm.create_model(backbone_name, num_classes=n_classes, pretrained=False)\n#         in_features = self.backbone.get_classifier().in_features\n        \n#         self.backbone.classifier = nn.Identity()\n#         self.embedding = nn.Linear(in_features, embedding_size)\n#         self.classifier = nn.Linear(embedding_size, n_classes)\n\n#     def embed_and_classify(self, x):\n#         x = self.forward(x)\n#         return x, self.classifier(x)\n\n#     def forward(self, x):\n#         x = self.backbone(x)\n#         x = x.view(x.size(0), -1)\n#         x = self.embedding(x)\n#         return x\n\n# source: https://github.com/ronghuaiyang/arcface-pytorch/blob/master/models/metrics.py\nclass ArcMarginProduct(nn.Module):\n    def __init__(self, in_features, out_features, s=30.0, m=0.50, easy_margin=False):\n        super(ArcMarginProduct, self).__init__()\n        self.in_features = in_features\n        self.out_features = out_features\n        self.s = s\n        self.m = m\n        self.weight = nn.Parameter(torch.FloatTensor(out_features, in_features))\n        nn.init.xavier_uniform_(self.weight)\n\n        self.easy_margin = easy_margin\n        self.cos_m = math.cos(m)\n        self.sin_m = math.sin(m)\n        self.th = math.cos(math.pi-m)\n        self.mm = math.sin(math.pi-m)*m\n\n    def forward(self, input, label):\n        # --------------------------- cos(theta) & phi(theta) ---------------------------\n        cosine = F.linear(F.normalize(input), F.normalize(self.weight))\n        sine = torch.sqrt((1.0-torch.pow(cosine, 2)).clamp(0, 1))\n        phi = cosine*self.cos_m-sine*self.sin_m\n        if self.easy_margin:\n            phi = torch.where(cosine>0, phi, cosine)\n        else:\n            phi = torch.where(cosine>self.th, phi, cosine-self.mm)\n        # --------------------------- convert label to one-hot ---------------------------\n        one_hot = torch.zeros(cosine.size(), device=args.device)\n        one_hot.scatter_(1, label.view(-1, 1).long(), 1)\n        # -------------torch.where(out_i = {x_i if condition_i else y_i) -------------\n        output = (one_hot*phi)+((1.0-one_hot)*cosine)\n        output *= self.s\n\n        return output\n\nclass EmbeddingModel(nn.Module):\n    def __init__(self, out_features=100, embed_size=256, backbone_name=\"efficientnet_b1\"):\n        super(EmbeddingModel, self).__init__()\n\n        self.embed_size = embed_size\n        self.backbone = timm.create_model(backbone_name, pretrained=True)\n        in_features = self.backbone.get_classifier().in_features\n        self.embedding = nn.Linear(in_features, embed_size)\n        self.classifier = nn.Linear(embed_size, out_features)\n\n        '''fc_name, _ = list(self.backbone.named_modules())[-1]\n        if fc_name == 'classifier':\n            self.backbone.classifier = nn.Identity()\n        elif fc_name == 'head.fc':\n            self.backbone.head.fc = nn.Identity()\n        elif fc_name == 'fc':\n            self.backbone.fc = nn.Identity()\n        else:\n            raise Exception(\"unknown classifier layer: \"+fc_name)'''\n        self.backbone.classifier = nn.Identity()\n\n        self.arc_face = ArcMarginProduct(self.embed_size, out_features, s=30.0, m=0.20, easy_margin=False)\n\n        self.post = nn.Sequential(\n            nn.utils.weight_norm(nn.Linear(in_features, self.embed_size*2), dim=None),\n            nn.BatchNorm1d(self.embed_size*2),\n            nn.Dropout(0.2),\n            nn.utils.weight_norm(nn.Linear(self.embed_size*2, self.embed_size)),\n            nn.BatchNorm1d(self.embed_size),\n        )\n\n        print(f\"Model {backbone_name} ArcMarginProduct - Features: {in_features}, Embeds: {self.embed_size}\")\n        \n    def embed_and_classify(self, x):\n        x = self.forward(x)\n        return x, self.classifier(x)\n    \n    def forward(self, input, targets=None):\n        x = self.backbone(input)\n        x = x.view(x.size(0), -1)\n        x = self.embedding(x) #self.post(x)\n        \n        if targets is not None:\n            logits = self.arc_face(x, targets)\n            return x, logits\n        \n        return x","metadata":{"papermill":{"duration":0.032166,"end_time":"2022-03-24T14:01:02.018479","exception":false,"start_time":"2022-03-24T14:01:01.986313","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:55.380420Z","iopub.execute_input":"2022-06-06T19:18:55.380604Z","iopub.status.idle":"2022-06-06T19:18:55.400103Z","shell.execute_reply.started":"2022-06-06T19:18:55.380581Z","shell.execute_reply":"2022-06-06T19:18:55.399360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model helper functions","metadata":{"id":"YMZYKhUSneMY","papermill":{"duration":0.024153,"end_time":"2022-03-24T14:01:02.067537","exception":false,"start_time":"2022-03-24T14:01:02.043384","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def generate_embeddings(args, loader, model, bar_desc=\"Generating embeds\"):\n    outputs_all = []\n    \n    model.eval()\n    with torch.no_grad():\n        t = tqdm(loader, desc=bar_desc)\n        for i, sample in enumerate(t):\n            input = sample['image'].to(args.device)\n            output = model(input)\n            outputs_all.extend(output.detach().cpu().numpy())\n            \n    return outputs_all","metadata":{"execution":{"iopub.status.busy":"2022-06-06T19:18:55.402154Z","iopub.execute_input":"2022-06-06T19:18:55.403075Z","iopub.status.idle":"2022-06-06T19:18:55.412746Z","shell.execute_reply.started":"2022-06-06T19:18:55.403018Z","shell.execute_reply":"2022-06-06T19:18:55.411857Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def find_matches_agg(query, base_embeds, base_targets, k=N_MATCHES, expfrom=30, topk=100):\n    distance_df = pd.DataFrame(index=np.arange(len(base_targets)), data={\"hotel_id\": base_targets})\n    # calculate cosine distance of query embeds to all base embeds\n    distance_df[\"distance\"] = cosine_similarity([query], list(base_embeds))[0]\n    # sort by distance and hotel_id\n    distance_df = distance_df.sort_values(by=[\"distance\", \"hotel_id\"], ascending=False).reset_index(drop=True)\n    distance_df = distance_df[:topk]\n    distance_df['rankscore'] = np.exp(np.linspace(expfrom,0,topk))/np.exp(expfrom) * np.maximum(0, distance_df[\"distance\"])\n    hotel_rankscore = distance_df.groupby('hotel_id')['rankscore'].agg(['sum', 'count'])\n    hotel_rankscore = hotel_rankscore.sort_values(by=[\"sum\"], ascending=False).reset_index()\n    return hotel_rankscore[\"hotel_id\"].values[:N_MATCHES]\n    \ndef find_matches(query, base_embeds, base_targets, k=N_MATCHES):\n    distance_df = pd.DataFrame(index=np.arange(len(base_targets)), data={\"hotel_id\": base_targets})\n    # calculate cosine distance of query embeds to all base embeds\n    distance_df[\"distance\"] = cosine_similarity([query], list(base_embeds))[0]\n    # sort by distance and hotel_id\n    distance_df = distance_df.sort_values(by=[\"distance\", \"hotel_id\"], ascending=False).reset_index(drop=True)\n    # return first 5 different hotel_id_codes\n    return distance_df[\"hotel_id\"].unique()[:N_MATCHES]\n\n\ndef predict(args, base_embeddings_df, test_loader, model):\n    test_embeds = generate_embeddings(args, test_loader, model, \"Generate test embeddings\")\n    \n    preds = []\n    for query_embeds in tqdm(test_embeds, desc=\"Similarity - match finding\"):\n        tmp = find_matches(query_embeds, \n                           base_embeddings_df[\"embeddings\"].values, \n                           base_embeddings_df[\"hotel_id\"].values)\n        preds.extend([tmp])\n        \n    return preds","metadata":{"papermill":{"duration":0.034692,"end_time":"2022-03-24T14:01:02.127372","exception":false,"start_time":"2022-03-24T14:01:02.09268","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:55.414338Z","iopub.execute_input":"2022-06-06T19:18:55.414609Z","iopub.status.idle":"2022-06-06T19:18:55.429044Z","shell.execute_reply.started":"2022-06-06T19:18:55.414573Z","shell.execute_reply":"2022-06-06T19:18:55.428307Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prepare data","metadata":{"id":"AwShW1wXniD6","papermill":{"duration":0.023807,"end_time":"2022-03-24T14:01:02.175822","exception":false,"start_time":"2022-03-24T14:01:02.152015","status":"completed"},"tags":[]}},{"cell_type":"code","source":"test_df = pd.DataFrame(data={\"image_id\": os.listdir(TEST_DATA_FOLDER), \"hotel_id\": \"\"}).sort_values(by=\"image_id\")","metadata":{"executionInfo":{"elapsed":3742,"status":"ok","timestamp":1619311036476,"user":{"displayName":"Jeom Jin-Ho","photoUrl":"","userId":"00155613517919499503"},"user_tz":-120},"id":"discrete-right","outputId":"c21ed589-3139-4919-b5d5-07bcf6f1df15","papermill":{"duration":0.103381,"end_time":"2022-03-24T14:01:02.453866","exception":false,"start_time":"2022-03-24T14:01:02.350485","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:57.872451Z","iopub.execute_input":"2022-06-06T19:18:57.873020Z","iopub.status.idle":"2022-06-06T19:18:57.887913Z","shell.execute_reply.started":"2022-06-06T19:18:57.872980Z","shell.execute_reply":"2022-06-06T19:18:57.887231Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prepare model","metadata":{"id":"5JPdD2bpnniP","papermill":{"duration":0.023835,"end_time":"2022-03-24T14:01:02.502786","exception":false,"start_time":"2022-03-24T14:01:02.478951","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def get_model(backbone_name, checkpoint_path, args):\n    model = EmbeddingModel(args.n_classes, args.embedding_size, backbone_name)\n        \n    checkpoint = torch.load(checkpoint_path, map_location=torch.device('cpu'))\n    model.load_state_dict(checkpoint[\"model\"])\n    model = model.to(args.device)\n    \n    return model","metadata":{"papermill":{"duration":0.031082,"end_time":"2022-03-24T14:01:02.557921","exception":false,"start_time":"2022-03-24T14:01:02.526839","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:58.829073Z","iopub.execute_input":"2022-06-06T19:18:58.829623Z","iopub.status.idle":"2022-06-06T19:18:58.835256Z","shell.execute_reply.started":"2022-06-06T19:18:58.829584Z","shell.execute_reply":"2022-06-06T19:18:58.834026Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class args:\n    batch_size = 4 #64\n    num_workers = 2\n    embedding_size = 256 #128\n    device = ('cuda' if torch.cuda.is_available() else 'cpu')\n\nseed_everything(seed=SEED)\n\ntest_dataset = HotelImageDataset(test_df, base_transform, data_folder=TEST_DATA_FOLDER)\ntest_loader  = DataLoader(test_dataset, num_workers=args.num_workers, batch_size=args.batch_size, shuffle=False)","metadata":{"executionInfo":{"elapsed":450,"status":"ok","timestamp":1619311064188,"user":{"displayName":"Jeom Jin-Ho","photoUrl":"","userId":"00155613517919499503"},"user_tz":-120},"id":"appointed-machinery","papermill":{"duration":0.069839,"end_time":"2022-03-24T14:01:02.65177","exception":false,"start_time":"2022-03-24T14:01:02.581931","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:18:59.493251Z","iopub.execute_input":"2022-06-06T19:18:59.493892Z","iopub.status.idle":"2022-06-06T19:18:59.562695Z","shell.execute_reply.started":"2022-06-06T19:18:59.493849Z","shell.execute_reply":"2022-06-06T19:18:59.561731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from glob import glob \nepoch = 8\n# run_dir = \"hotel-id-starter-similarity-training\"\nrun_dir = \"argfacecheckpoints\"\n# run_dir = \"clawsctadawfbnetc-100\"\n# run_dir = \"hotel-id-2022-tpu-cpu-conversion\"\n# run_dir = \"dataset-hotelid-2022-tpucpu-conversion\"\n\n# backbone_name = \"efficientnet_b0\"\nbackbone_name = \"efficientnet_b1\"\n#backbone_name = \"fbnetc_100\"\ncheckpointfile = glob(f\"../input/{run_dir}/checkpoint-embedding-model-{backbone_name}-{IMG_SIZE}x{IMG_SIZE}/epoch{epoch}_*\")[0]\nprint(checkpointfile)\nbase_embeddings_df = pd.read_pickle(f'../input/{run_dir}/embedding-model-{backbone_name}-{IMG_SIZE}x{IMG_SIZE}_image-embeddings/epoch{epoch}.pkl')","metadata":{"execution":{"iopub.status.busy":"2022-06-06T19:19:02.557423Z","iopub.execute_input":"2022-06-06T19:19:02.558077Z","iopub.status.idle":"2022-06-06T19:19:03.451642Z","shell.execute_reply.started":"2022-06-06T19:19:02.558039Z","shell.execute_reply":"2022-06-06T19:19:03.450913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"args.n_classes = base_embeddings_df[\"hotel_id\"].nunique()","metadata":{"papermill":{"duration":5.553999,"end_time":"2022-03-24T14:01:08.229948","exception":false,"start_time":"2022-03-24T14:01:02.675949","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:03:25.895000Z","iopub.execute_input":"2022-06-06T19:03:25.895772Z","iopub.status.idle":"2022-06-06T19:03:25.900684Z","shell.execute_reply.started":"2022-06-06T19:03:25.895721Z","shell.execute_reply":"2022-06-06T19:03:25.899802Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = get_model(backbone_name,checkpointfile, args)","metadata":{"papermill":{"duration":5.553999,"end_time":"2022-03-24T14:01:08.229948","exception":false,"start_time":"2022-03-24T14:01:02.675949","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:03:27.640516Z","iopub.execute_input":"2022-06-06T19:03:27.640813Z","iopub.status.idle":"2022-06-06T19:03:29.763288Z","shell.execute_reply.started":"2022-06-06T19:03:27.640779Z","shell.execute_reply":"2022-06-06T19:03:29.762599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{"papermill":{"duration":0.024227,"end_time":"2022-03-24T14:01:08.278753","exception":false,"start_time":"2022-03-24T14:01:08.254526","status":"completed"},"tags":[]}},{"cell_type":"code","source":"%%time\n\npreds = predict(args, base_embeddings_df, test_loader, model)\n# transform array of hotel_ids into string\ntest_df[\"hotel_id\"] = [str(list(l)).strip(\"[]\").replace(\",\", \"\") for l in preds]\n\ntest_df.to_csv(\"submission.csv\", index=False)\ntest_df.head()","metadata":{"papermill":{"duration":0.047156,"end_time":"2022-03-24T14:01:08.414557","exception":false,"start_time":"2022-03-24T14:01:08.367401","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-06T19:07:45.423209Z","iopub.execute_input":"2022-06-06T19:07:45.424031Z","iopub.status.idle":"2022-06-06T19:07:46.072864Z","shell.execute_reply.started":"2022-06-06T19:07:45.423979Z","shell.execute_reply":"2022-06-06T19:07:46.071781Z"},"trusted":true},"execution_count":null,"outputs":[]}]}