{"cells":[{"metadata":{},"cell_type":"markdown","source":"### [ EfficientDet: Scalable and Efficient Object Detection](https://arxiv.org/pdf/1911.09070.pdf)\n### [Code](https://github.com/xuannianz/EfficientDet) (tensorflow-keras)\n![EfficientDet-D7.JPG](attachment:EfficientDet-D7.JPG)","attachments":{"EfficientDet-D7.JPG":{"image/jpeg":"/9j/4AAQSkZJRgABAQEAYABgAAD/4RDaRXhpZgAATU0AKgAAAAgABAE7AAIAAAAFAAAISodpAAQAAAABAAAIUJydAAEAAAAKAAAQyOocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJLVU8AAAAFkAMAAgAAABQAABCekAQAAgAAABQAABCykpEAAgAAAAMzOQAAkpIAAgAAAAMzOQAA6hwABwAACAwAAAiSAAAAABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAyMDowOToyNCAxNToxNDo0NQAyMDIwOjA5OjI0IDE1OjE0OjQ1AAAAUgBLAFUATwAAAP/hCxdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+DQo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIj48cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPjx4bXA6Q3JlYXRlRGF0ZT4yMDIwLTA5LTI0VDE1OjE0OjQ1LjM5MzwveG1wOkNyZWF0ZURhdGU+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjxkYzpjcmVhdG9yPjxyZGY6U2VxIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpsaT5SS1VPPC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVhdG9yPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/bAEMABwUFBgUEBwYFBggHBwgKEQsK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"}}},{"metadata":{},"cell_type":"markdown","source":"# pytorch EfficientDet for Global Wheat Detection"},{"metadata":{},"cell_type":"markdown","source":"### Dataset: [Global Wheat Detection](https://www.kaggle.com/c/global-wheat-detection/overview) \n### [Notebook](https://www.kaggle.com/shonenkov/training-efficientdet)"},{"metadata":{},"cell_type":"markdown","source":"### Dependencies and imports\n\nIn this kernel used github repos [efficientdet-pytorch](https://github.com/rwightman/efficientdet-pytorch) and [pytorch-image-models](https://github.com/rwightman/pytorch-image-models) by [@rwightman](https://www.kaggle.com/rwightman). Don't forget add stars ;)"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true,"_kg_hide-input":true,"_kg_hide-output":true},"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","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true,"_kg_hide-output":true},"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\n\nSEED = 42\n\ndef 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\n    torch.backends.cudnn.benchmark = True\n\nseed_everything(SEED)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"marking = pd.read_csv('../input/global-wheat-detection/train.csv')\n\nbboxs = np.stack(marking['bbox'].apply(lambda x: np.fromstring(x[1:-1], sep=',')))\nfor i, column in enumerate(['x', 'y', 'w', 'h']):\n    marking[column] = bboxs[:,i]\nmarking.drop(columns=['bbox'], inplace=True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"About data splitting you can read [here](https://www.kaggle.com/shonenkov/wbf-approach-for-ensemble):"},{"metadata":{"_kg_hide-output":true,"trusted":true},"cell_type":"code","source":"skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n\ndf_folds = marking[['image_id']].copy()\ndf_folds.loc[:, 'bbox_count'] = 1\ndf_folds = df_folds.groupby('image_id').count()\ndf_folds.loc[:, 'source'] = marking[['image_id', 'source']].groupby('image_id').min()['source']\ndf_folds.loc[:, 'stratify_group'] = np.char.add(\n    df_folds['source'].values.astype(str),\n    df_folds['bbox_count'].apply(lambda x: f'_{x // 15}').values.astype(str)\n)\ndf_folds.loc[:, 'fold'] = 0\n\nfor fold_number, (train_index, val_index) in enumerate(skf.split(X=df_folds.index, y=df_folds['stratify_group'])):\n    df_folds.loc[df_folds.iloc[val_index].index, 'fold'] = fold_number","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Albumentations"},{"metadata":{"trusted":true},"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    )","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAIN_ROOT_PATH = '../input/global-wheat-detection/train'\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[index]\n        \n        if self.test or random.random() > 0.5:\n            image, boxes = self.load_image_and_boxes(index)\n        else:\n            image, boxes = self.load_cutmix_image_and_boxes(index)\n\n        # there is only one class\n        labels = torch.ones((boxes.shape[0],), dtype=torch.int64)\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[index]\n        image = cv2.imread(f'{TRAIN_ROOT_PATH}/{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        return image, boxes\n\n    def load_cutmix_image_and_boxes(self, index, imsize=1024):\n        \"\"\" \n        This implementation of cutmix author:  https://www.kaggle.com/nvnnghia \n        Refactoring and adaptation: https://www.kaggle.com/shonenkov\n        \"\"\"\n        w, h = imsize, imsize\n        s = imsize // 2\n    \n        xc, yc = [int(random.uniform(imsize * 0.25, imsize * 0.75)) for _ in range(2)]  # center x, y\n        indexes = [index] + [random.randint(0, self.image_ids.shape[0] - 1) for _ in range(3)]\n\n        result_image = np.full((imsize, imsize, 3), 1, dtype=np.float32)\n        result_boxes = []\n\n        for i, index in enumerate(indexes):\n            image, boxes = self.load_image_and_boxes(index)\n            if i == 0:\n                x1a, y1a, x2a, y2a = max(xc - w, 0), max(yc - h, 0), xc, yc  # xmin, ymin, xmax, ymax (large image)\n                x1b, y1b, x2b, y2b = w - (x2a - x1a), h - (y2a - y1a), w, h  # xmin, ymin, xmax, ymax (small image)\n            elif i == 1:  # top right\n                x1a, y1a, x2a, y2a = xc, max(yc - h, 0), min(xc + w, s * 2), yc\n                x1b, y1b, x2b, y2b = 0, h - (y2a - y1a), min(w, x2a - x1a), h\n            elif i == 2:  # bottom left\n                x1a, y1a, x2a, y2a = max(xc - w, 0), yc, xc, min(s * 2, yc + h)\n                x1b, y1b, x2b, y2b = w - (x2a - x1a), 0, max(xc, w), min(y2a - y1a, h)\n            elif i == 3:  # bottom right\n                x1a, y1a, x2a, y2a = xc, yc, min(xc + w, s * 2), min(s * 2, yc + h)\n                x1b, y1b, x2b, y2b = 0, 0, min(w, x2a - x1a), min(y2a - y1a, h)\n            result_image[y1a:y2a, x1a:x2a] = image[y1b:y2b, x1b:x2b]\n            padw = x1a - x1b\n            padh = y1a - y1b\n\n            boxes[:, 0] += padw\n            boxes[:, 1] += padh\n            boxes[:, 2] += padw\n            boxes[:, 3] += padh\n\n            result_boxes.append(boxes)\n\n        result_boxes = np.concatenate(result_boxes, 0)\n        np.clip(result_boxes[:, 0:], 0, 2 * s, out=result_boxes[:, 0:])\n        result_boxes = result_boxes.astype(np.int32)\n        result_boxes = result_boxes[np.where((result_boxes[:,2]-result_boxes[:,0])*(result_boxes[:,3]-result_boxes[:,1]) > 0)]\n        return result_image, result_boxes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fold_number = 0\n\ntrain_dataset = DatasetRetriever(\n    image_ids=df_folds[df_folds['fold'] != fold_number].index.values,\n    marking=marking,\n    transforms=get_train_transforms(),\n    test=False,\n)\n\nvalidation_dataset = DatasetRetriever(\n    image_ids=df_folds[df_folds['fold'] == fold_number].index.values,\n    marking=marking,\n    transforms=get_valid_transforms(),\n    test=True,\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image, target, image_id = train_dataset[1]\nboxes = target['boxes'].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 box in boxes:\n    cv2.rectangle(numpy_image, (box[1], box[0]), (box[3],  box[2]), (0, 1, 0), 2)\n    \nax.set_axis_off()\nax.imshow(numpy_image);","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Fitter"},{"metadata":{"trusted":true},"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","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"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')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class TrainGlobalConfig:\n    num_workers = 2\n    batch_size = 4 \n    n_epochs = 3 # 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.OneCycleLR\n#     scheduler_params = dict(\n#         max_lr=0.001,\n#         epochs=n_epochs,\n#         steps_per_epoch=int(len(train_dataset) / batch_size),\n#         pct_start=0.1,\n#         anneal_strategy='cos', \n#         final_div_factor=10**5\n#     )\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    # --------------------","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"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)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"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 = 1\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()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"run_training()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}