{"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 cv2\nimport matplotlib.pyplot as plt\nfrom os.path import isfile\nimport torch\nimport torch.nn as nn\nimport numpy as np\nimport pandas as pd \nimport os\nfrom PIL import Image, ImageFilter\nfrom sklearn.model_selection import train_test_split, StratifiedKFold\nfrom torch.utils.data import Dataset\nfrom torchvision import transforms\nfrom torch.optim import Adam, SGD, RMSprop\nimport time\nfrom torch.autograd import Variable\nfrom tqdm import tqdm\nfrom sklearn import metrics\nimport urllib\nimport pickle\nfrom torchvision import models\nimport seaborn as sns\nimport random\nimport sys\nimport gc\nimport warnings","metadata":{"execution":{"iopub.status.busy":"2022-08-10T08:59:16.851059Z","iopub.execute_input":"2022-08-10T08:59:16.851632Z","iopub.status.idle":"2022-08-10T08:59:16.859304Z","shell.execute_reply.started":"2022-08-10T08:59:16.851595Z","shell.execute_reply":"2022-08-10T08:59:16.857826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"SEED = 123\nrandom.seed(SEED)\nnp.random.seed(SEED)\ntorch.manual_seed(SEED)\ntorch.cuda.manual_seed(SEED)\ntorch.cuda.manual_seed_all(SEED)\ntorch.backends.cudnn.deterministic = True\ntorch.backends.cudnn.benchmark = False\n\nwarnings.filterwarnings('ignore')\ndevice = 'cuda' if torch.cuda.is_available() else 'cpu'\nprint(f'\\n Device : {device.upper()}')","metadata":{"execution":{"iopub.status.busy":"2022-08-10T08:59:17.760724Z","iopub.execute_input":"2022-08-10T08:59:17.762041Z","iopub.status.idle":"2022-08-10T08:59:17.771010Z","shell.execute_reply.started":"2022-08-10T08:59:17.761994Z","shell.execute_reply":"2022-08-10T08:59:17.769947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TEST_PATH = '../input/aptos2019-blindness-detection/test.csv'\nTEST_IMG = '../input/aptos2019-blindness-detection/test_images'\nSAMPLE_SUB_PATH = '../input/aptos2019-blindness-detection/sample_submission.csv'\ntest_csv  = pd.read_csv(TEST_PATH)","metadata":{"execution":{"iopub.status.busy":"2022-08-10T08:59:18.217510Z","iopub.execute_input":"2022-08-10T08:59:18.217885Z","iopub.status.idle":"2022-08-10T08:59:18.228139Z","shell.execute_reply.started":"2022-08-10T08:59:18.217831Z","shell.execute_reply":"2022-08-10T08:59:18.226898Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def expand_path(p):\n    p = str(p)\n#     if isfile(train + p + \".png\"):\n#         return train + (p + \".png\")\n#     if isfile(train_2015 + p + '.png'):\n#         return train_2015 + (p + \".png\")\n    if isfile(test + p + \".png\"):\n        return test + (p + \".png\")\n    return p","metadata":{"execution":{"iopub.status.busy":"2022-08-10T09:00:29.934510Z","iopub.execute_input":"2022-08-10T09:00:29.934932Z","iopub.status.idle":"2022-08-10T09:00:29.942050Z","shell.execute_reply.started":"2022-08-10T09:00:29.934888Z","shell.execute_reply":"2022-08-10T09:00:29.940916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def crop_image1(img,tol=7):\n    # img is image data\n    # tol  is tolerance\n        \n    mask = img>tol\n    return img[np.ix_(mask.any(1),mask.any(0))]\n\ndef crop_image_from_gray(img,tol=7):\n    if img.ndim ==2:\n        mask = img>tol\n        return img[np.ix_(mask.any(1),mask.any(0))]\n    elif img.ndim==3:\n        gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)\n        mask = gray_img>tol\n        \n        check_shape = img[:,:,0][np.ix_(mask.any(1),mask.any(0))].shape[0]\n        if (check_shape == 0): # image is too dark so that we crop out everything,\n            return img # return original image\n        else:\n            img1=img[:,:,0][np.ix_(mask.any(1),mask.any(0))]\n            img2=img[:,:,1][np.ix_(mask.any(1),mask.any(0))]\n            img3=img[:,:,2][np.ix_(mask.any(1),mask.any(0))]\n    #         print(img1.shape,img2.shape,img3.shape)\n            img = np.stack([img1,img2,img3],axis=-1)\n    #         print(img.shape)\n        return img","metadata":{"execution":{"iopub.status.busy":"2022-08-10T08:59:18.943107Z","iopub.execute_input":"2022-08-10T08:59:18.943497Z","iopub.status.idle":"2022-08-10T08:59:18.954721Z","shell.execute_reply.started":"2022-08-10T08:59:18.943467Z","shell.execute_reply":"2022-08-10T08:59:18.953791Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMG_SIZE    = 256\n\nclass MyDataset(Dataset):\n    def __init__(self, dataframe, transform=None):\n        self.df = dataframe\n        self.transform = transform\n    \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, idx):\n        p = self.df.id_code.values[idx]\n        p_path = os.path.join(TEST_IMG, p + '.png')\n        image = cv2.imread(p_path)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        image = crop_image_from_gray(image)\n        image = cv2.resize(image, (IMG_SIZE, IMG_SIZE))\n        image = cv2.addWeighted ( image,4, cv2.GaussianBlur( image , (0,0) , 30) ,-4 ,128)\n        image = transforms.ToPILImage()(image)\n        \n        if self.transform:\n            image = self.transform(image)\n        \n        image = np.resize(image, (3,IMG_SIZE, IMG_SIZE))\n        image = torch.tensor(image)\n        \n        return image","metadata":{"execution":{"iopub.status.busy":"2022-08-10T09:02:29.106666Z","iopub.execute_input":"2022-08-10T09:02:29.107056Z","iopub.status.idle":"2022-08-10T09:02:29.118964Z","shell.execute_reply.started":"2022-08-10T09:02:29.107023Z","shell.execute_reply":"2022-08-10T09:02:29.118063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.RandomHorizontalFlip(),\n    transforms.RandomRotation((-120, 120)),\n    transforms.ToTensor(),\n    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])\n\n\ntestset     = MyDataset(test_csv, transform =transform)\ntest_loader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False, num_workers=2)\n\nmodel = models.efficientnet_b0(pretrained = False)\nmodel.classifier = nn.Linear(in_features=1280, out_features=1, bias=True)\nmodel.load_state_dict(torch.load('../input/finetuned-models/0.223.bin')) \nmodel = model.to(device)\nmodel.eval()\n# y_pred = []  \n# with torch.no_grad():\n#     for batch, x in enumerate(tqdm(test_loader)):\n#         output = model(x.float().to(device))\n#         y_pred.extend(output.to('cpu'))        ","metadata":{"execution":{"iopub.status.busy":"2022-08-10T10:38:42.568754Z","iopub.execute_input":"2022-08-10T10:38:42.569138Z","iopub.status.idle":"2022-08-10T10:38:42.817679Z","shell.execute_reply.started":"2022-08-10T10:38:42.569106Z","shell.execute_reply":"2022-08-10T10:38:42.816749Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# preds = []\n# for val in y_pred:\n#     preds.append(val.detach().tolist()[0])","metadata":{"execution":{"iopub.status.busy":"2022-08-10T09:14:44.559728Z","iopub.execute_input":"2022-08-10T09:14:44.560644Z","iopub.status.idle":"2022-08-10T09:14:44.571201Z","shell.execute_reply.started":"2022-08-10T09:14:44.560607Z","shell.execute_reply":"2022-08-10T09:14:44.570158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# testset     = MyDataset(test_csv, transform =transform)\n# test_loader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False, num_workers=2)\ny_pred = []  \nwith torch.no_grad():\n    for batch, x in enumerate(tqdm(test_loader)):\n        output = model(x.float().to(device))\n        y_pred.extend(output.to('cpu'))    \npreds1 = []\nfor val in y_pred:\n    preds1.append(val.detach().tolist()[0])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# testset     = MyDataset(test_csv, transform =transform)\n# test_loader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False, num_workers=2)\nmodel.load_state_dict(torch.load('../input/ensemble-best/0.206.bin')) \ny_pred = []  \nwith torch.no_grad():\n    for batch, x in enumerate(tqdm(test_loader)):\n        output = model(x.float().to(device))\n        y_pred.extend(output.to('cpu'))    \npreds2 = []\nfor val in y_pred:\n    preds2.append(val.detach().tolist()[0])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# testset     = MyDataset(test_csv, transform =transform)\n# test_loader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False, num_workers=2)\nmodel.load_state_dict(torch.load('../input/finetuned-0216/0.216.bin')) \ny_pred = []  \nwith torch.no_grad():\n    for batch, x in enumerate(tqdm(test_loader)):\n        output = model(x.float().to(device))\n        y_pred.extend(output.to('cpu'))    \npreds3 = []\nfor val in y_pred:\n    preds3.append(val.detach().tolist()[0])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# testset     = MyDataset(test_csv, transform =transform)\n# test_loader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False, num_workers=2)\nmodel.load_state_dict(torch.load('../input/finetuned-mon/0.201.bin')) \ny_pred = []  \nwith torch.no_grad():\n    for batch, x in enumerate(tqdm(test_loader)):\n        output = model(x.float().to(device))\n        y_pred.extend(output.to('cpu'))    \npreds4 = []\nfor val in y_pred:\n    preds4.append(val.detach().tolist()[0])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # testset     = MyDataset(test_csv, transform =transform)\n# # test_loader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False, num_workers=2)\nmodel.load_state_dict(torch.load('../input/finetuned-mon/0.222.bin')) \ny_pred = []  \nwith torch.no_grad():\n    for batch, x in enumerate(tqdm(test_loader)):\n        output = model(x.float().to(device))\n        y_pred.extend(output.to('cpu'))    \npreds5 = []\nfor val in y_pred:\n    preds5.append(val.detach().tolist()[0])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = (np.array(preds1) + np.array(preds2) + np.array(preds3) + np.array(preds4) + np.array(preds5)) / 5","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"coef = [0.5, 1.5, 2.5, 3.5]\ntest_preds = []\nfor i, pred in enumerate(preds):\n    if pred < coef[0]:\n        test_preds.append(0)\n    elif pred >= coef[0] and pred < coef[1]:\n        test_preds.append(1)\n    elif pred >= coef[1] and pred < coef[2]:\n        test_preds.append(2)\n    elif pred >= coef[2] and pred < coef[3]:\n        test_preds.append(3)\n    else:\n        test_preds.append(4)","metadata":{"execution":{"iopub.status.busy":"2022-08-10T09:15:28.745120Z","iopub.execute_input":"2022-08-10T09:15:28.745747Z","iopub.status.idle":"2022-08-10T09:15:28.753813Z","shell.execute_reply.started":"2022-08-10T09:15:28.745711Z","shell.execute_reply":"2022-08-10T09:15:28.752837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_sub = pd.read_csv(SAMPLE_SUB_PATH)\nsample_sub['diagnosis'] = test_preds\nsample_sub.to_csv('submission.csv', index = False)","metadata":{"execution":{"iopub.status.busy":"2022-08-08T11:26:41.713213Z","iopub.execute_input":"2022-08-08T11:26:41.713902Z","iopub.status.idle":"2022-08-08T11:26:41.731562Z","shell.execute_reply.started":"2022-08-08T11:26:41.713866Z","shell.execute_reply":"2022-08-08T11:26:41.730653Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}