{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nos.chdir('../input/pretrainmodels')\n!python ./setup.py install","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"from glob import glob\n\nimport torch\nimport pandas as pd\nfrom PIL import Image, ImageFile\nfrom torchvision import transforms\n\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.nn.parameter import Parameter\n\nimport pretrainedmodels\nos.chdir('../../working')\n\nclass GeM(nn.Module):\n    def __init__(self, p=3, eps=1e-6):\n        super(GeM,self).__init__()\n        self.p = Parameter(torch.ones(1)*p)\n        self.eps = eps\n    def forward(self, x):\n        return gem(x, p=self.p, eps=self.eps)       \n    def __repr__(self):\n        return self.__class__.__name__ + '(' + 'p=' + '{:.4f}'.format(self.p.data.tolist()[0]) + ', ' + 'eps=' + str(self.eps) + ')'\n\n\ndef gem(x, p=3, eps=1e-6):\n    return F.avg_pool2d(x.clamp(min=eps).pow(p), (x.size(-2), x.size(-1))).pow(1./p)\n\n\ndef get_se_resnet50_gem(pretrain):\n    if pretrain == 'imagenet':\n        model = pretrainedmodels.__dict__['se_resnet50'](num_classes=1000, pretrained='imagenet')\n    else:\n        model = pretrainedmodels.__dict__['se_resnet50'](num_classes=1000, pretrained=None)\n    model.avg_pool = GeM()\n    model.last_linear = nn.Linear(2048, 1)\n    return model\n\nMODEL_PATH = '../input/224best/224best.pth'\nMODEL_PATH_list = ['../input/224best/224best.pth',\n                   '../input/128best/128best.pth',\n                   '../input/seresnet384/model_epoch33.pth']\nresize_list = [224,128,384]\nTEST_IMAGE_PATH = '../input/aptos2019-blindness-detection/test_images'\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\n\ntest_images = glob(os.path.join(TEST_IMAGE_PATH, '*.png'))\npredictions = []\nfor i, im_path in enumerate(test_images):\n    predictions.append([os.path.splitext(im_path.split('/')[-1])[0], 0])\n\n# Load model\nfor idx in range(len(MODEL_PATH_list)):\n    model = get_se_resnet50_gem(pretrain=None)\n    model.to(device)\n    model.load_state_dict(torch.load(MODEL_PATH_list[idx]))\n    model.eval()\n\n    # Inference\n    for i, im_path in enumerate(test_images):\n        print(i, '/', len(test_images))\n        image = Image.open(im_path)\n        image = image.resize((resize_list[idx], resize_list[idx]), resample=Image.BILINEAR)\n        image = transforms.ToTensor()(image).to(device)\n        output = model(image.unsqueeze(0))\n\n        # Make submission\n        predictions[i][1] = (predictions[i][1]*idx + output.item())/(idx+1)\n\nsubmission = pd.DataFrame(predictions)\nsubmission.columns = ['id_code','diagnosis']\nsubmission.to_csv('submission_raw_value.csv', index=False)\nsubmission.head()\n\nsubmission.loc[submission.diagnosis < 0.7, 'diagnosis'] = 0\nsubmission.loc[(0.7 <= submission.diagnosis) & (submission.diagnosis < 1.5), 'diagnosis'] = 1\nsubmission.loc[(1.5 <= submission.diagnosis) & (submission.diagnosis < 2.5), 'diagnosis'] = 2\nsubmission.loc[(2.5 <= submission.diagnosis) & (submission.diagnosis < 3.5), 'diagnosis'] = 3\nsubmission.loc[3.5 <= submission.diagnosis, 'diagnosis'] = 4\nsubmission['diagnosis'] = submission['diagnosis'].astype(int)\nsubmission.to_csv('submission.csv', index=False)\nsubmission.head()","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}