{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# !pip install git+https://github.com/qubvel/segmentation_models.pytorch","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import os\nimport copy\nimport cv2\nimport random\nimport pydicom\nimport torch\nimport time\nimport math\nimport shutil\nimport rasterio\n\nimport pandas as pd\nimport numpy as np\nimport PIL as pil\nimport matplotlib.pyplot as plt\n\nimport torch\nfrom torch import nn\nimport torch.nn.functional as F\nimport torchvision.models as models\nimport pytorch_lightning as pl\nimport albumentations as A\nfrom pytorch_lightning import loggers as pl_loggers\nfrom scipy.ndimage.interpolation import zoom\nfrom albumentations.pytorch import ToTensorV2\nfrom albumentations import (\n    HorizontalFlip, VerticalFlip, IAAPerspective, ShiftScaleRotate, CLAHE, RandomRotate90,\n    Transpose, ShiftScaleRotate, Blur, OpticalDistortion, GridDistortion, HueSaturationValue,\n    IAAAdditiveGaussianNoise, GaussNoise, MotionBlur, MedianBlur, IAAPiecewiseAffine,\n    IAASharpen, IAAEmboss, RandomBrightnessContrast, Flip, OneOf, Compose, Normalize, Cutout, CoarseDropout, ShiftScaleRotate \n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# def seed_everything(seed):\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#     torch.backends.cudnn.benchmark = True\n\n# seed_everything(cfg['seed'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"input_dir = '../input/hubmap-kidney-segmentation'\nerrors_dir = '../input/errors'\nerrors_csv = f'{errors_dir}/errors.csv'\n\nimg_size = 1024","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv(errors_csv)\ndf.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"eps = 1e-7\ndf['filename'] = df.apply( lambda row: f'{row.id}-{row.i}-{row.j}.jpeg', axis=1)\ndf['precision'] = (df.tp + eps) / (df.tp + df.fp + eps)\ndf['recall'] = (df.tp + eps) / (df.tp + df.fn + eps)\ndf['dice'] = (2 * df.tp + eps) / (2 * df.tp + df.fp + df.fn + eps)\ndf.sample(5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def plot_imgs(imgs_df, columns = 4):\n    imgs = imgs_df.filename.tolist()\n    \n    rows = len(imgs) // columns\n    \n    fig, axs = plt.subplots(rows, columns, figsize=(20,rows*5))\n    \n    for ax, img, im,  in zip(axs.flatten(), imgs, imgs_df.id.tolist()):\n        ax.imshow(pil.Image.open(f'{errors_dir}/imgs/{img}'))\n        ax.text(500,500,img, color='blue')\n\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Plot worst predictions"},{"metadata":{"trusted":true},"cell_type":"code","source":"count = 32\nworst = [df.nsmallest(count, typ) for typ in ['precision', 'recall', 'dice']]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**1. Precision**"},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_imgs(worst[0])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**2.Recall**"},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_imgs(worst[1], columns=3)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**3.Dice**"},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_imgs(worst[2])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**4. FN**"},{"metadata":{"trusted":true},"cell_type":"code","source":"worst_fn = df.nlargest(32, 'fn')\nworst_fn.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_imgs(worst_fn)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Plot tiffs"},{"metadata":{"trusted":true},"cell_type":"code","source":"df.nlargest(32, 'fp')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('worst recall; worst fn')\nworst[1].id.value_counts(), worst_fn.id.value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.fp.sum(), df.fn.sum(), ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.groupby(['id']).fn.sum().sort_values(ascending=False), df.groupby(['id']).fp.sum().sort_values(ascending=False),","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"thresh = 0.4\ndf[df.recall < thresh].shape, df[df.precision < thresh].shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"identity = rasterio.Affine(1, 0, 0, 0, 1, 0)\n\ndef reconstruct_img(tiff_id, tiffs, scale=10, typ='imgs'):\n    tif = rasterio.open(os.path.join(input_dir, 'train', f'{tiff_id}.tiff'), transform=identity)\n    shape = tif.shape\n\n    shape = (shape[0] // scale, shape[1] // scale, 3)\n\n    gray = 122\n    patched = np.ones(shape, dtype=np.uint8)*gray\n    print(tiff_id, shape, patched.shape)\n\n    for f in tiffs:\n        file = f.split('.')[0]\n\n        row = int(file.split('-')[1])\n        column = int(file.split('-')[2])\n        file = file.split('-')[0]\n\n        sz = img_size//scale\n\n        xstart = row*sz\n        xstop = xstart+sz\n\n        ystart = column*sz\n        ystop = ystart+sz\n\n        pt = os.path.join(errors_dir, typ, f)\n\n        patch = np.array(pil.Image.open(pt))\n        patch = cv2.resize(patch,(sz,sz))\n\n        patched[xstart:xstop, ystart:ystop] = patch\n        \n    return patched\n\ndef reconstruct_imgs(df, scale=10, typ='imgs'):\n    imgs = {}\n    for tiff_id in df.id.unique().tolist():\n        tiffs = df[df.id == tiff_id].filename.tolist()\n        \n        patch = reconstruct_img(tiff_id, tiffs, scale=scale, typ=typ)        \n        imgs[tiff_id] = patch\n\n    return imgs","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"imgs = reconstruct_imgs(df,scale=5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def save_result(imgs, dr='results'):\n    os.mkdir(dr)\n    \n    for k, v in imgs.items():\n        pl = pil.Image.fromarray(v)\n\n        pl.save(f'{dr}/{k}.jpeg')\n\n    shutil.make_archive(dr, 'zip', dr)\n    shutil.rmtree(dr)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"save_result(imgs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for k, v in imgs.items():\n    plt.figure(figsize = (20,20))\n    plt.imshow(v)\n    plt.title(k)\n    \nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}