{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":67836,"databundleVersionId":7527339,"sourceType":"competition"},{"sourceId":7580132,"sourceType":"datasetVersion","datasetId":4412500},{"sourceId":7592843,"sourceType":"datasetVersion","datasetId":4419570}],"dockerImageVersionId":30646,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"%%capture\n!pip install 'git+https://github.com/facebookresearch/detectron2.git@5aeb252b194b93dc2879b4ac34bc51a31b5aee13'","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-02-16T13:44:45.557738Z","iopub.execute_input":"2024-02-16T13:44:45.558150Z","iopub.status.idle":"2024-02-16T13:46:46.082540Z","shell.execute_reply.started":"2024-02-16T13:44:45.558116Z","shell.execute_reply":"2024-02-16T13:46:46.081011Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%capture\n# detectron2\nfrom detectron2.utils.memory import retry_if_cuda_oom\nfrom detectron2.utils.logger import setup_logger\nfrom detectron2.checkpoint import DetectionCheckpointer\nfrom detectron2.modeling import build_model\nfrom detectron2.evaluation import COCOEvaluator, inference_on_dataset\nimport detectron2.data.transforms as T\nfrom detectron2.data import detection_utils as utils\nfrom detectron2.data import DatasetCatalog, MetadataCatalog, build_detection_test_loader, build_detection_train_loader, DatasetMapper\nfrom detectron2.utils.visualizer import Visualizer\nfrom detectron2.structures import BoxMode\nfrom detectron2.engine import DefaultPredictor, DefaultTrainer\nfrom detectron2.config import get_cfg\nfrom detectron2 import model_zoo\n\nimport pandas as pd\nimport numpy as np\nfrom tqdm.notebook import tqdm  # progress bar\nimport matplotlib.pyplot as plt\nimport json\nimport cv2\nimport copy\nfrom typing import Optional\nimport seaborn as sns\n\n!pip install -q pycocotools\nfrom pycocotools.coco import COCO\nfrom PIL import Image\nimport random\nfrom pathlib import Path\n%matplotlib inline\nsns.set_theme(style='darkgrid', palette='deep', font='sans-serif', font_scale=1)\n\nfrom IPython.display import FileLink\n# torch\n#import os\n#os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:24'\nimport torch\nimport gc\nimport warnings\n# Ignore \"future\" warnings and Data-Frame-Slicing warnings.\nwarnings.filterwarnings('ignore')\n\nsetup_logger()","metadata":{"execution":{"iopub.status.busy":"2024-02-16T13:46:46.084923Z","iopub.execute_input":"2024-02-16T13:46:46.085317Z","iopub.status.idle":"2024-02-16T13:47:10.159108Z","shell.execute_reply.started":"2024-02-16T13:46:46.085269Z","shell.execute_reply":"2024-02-16T13:47:10.157683Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"### Data load\ntorch.cuda.empty_cache()\nfrom pathlib import Path\n\nTRAIN_IMG_DIR = Path(\"/kaggle/input/dl-enigma-10-sust-cse-carnival-2024/dlenigma1/BadODD/images/train\")\n\nTRAIN_COCO_PATH = Path(\"/kaggle/input/badodd/annotations.json\")\n\n\n\n# Training output directory\nOUTPUT_DIR = Path(\"./output\")\nOUTPUT_MODEL = OUTPUT_DIR/\"model_final.pth\"\n\n# Path to your pretrained model weights\nPRETRAINED_PATH = Path(\"\")\n\ntrain_file = \"/kaggle/input/badodd/annotations.json\"\n\n\ntrain_dir = Path(\"/kaggle/input/dl-enigma-10-sust-cse-carnival-2024/dlenigma1/BadODD/images/train\")\n\ntrain_annotations = COCO(annotation_file=train_file)","metadata":{"execution":{"iopub.status.busy":"2024-02-16T14:13:11.229481Z","iopub.execute_input":"2024-02-16T14:13:11.229882Z","iopub.status.idle":"2024-02-16T14:13:11.849779Z","shell.execute_reply.started":"2024-02-16T14:13:11.229853Z","shell.execute_reply":"2024-02-16T14:13:11.848537Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cat_ids = train_annotations.getCatIds()\nprint(f\"Number of Unique Categories: {len(cat_ids)}\")\nprint(\"Category IDs:\")\nprint(cat_ids) \n\ncats = train_annotations.loadCats(cat_ids)\ncat_names = [cat[\"name\"] for cat in cats]\nprint(\"Categories Names:\")\nprint(cat_names)","metadata":{"execution":{"iopub.status.busy":"2024-02-16T14:13:28.746908Z","iopub.execute_input":"2024-02-16T14:13:28.747675Z","iopub.status.idle":"2024-02-16T14:13:28.755342Z","shell.execute_reply.started":"2024-02-16T14:13:28.747633Z","shell.execute_reply":"2024-02-16T14:13:28.753925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for cat_id, cat_name in zip(cat_ids, cat_names):\n    img_ids = train_annotations.getImgIds(catIds=[cat_id])\n    print(f\"Number of Images Containing {cat_name}: {len(img_ids)}\")","metadata":{"execution":{"iopub.status.busy":"2024-02-16T14:13:43.612761Z","iopub.execute_input":"2024-02-16T14:13:43.613174Z","iopub.status.idle":"2024-02-16T14:13:43.625244Z","shell.execute_reply.started":"2024-02-16T14:13:43.613140Z","shell.execute_reply":"2024-02-16T14:13:43.623868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"### Coco Annotation\n\nwith TRAIN_COCO_PATH.open() as f:\n    train_dict = json.load(f)\n\n\ntrain_coco_labels=COCO(annotation_file=TRAIN_COCO_PATH)\n\nprint(\"#### LABELS AND METADATA LOADED ####\")","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:15:46.531132Z","iopub.execute_input":"2024-02-07T17:15:46.531972Z","iopub.status.idle":"2024-02-07T17:15:47.421885Z","shell.execute_reply.started":"2024-02-07T17:15:46.531942Z","shell.execute_reply":"2024-02-07T17:15:47.420623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from datetime import datetime\n\n# if False, model is set to `PRETRAINED_PATH` model\nis_train = True\n\n# if True, evaluate on validation dataset\nis_evaluate = False\n\n# if True, run inference on test dataset\nis_inference = False\n\n# if True and `is_train` == True, `PRETRAINED_PATH` model is trained further\nis_resume_training = False\n\n# Perform augmentation\nis_augment = False\n\nSEED = int(datetime.now().timestamp())\n\n# Model path based on Decisions\nMODEL_PATH = OUTPUT_MODEL if is_train else PRETRAINED_PATH","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:15:47.426467Z","iopub.execute_input":"2024-02-07T17:15:47.426959Z","iopub.status.idle":"2024-02-07T17:15:47.433555Z","shell.execute_reply.started":"2024-02-07T17:15:47.426925Z","shell.execute_reply":"2024-02-07T17:15:47.432169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"There are \" + str(len(train_dict['categories'])) + \" categories.\\n\")\nprint(\"There are \" + str(len(train_dict['images'])) + \" images in the train set.\")\nprint(\"There are \" + str(len(train_dict['annotations'])) + \" annotations in the train set.\\n\")\n\nprint(\"We will focus on mainly categories, images and annotations.\")","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:15:47.434838Z","iopub.execute_input":"2024-02-07T17:15:47.435438Z","iopub.status.idle":"2024-02-07T17:15:47.448980Z","shell.execute_reply.started":"2024-02-07T17:15:47.435407Z","shell.execute_reply":"2024-02-07T17:15:47.447856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def organize_coco_data(data_dict: dict) -> tuple[list[str], list[dict], list[dict]]:\n    thing_classes: list[str] = []\n\n    # Map Category Names to IDs\n    for cat in data_dict['categories']:\n        thing_classes.append(cat['name'])\n\n    # Images\n    images_metadata: list[dict] = data_dict['images']\n\n    # Convert COCO annotations to detectron2 annotations format\n    data_annotations = []\n    for ann in data_dict['annotations']:\n        # coco format -> detectron2 format\n        annot_obj = {\n            # Annotation ID\n            \"id\": ann['id'],\n\n            # Segmentation Polygon (x, y) coordinnates\n            #\"gt_masks\": ann['segmentation'],\n\n            # Image ID for this annotation (Which image does this annotation belong to?)\n            \"image_id\": ann['image_id'],\n\n            # Category Label (0: paragraph, 1: text box, 2: image, 3: table)\n            \"category_id\": ann['category_id'],\n\n            \"x_min\": ann['bbox'][0],  # left\n            \"y_min\": ann['bbox'][1],  # top\n            \"x_max\": ann['bbox'][0] + ann['bbox'][2],  # left+width\n            \"y_max\": ann['bbox'][1] + ann['bbox'][3]  # top+height\n        }\n        data_annotations.append(annot_obj)\n\n    return thing_classes, images_metadata, data_annotations","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:16:35.584676Z","iopub.execute_input":"2024-02-07T17:16:35.585939Z","iopub.status.idle":"2024-02-07T17:16:35.597312Z","shell.execute_reply.started":"2024-02-07T17:16:35.585888Z","shell.execute_reply":"2024-02-07T17:16:35.596033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"thing_classes, images_metadata, data_annotations = organize_coco_data(train_dict)\n\nprint(thing_classes)","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:16:35.889387Z","iopub.execute_input":"2024-02-07T17:16:35.889798Z","iopub.status.idle":"2024-02-07T17:16:36.004862Z","shell.execute_reply.started":"2024-02-07T17:16:35.889769Z","shell.execute_reply":"2024-02-07T17:16:36.003622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_metadata = pd.DataFrame(images_metadata)\ntrain_metadata = train_metadata[['id', 'file_name', 'width', 'height']]\ntrain_metadata = train_metadata.rename(columns={\"id\": \"image_id\"})\nprint(\"train_metadata size=\", len(train_metadata))\ntrain_metadata.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:16:36.114568Z","iopub.execute_input":"2024-02-07T17:16:36.115026Z","iopub.status.idle":"2024-02-07T17:16:36.150633Z","shell.execute_reply.started":"2024-02-07T17:16:36.114994Z","shell.execute_reply":"2024-02-07T17:16:36.149453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_annot_df = pd.DataFrame(data_annotations)\nprint(\"train_annot_df size=\", len(train_annot_df))\ntrain_annot_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:16:36.426060Z","iopub.execute_input":"2024-02-07T17:16:36.426488Z","iopub.status.idle":"2024-02-07T17:16:36.660838Z","shell.execute_reply.started":"2024-02-07T17:16:36.426455Z","shell.execute_reply":"2024-02-07T17:16:36.659747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15, 15))\n\nimage_id = \t-2467932577630964324\nimage_file = train_coco_labels.loadImgs([image_id])[0]['file_name']\nimage = Image.open(TRAIN_IMG_DIR/image_file)\ncode = 231 + 0;\nplt.subplot(code)\nplt.axis('off')\nplt.imshow(np.asarray(image))","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:16:36.851746Z","iopub.execute_input":"2024-02-07T17:16:36.852176Z","iopub.status.idle":"2024-02-07T17:16:37.525095Z","shell.execute_reply.started":"2024-02-07T17:16:36.852142Z","shell.execute_reply":"2024-02-07T17:16:37.523855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_image(_image_id):\n    image_file = train_coco_labels.loadImgs([_image_id])[0]['file_name']\n    image = Image.open(TRAIN_IMG_DIR/image_file)\n    plt.figure(figsize=(15, 15))\n    plt.axis('off')\n    plt.imshow(np.asarray(image))","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:16:37.527358Z","iopub.execute_input":"2024-02-07T17:16:37.527804Z","iopub.status.idle":"2024-02-07T17:16:37.534941Z","shell.execute_reply.started":"2024-02-07T17:16:37.527765Z","shell.execute_reply":"2024-02-07T17:16:37.533740Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_segmentations(_image_id):\n    show_image(_image_id)\n    annotation_ids = train_coco_labels.getAnnIds(imgIds=[_image_id])\n    annotations = train_coco_labels.loadAnns(annotation_ids)\n    train_coco_labels.showAnns(annotations)","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:16:37.967727Z","iopub.execute_input":"2024-02-07T17:16:37.968130Z","iopub.status.idle":"2024-02-07T17:16:37.974451Z","shell.execute_reply.started":"2024-02-07T17:16:37.968102Z","shell.execute_reply":"2024-02-07T17:16:37.973135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"show_image(-2467932577630964324)","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:16:38.368532Z","iopub.execute_input":"2024-02-07T17:16:38.369542Z","iopub.status.idle":"2024-02-07T17:16:39.523231Z","shell.execute_reply.started":"2024-02-07T17:16:38.369501Z","shell.execute_reply":"2024-02-07T17:16:39.521829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#show_segmentations(-2467932577630964324)","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:16:39.525954Z","iopub.execute_input":"2024-02-07T17:16:39.526400Z","iopub.status.idle":"2024-02-07T17:16:40.818101Z","shell.execute_reply.started":"2024-02-07T17:16:39.526364Z","shell.execute_reply":"2024-02-07T17:16:40.816434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Exploring Annonations\ntrain_annotations = pd.DataFrame(train_dict['annotations'])\ntrain_annotations.head()","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:16:41.059860Z","iopub.execute_input":"2024-02-07T17:16:41.060267Z","iopub.status.idle":"2024-02-07T17:16:41.248644Z","shell.execute_reply.started":"2024-02-07T17:16:41.060236Z","shell.execute_reply":"2024-02-07T17:16:41.247474Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_annotations.describe()","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:19:01.571824Z","iopub.execute_input":"2024-02-07T17:19:01.572270Z","iopub.status.idle":"2024-02-07T17:19:01.610944Z","shell.execute_reply.started":"2024-02-07T17:19:01.572235Z","shell.execute_reply":"2024-02-07T17:19:01.610003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Preparing data for train","metadata":{}},{"cell_type":"code","source":"TRAIN_SPLIT = 1.0","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:20:45.105058Z","iopub.execute_input":"2024-02-07T17:20:45.105483Z","iopub.status.idle":"2024-02-07T17:20:45.110630Z","shell.execute_reply.started":"2024-02-07T17:20:45.105454Z","shell.execute_reply":"2024-02-07T17:20:45.109336Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"n_dataset = len(train_metadata)\nn_train = int(n_dataset * TRAIN_SPLIT)\nprint(\"n_dataset\", n_dataset, \"n_train\", n_train, \"n_val\", n_dataset-n_train)\n\nnp.random.seed(SEED)\n\ninds = np.random.permutation(n_dataset)\ntrain_inds, valid_inds = inds[:n_train], inds[n_train:]","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:20:56.888875Z","iopub.execute_input":"2024-02-07T17:20:56.889277Z","iopub.status.idle":"2024-02-07T17:20:56.896564Z","shell.execute_reply.started":"2024-02-07T17:20:56.889247Z","shell.execute_reply":"2024-02-07T17:20:56.895729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Formatting Data for detectron2\ndef convert_coco_to_detectron2_format(\n    imgdir: Path,\n    metadata_df: pd.DataFrame,\n    annot_df: Optional[pd.DataFrame] = None,\n    target_indices: Optional[np.ndarray] = None,\n):\n\n    dataset_dicts = []\n    for _, train_meta_row in tqdm(metadata_df.iterrows(), total=len(metadata_df)):\n        # Iterate over each image\n        image_id, filename, width, height = train_meta_row.values\n\n        annotations = []\n        \n        # If train/validation data, then there will be annotations\n        if annot_df is not None:\n            for _, ann in annot_df.query(\"image_id == @image_id\").iterrows():\n                # Get annotations of current iteration's image\n                class_id = ann[\"category_id\"]\n                gt_masks = ann[\"gt_masks\"]\n                bbox_resized = [\n                    float(ann[\"x_min\"]),\n                    float(ann[\"y_min\"]),\n                    float(ann[\"x_max\"]),\n                    float(ann[\"y_max\"]),\n                ]\n\n                annotation = {\n                    \"bbox\": bbox_resized,\n                    \"bbox_mode\": BoxMode.XYXY_ABS,\n                    \"segmentation\": gt_masks,\n                    \"category_id\": class_id,\n                }\n\n                annotations.append(annotation)\n        # coco format -> detectron2 format dict\n        record = {\n            \"file_name\": str(imgdir/filename),\n            \"image_id\": image_id,\n            \"width\": width,\n            \"height\": height,\n            \"annotations\": annotations\n        }\n\n        dataset_dicts.append(record)\n\n    if target_indices is not None:\n        dataset_dicts = [dataset_dicts[i] for i in target_indices]\n\n    return dataset_dicts","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:22:27.092012Z","iopub.execute_input":"2024-02-07T17:22:27.092457Z","iopub.status.idle":"2024-02-07T17:22:27.105379Z","shell.execute_reply.started":"2024-02-07T17:22:27.092427Z","shell.execute_reply":"2024-02-07T17:22:27.104137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Registering and Loading Data for detectron2\nDATA_REGISTER_TRAINING = \"badlad_train\"\n#DATA_REGISTER_VALID    = \"badlad_valid\"\n#DATA_REGISTER_TEST     = \"badlad_test\"","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:22:52.319405Z","iopub.execute_input":"2024-02-07T17:22:52.319834Z","iopub.status.idle":"2024-02-07T17:22:52.323787Z","shell.execute_reply.started":"2024-02-07T17:22:52.319804Z","shell.execute_reply":"2024-02-07T17:22:52.322905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_inds","metadata":{"execution":{"iopub.status.busy":"2024-02-07T17:23:01.011342Z","iopub.execute_input":"2024-02-07T17:23:01.012619Z","iopub.status.idle":"2024-02-07T17:23:01.022347Z","shell.execute_reply.started":"2024-02-07T17:23:01.012581Z","shell.execute_reply":"2024-02-07T17:23:01.020838Z"},"trusted":true},"execution_count":null,"outputs":[]}]}