{"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 os\nimport numpy as np\nimport pandas as pd\nfrom PIL import Image\nfrom matplotlib import pyplot as plt\nimport seaborn as sns\n\nimport cv2\n\nfrom glob import glob\nfrom openslide import OpenSlide\nfrom pprint import pprint\nfrom collections import defaultdict\n\nImage.MAX_IMAGE_PIXELS = None","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:19:29.106974Z","iopub.execute_input":"2022-07-11T13:19:29.107404Z","iopub.status.idle":"2022-07-11T13:19:30.396904Z","shell.execute_reply.started":"2022-07-11T13:19:29.107367Z","shell.execute_reply":"2022-07-11T13:19:30.395945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#  1- Data viz","metadata":{}},{"cell_type":"code","source":"raw_data = pd.read_csv('../input/background-detected-on-mayo-clinic-sliced-datasets/dataset.csv')\nraw_data","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:19:38.256261Z","iopub.execute_input":"2022-07-11T13:19:38.256665Z","iopub.status.idle":"2022-07-11T13:19:39.55333Z","shell.execute_reply.started":"2022-07-11T13:19:38.256631Z","shell.execute_reply":"2022-07-11T13:19:39.552145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = raw_data[raw_data['is_background'] == 0]\ndata","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:19:43.780462Z","iopub.execute_input":"2022-07-11T13:19:43.780845Z","iopub.status.idle":"2022-07-11T13:19:43.835518Z","shell.execute_reply.started":"2022-07-11T13:19:43.780814Z","shell.execute_reply":"2022-07-11T13:19:43.834134Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('../input/mayo-clinic-strip-ai/train.csv')\ntest = pd.read_csv('../input/mayo-clinic-strip-ai/test.csv')\nsample_sub = pd.read_csv('../input/mayo-clinic-strip-ai/sample_submission.csv')\n\ntrain","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:19:47.583902Z","iopub.execute_input":"2022-07-11T13:19:47.584451Z","iopub.status.idle":"2022-07-11T13:19:47.622029Z","shell.execute_reply.started":"2022-07-11T13:19:47.584402Z","shell.execute_reply":"2022-07-11T13:19:47.621217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"patients_train = train['patient_id'].nunique()\npatients_test = test['patient_id'].nunique()\n\nprint(f\"Number of unique patients is train set: {patients_train}\")\nprint(f\"Number of unique patients is test set: {patients_test}\")","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:19:50.846311Z","iopub.execute_input":"2022-07-11T13:19:50.84705Z","iopub.status.idle":"2022-07-11T13:19:50.857404Z","shell.execute_reply.started":"2022-07-11T13:19:50.847011Z","shell.execute_reply":"2022-07-11T13:19:50.856062Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.displot(train['label'], stat='percent')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:19:53.149878Z","iopub.execute_input":"2022-07-11T13:19:53.150324Z","iopub.status.idle":"2022-07-11T13:19:53.426266Z","shell.execute_reply.started":"2022-07-11T13:19:53.150286Z","shell.execute_reply":"2022-07-11T13:19:53.424957Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.displot(data['label'], stat='percent')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:19:56.916137Z","iopub.execute_input":"2022-07-11T13:19:56.916708Z","iopub.status.idle":"2022-07-11T13:19:57.605887Z","shell.execute_reply.started":"2022-07-11T13:19:56.916659Z","shell.execute_reply":"2022-07-11T13:19:57.604959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Directory Setting","metadata":{}},{"cell_type":"code","source":"# ====================================================\n# Directory settings\n# ====================================================\nimport os\n\nOUTPUT_DIR = './'\nif not os.path.exists(OUTPUT_DIR):\n    os.makedirs(OUTPUT_DIR)","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:20:00.136982Z","iopub.execute_input":"2022-07-11T13:20:00.137804Z","iopub.status.idle":"2022-07-11T13:20:00.144376Z","shell.execute_reply.started":"2022-07-11T13:20:00.13775Z","shell.execute_reply":"2022-07-11T13:20:00.143364Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# CFG","metadata":{}},{"cell_type":"code","source":"# ====================================================\n# CFG\n# ====================================================\nclass CFG:\n    apex=False\n    debug=False\n    print_freq=100\n    num_workers=4\n    model_name='tf_efficientnet_b7_ns'\n    scheduler='CosineAnnealingLR' # ['ReduceLROnPlateau', 'CosineAnnealingLR', 'CosineAnnealingWarmRestarts']\n    epochs=2\n    #factor=0.2 # ReduceLROnPlateau\n    #patience=4 # ReduceLROnPlateau\n    #eps=1e-6 # ReduceLROnPlateau\n    T_max=3 # CosineAnnealingLR\n    #T_0=3 # CosineAnnealingWarmRestarts\n    lr=1e-4\n    min_lr=1e-6\n    batch_size=48\n    weight_decay=1e-6\n    gradient_accumulation_steps=1\n    max_grad_norm=1000\n    seed=42\n    target_size=1\n    target_col='label'\n    n_fold=3\n    trn_fold=[0] # [0, 1, 2, 3, 4]\n    train=True\n    grad_cam=True\n    \nif CFG.debug:\n    CFG.epochs = 1\n    train = train.sample(n=10000, random_state=CFG.seed).reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:20:03.532107Z","iopub.execute_input":"2022-07-11T13:20:03.532827Z","iopub.status.idle":"2022-07-11T13:20:03.543662Z","shell.execute_reply.started":"2022-07-11T13:20:03.532791Z","shell.execute_reply":"2022-07-11T13:20:03.542549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Libraries","metadata":{}},{"cell_type":"code","source":"!pip install ttach grad-cam timm wandb --upgrade","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-07-11T13:20:07.421446Z","iopub.execute_input":"2022-07-11T13:20:07.421889Z","iopub.status.idle":"2022-07-11T13:20:46.288473Z","shell.execute_reply.started":"2022-07-11T13:20:07.421836Z","shell.execute_reply":"2022-07-11T13:20:46.286895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ====================================================\n# Library\n# ====================================================\nimport sys\nsys.path.append('../input/pytorch-image-models/pytorch-image-models-master')\n\nimport IPython.display\n\nimport os\nimport math\nimport time\nimport random\nimport shutil\nfrom pathlib import Path\nfrom contextlib import contextmanager\nfrom collections import defaultdict, Counter\n\nimport scipy as sp\nimport numpy as np\nimport pandas as pd\n\nfrom sklearn import preprocessing\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.model_selection import StratifiedKFold, GroupKFold, KFold\n\nfrom tqdm.auto import tqdm\nfrom functools import partial\n\nimport cv2\nfrom openslide import OpenSlide\nimport seaborn as sns\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.optim import Adam, SGD\nimport torchvision.models as models\nfrom torch.nn.parameter import Parameter\nfrom torch.utils.data import DataLoader, Dataset\nfrom torch.optim.lr_scheduler import CosineAnnealingWarmRestarts, CosineAnnealingLR, ReduceLROnPlateau\n\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nfrom albumentations import ImageOnlyTransform\n\nfrom pytorch_grad_cam.utils.image import show_cam_on_image\nfrom pytorch_grad_cam import GradCAM, ScoreCAM, GradCAMPlusPlus, AblationCAM, XGradCAM, EigenCAM\n\nimport timm\n\nfrom torch.cuda.amp import autocast, GradScaler\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:20:46.291364Z","iopub.execute_input":"2022-07-11T13:20:46.291785Z","iopub.status.idle":"2022-07-11T13:20:59.272782Z","shell.execute_reply.started":"2022-07-11T13:20:46.291744Z","shell.execute_reply":"2022-07-11T13:20:59.271557Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from kaggle_secrets import UserSecretsClient\nuser_secrets = UserSecretsClient()\nwandb_api = user_secrets.get_secret(\"wandb_api\")\n\nimport wandb\nwandb.login(key=wandb_api)\n\ndef class2dict(f):\n    return dict((name, getattr(f, name)) for name in dir(f) if not name.startswith('__'))\n\nrun = wandb.init(project=\"Mayo Clinic - STRIP AI\", \n                 name=\"exp1.5\",\n                 config=class2dict(CFG),\n                 group=CFG.model_name,\n                 job_type=\"test\")","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:22:14.06604Z","iopub.execute_input":"2022-07-11T13:22:14.067192Z","iopub.status.idle":"2022-07-11T13:22:22.159293Z","shell.execute_reply.started":"2022-07-11T13:22:14.067147Z","shell.execute_reply":"2022-07-11T13:22:22.157744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Utils","metadata":{}},{"cell_type":"code","source":"# ====================================================\n# Utils\n# ====================================================\ndef get_score(y_true, y_pred):\n    score = roc_auc_score(y_true, y_pred)\n    return score\n\n\ndef init_logger(log_file=OUTPUT_DIR+'train.log'):\n    from logging import getLogger, INFO, FileHandler,  Formatter,  StreamHandler\n    logger = getLogger(__name__)\n    logger.setLevel(INFO)\n    handler1 = StreamHandler()\n    handler1.setFormatter(Formatter(\"%(message)s\"))\n    handler2 = FileHandler(filename=log_file)\n    handler2.setFormatter(Formatter(\"%(message)s\"))\n    logger.addHandler(handler1)\n    logger.addHandler(handler2)\n    return logger\n\nLOGGER = init_logger()\n\n\ndef seed_torch(seed=42):\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\nseed_torch(seed=CFG.seed)","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:22:22.161711Z","iopub.execute_input":"2022-07-11T13:22:22.162387Z","iopub.status.idle":"2022-07-11T13:22:22.17899Z","shell.execute_reply.started":"2022-07-11T13:22:22.162346Z","shell.execute_reply":"2022-07-11T13:22:22.177706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# CV Split","metadata":{}},{"cell_type":"code","source":"Fold = StratifiedKFold(n_splits=CFG.n_fold, shuffle=True, random_state=CFG.seed)\nfor n, (train_index, val_index) in enumerate(Fold.split(data, data[CFG.target_col])):\n    data.loc[val_index, 'fold'] = int(n)\ndata['fold'] = data['fold'].astype(int)\ndisplay(data.groupby(['fold', 'label']).size())\n","metadata":{"execution":{"iopub.status.busy":"2022-07-11T13:22:23.993157Z","iopub.execute_input":"2022-07-11T13:22:23.993592Z","iopub.status.idle":"2022-07-11T13:22:24.532623Z","shell.execute_reply.started":"2022-07-11T13:22:23.993548Z","shell.execute_reply":"2022-07-11T13:22:24.521969Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dataset class","metadata":{}},{"cell_type":"code","source":"# ====================================================\n# Dataset\n# ====================================================\nclass TrainDataset(Dataset):\n    def __init__(self, path, df, transform=None):\n        self.df = df\n        self.path = path\n        self.file_names = df['image_id'].values\n        self.labels = df[CFG.target_col].values\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        file_path = self.file_names[idx]\n        print(self.path + file_path + '.tif')\n        image = Image.open(self.path + file_path + '.tif') \n        plt.figure(figsize=(15, 15))\n        plt.imshow(image)\n        plt.show()\n        # image = image.squeeze().numpy()\n        if self.transform:\n            image = self.transform(image=image)['image']\n        label = torch.tensor(self.labels[idx]).float()\n        return image, label","metadata":{"execution":{"iopub.status.busy":"2022-07-09T15:46:49.836357Z","iopub.execute_input":"2022-07-09T15:46:49.837049Z","iopub.status.idle":"2022-07-09T15:46:49.850152Z","shell.execute_reply.started":"2022-07-09T15:46:49.837015Z","shell.execute_reply":"2022-07-09T15:46:49.84882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Transforms","metadata":{}},{"cell_type":"code","source":"# ====================================================\n# Transforms\n# ====================================================\ndef get_transforms(*, data):\n    \n    if data == 'train':\n        return A.Compose([\n            ToTensorV2(),\n        ])\n\n    elif data == 'valid':\n        return A.Compose([\n            ToTensorV2(),\n        ])","metadata":{"execution":{"iopub.status.busy":"2022-07-09T15:46:49.853488Z","iopub.execute_input":"2022-07-09T15:46:49.854021Z","iopub.status.idle":"2022-07-09T15:46:49.86544Z","shell.execute_reply.started":"2022-07-09T15:46:49.853972Z","shell.execute_reply":"2022-07-09T15:46:49.864676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = TrainDataset(\"../input/mayo-clinic-strip-ai/train/\", train)\n\nplt.figure(figsize=(16,12))\nimage, label = train_dataset[0]\nprint(image)\nplt.imshow(image)\nplt.title(f'label: {label}')\nplt.show() ","metadata":{"execution":{"iopub.status.busy":"2022-07-09T15:46:49.868969Z","iopub.execute_input":"2022-07-09T15:46:49.869574Z"},"trusted":true},"execution_count":null,"outputs":[]}]}