{"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 ../input/mydetect/my_wheels/pycocotools-2.0.2/dist/pycocotools-2.0.2.tar --no-index --find-links ../input/mydetect/my_wheels \n!pip install ../input/mydetect/my_wheels/fvcore-0.1.5.post20211019/fvcore-0.1.5.post20211019 --no-index --find-links ../input/mydetect/my_wheels \n!pip install ../input/mydetect/my_wheels/antlr4-python3-runtime-4.8/antlr4-python3-runtime-4.8 --no-index --find-links ../input/mydetect/my_wheels \n!pip install ../input/mydetect/my_wheels/detectron2-0.5/detectron2 --no-index --find-links ../input/mydetect/my_wheels  \n!pip install ../input/myeboxes/my_Eboxes/ -f ./ --no-index","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cv2, random, os\nimport json\nimport time\nimport numpy as np\nimport pandas as pd\nimport torch\nfrom fastai.vision.all import *\nimport detectron2\nfrom tqdm.auto import tqdm\nfrom detectron2 import model_zoo\nfrom detectron2.engine import DefaultPredictor\nfrom detectron2.config import get_cfg\nfrom detectron2.data.datasets import register_coco_instances\nfrom detectron2.evaluation import inference_on_dataset\nfrom detectron2.evaluation.evaluator import DatasetEvaluator\nfrom detectron2.data import DatasetCatalog, build_detection_test_loader\nimport pycocotools.mask as mask_util\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nfrom fastcore.all import *\nfrom ensemble_boxes import *","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def set_random_seed(seed: int = 56, deterministic: bool = True):\n    random.seed(seed)\n    random_state = np.random.RandomState(seed)\n    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 = False\n    os.environ['PYTHONHASHSEED'] = str(seed)\nset_random_seed(56)    ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rle_decode(mask_rle, shape=(520, 704)):\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)  \n\ndef rle_encode(img):\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_count":null,"outputs":[]},{"cell_type":"code","source":"def ensemble_preds(file_name, path, models, ths, myclass):\n    img = cv2.imread(f'{path}/{file_name}')\n    # classes = []\n    scores = []\n    bboxes = []\n    masks = []\n    for model in models:\n        output = model(img)\n        take = output['instances'].scores >= ths[myclass]\n        scores.extend(output['instances'].scores[take].cpu().numpy().tolist())\n        bboxes.extend(output['instances'].pred_boxes[take].tensor.cpu().numpy().tolist())\n        masks.extend(output['instances'].pred_masks[take].cpu().numpy())\n    classes = [myclass]*len(masks)    \n    scores, classes, bboxes, masks = zip(*sorted(zip(scores, classes, bboxes, masks), reverse=True))   \n    return classes, scores, bboxes, masks\n\ndef nms_predictions(classes, scores, bboxes, masks, iou_th=.4, shape=(520, 704)):\n    he, wd = shape[0], shape[1]\n    boxes_list = [[x[0] / wd, x[1] / he, x[2] / wd, x[3] / he]\n                  for x in bboxes]\n    scores_list = [x for x in scores]\n    labels_list = [x for x in classes]\n    nms_bboxes, nms_scores, nms_classes = nms(boxes=[boxes_list], scores=[scores_list], labels=[labels_list], \n                                              weights=None, iou_thr=iou_th )\n    nms_masks = []\n    for s in nms_scores:\n        nms_masks.append(masks[scores.index(s)])\n    nms_scores, nms_classes, nms_masks = zip(*sorted(zip(nms_scores, nms_classes, nms_masks), reverse=True))\n    \n    return nms_classes, nms_scores, nms_masks\n\n\ndef ensemble_pred_masks(masks, classes, min_pixels, ctype, shape=(520, 704)):\n    result = []\n    #pred_class = max(set(classes), key=classes.count)\n    pred_class = ctype\n    used = np.zeros(shape, dtype=int) \n    for i, mask in enumerate(masks):\n        mask = mask * (1 - used)\n        if mask.sum() >= min_pixels[pred_class]:\n            used += mask\n            result.append(rle_encode(mask))\n    return result","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rle_decode_to_linear(mask_rle, linsize=366080):\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(linsize, dtype=np.uint8)\n    for lo, hi in zip(starts, ends):\n        img[lo : hi] = 1\n    return img \n\ndef rle_encode_from_linear(linearM):\n    pixels = np.concatenate([[0], linearM, [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_count":null,"outputs":[]},{"cell_type":"code","source":"mylearner = load_learner('../input/cell-clas/cell_classifier.pkl')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DATA_PATH = '../input/sartorius-cell-instance-segmentation'\nSUBM_PATH = f'{DATA_PATH}/test'\nSINGLE_MODE = False\nNMS = True\nMIN_PIXELS = [60, 110, 50]      #  [shsy5y, astro, cort]\nIOU_TH = .4\ncell_dict = {'shsy5y':0, 'astro':1, 'cort':2}\nTHSS = [.18, .38, .58]\n\nVERSIONS = [['10F8','S141T','10F6'], ['10F8','A121TT','10F6'],['10F8','10F9','10F6']]\nMODELS = []\nfor i in range(3):\n    VERS = VERSIONS[i]\n    for ver in VERS:                         \n        TypeMODELS = []\n        cfg = get_cfg()\n        cfg.merge_from_file(model_zoo.get_config_file(\"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml\"))\n        cfg.INPUT.MASK_FORMAT = 'bitmask'\n        cfg.MODEL.ROI_HEADS.NUM_CLASSES = 3 \n        cfg.MODEL.WEIGHTS = os.path.join('../input/models10f', 'model_best'+ver+'.pth')  \n        cfg.TEST.DETECTIONS_PER_IMAGE = 1000\n        TypeMODELS.append(DefaultPredictor(cfg))\n    MODELS.append(TypeMODELS)\n\ntest_names = sorted(os.listdir(SUBM_PATH))\nsubm_ids, subm_masks = [], []\nlin_sizes = []","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for test_name in test_names:\n    \n    ctype = int(cell_dict[(mylearner.predict( DATA_PATH+'/test/'+ test_name))[0]])\n    \n    img = cv2.imread(DATA_PATH+'/test/'+ test_name)\n    linsz = img.shape[0]*img.shape[1]\n    lin_sizes.append(linsz)\n    \n    classes,scores,bboxes,masks = ensemble_preds(file_name=test_name, path=SUBM_PATH, \n                                                 models=MODELS[ctype], ths=THSS, myclass=ctype)\n    if NMS:\n        classes, scores, masks = nms_predictions(classes, scores, bboxes, masks, iou_th=IOU_TH )\n        \n    encoded_masks = ensemble_pred_masks(masks, classes, min_pixels=MIN_PIXELS, ctype=ctype )\n    \n    for enc_mask in encoded_masks:\n        subm_ids.append(test_name[:test_name.find('.')])\n        subm_masks.append(enc_mask)\n        \nmy_subm = pd.DataFrame({'id': subm_ids, 'predicted': subm_masks }) \nmysubm_ids = list(my_subm['id'].unique())","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"proc_masks = []\nsz = 0\nfor sid in mysubm_ids:\n    imsize = lin_sizes[sz]\n    sid_subm = my_subm[my_subm.id == sid].reset_index(drop = True)\n    slen = len(sid_subm)\n    sid_masks = list(sid_subm['predicted'].values)\n    sid_binaries = []\n    for sid_mask in sid_masks:\n        sid_binaries.append(rle_decode_to_linear(sid_mask,linsize=imsize))\n    bin_matrix = np.array(sid_binaries)\n    bshape = bin_matrix.shape\n    for i in range(bshape[0]):\n        mask = abs(1-bin_matrix[i])\n        for j in range(i+1, bshape[0]):\n            bin_matrix[j] = bin_matrix[j] * mask\n        proc_masks.append(rle_encode_from_linear(bin_matrix[i]))          \n    sz+=1  ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.DataFrame({'id': subm_ids, 'predicted': proc_masks }).to_csv('submission.csv', index=False)\npd.read_csv('submission.csv').head() ","metadata":{},"execution_count":null,"outputs":[]}]}