{"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":"code","source":"import os \nimport gc\nimport cv2\nimport glob\nimport random\nimport numpy as np\nimport pandas as pd\nfrom pathlib import Path\nfrom tqdm.notebook import tqdm\nimport matplotlib.pyplot as plt\nfrom collections import OrderedDict\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import StratifiedKFold\n\nimport timm\nimport torch\nimport torch.nn as nn\nfrom torch.cuda import amp\nfrom torch.utils.data import Dataset, DataLoader\nfrom torch.optim.lr_scheduler import CosineAnnealingWarmRestarts\n\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2","metadata":{"execution":{"iopub.status.busy":"2023-06-05T17:44:45.079943Z","iopub.execute_input":"2023-06-05T17:44:45.080295Z","iopub.status.idle":"2023-06-05T17:44:51.201706Z","shell.execute_reply.started":"2023-06-05T17:44:45.080264Z","shell.execute_reply":"2023-06-05T17:44:51.200744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# timm.list_models()","metadata":{"execution":{"iopub.status.busy":"2023-06-05T17:44:51.203507Z","iopub.execute_input":"2023-06-05T17:44:51.203895Z","iopub.status.idle":"2023-06-05T17:44:51.208451Z","shell.execute_reply.started":"2023-06-05T17:44:51.203853Z","shell.execute_reply":"2023-06-05T17:44:51.207485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Configurations","metadata":{}},{"cell_type":"code","source":"class cfg:\n    data_path = \"/kaggle/input/extracting-attributes-from-fashion-images-2/\"\n    sc_path = \"/kaggle/input/sc-test-data/\"\n    img_size1 = (384, 512)\n    img_size2 = (384, 384)\n    num_classes = 7\n    bs = 64\n    ls = 0.1\n    cls_drop=0.1\n    epochs = 5\n    lr = 1e-4\n    wd = 1e-2","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:14:21.351116Z","iopub.execute_input":"2023-06-05T18:14:21.351506Z","iopub.status.idle":"2023-06-05T18:14:21.357716Z","shell.execute_reply.started":"2023-06-05T18:14:21.351473Z","shell.execute_reply":"2023-06-05T18:14:21.356571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv(cfg.data_path+\"train.csv\")\ndisplay(df_train.head())\nprint(f\"Number of Train samples: {df_train.shape[0]}\")","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:14:21.579963Z","iopub.execute_input":"2023-06-05T18:14:21.580269Z","iopub.status.idle":"2023-06-05T18:14:21.621553Z","shell.execute_reply.started":"2023-06-05T18:14:21.580241Z","shell.execute_reply":"2023-06-05T18:14:21.620486Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_img_dirs = sorted(glob.glob(cfg.data_path+\"test/*\"))\ncfg.test_img_dirs = test_img_dirs\nprint(f\"Number of Test samples: {len(test_img_dirs)}\")","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:14:21.796295Z","iopub.execute_input":"2023-06-05T18:14:21.796702Z","iopub.status.idle":"2023-06-05T18:14:21.826739Z","shell.execute_reply.started":"2023-06-05T18:14:21.796666Z","shell.execute_reply":"2023-06-05T18:14:21.825819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Sample Images","metadata":{}},{"cell_type":"code","source":"sample_images = []\nnum_rows = 2 \nnum_cols = 4\nfor i in range(0,7):\n    df_subset = df_train[df_train['label']==i] \n    img = cv2.imread(os.path.join(cfg.data_path+\"train\",df_subset.file_name.values[0]))\n    sample_images.append(img)\n\nfig, axes = plt.subplots(num_rows, num_cols, figsize=(12, 8))\naxes = axes.flatten()\n\nfor i in range(len(sample_images)):\n    axes[i].imshow(cv2.cvtColor(sample_images[i], cv2.COLOR_BGR2RGB))\n    axes[i].set_title(f\"Label {i}\")\n    axes[i].axis(\"off\")\n    \nif len(sample_images) < num_rows * num_cols:\n    axes[-1].axis(\"off\")\n\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:14:22.939072Z","iopub.execute_input":"2023-06-05T18:14:22.939468Z","iopub.status.idle":"2023-06-05T18:14:24.204289Z","shell.execute_reply.started":"2023-06-05T18:14:22.939432Z","shell.execute_reply":"2023-06-05T18:14:24.203480Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dataset","metadata":{}},{"cell_type":"code","source":"class FashionDataset(Dataset):\n    def __init__(self, img_size, train=False):\n        super().__init__()\n        self.train=train\n        self.img_dirs = cfg.test_img_dirs \n            \n        self.train_transform = A.Compose([\n            A.OneOf([\n#                 A.VerticalFlip(p=0.5),  \n                A.HorizontalFlip(p=0.5) \n            ]),\n            A.augmentations.transforms.ChannelShuffle(),\n            A.augmentations.dropout.coarse_dropout.CoarseDropout(max_holes=7, max_height=32, max_width=32, p=0.25),\n            A.RandomBrightnessContrast(p=0.2, brightness_by_max=False),\n            ToTensorV2()\n        ])\n        \n        self.test_transform = A.Compose([ \n            A.augmentations.geometric.resize.Resize(height=img_size[1], width=img_size[0], always_apply=True),\n            ToTensorV2()\n        ])\n\n\n            \n            \n    def __len__(self):\n        return len(self.img_dirs) \n    \n    def __getitem__(self,idx):\n        img_dir = self.img_dirs[idx]\n        \n        img = cv2.imread(img_dir)\n        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n        img = img/255.0\n        \n        if self.train:\n            img = self.train_transform(image=img)['image'].float()\n        else:\n            img = self.test_transform(image=img)['image'].float()\n        \n        return img\n","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:14:24.206200Z","iopub.execute_input":"2023-06-05T18:14:24.206841Z","iopub.status.idle":"2023-06-05T18:14:24.219478Z","shell.execute_reply.started":"2023-06-05T18:14:24.206794Z","shell.execute_reply":"2023-06-05T18:14:24.218656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset1 = FashionDataset(cfg.img_size1)\ntest_loader1 = DataLoader(test_dataset1, batch_size=cfg.bs*2, num_workers=2, shuffle=False)\ntest_dataset2 = FashionDataset(cfg.img_size2)\ntest_loader2 = DataLoader(test_dataset2, batch_size=cfg.bs*2, num_workers=2, shuffle=False)\n\nbatch = next(iter(test_loader1))\nplt.imshow(batch[0].permute(1,2,0))\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:15:36.248856Z","iopub.execute_input":"2023-06-05T18:15:36.249939Z","iopub.status.idle":"2023-06-05T18:15:40.974701Z","shell.execute_reply.started":"2023-06-05T18:15:36.249899Z","shell.execute_reply":"2023-06-05T18:15:40.973592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 1","metadata":{}},{"cell_type":"code","source":"class FashionModel1(nn.Module):\n    def __init__(self, num_classes=cfg.num_classes, pretrained=True):\n        super().__init__()\n        self.backbone = timm.create_model(\"convnextv2_tiny\", pretrained=pretrained)\n        self.in_features = self.backbone.head.fc.in_features\n        self.backbone.head.fc = nn.Sequential(nn.Dropout(cfg.cls_drop),\n                                              nn.Linear(self.in_features, num_classes))\n    def forward(self, x):\n        logits = self.backbone(x)\n        return logits\n        ","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:15:52.596142Z","iopub.execute_input":"2023-06-05T18:15:52.596571Z","iopub.status.idle":"2023-06-05T18:15:52.604571Z","shell.execute_reply.started":"2023-06-05T18:15:52.596510Z","shell.execute_reply":"2023-06-05T18:15:52.603516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 2","metadata":{}},{"cell_type":"code","source":"class FashionModel2(nn.Module):\n    def __init__(self, num_classes=cfg.num_classes, pretrained=True):\n        super().__init__()\n        self.backbone = timm.create_model(\"swin_base_patch4_window12_384\", pretrained=pretrained)\n        self.in_features = self.backbone.head.fc.in_features\n        self.backbone.head.fc = nn.Sequential(nn.Dropout(cfg.cls_drop),\n                                              nn.Linear(self.in_features, num_classes))        \n        \n    def forward(self, x):\n        logits = self.backbone(x)\n        return logits\n        ","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:15:53.103146Z","iopub.execute_input":"2023-06-05T18:15:53.104060Z","iopub.status.idle":"2023-06-05T18:15:53.112637Z","shell.execute_reply.started":"2023-06-05T18:15:53.104014Z","shell.execute_reply":"2023-06-05T18:15:53.111677Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predictions","metadata":{}},{"cell_type":"code","source":"##### load this way if running in cpu.\n\n# def load_model(model, ckpt):\n#     state_dict = torch.load(ckpt)\n\n#     new_state_dict = OrderedDict()\n#     for k, v in state_dict.items():\n#         name = k[7:] # remove `module.`, it's because of using nn.DataParallel in training\n#         new_state_dict[name] = v\n#     # load params\n#     model.load_state_dict(new_state_dict)\n#     return model","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:15:53.912130Z","iopub.execute_input":"2023-06-05T18:15:53.912478Z","iopub.status.idle":"2023-06-05T18:15:53.916956Z","shell.execute_reply.started":"2023-06-05T18:15:53.912448Z","shell.execute_reply":"2023-06-05T18:15:53.916002Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_ckpts = sorted(glob.glob(\"/kaggle/input/convnextv2-4folds/*.pt\")) + sorted(glob.glob(\"/kaggle/input/eafi-train/*.pt\")) \n\nfold_preds = []\nfor i, ckpt in enumerate(model_ckpts):        \n    if i<5:\n        model = FashionModel1()\n        model = nn.DataParallel(model, device_ids=[0, 1])\n        model = model.cuda()\n        model.load_state_dict(torch.load(ckpt))\n        test_loader = test_loader1\n    else:\n        model = FashionModel2()        \n        model = nn.DataParallel(model, device_ids=[0, 1])\n        model = model.cuda()\n        model.load_state_dict(torch.load(ckpt))\n        test_loader = test_loader2\n\n    test_preds = []\n    for batch in tqdm(test_loader, total=len(test_loader)):\n        model.eval()\n        with torch.no_grad():\n            preds = model(batch)\n            test_preds.append(preds.cpu().numpy())\n\n    test_preds = np.argmax(np.concatenate(test_preds), axis=-1)\n    fold_preds.append(test_preds)\n","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:17:51.095410Z","iopub.execute_input":"2023-06-05T18:17:51.096246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fold_preds = [np.argmax(np.bincount(pred)) for pred in np.array(fold_preds).transpose(1,0)]","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:17:13.778996Z","iopub.status.idle":"2023-06-05T18:17:13.779869Z","shell.execute_reply.started":"2023-06-05T18:17:13.779597Z","shell.execute_reply":"2023-06-05T18:17:13.779624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv(\"/kaggle/input/extracting-attributes-from-fashion-images-2/sample_submission.csv\")\nsub['label'] = fold_preds\nsub.to_csv('submission.csv', index=False)\nsub.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-05T18:17:13.781431Z","iopub.status.idle":"2023-06-05T18:17:13.782313Z","shell.execute_reply.started":"2023-06-05T18:17:13.782035Z","shell.execute_reply":"2023-06-05T18:17:13.782077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}