{"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":"markdown","source":"Code taken directly from [here](https://www.kaggle.com/code/slawekbiel/positive-score-with-detectron-2-3-training). pls let me know issues in comments. Thanks for reading. COCO dataset generation code [here](https://www.kaggle.com/code/vineethakkinapalli/uw-madison-gi-tract-coco-dataset)","metadata":{}},{"cell_type":"code","source":"!pip -q install 'git+https://github.com/facebookresearch/detectron2.git'","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-05-08T12:25:11.8599Z","iopub.execute_input":"2022-05-08T12:25:11.860204Z","iopub.status.idle":"2022-05-08T12:28:27.017162Z","shell.execute_reply.started":"2022-05-08T12:25:11.860125Z","shell.execute_reply":"2022-05-08T12:28:27.01622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#import torch, torchvision\nimport detectron2\nfrom pathlib import Path\nimport random, cv2, os\nimport matplotlib.pyplot as plt\n# import some common detectron2 utilities\nfrom detectron2 import model_zoo\nfrom detectron2.engine import DefaultPredictor, DefaultTrainer\nfrom detectron2.config import get_cfg\nfrom detectron2.utils.visualizer import Visualizer, ColorMode\nfrom detectron2.data import MetadataCatalog, DatasetCatalog\nfrom detectron2.data.datasets import register_coco_instances","metadata":{"execution":{"iopub.status.busy":"2022-05-08T12:35:08.630458Z","iopub.execute_input":"2022-05-08T12:35:08.631016Z","iopub.status.idle":"2022-05-08T12:35:09.751263Z","shell.execute_reply.started":"2022-05-08T12:35:08.630974Z","shell.execute_reply":"2022-05-08T12:35:09.750543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Load the competition data","metadata":{}},{"cell_type":"code","source":"dataDir=Path('../input/uw-madison-gi-tract-coco-dataset/')\ncfg = get_cfg()\ncfg.INPUT.MASK_FORMAT='bitmask'\nregister_coco_instances('uw_madison_gi_tract_train',{}, '../input/uw-madison-gi-tract-coco-dataset/gi_tract_train_annotations_coco.json', dataDir)\nregister_coco_instances('uw_madison_gi_tract_val',{},'../input/uw-madison-gi-tract-coco-dataset/gi_tract_val_annotations_coco.json', dataDir)\nmetadata = MetadataCatalog.get('uw_madison_gi_tract_train')\ntrain_ds = DatasetCatalog.get('uw_madison_gi_tract_train')","metadata":{"execution":{"iopub.status.busy":"2022-05-08T12:35:32.195184Z","iopub.execute_input":"2022-05-08T12:35:32.195454Z","iopub.status.idle":"2022-05-08T12:35:36.478711Z","shell.execute_reply.started":"2022-05-08T12:35:32.195423Z","shell.execute_reply":"2022-05-08T12:35:36.477961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Display a sample file to check the data is loaded correctly","metadata":{"execution":{"iopub.status.busy":"2021-10-20T14:54:34.693045Z","iopub.execute_input":"2021-10-20T14:54:34.693326Z","iopub.status.idle":"2021-10-20T14:54:34.814645Z","shell.execute_reply.started":"2021-10-20T14:54:34.69329Z","shell.execute_reply":"2021-10-20T14:54:34.813452Z"}}},{"cell_type":"code","source":"d = train_ds[20]\n\nimg = cv2.imread(d[\"file_name\"])\nvisualizer = Visualizer(img[:, :, ::-1], metadata=metadata)\nout = visualizer.draw_dataset_dict(d)\nplt.figure(figsize = (20,15))\nplt.imshow(out.get_image()[:, :, ::-1])","metadata":{"execution":{"iopub.status.busy":"2022-05-08T12:36:07.905342Z","iopub.execute_input":"2022-05-08T12:36:07.905712Z","iopub.status.idle":"2022-05-08T12:36:08.249897Z","shell.execute_reply.started":"2022-05-08T12:36:07.905675Z","shell.execute_reply":"2022-05-08T12:36:08.249234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Train\nHyperparameter optimization is not done here, this is a very basic tutorial implementation.","metadata":{}},{"cell_type":"code","source":"cfg.merge_from_file(model_zoo.get_config_file(\"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml\"))\ncfg.DATASETS.TRAIN = (\"uw_madison_gi_tract_train\",)\ncfg.DATASETS.TEST = ()\ncfg.DATALOADER.NUM_WORKERS = 2\ncfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(\"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml\")  # Let training initialize from model zoo\ncfg.SOLVER.IMS_PER_BATCH = 2\ncfg.SOLVER.BASE_LR = 0.00025 \ncfg.SOLVER.MAX_ITER = 1000    \ncfg.SOLVER.STEPS = []        \ncfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128   \ncfg.MODEL.ROI_HEADS.NUM_CLASSES = 3  \n\n\nos.makedirs(cfg.OUTPUT_DIR, exist_ok=True)\ntrainer = DefaultTrainer(cfg) \ntrainer.resume_or_load(resume=False)\ntrainer.train()","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-05-08T12:36:12.178186Z","iopub.execute_input":"2022-05-08T12:36:12.178964Z","iopub.status.idle":"2022-05-08T12:40:22.471567Z","shell.execute_reply.started":"2022-05-08T12:36:12.178852Z","shell.execute_reply":"2022-05-08T12:40:22.470605Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Lets look at some of the validation files to check if things look reasonable\nWe show predictions on the left and ground truth on the right","metadata":{}},{"cell_type":"code","source":"cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, \"model_final.pth\")  # path to the model we just trained\ncfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5   # set a custom testing threshold\npredictor = DefaultPredictor(cfg)\ndataset_dicts = DatasetCatalog.get('uw_madison_gi_tract_val')\nouts = []\nfor d in random.sample(dataset_dicts, 1):    \n    im = cv2.imread(d[\"file_name\"])\n    outputs = predictor(im)  # format is documented at https://detectron2.readthedocs.io/tutorials/models.html#model-output-format\n    v = Visualizer(im[:, :, ::-1],\n                   metadata = MetadataCatalog.get('uw_madison_gi_tract_train'), \n                    \n                   instance_mode=ColorMode.IMAGE_BW   # remove the colors of unsegmented pixels. This option is only available for segmentation models\n    )\n    out_pred = v.draw_instance_predictions(outputs[\"instances\"].to(\"cpu\"))\n    visualizer = Visualizer(im[:, :, ::-1], metadata=MetadataCatalog.get('uw_madison_gi_tract_train'))\n    out_target = visualizer.draw_dataset_dict(d)\n    outs.append(out_pred)\n    outs.append(out_target)\n_,axs = plt.subplots(len(outs)//2,2,figsize=(40,45))\nfor ax, out in zip(axs.reshape(-1), outs):\n    ax.imshow(out.get_image()[:, :, ::-1])","metadata":{"execution":{"iopub.status.busy":"2022-05-08T12:44:29.224769Z","iopub.execute_input":"2022-05-08T12:44:29.225034Z","iopub.status.idle":"2022-05-08T12:44:31.202615Z","shell.execute_reply.started":"2022-05-08T12:44:29.225003Z","shell.execute_reply":"2022-05-08T12:44:31.201829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls ./output/model_final.pth","metadata":{"execution":{"iopub.status.busy":"2022-05-08T12:44:49.277919Z","iopub.execute_input":"2022-05-08T12:44:49.278174Z","iopub.status.idle":"2022-05-08T12:44:49.99051Z","shell.execute_reply.started":"2022-05-08T12:44:49.278146Z","shell.execute_reply":"2022-05-08T12:44:49.989643Z"},"trusted":true},"execution_count":null,"outputs":[]}]}