{"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 sys\nsys.path.append('../input/strip-ai-seam-carving/seam-carving')","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:07:03.891789Z","iopub.execute_input":"2022-09-10T11:07:03.892875Z","iopub.status.idle":"2022-09-10T11:07:03.918601Z","shell.execute_reply.started":"2022-09-10T11:07:03.892762Z","shell.execute_reply":"2022-09-10T11:07:03.917712Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os, random, gc\nimport seaborn as sns\nimport numpy as np \nimport pandas as pd \nimport torch\nimport torch.nn as nn # neural network module\nimport torch.nn.functional as F # neural network module에서 자주 사용되는 함수\nimport torchvision\nimport cv2, math, shutil # OpenCV => cv2\nimport albumentations as Albu\nimport rasterio\nimport seam_carving\nimport skimage\nfrom skimage.io.manage_plugins import call_plugin\nfrom skimage.color import rgb2hed, hed2rgb\nfrom skimage.exposure import rescale_intensity\n\nimport matplotlib.pyplot as plt\nfrom rasterio.enums import Resampling\nfrom rasterio.transform import Affine\nfrom torchvision import models\nfrom torchvision import transforms\nfrom albumentations.pytorch import ToTensorV2  \nfrom sklearn.model_selection import train_test_split\nfrom torch.utils.data import Dataset, DataLoader\nfrom sklearn.metrics import roc_auc_score\nfrom tqdm.notebook import tqdm\n%matplotlib inline","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-09-10T11:07:04.822489Z","iopub.execute_input":"2022-09-10T11:07:04.823551Z","iopub.status.idle":"2022-09-10T11:07:09.404168Z","shell.execute_reply.started":"2022-09-10T11:07:04.823507Z","shell.execute_reply":"2022-09-10T11:07:09.403204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Step 1.1 Test, Submission Path Setting\ndata_path = '../input/mayo-clinic-strip-ai/'\ntest = pd.read_csv(data_path + 'test.csv')\nsubmission = pd.read_csv(data_path + 'sample_submission.csv')\nsubmission_efficient = pd.read_csv(data_path + 'sample_submission.csv')\nsubmission_vit = pd.read_csv(data_path + 'sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:07:09.405941Z","iopub.execute_input":"2022-09-10T11:07:09.406512Z","iopub.status.idle":"2022-09-10T11:07:09.428833Z","shell.execute_reply.started":"2022-09-10T11:07:09.406483Z","shell.execute_reply":"2022-09-10T11:07:09.427981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Step 1.1.1 Seed Fasten\nseed = 50\nos.environ['PYTHONHASHSEED'] = str(seed) # python 난수 고정 => 환경변수 접근, 고정 시드 넘버 할당\nrandom.seed(seed) # random module 난수 고정\nnp.random.seed(seed) # numpy module 난수 고정\ntorch.manual_seed(seed)\n\ntorch.manual_seed(seed) # 파이토치 CPU 난수 생성기 => 시드 고정 \ntorch.cuda.manual_seed(seed) # 파이토치 GPU 난수 생성기 => 시드 고정\ntorch.cuda.manual_seed_all(seed) # 파이토치 멀티 코어_GPU 난수 생성기 => 시드 고정\n\ntorch.backends.cudnn.deterministic = True # 확정적 연산 사용\ntorch.backends.cudnn.benchmark = False # benchmark function 해제\ntorch.backends.cudnn.enabled = False # cudnn 사용 해제","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:07:09.43009Z","iopub.execute_input":"2022-09-10T11:07:09.430533Z","iopub.status.idle":"2022-09-10T11:07:09.441113Z","shell.execute_reply.started":"2022-09-10T11:07:09.430498Z","shell.execute_reply":"2022-09-10T11:07:09.440111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Step 1.2.1 Device setting => GPU\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\ndevice","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:07:09.443468Z","iopub.execute_input":"2022-09-10T11:07:09.444341Z","iopub.status.idle":"2022-09-10T11:07:09.514435Z","shell.execute_reply.started":"2022-09-10T11:07:09.444297Z","shell.execute_reply":"2022-09-10T11:07:09.513418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dir_path = './test'\nos.mkdir(dir_path)","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:07:10.410654Z","iopub.execute_input":"2022-09-10T11:07:10.411294Z","iopub.status.idle":"2022-09-10T11:07:10.41628Z","shell.execute_reply.started":"2022-09-10T11:07:10.411256Z","shell.execute_reply":"2022-09-10T11:07:10.41515Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Demo Test Data Set Convert (Tiff to Png)\nimage_scalar = 1024\nseam_carving.carve.MAX_MEAN_ENERGY = 10.0\n# fig, axes = plt.subplots(2, 2, figsize=(7, 6), sharex=True, sharey=True)\n# ax = axes.ravel()\nfor i in tqdm(range(test.shape[0])):\n    # Remove Background White Space\n        img_id = test.iloc[i].image_id\n        img_path = f'../input/mayo-clinic-strip-ai/test/{img_id}.tif'\n\n        image = rasterio.open(img_path)\n        image = image.read(out_shape=(image.count, int(image_scalar), int(image_scalar)),\n                                 resampling=Resampling.bilinear).transpose(1,2,0)\n        image_h, image_w, _ = image.shape\n        image = seam_carving.resize(image, (image_w-512, image_h-512),\n                                        energy_mode='backward',\n                                        order=('width-first'),\n                                        keep_mask=None)\n    # Apply Stain Color Normalization => Using Skimage\n        ihc_hed = rgb2hed(image)\n        null = np.zeros_like(ihc_hed[:, :, 0])\n        h = rescale_intensity(ihc_hed[:, :, 0], out_range=(0, 1),\n                      in_range=(0, np.percentile(ihc_hed[:, :, 0], 99)))\n        d = rescale_intensity(ihc_hed[:, :, 2], out_range=(0, 1),\n                      in_range=(0, np.percentile(ihc_hed[:, :, 2], 99)))\n        # Cast the two channels into an RGB image, as the blue and green channels\n        # respectively\n        image = np.dstack((null, d, h))#.transpose(2,0,1).astype(np.uint16)\n        print(image.shape)\n#         fig = plt.figure()\n#         axis = plt.subplot(1, 1, 1, sharex=ax[0], sharey=ax[0])\n#         axis.imshow(image)\n#         axis.set_title('Stain-separated image (rescaled)')\n#         axis.axis('off')\n#         plt.show()\n#         with rasterio.open(f'./test/{img_id}.png', 'w', driver='png', height = image.shape[1], # driver => jpeg, png, gtiff\n#                        width = image.shape[2], dtype = image.dtype, count=3) as images: # count => Image Channel 개수 (RGB의 경우 3개)\n#             images.write(image)\n\n        skimage.io.imsave(f'./test/{img_id}.png', image)\n        del image\n        gc.collect()\n        \n        \n\n#         if img_id == '006388_0':\n#             target_image = image\n#             image = image.transpose(2,0,1)\n#             with rasterio.open(f'./test/{img_id}.png', 'w', driver='png', height = image.shape[1], # driver => jpeg, png, gtiff\n#                            width = image.shape[2], dtype = image.dtype, count=3) as images: # count => Image Channel 개수 (RGB의 경우 3개)\n#                 images.write(image)\n\n#             continue\n        \n#         else:\n#             target_img = staintools.LuminosityStandardizer.standardize(target_image)\n#             transform_img = staintools.LuminosityStandardizer.standardize(image)\n\n#             normalizer = staintools.StainNormalizer(method='vahadane')\n#             target_img_n = normalizer.fit(target_img)\n#             transform_img_n = normalizer.transform(transform_img)\n#             image = transform_img_n.transpose(2,0,1)\n#             with rasterio.open(f'./test/{img_id}.png', 'w', driver='png', height = image.shape[1], # driver => jpeg, png, gtiff\n#                        width = image.shape[2], dtype = image.dtype, count=3) as images: # count => Image Channel 개수 (RGB의 경우 3개)\n#                 images.write(image)\n\n#             del image\n#             gc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:07:11.75546Z","iopub.execute_input":"2022-09-10T11:07:11.755893Z","iopub.status.idle":"2022-09-10T11:11:29.982142Z","shell.execute_reply.started":"2022-09-10T11:07:11.755858Z","shell.execute_reply":"2022-09-10T11:11:29.981199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Step 1.2.2 Definition Data Set Class\nclass ImageDataset(Dataset):\n    def __init__(self, df, img_dir='./', transform=None, is_test=True):\n        super().__init__()\n        self.df = df\n        self.img_dir = img_dir\n        self.transform = transform\n        self.is_test = is_test\n        \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, idx):\n    \n        if self.is_test:\n            img_id = self.df.iloc[idx, 0] \n            img_path = f'{self.img_dir}/{img_id}.png'\n            \n            image = rasterio.open(img_path)\n            image = image.read(resampling=Resampling.bilinear).transpose(1,2,0)\n            patient_ids = self.df.iloc[idx, 2]\n            \n            if self.transform is not None:\n              image = self.transform(image=image)['image']\n            \n            return image, patient_ids ","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:11:37.978051Z","iopub.execute_input":"2022-09-10T11:11:37.978778Z","iopub.status.idle":"2022-09-10T11:11:37.986593Z","shell.execute_reply.started":"2022-09-10T11:11:37.978741Z","shell.execute_reply":"2022-09-10T11:11:37.985598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Step 1.3 Test Transform\ntransform_test = Albu.Compose([Albu.Normalize(mean=[0.485, 0.456, 0.406], \n                                              std=[0.229, 0.224, 0.225]),\n                               ToTensorV2()])","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:11:41.665883Z","iopub.execute_input":"2022-09-10T11:11:41.666272Z","iopub.status.idle":"2022-09-10T11:11:41.672274Z","shell.execute_reply.started":"2022-09-10T11:11:41.66624Z","shell.execute_reply":"2022-09-10T11:11:41.671074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 1.4 Test Data Set\nimg_dir = './test'\ndataset_test = ImageDataset(test, img_dir=img_dir, transform=transform_test)","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:11:42.595456Z","iopub.execute_input":"2022-09-10T11:11:42.596431Z","iopub.status.idle":"2022-09-10T11:11:42.601575Z","shell.execute_reply.started":"2022-09-10T11:11:42.596385Z","shell.execute_reply":"2022-09-10T11:11:42.600533Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Step 1.5 Data Loader Definition \ndef seed_worker(worker_id):\n    worker_seed = torch.initial_seed() %2**32\n    np.random.seed(worker_seed)\n    random.seed(worker_seed)\n\ng = torch.Generator()\ng.manual_seed(0)\n\nbatch_size = 1\nloader_test = DataLoader(dataset_test, batch_size=batch_size, shuffle=False, \n                         worker_init_fn=seed_worker, generator=g, num_workers=1)","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:11:43.534597Z","iopub.execute_input":"2022-09-10T11:11:43.535296Z","iopub.status.idle":"2022-09-10T11:11:43.541354Z","shell.execute_reply.started":"2022-09-10T11:11:43.535259Z","shell.execute_reply":"2022-09-10T11:11:43.540076Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Step 1.6 Pretrained Model => Efficient Net-B5\n# 앙상블 추후 적용 => 모델 리스트화\nmodel = []\n\n# Efficient-Net\nefficient_net = models.efficientnet_b0()\nefficient_net.classifier = nn.Linear(1280,2)\nefficient_net.load_state_dict(torch.load('../input/strip-ai-train-parameters/new_efficient_model_state_dict.pth'))\nprint(efficient_net.classifier)\n\nefficient_net = efficient_net.to(device)\nmodel.append(efficient_net)","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:11:45.997075Z","iopub.execute_input":"2022-09-10T11:11:45.99846Z","iopub.status.idle":"2022-09-10T11:11:49.229264Z","shell.execute_reply.started":"2022-09-10T11:11:45.998412Z","shell.execute_reply":"2022-09-10T11:11:49.227378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# regnet_x = models.regnet_x_8gf()\n# regnet_x.fc = nn.Linear(1920,2)\n# regnet_x.load_state_dict(torch.load('../input/strip-ai-regnet-train-1k-png/model_state_dict.pth'))\n# print(regnet_x.fc)\n\n# regnet_x = regnet_x.to(device)\n# model.append(regnet_x)","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:11:49.231369Z","iopub.execute_input":"2022-09-10T11:11:49.231833Z","iopub.status.idle":"2022-09-10T11:11:49.236963Z","shell.execute_reply.started":"2022-09-10T11:11:49.231794Z","shell.execute_reply":"2022-09-10T11:11:49.235976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vit = models.vit_l_16(image_size=512)\nvit.heads = nn.Linear(1024,2)\nvit.load_state_dict(torch.load('../input/strip-ai-vit-train-parameter/vit_model_state_dict.pth'))\n\nvit = vit.to(device)\nmodel.append(vit)\n# i want to test Vision Transformer model but, computing powers that i have are limited.... ","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:11:49.238659Z","iopub.execute_input":"2022-09-10T11:11:49.239599Z","iopub.status.idle":"2022-09-10T11:12:06.246537Z","shell.execute_reply.started":"2022-09-10T11:11:49.239562Z","shell.execute_reply":"2022-09-10T11:12:06.245426Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Step 1.7 Predict Function Definition\ndef predict(model, loader_test): \n    ids = []\n    model.eval()\n    preds_part = []\n    \n    with torch.no_grad():\n        for images, patient_ids in loader_test:\n            images = images.to(device) #, dtype=torch.float32)\n            outputs = model(images)\n            \n            ids.append(patient_ids[0]) # Pytorch Broadcasting => patient_ids 차원 추가, 그래서 ('patient_id',) <= 출력 형태가 저런 모습이었다. \n            preds_part.append(torch.softmax(outputs.cpu(), dim=1).squeeze().numpy())\n            \n    return np.array(preds_part), ids","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:12:11.243885Z","iopub.execute_input":"2022-09-10T11:12:11.244271Z","iopub.status.idle":"2022-09-10T11:12:11.251498Z","shell.execute_reply.started":"2022-09-10T11:12:11.244237Z","shell.execute_reply":"2022-09-10T11:12:11.250199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Step 3.8.6 Submission\npreds, ids = predict(model[0], loader_test)\nresult_table_efficient = pd.DataFrame({'patient_id' : ids, \"CE\" : preds[:,0], \"LAA\" : preds[:,1]})\nresult_table_efficient = result_table_efficient.groupby(\"patient_id\").mean()","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:12:12.980967Z","iopub.execute_input":"2022-09-10T11:12:12.981654Z","iopub.status.idle":"2022-09-10T11:12:14.144445Z","shell.execute_reply.started":"2022-09-10T11:12:12.981616Z","shell.execute_reply":"2022-09-10T11:12:14.143248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result_table_efficient","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:12:15.45815Z","iopub.execute_input":"2022-09-10T11:12:15.458964Z","iopub.status.idle":"2022-09-10T11:12:15.475765Z","shell.execute_reply.started":"2022-09-10T11:12:15.458927Z","shell.execute_reply":"2022-09-10T11:12:15.474699Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_efficient.CE = result_table_efficient.CE.to_list()\nsubmission_efficient.LAA = result_table_efficient.LAA.to_list()\n\n#submission_efficient[['patient_id', 'CE', 'LAA']].round(6).to_csv('submission.csv', index=False)\nsubmission_efficient","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:12:28.120738Z","iopub.execute_input":"2022-09-10T11:12:28.1211Z","iopub.status.idle":"2022-09-10T11:12:28.136336Z","shell.execute_reply.started":"2022-09-10T11:12:28.121065Z","shell.execute_reply":"2022-09-10T11:12:28.134799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds, ids = predict(model[1], loader_test)\nresult_table_vit = pd.DataFrame({'patient_id' : ids, 'CE' : preds[:,0], 'LAA' : preds[:,1]})\nresult_table_vit = result_table_vit.groupby(\"patient_id\").mean()","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:12:30.338233Z","iopub.execute_input":"2022-09-10T11:12:30.339424Z","iopub.status.idle":"2022-09-10T11:12:31.124838Z","shell.execute_reply.started":"2022-09-10T11:12:30.339377Z","shell.execute_reply":"2022-09-10T11:12:31.123668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result_table_vit","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:12:33.072933Z","iopub.execute_input":"2022-09-10T11:12:33.073691Z","iopub.status.idle":"2022-09-10T11:12:33.084145Z","shell.execute_reply.started":"2022-09-10T11:12:33.073651Z","shell.execute_reply":"2022-09-10T11:12:33.083249Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_vit.CE = result_table_vit.CE.to_list()\nsubmission_vit.LAA = result_table_vit.LAA.to_list()\nsubmission_vit","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:12:43.079285Z","iopub.execute_input":"2022-09-10T11:12:43.079912Z","iopub.status.idle":"2022-09-10T11:12:43.093198Z","shell.execute_reply.started":"2022-09-10T11:12:43.079875Z","shell.execute_reply":"2022-09-10T11:12:43.091936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.CE = (submission_efficient.CE + submission_vit.CE) / 2\nsubmission.LAA = (submission_efficient.LAA + submission_vit.LAA) / 2\n\nsubmission[['patient_id', 'CE', 'LAA']].round(6).to_csv('submission.csv', index=False) # CE, LAA만 괄호에 넣었더니 patient_id이 사라진 상태로 CSV 파일이 저장된 경우....\nsubmission","metadata":{"execution":{"iopub.status.busy":"2022-09-10T11:12:43.408007Z","iopub.execute_input":"2022-09-10T11:12:43.408703Z","iopub.status.idle":"2022-09-10T11:12:43.431038Z","shell.execute_reply.started":"2022-09-10T11:12:43.408666Z","shell.execute_reply":"2022-09-10T11:12:43.430203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!head submission.csv","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-09-10T11:12:57.107055Z","iopub.execute_input":"2022-09-10T11:12:57.107447Z","iopub.status.idle":"2022-09-10T11:12:58.134947Z","shell.execute_reply.started":"2022-09-10T11:12:57.107413Z","shell.execute_reply":"2022-09-10T11:12:58.133723Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}