{"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":"# **SIIM COVID-19 Detectron2 [Inferance]**","metadata":{"papermill":{"duration":0.02586,"end_time":"2021-07-08T22:53:10.466983","exception":false,"start_time":"2021-07-08T22:53:10.441123","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"### Hi kagglers, This is `inferance` notebook using `Detectron2`.\n\n### Please if this kernel is useful, <font color='red'>please upvote !!</font>","metadata":{"papermill":{"duration":0.023834,"end_time":"2021-07-08T22:53:10.563453","exception":false,"start_time":"2021-07-08T22:53:10.539619","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"## Training, EDA,and Dataset \n- [SIIM COVID-19 Detectron2 Training](https://www.kaggle.com/ammarnassanalhajali/siim-covid-19-detectron2-training)\n- [SIIM-FISABIO-RSNA COVID-19 Detection-EDA](https://www.kaggle.com/ammarnassanalhajali/siim-fisabio-rsna-covid-19-detection-eda)\n- [SIIM-COVID-19 Detection Training Labels (Dataset)](https://www.kaggle.com/ammarnassanalhajali/siimcovid19-detection-training-label)\n\n","metadata":{"papermill":{"duration":0.023929,"end_time":"2021-07-08T22:53:10.515331","exception":false,"start_time":"2021-07-08T22:53:10.491402","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"### Other notebooks in this competition -YOLOv5\n- [🚀 COVID-19 Detection YOLOv5 3Classes [Training]](https://www.kaggle.com/ammarnassanalhajali/covid-19-detection-yolov5-3classes-training)\n- [🚀 COVID-19 Detection YOLOv5 3Classes [Inference]\n](https://www.kaggle.com/ammarnassanalhajali/covid-19-detection-yolov5-3classes-inference)","metadata":{}},{"cell_type":"markdown","source":"# Detectron2\nDetectron2 is Facebook AI Research's next generation software system that implements state-of-the-art object detection algorithms. It is a ground-up rewrite of the previous version, Detectron, and it originates from maskrcnn-benchmark.","metadata":{"papermill":{"duration":0.024419,"end_time":"2021-07-08T22:53:10.61227","exception":false,"start_time":"2021-07-08T22:53:10.587851","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"# Installation\n* detectron2 is not pre-installed in this kaggle docker, so let's install it.\n* we need to know CUDA and pytorch version to install correct detectron2.","metadata":{"papermill":{"duration":0.024508,"end_time":"2021-07-08T22:53:10.661179","exception":false,"start_time":"2021-07-08T22:53:10.636671","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!nvidia-smi","metadata":{"papermill":{"duration":0.705422,"end_time":"2021-07-08T22:53:11.391414","exception":false,"start_time":"2021-07-08T22:53:10.685992","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:32:42.704631Z","iopub.execute_input":"2021-07-25T12:32:42.705016Z","iopub.status.idle":"2021-07-25T12:32:43.419649Z","shell.execute_reply.started":"2021-07-25T12:32:42.704918Z","shell.execute_reply":"2021-07-25T12:32:43.418545Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!nvcc --version","metadata":{"papermill":{"duration":0.666457,"end_time":"2021-07-08T22:53:12.083346","exception":false,"start_time":"2021-07-08T22:53:11.416889","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:32:43.423407Z","iopub.execute_input":"2021-07-25T12:32:43.423709Z","iopub.status.idle":"2021-07-25T12:32:44.125141Z","shell.execute_reply.started":"2021-07-25T12:32:43.423673Z","shell.execute_reply":"2021-07-25T12:32:44.124171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch, torchvision\nprint(torch.__version__, torch.cuda.is_available())","metadata":{"papermill":{"duration":1.348408,"end_time":"2021-07-08T22:53:13.457144","exception":false,"start_time":"2021-07-08T22:53:12.108736","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:32:44.127165Z","iopub.execute_input":"2021-07-25T12:32:44.127532Z","iopub.status.idle":"2021-07-25T12:32:45.413412Z","shell.execute_reply.started":"2021-07-25T12:32:44.127491Z","shell.execute_reply":"2021-07-25T12:32:45.412566Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* It seems CUDA=11.0 and torch==1.7.0 is used in this kaggle docker image.\n* See installation for details. https://detectron2.readthedocs.io/en/latest/tutorials/install.html","metadata":{"papermill":{"duration":0.025139,"end_time":"2021-07-08T22:53:13.508347","exception":false,"start_time":"2021-07-08T22:53:13.483208","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"# Install Pre-Built Detectron2","metadata":{"papermill":{"duration":0.024919,"end_time":"2021-07-08T22:53:13.558394","exception":false,"start_time":"2021-07-08T22:53:13.533475","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!pip install /kaggle/input/detectron2/omegaconf-2.0.6-py3-none-any.whl\n\n!pip install /kaggle/input/detectron2/iopath-0.1.8-py3-none-any.whl\n\n!pip install /kaggle/input/detectron2/fvcore-0.1.3.post20210317/fvcore-0.1.3.post20210317/\n\n!pip install /kaggle/input/detectron2/pycocotools-2.0.2/dist/pycocotools-2.0.2.tar\n\n!pip install /kaggle/input/detectron2/detectron2-0.4cu110-cp37-cp37m-linux_x86_64.whl","metadata":{"_kg_hide-output":true,"papermill":{"duration":138.682502,"end_time":"2021-07-08T22:55:32.266133","exception":false,"start_time":"2021-07-08T22:53:13.583631","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:32:45.415118Z","iopub.execute_input":"2021-07-25T12:32:45.41548Z","iopub.status.idle":"2021-07-25T12:33:25.056043Z","shell.execute_reply.started":"2021-07-25T12:32:45.415443Z","shell.execute_reply":"2021-07-25T12:33:25.055063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"!pip install detectron2 -f \\\n  https://dl.fbaipublicfiles.com/detectron2/wheels/cu110/torch1.7/index.html","metadata":{"_kg_hide-output":true,"execution":{"iopub.execute_input":"2021-06-12T04:28:44.774938Z","iopub.status.busy":"2021-06-12T04:28:44.774524Z","iopub.status.idle":"2021-06-12T04:29:06.797853Z","shell.execute_reply":"2021-06-12T04:29:06.796932Z","shell.execute_reply.started":"2021-06-12T04:28:44.774889Z"},"papermill":{"duration":0.034907,"end_time":"2021-07-08T22:55:32.336935","exception":false,"start_time":"2021-07-08T22:55:32.302028","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"# Import Libraries","metadata":{"papermill":{"duration":0.034674,"end_time":"2021-07-08T22:55:32.406413","exception":false,"start_time":"2021-07-08T22:55:32.371739","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings('ignore') #Ignore \"future\" warnings and Data-Frame-Slicing warnings.\n\nimport numpy as np \nimport pandas as pd \nfrom datetime import datetime\nimport time\nfrom tqdm import tqdm_notebook as tqdm # progress bar\nimport matplotlib.pyplot as plt\n\nfrom math import ceil\nfrom typing import Any, Dict, List\nfrom typing import List\nfrom dataclasses import dataclass, field\nfrom typing import Dict\nfrom numpy import ndarray\nfrom glob import glob\n\n\nimport os, json, cv2, random\nimport skimage.io as io\n\nimport pickle\nfrom pathlib import Path\nfrom typing import Optional\nfrom tqdm import tqdm\n\n# numba\nimport numba\nfrom numba import jit\n\n\n# import some common detectron2 utilities\nfrom detectron2 import model_zoo\nfrom detectron2.engine import DefaultPredictor\nfrom detectron2.config import get_cfg\nfrom detectron2.utils.visualizer import Visualizer\nfrom detectron2.data import DatasetCatalog, MetadataCatalog\nfrom detectron2.utils.visualizer import ColorMode","metadata":{"_kg_hide-input":true,"papermill":{"duration":1.541907,"end_time":"2021-07-08T22:55:33.982894","exception":false,"start_time":"2021-07-08T22:55:32.440987","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:33:25.05953Z","iopub.execute_input":"2021-07-25T12:33:25.059813Z","iopub.status.idle":"2021-07-25T12:33:26.506641Z","shell.execute_reply.started":"2021-07-25T12:33:25.059782Z","shell.execute_reply":"2021-07-25T12:33:26.505782Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# configs","metadata":{"papermill":{"duration":0.034749,"end_time":"2021-07-08T22:55:34.053252","exception":false,"start_time":"2021-07-08T22:55:34.018503","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# --- configs ---\nthing_classes = [\n    \"atypical\",\n    \"indeterminate\",\n    \"negative\",\n    \"typical\"\n]\ndebug=False\n\ncategory_name_to_id = {class_name: index for index, class_name in enumerate(thing_classes)}\ncategory_name_to_id","metadata":{"papermill":{"duration":0.046951,"end_time":"2021-07-08T22:55:34.136147","exception":false,"start_time":"2021-07-08T22:55:34.089196","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:33:26.507881Z","iopub.execute_input":"2021-07-25T12:33:26.508267Z","iopub.status.idle":"2021-07-25T12:33:26.517958Z","shell.execute_reply.started":"2021-07-25T12:33:26.50823Z","shell.execute_reply":"2021-07-25T12:33:26.517022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Register Dataset","metadata":{"papermill":{"duration":0.035118,"end_time":"2021-07-08T22:55:34.206271","exception":false,"start_time":"2021-07-08T22:55:34.171153","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import pandas as pd \ndf_meta = pd.read_csv(\"../input/siim-covid19-resized-1024px/meta.csv\")\ntest_meta=df_meta[df_meta.split==\"test\"]\n\n\ndef get_COVID19_data_dicts_test(\n    imgdir: Path, test_meta: pd.DataFrame, use_cache: bool = True, debug: bool = False,\n):\n    debug_str = f\"_debug{int(debug)}\"\n    cache_path = Path(\".\") / f\"dataset_dicts_cache_test.pkl\"\n    if not use_cache or not cache_path.exists():\n        print(\"Creating data...\")\n        # test_meta = pd.read_csv(imgdir / \"test_meta.csv\")\n        df_meta = pd.read_csv(\"../input/siim-covid19-resized-1024px/meta.csv\")\n        test_meta=df_meta[df_meta.split==\"test\"]\n        if debug:\n            test_meta = test_meta.iloc[:10]  # For debug....\n        # Load 1 image to get image size.\n        image_id = test_meta.iloc[0,0]\n        #image_path = str(imgdir / \"test\" / f\"{image_id}.jpg\")\n        image_path = str(f'../input/siim-covid19-resized-1024px/test/{image_id}.jpg')\n        image = cv2.imread(image_path)\n        resized_height, resized_width, ch = image.shape\n        print(f\"image shape: {image.shape}\")\n\n        dataset_dicts = []\n        for index, test_meta_row in tqdm(test_meta.iterrows(), total=len(test_meta)):\n            record = {}\n\n            image_id, height, width,s = test_meta_row.values\n            #filename = str(imgdir / \"test\" / f\"{image_id}.jpg\")\n            filename = str(f'../input/siim-covid19-resized-1024px/test/{image_id}.jpg')\n            record[\"file_name\"] = filename\n            # record[\"image_id\"] = index\n            record[\"image_id\"] = image_id\n            record[\"height\"] = resized_height\n            record[\"width\"] = resized_width\n            # objs = []\n            # record[\"annotations\"] = objs\n            dataset_dicts.append(record)\n        with open(cache_path, mode=\"wb\") as f:\n            pickle.dump(dataset_dicts, f)\n\n    #print(f\"Load from cache {cache_path}\")\n    with open(cache_path, mode=\"rb\") as f:\n        dataset_dicts = pickle.load(f)\n    return dataset_dicts","metadata":{"papermill":{"duration":0.08294,"end_time":"2021-07-08T22:55:34.324475","exception":false,"start_time":"2021-07-08T22:55:34.241535","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:33:26.520991Z","iopub.execute_input":"2021-07-25T12:33:26.521516Z","iopub.status.idle":"2021-07-25T12:33:26.564168Z","shell.execute_reply.started":"2021-07-25T12:33:26.521475Z","shell.execute_reply":"2021-07-25T12:33:26.563432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"imgdir = \"../input/siim-covid19-resized-1024px\"\nDatasetCatalog.register(\n    \"COVID19_data_test\", lambda: get_COVID19_data_dicts_test(imgdir, test_meta, debug=debug)\n)\n","metadata":{"papermill":{"duration":0.041897,"end_time":"2021-07-08T22:55:34.401674","exception":false,"start_time":"2021-07-08T22:55:34.359777","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:33:26.565842Z","iopub.execute_input":"2021-07-25T12:33:26.566209Z","iopub.status.idle":"2021-07-25T12:33:26.571359Z","shell.execute_reply.started":"2021-07-25T12:33:26.566174Z","shell.execute_reply":"2021-07-25T12:33:26.569567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"MetadataCatalog.get(\"COVID19_data_test\").set(thing_classes=thing_classes)\nmetadata = MetadataCatalog.get(\"COVID19_data_test\")\ndataset_dicts = get_COVID19_data_dicts_test(imgdir, test_meta, debug=debug)","metadata":{"papermill":{"duration":0.256786,"end_time":"2021-07-08T22:55:34.693361","exception":false,"start_time":"2021-07-08T22:55:34.436575","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:33:26.573867Z","iopub.execute_input":"2021-07-25T12:33:26.574254Z","iopub.status.idle":"2021-07-25T12:33:26.780381Z","shell.execute_reply.started":"2021-07-25T12:33:26.574216Z","shell.execute_reply":"2021-07-25T12:33:26.778052Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load model","metadata":{"papermill":{"duration":0.035831,"end_time":"2021-07-08T22:55:34.765938","exception":false,"start_time":"2021-07-08T22:55:34.730107","status":"completed"},"tags":[]}},{"cell_type":"code","source":"from detectron2.config import get_cfg\ncfg = get_cfg()\nconfig_name = \"COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml\" \n#config_name = \"COCO-Detection/faster_rcnn_R_101_C4_3x.yaml\"\ncfg.merge_from_file(model_zoo.get_config_file(config_name))\ncfg.MODEL.ROI_HEADS.NUM_CLASSES = 4  # \n\n\ncfg.MODEL.WEIGHTS = \"../input/d/ammarnassanalhajali/1siim-covid19-detectron2-weights/output/model_final.pth\"\ncfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.180 # set the testing threshold for this model\n\npredictor = DefaultPredictor(cfg)","metadata":{"papermill":{"duration":9.058909,"end_time":"2021-07-08T22:55:43.861018","exception":false,"start_time":"2021-07-08T22:55:34.802109","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:33:26.781773Z","iopub.execute_input":"2021-07-25T12:33:26.782316Z","iopub.status.idle":"2021-07-25T12:33:37.32733Z","shell.execute_reply.started":"2021-07-25T12:33:26.782274Z","shell.execute_reply":"2021-07-25T12:33:37.326332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def format_pred(labels: ndarray, boxes: ndarray, scores: ndarray) -> str:\n    pred_strings = []\n    for label, score, bbox in zip(labels, scores, boxes):\n        xmin, ymin, xmax, ymax = bbox.astype(np.int64)\n        if label==2:\n            labelstr='none'\n        else:\n            labelstr='opacity'\n        pred_strings.append(f\"{labelstr} {score:0.3f} {xmin} {ymin} {xmax} {ymax}\") \n    return \" \".join(pred_strings)\n\ndef predict_batch(predictor: DefaultPredictor, im_list: List[ndarray]) -> List:\n    with torch.no_grad():  # https://github.com/sphinx-doc/sphinx/issues/4258\n        inputs_list = []\n        for original_image in im_list:\n            # Apply pre-processing to image.\n            if predictor.input_format == \"RGB\":\n                # whether the model expects BGR inputs or RGB\n                original_image = original_image[:, :, ::-1]\n            height, width = original_image.shape[:2]\n            # Do not apply original augmentation, which is resize.\n            # image = predictor.aug.get_transform(original_image).apply_image(original_image)\n            image = original_image\n            image = torch.as_tensor(image.astype(\"float32\").transpose(2, 0, 1))\n            inputs = {\"image\": image, \"height\": height, \"width\": width}\n            inputs_list.append(inputs)\n        predictions = predictor.model(inputs_list)\n        return predictions","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.047473,"end_time":"2021-07-08T22:55:43.945088","exception":false,"start_time":"2021-07-08T22:55:43.897615","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:33:37.329149Z","iopub.execute_input":"2021-07-25T12:33:37.329546Z","iopub.status.idle":"2021-07-25T12:33:37.342129Z","shell.execute_reply.started":"2021-07-25T12:33:37.329505Z","shell.execute_reply":"2021-07-25T12:33:37.341242Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inferance","metadata":{"papermill":{"duration":0.036428,"end_time":"2021-07-08T22:55:44.017658","exception":false,"start_time":"2021-07-08T22:55:43.98123","status":"completed"},"tags":[]}},{"cell_type":"code","source":"if debug:\n    dataset_dicts = dataset_dicts[:30]\n\nresults_list = []\nindex = 0\nbatch_size = 1\n\nfig, ax = plt.subplots(2, 5, figsize =(20,8))\nindices=[ax[0][0],ax[1][0],ax[0][1],ax[1][1],ax[0][2],ax[1][2],ax[0][3],ax[1][3],ax[0][4],ax[1][4] ]\n\n\nfor i in tqdm(range(ceil(len(dataset_dicts) / batch_size))):\n    inds = list(range(batch_size * i, min(batch_size * (i + 1), len(dataset_dicts))))\n    dataset_dicts_batch = [dataset_dicts[i] for i in inds]\n    im_list = [cv2.imread(d[\"file_name\"]) for d in dataset_dicts_batch]\n    outputs_list = predict_batch(predictor, im_list)\n\n    for im, outputs, d in zip(im_list, outputs_list, dataset_dicts_batch):\n        resized_height, resized_width, ch = im.shape\n        # outputs = predictor(im)\n        #############################################################\n\n        if index < 10:\n            # format is documented at https://detectron2.readthedocs.io/tutorials/models.html#model-output-format\n            v = Visualizer(\n                im[:, :, ::-1],\n                metadata=metadata,\n                scale=0.8,\n                instance_mode=ColorMode.IMAGE_BW\n                # remove the colors of unsegmented pixels. This option is only available for segmentation models\n            )\n            out = v.draw_instance_predictions(outputs[\"instances\"].to(\"cpu\"))\n            # cv2_imshow(out.get_image()[:, :, ::-1])\n            #cv2.imwrite(str(outdir / f\"pred_{index}.jpg\"), out.get_image()[:, :, ::-1])\n            \n            #cv2.imwrite(f\"./pred_{index}.jpg\", out.get_image()[:, :, ::-1])\n            \n            indices[index].grid(False)\n            indices[index].imshow(out.get_image()[:, :, ::-1])\n            \n                        \n         ###############################################################   \n            \n            \n            \n        df_meta = pd.read_csv(\"../input/siim-covid19-resized-1024px/meta.csv\")\n        test_meta=df_meta[df_meta.split==\"test\"]\n        \n        image_id, dim0, dim1,s = test_meta.iloc[index].values\n\n        instances = outputs[\"instances\"]\n        if len(instances) == 0:\n            # No finding, let's set 2 1.0 0 0 1 1x. Negative\n            result = {\n                \"image_id\": image_id +\"_image\",\n                \"negative\": 1,\n                \"typical\": 0,\n                \"indeterminate\": 0,\n                \"atypical\": 0,\n                 \"PredictionString\": \"none 1 0 0 1 1\"}\n        else:\n            # Find some bbox...\n            # print(f\"index={index}, find {len(instances)} bbox.\")\n            fields: Dict[str, Any] = instances.get_fields()\n            pred_classes = fields[\"pred_classes\"]  # (n_boxes,)\n            pred_scores = fields[\"scores\"]\n            # shape (n_boxes, 4). (xmin, ymin, xmax, ymax)\n            pred_boxes = fields[\"pred_boxes\"].tensor\n\n            h_ratio = dim0 / resized_height\n            w_ratio = dim1 / resized_width\n            pred_boxes[:, [0, 2]] *= w_ratio\n            pred_boxes[:, [1, 3]] *= h_ratio\n\n            pred_classes_array = pred_classes.cpu().numpy()\n            pred_boxes_array = pred_boxes.cpu().numpy()\n            pred_scores_array = pred_scores.cpu().numpy()\n            pred_classes_scores_array=np.stack((pred_classes_array,pred_scores_array), axis=-1)\n            #{'atypical': 0, 'indeterminate': 1, 'negative': 2, 'typical': 3}\n            \n            \n            typical= np.sum(pred_classes_scores_array[pred_classes_scores_array[:,0]==3, 1],axis=0)\n            negative= np.sum(pred_classes_scores_array[pred_classes_scores_array[:,0]==2, 1],axis=0)\n            indeterminate= np.sum(pred_classes_scores_array[pred_classes_scores_array[:,0]==1, 1],axis=0)\n            atypical= np.sum(pred_classes_scores_array[pred_classes_scores_array[:,0]==0, 1],axis=0)\n            \n            total=typical+negative+indeterminate+atypical\n            \n            typical=typical/total\n            negative=negative/total\n            indeterminate=indeterminate/total\n            atypical=atypical/total\n            \n                \n            result = {\n                \"image_id\": image_id +\"_image\",\n                \"negative\": negative,\n                \"typical\": typical,\n                \"indeterminate\": indeterminate,\n                \"atypical\": atypical,\n                \"PredictionString\": format_pred(pred_classes_array, pred_boxes_array, pred_scores_array),\n            }\n        results_list.append(result)\n        index += 1","metadata":{"papermill":{"duration":899.79283,"end_time":"2021-07-08T23:10:43.84749","exception":false,"start_time":"2021-07-08T22:55:44.05466","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:33:37.345683Z","iopub.execute_input":"2021-07-25T12:33:37.346067Z","iopub.status.idle":"2021-07-25T12:48:35.370999Z","shell.execute_reply.started":"2021-07-25T12:33:37.346037Z","shell.execute_reply":"2021-07-25T12:48:35.37016Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_img_pre=None\ndf_img_pre = pd.DataFrame(results_list)\ndf_img_pre","metadata":{"papermill":{"duration":0.388635,"end_time":"2021-07-08T23:10:44.608942","exception":false,"start_time":"2021-07-08T23:10:44.220307","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:35.372066Z","iopub.execute_input":"2021-07-25T12:48:35.372371Z","iopub.status.idle":"2021-07-25T12:48:35.401569Z","shell.execute_reply.started":"2021-07-25T12:48:35.372338Z","shell.execute_reply":"2021-07-25T12:48:35.400553Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df=None\nfilepaths = glob('/kaggle/input/siim-covid19-detection/test/**/*dcm',recursive=True)\ntest_df = pd.DataFrame({'filepath':filepaths,})\ntest_df['image_id'] = test_df.filepath.map(lambda x: x.split('/')[-1].replace('.dcm', '')+'_image')\ntest_df['study_id'] = test_df.filepath.map(lambda x: x.split('/')[-3].replace('.dcm', '')+'_study')\ntest_df.drop(['filepath'], axis=1, inplace=True)\ntest_df","metadata":{"papermill":{"duration":4.828166,"end_time":"2021-07-08T23:10:49.805358","exception":false,"start_time":"2021-07-08T23:10:44.977192","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:35.40311Z","iopub.execute_input":"2021-07-25T12:48:35.403453Z","iopub.status.idle":"2021-07-25T12:48:40.394379Z","shell.execute_reply.started":"2021-07-25T12:48:35.403417Z","shell.execute_reply":"2021-07-25T12:48:40.393617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_img_pre_df=None\ntest_img_pre_df=pd.merge(test_df, df_img_pre, on = 'image_id', how = 'left')\ntest_img_pre_df.sort_values('typical')","metadata":{"papermill":{"duration":0.38799,"end_time":"2021-07-08T23:10:50.554882","exception":false,"start_time":"2021-07-08T23:10:50.166892","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.395745Z","iopub.execute_input":"2021-07-25T12:48:40.396127Z","iopub.status.idle":"2021-07-25T12:48:40.428963Z","shell.execute_reply.started":"2021-07-25T12:48:40.396088Z","shell.execute_reply":"2021-07-25T12:48:40.428064Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_img_pre_df=test_img_pre_df.groupby(['study_id']).mean()\ntest_img_pre_df.reset_index(inplace = True) \ntest_img_pre_df.sort_values('typical')\ntest_img_pre_df=test_img_pre_df.fillna(0)\ntest_img_pre_df","metadata":{"papermill":{"duration":0.396574,"end_time":"2021-07-08T23:10:51.526276","exception":false,"start_time":"2021-07-08T23:10:51.129702","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.430376Z","iopub.execute_input":"2021-07-25T12:48:40.430773Z","iopub.status.idle":"2021-07-25T12:48:40.453702Z","shell.execute_reply.started":"2021-07-25T12:48:40.430734Z","shell.execute_reply":"2021-07-25T12:48:40.452912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd\n\ndf = pd.read_csv('../input/siim-covid19-detection/sample_submission.csv')\nid_laststr_list  = []\nfor i in range(df.shape[0]):\n    id_laststr_list.append(df.loc[i,'id'][-1])\ndf['id_last_str'] = id_laststr_list\nstudy_len = df[df['id_last_str'] == 'y'].shape[0]\nimage_len = df[df['id_last_str'] == 'e'].shape[0]\nprint(\"study_len:\" + str(study_len) + \"   image_len:\" + str(image_len))\ndf=df[df.id_last_str == 'y']\ndf","metadata":{"papermill":{"duration":0.417057,"end_time":"2021-07-08T23:10:52.304527","exception":false,"start_time":"2021-07-08T23:10:51.88747","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.454929Z","iopub.execute_input":"2021-07-25T12:48:40.455284Z","iopub.status.idle":"2021-07-25T12:48:40.5101Z","shell.execute_reply.started":"2021-07-25T12:48:40.45525Z","shell.execute_reply":"2021-07-25T12:48:40.509268Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_submission=None\ndf_submission=pd.merge(df,test_img_pre_df, left_on='id', right_on='study_id', how = 'left')\ndf_submission=df_submission.fillna(0)\n#df_submission.drop(['PredictionString'], axis=1, inplace=True)\ndf_submission","metadata":{"papermill":{"duration":0.385628,"end_time":"2021-07-08T23:10:53.060426","exception":false,"start_time":"2021-07-08T23:10:52.674798","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.511376Z","iopub.execute_input":"2021-07-25T12:48:40.511743Z","iopub.status.idle":"2021-07-25T12:48:40.542453Z","shell.execute_reply.started":"2021-07-25T12:48:40.511706Z","shell.execute_reply":"2021-07-25T12:48:40.541462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nid_laststr_list  = []\nfor i in range(df.shape[0]):\n    id_laststr_list.append(df.loc[i,'id'][-1])\ndf['id_last_str'] = id_laststr_list\nstudy_len = df[df['id_last_str'] == 'y'].shape[0]\n\nfor i in range(study_len):\n    negative =  df_submission.loc[i,'negative'] \n    typical = df_submission.loc[i,'typical']\n    indeterminate = df_submission.loc[i,'indeterminate']\n    atypical = df_submission.loc[i,'atypical']\n    \n    negative_st=''\n    typical_st=''\n    indeterminate_st=''\n    atypical_st=''\n\n    if negative>0:\n        negative_st =f'negative {negative:0.3f} 0 0 1 1 '\n    if typical>0:\n        typical_st =f'typical {typical:0.3f} 0 0 1 1 '\n    if indeterminate>0:\n        indeterminate_st =f'indeterminate {indeterminate:0.3f} 0 0 1 1 '\n    if atypical>0:\n        atypical_st =f'atypical {atypical:0.3f} 0 0 1 1 '\n\n    #study_str = f'{negative_st}{typical_st}{indeterminate_st}{atypical_st}'\n        \n    #study_str = 'negative 1 0 0 1 1 atypical 1 0 0 1 1 typical 1 0 0 1 1 indeterminate 1 0 0 1 1'\n    study_str = f'negative {negative} 0 0 1 1 typical {typical} 0 0 1 1 indeterminate {indeterminate} 0 0 1 1 atypical {atypical} 0 0 1 1'\n    df.loc[i, 'PredictionString'] = study_str\n    \nsubmission_file_study = df[['id', 'PredictionString']]\nsubmission_file_study","metadata":{"papermill":{"duration":0.548663,"end_time":"2021-07-08T23:10:53.97261","exception":false,"start_time":"2021-07-08T23:10:53.423947","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.545577Z","iopub.execute_input":"2021-07-25T12:48:40.545834Z","iopub.status.idle":"2021-07-25T12:48:40.758105Z","shell.execute_reply.started":"2021-07-25T12:48:40.545809Z","shell.execute_reply":"2021-07-25T12:48:40.757158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_file_image = df_img_pre[['image_id', 'PredictionString']]\nsubmission_file_image.rename(columns={'image_id': 'id'}, inplace=True)\n#submission_file_image.PredictionString=\"none 1 0 0 1 1\"\nsubmission_file_image","metadata":{"papermill":{"duration":0.379892,"end_time":"2021-07-08T23:10:54.717528","exception":false,"start_time":"2021-07-08T23:10:54.337636","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.759652Z","iopub.execute_input":"2021-07-25T12:48:40.760001Z","iopub.status.idle":"2021-07-25T12:48:40.773576Z","shell.execute_reply.started":"2021-07-25T12:48:40.759965Z","shell.execute_reply":"2021-07-25T12:48:40.77254Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_file = pd.concat([submission_file_study, submission_file_image], ignore_index=[True])","metadata":{"papermill":{"duration":0.375639,"end_time":"2021-07-08T23:10:55.458716","exception":false,"start_time":"2021-07-08T23:10:55.083077","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.775155Z","iopub.execute_input":"2021-07-25T12:48:40.775632Z","iopub.status.idle":"2021-07-25T12:48:40.78398Z","shell.execute_reply.started":"2021-07-25T12:48:40.775586Z","shell.execute_reply":"2021-07-25T12:48:40.782982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#submission_file.to_csv('submission.csv', index=False)\nsubmission_file","metadata":{"papermill":{"duration":0.388578,"end_time":"2021-07-08T23:10:56.212205","exception":false,"start_time":"2021-07-08T23:10:55.823627","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.785337Z","iopub.execute_input":"2021-07-25T12:48:40.78578Z","iopub.status.idle":"2021-07-25T12:48:40.800924Z","shell.execute_reply.started":"2021-07-25T12:48:40.785742Z","shell.execute_reply":"2021-07-25T12:48:40.799903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('../input/siim-covid19-detection/sample_submission.csv')\ndf.drop(['PredictionString'], axis=1, inplace=True)","metadata":{"papermill":{"duration":0.376833,"end_time":"2021-07-08T23:10:56.953217","exception":false,"start_time":"2021-07-08T23:10:56.576384","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.802418Z","iopub.execute_input":"2021-07-25T12:48:40.802854Z","iopub.status.idle":"2021-07-25T12:48:40.814751Z","shell.execute_reply.started":"2021-07-25T12:48:40.802811Z","shell.execute_reply":"2021-07-25T12:48:40.813696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_file1 = df.join(submission_file.set_index('id'), on = 'id')","metadata":{"papermill":{"duration":0.376035,"end_time":"2021-07-08T23:10:57.694769","exception":false,"start_time":"2021-07-08T23:10:57.318734","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.816309Z","iopub.execute_input":"2021-07-25T12:48:40.816834Z","iopub.status.idle":"2021-07-25T12:48:40.831215Z","shell.execute_reply.started":"2021-07-25T12:48:40.816788Z","shell.execute_reply":"2021-07-25T12:48:40.830032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_file1","metadata":{"papermill":{"duration":0.380107,"end_time":"2021-07-08T23:10:58.439374","exception":false,"start_time":"2021-07-08T23:10:58.059267","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.832786Z","iopub.execute_input":"2021-07-25T12:48:40.833241Z","iopub.status.idle":"2021-07-25T12:48:40.848275Z","shell.execute_reply.started":"2021-07-25T12:48:40.833197Z","shell.execute_reply":"2021-07-25T12:48:40.84721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_file1.to_csv('submission.csv', index=False)","metadata":{"papermill":{"duration":0.579629,"end_time":"2021-07-08T23:10:59.399039","exception":false,"start_time":"2021-07-08T23:10:58.81941","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-07-25T12:48:40.85007Z","iopub.execute_input":"2021-07-25T12:48:40.850636Z","iopub.status.idle":"2021-07-25T12:48:41.003209Z","shell.execute_reply.started":"2021-07-25T12:48:40.850598Z","shell.execute_reply":"2021-07-25T12:48:41.002299Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"![download (1).jpg](attachment:442fb254-0ff3-4ceb-bf47-b15a57118389.jpg)","metadata":{"papermill":{"duration":0.400128,"end_time":"2021-07-08T23:11:00.195327","exception":false,"start_time":"2021-07-08T23:10:59.795199","status":"completed"},"tags":[]},"attachments":{"442fb254-0ff3-4ceb-bf47-b15a57118389.jpg":{"image/jpeg":"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"}}},{"cell_type":"markdown","source":"# References\n1. https://www.kaggle.com/ammarnassanalhajali/training-detectron2-for-blood-cells-detection\n1. https://www.kaggle.com/corochann/vinbigdata-detectron2-train\n1. https://www.kaggle.com/corochann/vinbigdata-detectron2-prediction\n","metadata":{"papermill":{"duration":0.416998,"end_time":"2021-07-08T23:11:01.046494","exception":false,"start_time":"2021-07-08T23:11:00.629496","status":"completed"},"tags":[]}}]}