{"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":"%%capture\n!pip install /kaggle/input/detectron2-wheel/detectron2/detectron2-0.6-cp310-cp310-linux_x86_64.whl --no-index --find-links=/kaggle/input/detectron2-wheel/detectron2","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-06-26T08:46:19.638645Z","iopub.execute_input":"2023-06-26T08:46:19.639118Z","iopub.status.idle":"2023-06-26T08:46:32.380115Z","shell.execute_reply.started":"2023-06-26T08:46:19.639075Z","shell.execute_reply":"2023-06-26T08:46:32.378802Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os,random\nimport cv2\nimport json\nimport time\nimport torch\nfrom tqdm.auto import tqdm\n\nimport detectron2\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.evaluator import DatasetEvaluator\nfrom detectron2 import model_zoo\nfrom detectron2.config import get_cfg\nfrom detectron2.data import DatasetCatalog, MetadataCatalog\nfrom detectron2.engine import DefaultPredictor, DefaultTrainer, launch\nfrom detectron2.structures import BoxMode\nfrom detectron2.utils.visualizer import ColorMode\nfrom detectron2.utils.logger import setup_logger\nfrom detectron2.utils.visualizer import Visualizer\nfrom detectron2.data import DatasetCatalog, MetadataCatalog, build_detection_test_loader, build_detection_train_loader\nfrom detectron2.data import detection_utils as utils\nimport detectron2.data.transforms as T\nfrom detectron2.evaluation import COCOEvaluator, inference_on_dataset\nsetup_logger()\n\n\n\nimport pycocotools.mask as mask_util\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nfrom fastcore.all import *\nfrom pycocotools.coco import COCO\nimport matplotlib.patches as mpatches\nfrom skimage import io\n\nimport warnings\nwarnings.filterwarnings('ignore') #Ignore \"future\" warnings and Data-Frame-Slicing warnings.\n\nos.environ['CUDA_VISIBLE_DEVICES'] = '0' \nif torch.cuda.is_available():\n    DEVICE = torch.device('cuda')\n    print('GPU is available')\nelse:\n    DEVICE = torch.device('cpu')\n    print('CPU is used')\nprint('detectron ver:', detectron2.__version__)","metadata":{"execution":{"iopub.status.busy":"2023-06-26T08:46:32.382756Z","iopub.execute_input":"2023-06-26T08:46:32.383108Z","iopub.status.idle":"2023-06-26T08:46:35.484397Z","shell.execute_reply.started":"2023-06-26T08:46:32.383077Z","shell.execute_reply":"2023-06-26T08:46:35.483388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Data_Resister_training=\"HuBMAP_train\";\nData_Resister_valid=\"HuBMAP_valid\";\nfrom detectron2.data.datasets import register_coco_instances\ndataDir=Path('/kaggle/input/hubmap-train-augmented/train_augmented/')\n\nregister_coco_instances(Data_Resister_training,{}, '/kaggle/input/coco-dataset-hubmap-2023-aug/coco_annotations_train_all_fold1_aug.json', dataDir)\nregister_coco_instances(Data_Resister_valid,{},'/kaggle/input/coco-dataset-hubmap-2023-aug/coco_annotations_valid_all_fold1_aug.json', dataDir)\n\nmetadata = MetadataCatalog.get(Data_Resister_training)\ndataset_train = DatasetCatalog.get(Data_Resister_training)\ndataset_valid = DatasetCatalog.get(Data_Resister_valid)","metadata":{"execution":{"iopub.status.busy":"2023-06-26T08:46:35.486372Z","iopub.execute_input":"2023-06-26T08:46:35.486874Z","iopub.status.idle":"2023-06-26T08:46:40.997103Z","shell.execute_reply.started":"2023-06-26T08:46:35.486846Z","shell.execute_reply":"2023-06-26T08:46:40.996102Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"annFile = Path(\"/kaggle/input/coco-dataset-hubmap-2023-aug/coco_annotations_train_all_fold1_aug.json\")\n\ncolors = ['Set1'] \nlegend = {1: 'blood_vessel'} \n\ncoco = COCO(annFile)\nimgIds = coco.getImgIds()\nimgs = coco.loadImgs(imgIds[48:50])\n\nfig, axs = plt.subplots(len(imgs), 2, figsize=(10, 5*len(imgs)))\nfor img, ax_row in zip(imgs, axs):\n    ax = ax_row[0]  # Access the first axis in each row\n    I = io.imread(dataDir / img[\"file_name\"])\n    annIds = coco.getAnnIds(imgIds=[img[\"id\"]])\n    anns = coco.loadAnns(annIds)\n    ax.imshow(I)\n    ax = ax_row[1]  # Access the second axis in each row\n    ax.imshow(I)\n    plt.sca(ax)\n    for i, ann in enumerate(anns):\n        category_id = ann['category_id']\n        color = colors[category_id-1]\n        #-----------------------------------------\n        mask = coco.annToMask(ann)\n        mask = np.ma.masked_where(mask == 0, mask)\n        ax.imshow(mask, cmap=color, alpha=1)\n        #-----------------------------------------\n        handles = []\n        for category_id in legend:\n            color = colors[category_id - 1]\n            handles.append(mpatches.Patch(color=plt.colormaps.get_cmap(color)(0)))\n        ax.legend(handles, legend.values(), bbox_to_anchor=(1.05, 1), loc='upper left')\n\nplt.axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-06-26T08:46:40.998610Z","iopub.execute_input":"2023-06-26T08:46:40.998991Z","iopub.status.idle":"2023-06-26T08:46:44.969324Z","shell.execute_reply.started":"2023-06-26T08:46:40.998956Z","shell.execute_reply":"2023-06-26T08:46:44.968470Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from detectron2.evaluation.evaluator import DatasetEvaluator\nimport pycocotools.mask as mask_util\ndef precision_at(threshold, iou):\n    matches = iou > threshold\n    matches = np.atleast_2d(matches)  # Convert to 2D array if necessary\n    true_positives = np.sum(matches, axis=1) == 1  # Correct objects\n    false_positives = np.sum(matches, axis=0) == 0  # Missed objects\n    false_negatives = np.sum(matches, axis=1) == 0  # Extra objects\n    return np.sum(true_positives), np.sum(false_positives), np.sum(false_negatives)\n\ndef score(pred, targ):\n    pred_masks = pred['instances'].pred_masks.cpu().numpy()\n    enc_preds = [mask_util.encode(np.asarray(p, order='F')) for p in pred_masks]\n    enc_targs = list(map(lambda x:x['segmentation'], targ))\n    ious = mask_util.iou(enc_preds, enc_targs, [0]*len(enc_targs))\n    prec = []\n    for t in np.arange(0.45, 1.0, 0.05):\n        tp, fp, fn = precision_at(t, ious)\n        p = tp / (tp + fp + fn)\n        prec.append(p)\n    return np.mean(prec)\n\nclass MAPIOUEvaluator(DatasetEvaluator):\n    def __init__(self, dataset_name):\n        dataset_dicts = DatasetCatalog.get(dataset_name)\n        self.annotations_cache = {item['image_id']:item['annotations'] for item in dataset_dicts}\n            \n    def reset(self):\n        self.scores = []\n\n    def process(self, inputs, outputs):\n        for inp, out in zip(inputs, outputs):\n            if len(out['instances']) == 0:\n                self.scores.append(0)    \n            else:\n                targ = self.annotations_cache[inp['image_id']]\n                self.scores.append(score(out, targ))\n\n    def evaluate(self):\n        return {\"MaP IoU\": np.mean(self.scores)}","metadata":{"execution":{"iopub.status.busy":"2023-06-26T08:46:44.971603Z","iopub.execute_input":"2023-06-26T08:46:44.971939Z","iopub.status.idle":"2023-06-26T08:46:44.989270Z","shell.execute_reply.started":"2023-06-26T08:46:44.971909Z","shell.execute_reply":"2023-06-26T08:46:44.988059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from detectron2.engine import BestCheckpointer\nfrom detectron2.checkpoint import DetectionCheckpointer\n\nclass Trainer(DefaultTrainer):\n    @classmethod\n    def build_evaluator(cls, cfg, dataset_name, output_folder=None):\n        return MAPIOUEvaluator(dataset_name)\n    def build_hooks(self):\n        cfg = self.cfg.clone()\n        hooks = super().build_hooks()\n        checkpointer = DetectionCheckpointer(\n            self.model,\n            cfg.OUTPUT_DIR,\n        )\n        hooks.insert(-1, BestCheckpointer(cfg.TEST.EVAL_PERIOD, \n                                         checkpointer,\n                                         \"MaP IoU\",\n                                         \"max\",\n                                         ))\n        return hooks","metadata":{"execution":{"iopub.status.busy":"2023-06-26T08:46:44.990664Z","iopub.execute_input":"2023-06-26T08:46:44.991139Z","iopub.status.idle":"2023-06-26T08:46:45.003912Z","shell.execute_reply.started":"2023-06-26T08:46:44.991109Z","shell.execute_reply":"2023-06-26T08:46:45.002736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cfg = get_cfg()\n#config_name = \"COCO-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_3x.yaml\" \nconfig_name = \"COCO-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_3x.yaml\" \ncfg.merge_from_file(model_zoo.get_config_file(config_name))\n\ncfg.DATASETS.TRAIN = (Data_Resister_training,)\ncfg.DATASETS.TEST = (Data_Resister_valid,)\n\ncfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(config_name)\ncfg.DATALOADER.NUM_WORKERS = 0\ncfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128  \ncfg.MODEL.ROI_HEADS.NUM_CLASSES = 2 # 1+ background class.\ncfg.SOLVER.IMS_PER_BATCH = 2 \ncfg.INPUT.MASK_FORMAT='bitmask'\n\ncfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5\ncfg.SOLVER.MAX_ITER = 15000 #Maximum of iterations 1\ncfg.SOLVER.BASE_LR = 0.005 #(quite high base learning rate but should drop)\ncfg.SOLVER.GAMMA = 0.95 #LR will be decreased by a factor of 0.9\ncfg.SOLVER.WARMUP_ITERS = 300 #How many iterations to go from 0 to reach base LR\ncfg.SOLVER.STEPS = (400,800,1200,1600,2500,3000,7000,10000) #At which point to change the LR \ncfg.TEST.EVAL_PERIOD = 500\n#cfg.SOLVER.CHECKPOINT_PERIOD=250\nos.makedirs(cfg.OUTPUT_DIR, exist_ok=True)\n\n\ntrainer = Trainer(cfg) \ntrainer.resume_or_load(resume=True)\ntrainer.train()","metadata":{"execution":{"iopub.status.busy":"2023-06-26T08:46:45.005696Z","iopub.execute_input":"2023-06-26T08:46:45.006496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}