{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":true},"cell_type":"code","source":"import sys\nimport importlib\n\nsys.path.append('../input')\nsys.modules['efficientnet_pytorch'] = importlib.import_module('efficientnet-pytorch')\nsys.modules['rectified_adam'] = importlib.import_module('rectified-adam')","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"from pathlib import Path\nimport pandas as pd\nfrom fastai.vision import *\nfrom efficientnet_pytorch import EfficientNet\nfrom rectified_adam.radam import *\nfrom functools import partial\nimport io","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_dir = Path('../input/aptos2019-blindness-detection')\nbatch_size = 8\nim_size = (528,528)\n\ntrain = False\nssl = False\nc = 1/3\nmodel_dir = Path('../input/my-aptos2019-blindness-detection')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def preprocess(im):\n    bbox = pil2tensor(im, dtype=np.uint8).nonzero().transpose(1,0)\n    im = im.crop((bbox[2].min().item(), \n                    bbox[1].min().item(), \n                    bbox[2].max().item(), \n                    bbox[1].max().item()))\n\n    return im\n    \nif train:\n    df = pd.read_csv(data_dir/'train.csv')\n    counts = df['diagnosis'].value_counts(normalize=True)\n    w = 1 - tensor([counts[i] for i in range(5)])\n    w = w.to(defaults.device)\n\n    L = len(df)\n    if ssl: df = df.sample(frac=1 - c)\n    src = ImageList.from_df(df, data_dir/'train_images', suffix='.png', after_open=preprocess)\n    if ssl:\n        df = pd.read_csv(model_dir/'test.csv').sample(n=int(c * L))\n        src.add(ImageList.from_df(df, data_dir/'test_images', suffix='.png', after_open=preprocess))\n\n    data = src.split_none()\\\n        .label_from_df(classes=[0,1,2,3,4])\\\n        .transform(\n            get_transforms(max_warp=None, \n                xtra_tfms=[cutout(length=(im_size[0]//8,im_size[0]//4))]), \n            size=im_size, \n            resize_method=ResizeMethod.SQUISH, \n            padding_mode='zeros')\\\n        .databunch(bs=batch_size)\\\n        .normalize(stats=imagenet_stats)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_name = 'efficientnet-b6'\nif train:\n    model = EfficientNet.from_pretrained(model_name, num_classes=5)\n    kappa = KappaScore()\n    kappa.weights = 'quadratic'\n\n    learn = Learner(data, model, \n        loss_func=partial(F.cross_entropy, weight=w), opt_func=RAdam, metrics=[kappa]).to_fp16()\n    learn.layer_groups = split_model_idx(learn.model, idxs=[-1])\n    learn.summary()\nelse:\n    learn = load_learner(model_dir, model_name + '.pkl')\nlearn.path = Path('.')\n\nif ssl:\n    with io.open(model_dir/f'{model_name}.pth', 'rb') as f:\n        learn = learn.load(f)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"if train:\n    if not ssl:\n        learn.freeze()\n        learn.fit(1, lr=1e-3)\n\n    nepochs = 12\n    learn.unfreeze()\n    learn.fit_one_cycle(cyc_len=nepochs, max_lr=1e-4, div_factor=10, pct_start=0)\n\n    learn.export(model_name + '.pkl')\n    learn.save(model_name)\nelse:\n    learn.model.eval()\n    mean = tensor(imagenet_stats[0])\n    std = tensor(imagenet_stats[1])\n\n    def diagnose(row):\n        fn = row['id_code']\n        im = open_image(data_dir/f'test_images/{fn}.png', div=True, after_open=preprocess)\n        im = im.apply_tfms(None, size=im_size, resize_method=ResizeMethod.PAD, padding_mode='zeros')\n\n        #tta\n        x = torch.stack([\n            im.data, \n#             flip_lr(im).data, \n#             im.zoom(scale=1.25).data\n        ])\n        x = (x - mean[None,:,None,None]) / std[None,:,None,None]\n        x = x.to(defaults.device).half()\n        pred = learn.model(x).mean(dim=0)\n        pred = np.argmax(pred)\n\n        return pred.item()\n    \n    df = pd.read_csv(data_dir/'test.csv')\n    df['diagnosis'] = df.apply(diagnose, axis=1)\n    df.to_csv('submission.csv', index=False, line_terminator='\\n')","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.9"}},"nbformat":4,"nbformat_minor":1}