{"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":"!pip install 'git+https://github.com/facebookresearch/detectron2.git'","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-12-29T06:50:57.072931Z","iopub.execute_input":"2022-12-29T06:50:57.073430Z","iopub.status.idle":"2022-12-29T06:53:59.249293Z","shell.execute_reply.started":"2022-12-29T06:50:57.073343Z","shell.execute_reply":"2022-12-29T06:53:59.248116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport detectron2\nfrom detectron2 import model_zoo\nfrom detectron2.engine import DefaultPredictor\nfrom detectron2.config import get_cfg\nfrom PIL import Image\nimport cv2\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom fastcore.all import *\ndetectron2.__version__","metadata":{"execution":{"iopub.status.busy":"2022-12-29T06:53:59.251586Z","iopub.execute_input":"2022-12-29T06:53:59.253067Z","iopub.status.idle":"2022-12-29T06:54:01.220118Z","shell.execute_reply.started":"2022-12-29T06:53:59.253020Z","shell.execute_reply":"2022-12-29T06:54:01.218610Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CFG:\n    wfold = 0\n    data_folder = '../input/sartorius-cell-instance-segmentation/'\n    anno_folder = '\"/kaggle/input/annotationcellsegmentation/result/\"'\n    arch = 'mask_rcnn_R_50_FPN_3x'\n    nof_iters = 3000\n    model_folder = '/kaggle/input/datasetwithtrainedweights/'\n    \n    \nTHRESHOLDS = [.18, .35, .58]\nMIN_PIXELS = [75, 150, 75]    ","metadata":{"execution":{"iopub.status.busy":"2022-12-29T06:54:01.221654Z","iopub.execute_input":"2022-12-29T06:54:01.222913Z","iopub.status.idle":"2022-12-29T06:54:01.229765Z","shell.execute_reply.started":"2022-12-29T06:54:01.222870Z","shell.execute_reply":"2022-12-29T06:54:01.228368Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rle_decode(mask_rle, shape=(520, 704)):\n    '''\n    mask_rle: run-length as string formated (start length)\n    shape: (height,width) of array to return \n    Returns numpy array, 1 - mask, 0 - background\n\n    '''\n    s = mask_rle.split()\n    starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]\n    starts -= 1\n    ends = starts + lengths\n    img = np.zeros(shape[0]*shape[1], dtype=np.uint8)\n    for lo, hi in zip(starts, ends):\n        img[lo:hi] = 1\n    return img.reshape(shape)  # Needed to align to RLE direction\n\ndef rle_encode(img):\n    '''\n    img: numpy array, 1 - mask, 0 - background\n    Returns run length as string formated\n    '''\n    pixels = img.flatten()\n    pixels = np.concatenate([[0], pixels, [0]])\n    runs = np.where(pixels[1:] != pixels[:-1])[0] + 1\n    runs[1::2] -= runs[::2]\n    return ' '.join(str(x) for x in runs)","metadata":{"execution":{"iopub.status.busy":"2022-12-29T06:54:01.232894Z","iopub.execute_input":"2022-12-29T06:54:01.233613Z","iopub.status.idle":"2022-12-29T06:54:01.243167Z","shell.execute_reply.started":"2022-12-29T06:54:01.233577Z","shell.execute_reply":"2022-12-29T06:54:01.242253Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_masks(fn, predictor):\n    im = cv2.imread(str(fn))\n    pred = predictor(im)\n    pred_class = torch.mode(pred['instances'].pred_classes)[0]\n    take = pred['instances'].scores >= THRESHOLDS[pred_class]\n    pred_masks = pred['instances'].pred_masks[take]\n    pred_masks = pred_masks.cpu().numpy()\n    res = []\n    used = np.zeros(im.shape[:2], dtype=int) \n    for mask in pred_masks:\n        mask = mask * (1-used)\n        if mask.sum() >= MIN_PIXELS[pred_class]: # skip predictions with small area\n            used += mask\n            res.append(rle_encode(mask))\n    return res","metadata":{"execution":{"iopub.status.busy":"2022-12-29T06:54:01.244457Z","iopub.execute_input":"2022-12-29T06:54:01.245016Z","iopub.status.idle":"2022-12-29T06:54:01.253390Z","shell.execute_reply.started":"2022-12-29T06:54:01.244977Z","shell.execute_reply":"2022-12-29T06:54:01.252363Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataDir=Path(CFG.data_folder)\n\nids, masks=[],[]\ntest_names = (dataDir/'test').ls()","metadata":{"execution":{"iopub.status.busy":"2022-12-29T06:54:01.254887Z","iopub.execute_input":"2022-12-29T06:54:01.255227Z","iopub.status.idle":"2022-12-29T06:54:01.273576Z","shell.execute_reply.started":"2022-12-29T06:54:01.255193Z","shell.execute_reply":"2022-12-29T06:54:01.272815Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_names","metadata":{"execution":{"iopub.status.busy":"2022-12-29T06:54:01.274603Z","iopub.execute_input":"2022-12-29T06:54:01.274874Z","iopub.status.idle":"2022-12-29T06:54:01.282702Z","shell.execute_reply.started":"2022-12-29T06:54:01.274849Z","shell.execute_reply":"2022-12-29T06:54:01.281706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cfg = get_cfg()\ncfg.merge_from_file(model_zoo.get_config_file(\"COCO-InstanceSegmentation/\"+CFG.arch+\".yaml\"))\ncfg.INPUT.MASK_FORMAT='bitmask'\ncfg.MODEL.ROI_HEADS.NUM_CLASSES = 3 \ncfg.MODEL.WEIGHTS = CFG.model_folder + 'output/model_best.pth' \ncfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5\ncfg.TEST.DETECTIONS_PER_IMAGE = 1000\npredictor = DefaultPredictor(cfg)","metadata":{"execution":{"iopub.status.busy":"2022-12-29T06:54:01.284033Z","iopub.execute_input":"2022-12-29T06:54:01.285101Z","iopub.status.idle":"2022-12-29T06:54:06.472830Z","shell.execute_reply.started":"2022-12-29T06:54:01.285067Z","shell.execute_reply":"2022-12-29T06:54:06.471836Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nencoded_masks = get_masks(test_names[1], predictor)\n\n_, axs = plt.subplots(1,2, figsize=(40,15))\naxs[1].imshow(cv2.imread(str(test_names[0])))\nfor enc in encoded_masks:\n    dec = rle_decode(enc)\n    axs[0].imshow(np.ma.masked_where(dec==0, dec))","metadata":{"execution":{"iopub.status.busy":"2022-12-29T06:54:06.474188Z","iopub.execute_input":"2022-12-29T06:54:06.474577Z","iopub.status.idle":"2022-12-29T06:54:22.754424Z","shell.execute_reply.started":"2022-12-29T06:54:06.474540Z","shell.execute_reply":"2022-12-29T06:54:22.753602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for fn in test_names:\n    encoded_masks = get_masks(fn, predictor)\n    for enc in encoded_masks:\n        ids.append(fn.stem)\n        masks.append(enc)","metadata":{"execution":{"iopub.status.busy":"2022-12-29T06:54:22.756685Z","iopub.execute_input":"2022-12-29T06:54:22.757745Z","iopub.status.idle":"2022-12-29T06:54:23.397671Z","shell.execute_reply.started":"2022-12-29T06:54:22.757704Z","shell.execute_reply":"2022-12-29T06:54:23.396704Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.DataFrame({'id':ids, 'predicted':masks}).to_csv('submission.csv', index=False)\npd.read_csv('submission.csv').head()","metadata":{"execution":{"iopub.status.busy":"2022-12-29T06:54:23.399099Z","iopub.execute_input":"2022-12-29T06:54:23.399478Z","iopub.status.idle":"2022-12-29T06:54:23.429380Z","shell.execute_reply.started":"2022-12-29T06:54:23.399434Z","shell.execute_reply":"2022-12-29T06:54:23.428560Z"},"trusted":true},"execution_count":null,"outputs":[]}]}