{"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":"!pip install --no-deps '../input/timm-package/timm-0.1.26-py3-none-any.whl' > /dev/null\n!pip install --no-deps '../input/pycocotools/pycocotools-2.0-cp37-cp37m-linux_x86_64.whl' > /dev/null","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-04-28T03:46:40.775535Z","iopub.execute_input":"2022-04-28T03:46:40.775928Z","iopub.status.idle":"2022-04-28T03:47:25.493999Z","shell.execute_reply.started":"2022-04-28T03:46:40.775892Z","shell.execute_reply":"2022-04-28T03:47:25.492823Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nsys.path.insert(0, \"../input/timm-efficientdet-pytorch\")\nsys.path.insert(0, \"../input/omegaconf\")\n\nimport torch\nimport os\nfrom datetime import datetime\nimport time\nimport random\nimport cv2\nimport pandas as pd\nimport numpy as np\nimport albumentations as A\nimport matplotlib.pyplot as plt\nfrom albumentations.pytorch.transforms import ToTensorV2\nfrom sklearn.model_selection import StratifiedKFold\nfrom torch.utils.data import Dataset,DataLoader\nfrom torch.utils.data.sampler import SequentialSampler, RandomSampler\nfrom glob import glob","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-04-28T03:47:25.496399Z","iopub.execute_input":"2022-04-28T03:47:25.4968Z","iopub.status.idle":"2022-04-28T03:47:27.044549Z","shell.execute_reply.started":"2022-04-28T03:47:25.496758Z","shell.execute_reply":"2022-04-28T03:47:27.043707Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import xml.etree.ElementTree as ET\n\ndef xml_to_csv():\n    xml_list = []\n    path = '../input/stanford-dogs-dataset/annotations/Annotation'\n    dirs = os.listdir(path)\n    for i in range(10):\n        idir = dirs[i]\n        if(idir != 'n02091635-otterhound' and os.path.isdir(path+'/'+idir)):\n            for xml_file in os.listdir(path+'/'+idir):\n                tree = ET.parse(path+'/'+idir+'/'+xml_file)\n                root = tree.getroot()\n                for member in root.findall('object'):\n                    bbx = member.find('bndbox')\n                    xmin = int(bbx.find('xmin').text)\n                    ymin = int(bbx.find('ymin').text)\n                    xmax = int(bbx.find('xmax').text)\n                    ymax = int(bbx.find('ymax').text)\n                    label = member.find('name').text\n\n                    value = (root.find('filename').text,\n                             int(root.find('size')[0].text),\n                             int(root.find('size')[1].text),\n                             label,\n                             xmin,\n                             ymin,\n                             xmax-xmin,\n                             ymax-ymin)\n                    xml_list.append(value)\n    column_name = ['image_id', 'width', 'height',\n                   'class', 'x', 'y', 'w', 'h']\n    xml_df = pd.DataFrame(xml_list, columns=column_name)\n    return xml_df\n    \nmarking = xml_to_csv()","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:27.045849Z","iopub.execute_input":"2022-04-28T03:47:27.046209Z","iopub.status.idle":"2022-04-28T03:47:31.009755Z","shell.execute_reply.started":"2022-04-28T03:47:27.046171Z","shell.execute_reply":"2022-04-28T03:47:31.008557Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn import preprocessing\n\n#marking = pd.read_csv('../input/custom-dataset/train.csv') #Put your training set here\n\nle = preprocessing.LabelEncoder()\n\nle.fit(marking['class'])\nprint(list(le.classes_))","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:31.011389Z","iopub.execute_input":"2022-04-28T03:47:31.012019Z","iopub.status.idle":"2022-04-28T03:47:31.020566Z","shell.execute_reply.started":"2022-04-28T03:47:31.011975Z","shell.execute_reply":"2022-04-28T03:47:31.019627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"skf = StratifiedKFold(n_splits=5, shuffle=True)\n\nmarking.loc[:, 'fold'] = 0\n\nfor fold_number, (train_index, val_index) in enumerate(skf.split(X=marking.index, y=marking['class'])):\n    marking.loc[marking.iloc[val_index].index, 'fold'] = fold_number\n    \nmarking.head()","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-04-28T03:47:31.024272Z","iopub.execute_input":"2022-04-28T03:47:31.02471Z","iopub.status.idle":"2022-04-28T03:47:31.057494Z","shell.execute_reply.started":"2022-04-28T03:47:31.024655Z","shell.execute_reply":"2022-04-28T03:47:31.056764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Albumentations","metadata":{}},{"cell_type":"code","source":"def get_train_transforms():\n    return A.Compose(\n        [\n            A.RandomSizedCrop(min_max_height=(800, 800), height=1024, width=1024, p=0.5),\n            A.OneOf([\n                A.HueSaturationValue(hue_shift_limit=0.2, sat_shift_limit= 0.2, \n                                     val_shift_limit=0.2, p=0.9),\n                A.RandomBrightnessContrast(brightness_limit=0.2, \n                                           contrast_limit=0.2, p=0.9),\n            ],p=0.9),\n            A.ToGray(p=0.01),\n            A.HorizontalFlip(p=0.5),\n            A.VerticalFlip(p=0.5),\n            A.Resize(height=512, width=512, p=1),\n            A.Cutout(num_holes=8, max_h_size=64, max_w_size=64, fill_value=0, p=0.5),\n            ToTensorV2(p=1.0),\n        ], \n        p=1.0, \n        bbox_params=A.BboxParams(\n            format='pascal_voc',\n            min_area=0, \n            min_visibility=0,\n            label_fields=['labels']\n        )\n    )\n\ndef get_valid_transforms():\n    return A.Compose(\n        [\n            A.Resize(height=512, width=512, p=1.0),\n            ToTensorV2(p=1.0),\n        ], \n        p=1.0, \n        bbox_params=A.BboxParams(\n            format='pascal_voc',\n            min_area=0, \n            min_visibility=0,\n            label_fields=['labels']\n        )\n    )","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:31.058955Z","iopub.execute_input":"2022-04-28T03:47:31.059209Z","iopub.status.idle":"2022-04-28T03:47:31.072149Z","shell.execute_reply.started":"2022-04-28T03:47:31.059184Z","shell.execute_reply":"2022-04-28T03:47:31.070985Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Dataset","metadata":{}},{"cell_type":"code","source":"TRAIN_ROOT_PATH = '../input/stanford-dogs-dataset/images/Images'\n\nclass DatasetRetriever(Dataset):\n\n    def __init__(self, marking, image_ids, transforms=None, test=False):\n        super().__init__()\n\n        self.image_ids = image_ids\n        self.marking = marking\n        self.transforms = transforms\n        self.test = test\n\n    def __getitem__(self, index: int):\n        image_id = self.image_ids.iloc[index]['image_id']\n        image, boxes, labels = self.load_image_and_boxes(index)\n\n        #labels = torch.ones((boxes.shape[0],), dtype=torch.int64)\n        labels = torch.LongTensor(labels)\n        \n        target = {}\n        target['boxes'] = boxes\n        target['labels'] = labels\n        target['image_id'] = torch.tensor([index])\n\n        if self.transforms:\n            for i in range(10):\n                sample = self.transforms(**{\n                    'image': image,\n                    'bboxes': target['boxes'],\n                    'labels': labels\n                })\n                if len(sample['bboxes']) > 0:\n                    image = sample['image']\n                    target['boxes'] = torch.stack(tuple(map(torch.tensor, zip(*sample['bboxes'])))).permute(1, 0)\n                    target['boxes'][:,[0,1,2,3]] = target['boxes'][:,[1,0,3,2]]  #yxyx: be warning\n                    break\n                    \n        return image, target, image_id\n\n    def __len__(self) -> int:\n        return self.image_ids.shape[0]\n\n    def load_image_and_boxes(self, index):\n        image_id = (self.image_ids.iloc[index]['image_id'])\n        \n        ID = image_id[:image_id.find('_')]\n        imgDir = ''\n        for dirs in os.listdir(TRAIN_ROOT_PATH):\n            if(dirs.find(ID) == 0):\n                imgDir = TRAIN_ROOT_PATH+'/'+dirs\n                \n        image = cv2.imread(f'{imgDir}/{image_id}.jpg', cv2.IMREAD_COLOR)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB).astype(np.float32)\n        image /= 255.0\n        records = self.marking[self.marking['image_id'] == image_id]\n        boxes = records[['x', 'y', 'w', 'h']].values\n        boxes[:, 2] = boxes[:, 0] + boxes[:, 2]\n        boxes[:, 3] = boxes[:, 1] + boxes[:, 3]\n        labels = le.transform(records['class'])\n        return image, boxes, labels","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:31.073757Z","iopub.execute_input":"2022-04-28T03:47:31.074431Z","iopub.status.idle":"2022-04-28T03:47:31.096542Z","shell.execute_reply.started":"2022-04-28T03:47:31.074389Z","shell.execute_reply":"2022-04-28T03:47:31.095715Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fold_number = 0\n\ntrain_dataset = DatasetRetriever(\n    image_ids=marking[marking['fold'] != fold_number],\n    marking=marking,\n    transforms=get_valid_transforms(),\n    test=False,)\n\nvalidation_dataset = DatasetRetriever(\n    image_ids=marking[marking['fold'] == fold_number],\n    marking=marking,\n    transforms=get_valid_transforms(),\n    test=True,)","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:31.098092Z","iopub.execute_input":"2022-04-28T03:47:31.098505Z","iopub.status.idle":"2022-04-28T03:47:31.110962Z","shell.execute_reply.started":"2022-04-28T03:47:31.098464Z","shell.execute_reply":"2022-04-28T03:47:31.110061Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image, target, image_id = train_dataset[1000]\nboxes = target['boxes'].cpu().numpy().astype(np.int32)\n\ncolors = [(x*0.5,y*0.5,z*0.5) for x in range(3) for y in range(3) for z in range(3)]\ncolors = colors[1::] #We don't take (0, 0, 0)\nlabels = target['labels'].cpu().numpy().astype(np.int32)\n\nnumpy_image = image.permute(1,2,0).cpu().numpy()\n\nfig, ax = plt.subplots(1, 1, figsize=(16, 8))\n\nfor i in range(len(boxes)):\n    cv2.rectangle(numpy_image, (boxes[i][1], boxes[i][0]), (boxes[i][3],  boxes[i][2]), colors[labels[i]], 2)\n    \nax.set_axis_off()\nax.imshow(numpy_image)","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:31.112644Z","iopub.execute_input":"2022-04-28T03:47:31.113026Z","iopub.status.idle":"2022-04-28T03:47:31.345136Z","shell.execute_reply.started":"2022-04-28T03:47:31.112986Z","shell.execute_reply":"2022-04-28T03:47:31.341284Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Fitter","metadata":{}},{"cell_type":"code","source":"class AverageMeter(object):\n    \"\"\"Computes and stores the average and current value\"\"\"\n    def __init__(self):\n        self.reset()\n\n    def reset(self):\n        self.val = 0\n        self.avg = 0\n        self.sum = 0\n        self.count = 0\n\n    def update(self, val, n=1):\n        self.val = val\n        self.sum += val * n\n        self.count += n\n        self.avg = self.sum / self.count","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:31.346298Z","iopub.execute_input":"2022-04-28T03:47:31.346671Z","iopub.status.idle":"2022-04-28T03:47:31.35402Z","shell.execute_reply.started":"2022-04-28T03:47:31.346633Z","shell.execute_reply":"2022-04-28T03:47:31.353184Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import warnings\n\nwarnings.filterwarnings(\"ignore\")\n\nclass Fitter:\n    \n    def __init__(self, model, device, config):\n        self.config = config\n        self.epoch = 0\n\n        self.base_dir = f'./{config.folder}'\n        if not os.path.exists(self.base_dir):\n            os.makedirs(self.base_dir)\n        \n        self.log_path = f'{self.base_dir}/log.txt'\n        self.best_summary_loss = 10**5\n\n        self.model = model\n        self.device = device\n\n        param_optimizer = list(self.model.named_parameters())\n        no_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight']\n        optimizer_grouped_parameters = [\n            {'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)], 'weight_decay': 0.001},\n            {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0}\n        ] \n\n        self.optimizer = torch.optim.AdamW(self.model.parameters(), lr=config.lr)\n        self.scheduler = config.SchedulerClass(self.optimizer, **config.scheduler_params)\n        self.log(f'Fitter prepared. Device is {self.device}')\n\n    def fit(self, train_loader, validation_loader):\n        for e in range(self.config.n_epochs):\n            if self.config.verbose:\n                lr = self.optimizer.param_groups[0]['lr']\n                timestamp = datetime.utcnow().isoformat()\n                self.log(f'\\n{timestamp}\\nLR: {lr}')\n\n            t = time.time()\n            summary_loss = self.train_one_epoch(train_loader)\n\n            self.log(f'[RESULT]: Train. Epoch: {self.epoch}, summary_loss: {summary_loss.avg:.5f}, time: {(time.time() - t):.5f}')\n            self.save(f'{self.base_dir}/last-checkpoint.bin')\n\n            t = time.time()\n            summary_loss = self.validation(validation_loader)\n\n            self.log(f'[RESULT]: Val. Epoch: {self.epoch}, summary_loss: {summary_loss.avg:.5f}, time: {(time.time() - t):.5f}')\n            if summary_loss.avg < self.best_summary_loss:\n                self.best_summary_loss = summary_loss.avg\n                self.model.eval()\n                self.save(f'{self.base_dir}/best-checkpoint-{str(self.epoch).zfill(3)}epoch.bin')\n                for path in sorted(glob(f'{self.base_dir}/best-checkpoint-*epoch.bin'))[:-3]:\n                    os.remove(path)\n\n            if self.config.validation_scheduler:\n                self.scheduler.step(metrics=summary_loss.avg)\n\n            self.epoch += 1\n\n    def validation(self, val_loader):\n        self.model.eval()\n        summary_loss = AverageMeter()\n        t = time.time()\n        for step, (images, targets, image_ids) in enumerate(val_loader):\n            if self.config.verbose:\n                if step % self.config.verbose_step == 0:\n                    print(\n                        f'Val Step {step}/{len(val_loader)}, ' + \\\n                        f'summary_loss: {summary_loss.avg:.5f}, ' + \\\n                        f'time: {(time.time() - t):.5f}', end='\\r'\n                    )\n            with torch.no_grad():\n                images = torch.stack(images)\n                batch_size = images.shape[0]\n                images = images.to(self.device).float()\n                boxes = [target['boxes'].to(self.device).float() for target in targets]\n                labels = [target['labels'].to(self.device).float() for target in targets]\n\n                loss, _, _ = self.model(images, boxes, labels)\n                summary_loss.update(loss.detach().item(), batch_size)\n\n        return summary_loss\n\n    def train_one_epoch(self, train_loader):\n        self.model.train()\n        summary_loss = AverageMeter()\n        t = time.time()\n        for step, (images, targets, image_ids) in enumerate(train_loader):\n            if self.config.verbose:\n                if step % self.config.verbose_step == 0:\n                    print(\n                        f'Train Step {step}/{len(train_loader)}, ' + \\\n                        f'summary_loss: {summary_loss.avg:.5f}, ' + \\\n                        f'time: {(time.time() - t):.5f}', end='\\r'\n                    )\n            \n            images = torch.stack(images)\n            images = images.to(self.device).float()\n            batch_size = images.shape[0]\n            boxes = [target['boxes'].to(self.device).float() for target in targets]\n            labels = [target['labels'].to(self.device).float() for target in targets]\n\n            self.optimizer.zero_grad()\n            \n            loss, _, _ = self.model(images, boxes, labels)\n            \n            loss.backward()\n\n            summary_loss.update(loss.detach().item(), batch_size)\n\n            self.optimizer.step()\n\n            if self.config.step_scheduler:\n                self.scheduler.step()\n\n        return summary_loss\n    \n    def save(self, path):\n        self.model.eval()\n        torch.save({\n            'model_state_dict': self.model.model.state_dict(),\n            'optimizer_state_dict': self.optimizer.state_dict(),\n            'scheduler_state_dict': self.scheduler.state_dict(),\n            'best_summary_loss': self.best_summary_loss,\n            'epoch': self.epoch,\n        }, path)\n\n    def load(self, path):\n        checkpoint = torch.load(path)\n        self.model.model.load_state_dict(checkpoint['model_state_dict'])\n        self.optimizer.load_state_dict(checkpoint['optimizer_state_dict'])\n        self.scheduler.load_state_dict(checkpoint['scheduler_state_dict'])\n        self.best_summary_loss = checkpoint['best_summary_loss']\n        self.epoch = checkpoint['epoch'] + 1\n        \n    def log(self, message):\n        if self.config.verbose:\n            print(message)\n        with open(self.log_path, 'a+') as logger:\n            logger.write(f'{message}\\n')","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:31.355817Z","iopub.execute_input":"2022-04-28T03:47:31.356541Z","iopub.status.idle":"2022-04-28T03:47:31.398165Z","shell.execute_reply.started":"2022-04-28T03:47:31.356497Z","shell.execute_reply":"2022-04-28T03:47:31.39741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TrainGlobalConfig:\n    num_workers = 2\n    batch_size = 4 \n    n_epochs = 30 # n_epochs = 40\n    lr = 0.0002\n\n    folder = 'effdet5-cutmix-augmix'\n\n    # -------------------\n    verbose = True\n    verbose_step = 1\n    # -------------------\n\n    # --------------------\n    step_scheduler = False  # do scheduler.step after optimizer.step\n    validation_scheduler = True  # do scheduler.step after validation stage loss\n    \n    SchedulerClass = torch.optim.lr_scheduler.ReduceLROnPlateau\n    scheduler_params = dict(\n        mode='min',\n        factor=0.5,\n        patience=1,\n        verbose=False, \n        threshold=0.0001,\n        threshold_mode='abs',\n        cooldown=0,\n        min_lr=1e-8,\n        eps=1e-08\n    )\n    # --------------------","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:31.399613Z","iopub.execute_input":"2022-04-28T03:47:31.400143Z","iopub.status.idle":"2022-04-28T03:47:31.410509Z","shell.execute_reply.started":"2022-04-28T03:47:31.4001Z","shell.execute_reply":"2022-04-28T03:47:31.40963Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def collate_fn(batch):\n    return tuple(zip(*batch))\n\ndef run_training():\n    device = torch.device('cuda:0')\n    net.to(device)\n\n    train_loader = torch.utils.data.DataLoader(\n        train_dataset,\n        batch_size=TrainGlobalConfig.batch_size,\n        sampler=RandomSampler(train_dataset),\n        pin_memory=False,\n        drop_last=True,\n        num_workers=TrainGlobalConfig.num_workers,\n        collate_fn=collate_fn,\n    )\n    val_loader = torch.utils.data.DataLoader(\n        validation_dataset, \n        batch_size=TrainGlobalConfig.batch_size,\n        num_workers=TrainGlobalConfig.num_workers,\n        shuffle=False,\n        sampler=SequentialSampler(validation_dataset),\n        pin_memory=False,\n        collate_fn=collate_fn,\n    )\n\n    fitter = Fitter(model=net, device=device, config=TrainGlobalConfig)\n    fitter.fit(train_loader, val_loader)","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:31.413742Z","iopub.execute_input":"2022-04-28T03:47:31.414065Z","iopub.status.idle":"2022-04-28T03:47:31.423242Z","shell.execute_reply.started":"2022-04-28T03:47:31.41404Z","shell.execute_reply":"2022-04-28T03:47:31.422432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from effdet import get_efficientdet_config, EfficientDet, DetBenchTrain\nfrom effdet.efficientdet import HeadNet\n\ndef get_net():\n    config = get_efficientdet_config('tf_efficientdet_d5')\n    net = EfficientDet(config, pretrained_backbone=False)\n    checkpoint = torch.load('../input/efficientdet/efficientdet_d5-ef44aea8.pth')\n    net.load_state_dict(checkpoint)\n    config.num_classes = len(list(le.classes_))\n    config.image_size = 512\n    net.class_net = HeadNet(config, num_outputs=config.num_classes, norm_kwargs=dict(eps=.001, momentum=.01))\n    return DetBenchTrain(net, config)\n\nnet = get_net()","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:31.42496Z","iopub.execute_input":"2022-04-28T03:47:31.425601Z","iopub.status.idle":"2022-04-28T03:47:32.896668Z","shell.execute_reply.started":"2022-04-28T03:47:31.425561Z","shell.execute_reply":"2022-04-28T03:47:32.895863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"run_training()","metadata":{"execution":{"iopub.status.busy":"2022-04-28T03:47:32.898064Z","iopub.execute_input":"2022-04-28T03:47:32.898423Z","iopub.status.idle":"2022-04-28T06:24:28.067549Z","shell.execute_reply.started":"2022-04-28T03:47:32.898387Z","shell.execute_reply":"2022-04-28T06:24:28.066491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inference part:","metadata":{}},{"cell_type":"code","source":"sys.path.insert(0, \"../input/weightedboxesfusion\") #Kaggle\nfrom ensemble_boxes import *\nfrom effdet import DetBenchEval\nimport gc\n\nval_loader = DataLoader(\n    validation_dataset,\n    batch_size=2,\n    shuffle=False,\n    num_workers=4,\n    drop_last=False,\n    collate_fn=collate_fn)","metadata":{"execution":{"iopub.status.busy":"2022-04-28T06:24:28.070282Z","iopub.execute_input":"2022-04-28T06:24:28.070705Z","iopub.status.idle":"2022-04-28T06:24:28.112888Z","shell.execute_reply.started":"2022-04-28T06:24:28.070637Z","shell.execute_reply":"2022-04-28T06:24:28.112085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_net(checkpoint_path):\n    config = get_efficientdet_config('tf_efficientdet_d5')\n    net = EfficientDet(config, pretrained_backbone=False)\n\n    config.num_classes = len(list(le.classes_))\n    config.image_size=512\n    net.class_net = HeadNet(config, num_outputs=config.num_classes, norm_kwargs=dict(eps=.001, momentum=.01))\n\n    checkpoint = torch.load(checkpoint_path)\n    net.load_state_dict(checkpoint['model_state_dict'])\n\n    del checkpoint\n    gc.collect()\n\n    net = DetBenchEval(net, config)\n    net.eval()\n    return net.cuda()\n\nnet = load_net('./effdet5-cutmix-augmix/best-checkpoint-030epoch.bin') #Replace the epoch number","metadata":{"execution":{"iopub.status.busy":"2022-04-28T06:26:46.746942Z","iopub.execute_input":"2022-04-28T06:26:46.747325Z","iopub.status.idle":"2022-04-28T06:26:48.606696Z","shell.execute_reply.started":"2022-04-28T06:26:46.747282Z","shell.execute_reply":"2022-04-28T06:26:48.605887Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_predictions(images, score_threshold=0.22):\n    images = torch.stack(images).cuda().float()\n    predictions = []\n    with torch.no_grad():\n        det = net(images, torch.tensor([1]*images.shape[0]).float().cuda())\n        for i in range(images.shape[0]):\n            boxes = det[i].detach().cpu().numpy()[:,:4]    \n            scores = det[i].detach().cpu().numpy()[:,4]\n            labels = det[i].detach().cpu().numpy()[:,5]\n            indexes = np.where(scores > score_threshold)[0]\n            boxes = boxes[indexes]\n            boxes[:, 2] = boxes[:, 2] + boxes[:, 0]\n            boxes[:, 3] = boxes[:, 3] + boxes[:, 1]\n            predictions.append({\n                'boxes': boxes[indexes],\n                'scores': scores[indexes],\n                'labels': labels[indexes],\n            })\n    return [predictions]\n\ndef run_wbf(predictions, image_index, image_size=512, iou_thr=0.44, skip_box_thr=0.43, weights=None):\n    boxes = [(prediction[image_index]['boxes']/(image_size-1)).tolist()  for prediction in predictions]\n    scores = [prediction[image_index]['scores'].tolist()  for prediction in predictions]\n    labels = [prediction[image_index]['labels'].tolist() for prediction in predictions]\n    boxes, scores, labels = weighted_boxes_fusion(boxes, scores, labels, weights=None, iou_thr=iou_thr, skip_box_thr=skip_box_thr)\n    boxes = boxes*(image_size-1)\n    return boxes, scores, labels","metadata":{"execution":{"iopub.status.busy":"2022-04-28T06:27:33.735963Z","iopub.execute_input":"2022-04-28T06:27:33.736309Z","iopub.status.idle":"2022-04-28T06:27:33.75207Z","shell.execute_reply.started":"2022-04-28T06:27:33.736279Z","shell.execute_reply":"2022-04-28T06:27:33.750529Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nfor j, (images, targets, image_ids) in enumerate(val_loader):\n    if(j > 5): break\n    predictions = make_predictions(images)\n\n    sample = images[0].permute(1,2,0).cpu().numpy()\n\n    boxes, scores, labels = run_wbf(predictions, image_index=i)\n    boxes = boxes.astype(np.int32).clip(min=0, max=511)\n\n    fig, ax = plt.subplots(1, 1, figsize=(16, 8))\n\n    for z in range(len(boxes)):\n        cv2.rectangle(sample, (boxes[z][0], boxes[z][1]), (boxes[z][2], boxes[z][3]), colors[int(labels[z])], 2)\n\n    ax.set_axis_off()\n    ax.imshow(sample)","metadata":{"execution":{"iopub.status.busy":"2022-04-28T06:30:35.042771Z","iopub.execute_input":"2022-04-28T06:30:35.043101Z","iopub.status.idle":"2022-04-28T06:30:37.634401Z","shell.execute_reply.started":"2022-04-28T06:30:35.043073Z","shell.execute_reply":"2022-04-28T06:30:37.633446Z"},"trusted":true},"execution_count":null,"outputs":[]}]}