{"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":"# Install Packages","metadata":{"papermill":{"duration":0.03397,"end_time":"2021-08-08T14:34:50.525492","exception":false,"start_time":"2021-08-08T14:34:50.491522","status":"completed"},"tags":[]}},{"cell_type":"code","source":"SKIP = True # For super fast commit.\n\nimport glob\nimport pandas as pd\ndicom_files = glob.glob('/kaggle/input/siim-covid19-detection/test/*/*/*.dcm')\nPUBLIC = len(dicom_files) == 1263\nimport torch\nassert(torch.cuda.is_available())\nif PUBLIC & SKIP:\n    sub = pd.read_csv('../input/siim-covid19-detection/sample_submission.csv')\n    sub.to_csv('submission.csv', index=False)\nelse:\n    !cd /kaggle/input/timm-071121/ ; pip install -q .\n    !cd /kaggle/input/pretrainedmodels/pretrained-models.pytorch/ ; pip install -q .\n    !pip install -q /kaggle/input/omegaconf/omegaconf-2.0.2-py3-none-any.whl\n\n    !pip install -q /kaggle/input/pycocotools202/pycocotools-2.0.2-cp37-cp37m-linux_x86_64.whl\n\n    !pip install -q /kaggle/input/mmdet-pkgs/yapf-0.31.0-py2.py3-none-any.whl\n    !pip install -q /kaggle/input/mmdet-pkgs/setuptools-57.4.0-py3-none-any.whl\n    !pip install -q /kaggle/input/mmdet-pkgs/addict-2.4.0-py3-none-any.whl\n    !pip install -q /kaggle/input/mmdet-pkgs/mmcv_full-1.3.10-cp37-cp37m-manylinux1_x86_64.whl\n    !cp -r /kaggle/input/mmdet-pkgs/panopticapi /kaggle/working/ ; cd /kaggle/working/panopticapi/ ; pip install -q .     \n\n    !cp /kaggle/input/gdcm-conda-install/gdcm.tar .\n    !tar -xvzf gdcm.tar\n    !conda install --offline ./gdcm/gdcm-2.8.9-py37h71b2a6d_0.tar.bz2\n\n    !cp -r /kaggle/input/siim-covid19-src/mmdetection /kaggle/working/ ; cd /kaggle/working/mmdetection/ ; pip install -q -r requirements/build.txt ; pip install -q -v -e .\n\n    import pandas as pd\n    public_dicoms = pd.read_csv('/kaggle/input/public-dicom-files/public_dicom_files.csv')\n    public_dicoms.head()","metadata":{"papermill":{"duration":341.675606,"end_time":"2021-08-08T14:40:32.233973","exception":false,"start_time":"2021-08-08T14:34:50.558367","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:03:18.415359Z","iopub.execute_input":"2021-08-09T11:03:18.415872Z","iopub.status.idle":"2021-08-09T11:09:02.074241Z","shell.execute_reply.started":"2021-08-09T11:03:18.41575Z","shell.execute_reply":"2021-08-09T11:09:02.073269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\nSKIP_PRIVATE = False\nSKIP_PUBLIC = not SKIP_PRIVATE\ndicom_files = glob.glob('/kaggle/input/siim-covid19-detection/test/*/*/*.dcm')\nPUBLIC = len(dicom_files) == 1263\nSKIP_PUBLIC = SKIP_PUBLIC and not PUBLIC\nEXCLUDE_YOLO = False\nstudy_only = False\nimage_only = False\n\nif PUBLIC:\n    DEBUG = True\n#     DEBUG = False\nelse:\n    DEBUG = False\n\n# if DEBUG: dicom_files = dicom_files[:10]\nif DEBUG: dicom_files = dicom_files[:200]\nif SKIP_PUBLIC:\n    dicom_files = list(set(dicom_files) - set(public_dicoms.file.values))\nelif SKIP_PRIVATE:\n    dicom_files = list(set(dicom_files) & set(public_dicoms.file.values))\nprint (f'There are {len(dicom_files)} DICOM files. ')","metadata":{"papermill":{"duration":1.208934,"end_time":"2021-08-08T14:40:33.4874","exception":false,"start_time":"2021-08-08T14:40:32.278466","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:09:02.076119Z","iopub.execute_input":"2021-08-09T11:09:02.076574Z","iopub.status.idle":"2021-08-09T11:09:03.081113Z","shell.execute_reply.started":"2021-08-09T11:09:02.076529Z","shell.execute_reply":"2021-08-09T11:09:03.080262Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# DICOM Loading","metadata":{"papermill":{"duration":0.040208,"end_time":"2021-08-08T14:40:33.565976","exception":false,"start_time":"2021-08-08T14:40:33.525768","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport cv2\nimport glob\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pydicom\nimport re\nimport torch\n\nfrom collections import defaultdict\nfrom omegaconf import OmegaConf\nfrom PIL import Image\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nfrom tqdm import tqdm\n\n\ndef read_dicom(path, voi_lut = True, fix_monochrome = True):\n    # Original from: https://www.kaggle.com/raddar/convert-dicom-to-np-array-the-correct-way\n    dicom = pydicom.read_file(path)\n    \n    # VOI LUT (if available by DICOM device) is used to transform raw DICOM data to \n    # \"human-friendly\" view\n    if voi_lut:\n        data = apply_voi_lut(dicom.pixel_array, dicom)\n    else:\n        data = dicom.pixel_array\n               \n    # depending on this value, X-ray may look inverted - fix that:\n    if fix_monochrome and dicom.PhotometricInterpretation == \"MONOCHROME1\":\n        data = np.amax(data) - data\n        \n    data = data - np.min(data)\n    data = data / np.max(data)\n    data = (data * 255).astype(np.uint8)\n    # shape = (H, W)\n    data = np.expand_dims(data, axis=-1)\n    data = np.repeat(data, 3, axis=-1)\n    # shape = (H, W, 3)\n    return data\n\n\nos.makedirs('/kaggle/tmp/')","metadata":{"papermill":{"duration":0.394948,"end_time":"2021-08-08T14:40:34.001551","exception":false,"start_time":"2021-08-08T14:40:33.606603","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:09:03.08307Z","iopub.execute_input":"2021-08-09T11:09:03.08341Z","iopub.status.idle":"2021-08-09T11:09:03.41543Z","shell.execute_reply.started":"2021-08-09T11:09:03.083373Z","shell.execute_reply":"2021-08-09T11:09:03.414536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Detection Inference","metadata":{"papermill":{"duration":0.038263,"end_time":"2021-08-08T14:40:34.080095","exception":false,"start_time":"2021-08-08T14:40:34.041832","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"## MMDetection Setup","metadata":{"papermill":{"duration":0.03838,"end_time":"2021-08-08T14:40:34.161589","exception":false,"start_time":"2021-08-08T14:40:34.123209","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import sys ; sys.path.insert(0, '/kaggle/working/mmdetection/')\n\nfrom mmcv import Config\nfrom mmcv.parallel import collate\nfrom mmcv.parallel import MMDataParallel\nfrom mmcv.runner import load_checkpoint\nfrom mmdet.datasets import build_dataset\nfrom mmdet.models import build_detector\n\n\ndef load_model(cfg, checkpoint):\n    model = build_detector(cfg.model, test_cfg=cfg.get('test_cfg'))\n    checkpoint = load_checkpoint(model, checkpoint, map_location='cpu')\n    return MMDataParallel(model.eval().cuda(), device_ids=[0])\n\n\ndef process_image_for_mmdet(img, fp, pipeline):\n    results = {}\n    results['filename'] = fp\n    results['ori_filename'] = fp\n    results['img'] = img\n    results['img_shape'] = img.shape\n    results['ori_shape'] = img.shape\n    results['img_fields'] = ['img']\n    results = pipeline(results)\n    return collate([results])\n\n\ncfg = Config.fromfile('/kaggle/input/siim-covid19-src/mmdetection/configs/swin/swin004.py')\ncfg.model.train_cfg = None\nif hasattr(cfg.model.backbone, 'init_cfg'):\n    cfg.model.backbone.init_cfg = None\nif hasattr(cfg.model.backbone, 'pretrained'):\n    cfg.model.backbone.pretrained = None\ncfg.data.test.filter_empty_gt = False\ncfg.data.test.annotations = []\ncfg.data.test.pipeline = cfg.data.test.pipeline[1:]\n\ncheckpoints = np.sort(glob.glob('/kaggle/input/mmdet-checkpoints/swin004*'))\n\nmmdet_models = [load_model(cfg, ckpt) for ckpt in checkpoints]\nmmdet_dataset = build_dataset(cfg.data.test)","metadata":{"papermill":{"duration":81.38269,"end_time":"2021-08-08T14:41:55.583242","exception":false,"start_time":"2021-08-08T14:40:34.200552","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:09:03.418109Z","iopub.execute_input":"2021-08-09T11:09:03.418723Z","iopub.status.idle":"2021-08-09T11:10:23.646673Z","shell.execute_reply.started":"2021-08-09T11:09:03.418681Z","shell.execute_reply":"2021-08-09T11:10:23.64576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## EfficientDet Setup","metadata":{"papermill":{"duration":0.037696,"end_time":"2021-08-08T14:41:55.659675","exception":false,"start_time":"2021-08-08T14:41:55.621979","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import sys ; sys.path.insert(0, '/kaggle/input/siim-covid19-src/')\n\nimport cv2\nimport glob\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pydicom\nimport re\nimport torch\n\nfrom collections import defaultdict\nfrom omegaconf import OmegaConf\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nfrom tqdm import tqdm\n\nfrom detect.skp import builder\n\n\ndef load_model(cfg, checkpoint):\n    cfg.model.params.pretrained = False\n    cfg.model.params.inference = True\n    if 'load_pretrained' in cfg.model.params: cfg.model.params.load_pretrained = None\n    model = builder.build_model(cfg)\n    print (f'Loading model from {checkpoint} ... ')\n    weights = torch.load(checkpoint, map_location=lambda storage, loc: storage)['state_dict']\n    weights = {re.sub(r'^model.', '', k) : v for k,v in weights.items()}\n    model.load_state_dict(weights)\n    return model.eval().cuda()\n\n\ndef load_config(cfgname):\n    config = OmegaConf.load(f'/kaggle/input/siim-covid19-src/detect/configs/mks/{cfgname}.yaml')\n    config.data.dataset.name = 'CXRDataset'\n    config.data.dataset.params.dicom = True\n    return config\n\n\ndef draw_bbox(img, rects):\n    for r in rects:\n        xmin, ymin, xmax, ymax = r\n        cv2.rectangle(img, (xmin, ymin), (xmax, ymax), (255,0,0), 2)\n    return img\n\n\neffdet_configs = ['mk004'] * 5 + ['mk007'] * 5\neffdet_configs = [load_config(c) for c in effdet_configs]\n\neffdet_models = list(np.sort(glob.glob('/kaggle/input/effdet-d7x-d6/mk004*')))[:5] + list(np.sort(glob.glob('/kaggle/input/effdet-d7x-d6/mk007*')))[:5]\neffdet_models = [load_model(conf, mod) for conf, mod in zip(effdet_configs, effdet_models)]\n\neffdet_datasets = [builder.build_dataset(conf, data_info=dict(annotations=[]), mode='predict') for conf in effdet_configs]","metadata":{"papermill":{"duration":51.163495,"end_time":"2021-08-08T14:42:46.861401","exception":false,"start_time":"2021-08-08T14:41:55.697906","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:10:41.677254Z","iopub.execute_input":"2021-08-09T11:10:41.677586Z","iopub.status.idle":"2021-08-09T11:11:27.366692Z","shell.execute_reply.started":"2021-08-09T11:10:41.677556Z","shell.execute_reply":"2021-08-09T11:11:27.365855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Classification Setup","metadata":{"papermill":{"duration":0.050439,"end_time":"2021-08-08T14:42:46.986665","exception":false,"start_time":"2021-08-08T14:42:46.936226","status":"completed"},"tags":[]}},{"cell_type":"code","source":"from classify.skp import builder\n\n\ndef load_model(cfg, checkpoint):\n    if cfg.model.name != 'SwinFPN':\n        cfg.model.params.encoder_weights = None\n    if 'load_pretrained' in cfg.model.params: cfg.model.params.load_pretrained = None\n    if 'load_pretrained_encoder' in cfg.model.params: cfg.model.params.load_pretrained_encoder = None\n    model = builder.build_model(cfg)\n    print (f'Loading model from {checkpoint} ... ')\n    weights = torch.load(checkpoint, map_location=lambda storage, loc: storage)['state_dict']\n    weights = {re.sub(r'^model.', '', k) : v for k,v in weights.items()}\n    model.load_state_dict(weights)\n    return model.eval().cuda()\n\n\ndef load_config(cfgname):\n    config = OmegaConf.load(f'/kaggle/input/siim-covid19-src/classify/configs/seg/{cfgname}.yaml')\n    config.data.dataset.name = 'DICOMDataset'\n    config.data.dataset.params.return_name = True\n    return config\n\n\nclass_configs = ['seg019', 'seg019', 'seg019', 'seg019', 'seg019', 'seg032', 'seg032', 'seg032', 'seg032', 'seg032']\nclass_checkpoints = glob.glob('/kaggle/input/siim-covid19-checkpoints/sbn/fold*/checkpoints/epoch*') + glob.glob('/kaggle/input/siim-covid19-seg032/fold*/checkpoints/epoch*')\nclass_configs = [load_config(c) for c in class_configs]\nseg019_models = [load_model(conf, mod) for conf, mod in zip(class_configs[:5], class_checkpoints[:5])]\nseg032_models = [load_model(conf, mod) for conf, mod in zip(class_configs[5:], class_checkpoints[5:])]\n\ndata_info = {\n    'inputs': [], 'labels': []\n}\nseg019_dataset = builder.build_dataset(class_configs[0], data_info, mode='predict')\nseg032_dataset = builder.build_dataset(class_configs[-1], data_info, mode='predict')","metadata":{"papermill":{"duration":58.824096,"end_time":"2021-08-08T14:43:45.857672","exception":false,"start_time":"2021-08-08T14:42:47.033576","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:11:27.368252Z","iopub.execute_input":"2021-08-09T11:11:27.368581Z","iopub.status.idle":"2021-08-09T11:12:31.08408Z","shell.execute_reply.started":"2021-08-09T11:11:27.368544Z","shell.execute_reply":"2021-08-09T11:12:31.083248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from scipy.special import softmax\ndef sigmoid(x):\n    return 1/(1 + np.exp(-x))\n\n# Store detection predictions\neffdet_model_predictions = defaultdict(list)\nswin_model_predictions = defaultdict(list)\n\n# effdet_model_names = [f'mk004_fold{i}' for i in [2,3,4]] + [f'mk007_fold{i}' for i in [0,1,2]]\neffdet_model_names = [f'mk004_fold{i}' for i in range(5)] + [f'mk007_fold{i}' for i in range(5)]\nswin_model_names = [f'swin004_fold{i}' for i in range(5)]\n\n# Store classification predictions\nseg019_cls_predictions = []\nseg032_cls_predictions = []\n\nfor dcmfile in tqdm(dicom_files):\n\n    dcm = read_dicom(dcmfile)\n    original_size = dcm.shape\n    \n    # EfficientNet \n    for ind,(d,m) in enumerate(zip(effdet_datasets, effdet_models)):\n        X = d.resize(image=dcm.copy(), bboxes=[], labels=[])['image']\n        new_size = X.shape\n        scale_factor = (original_size[0] / new_size[0], original_size[1] / new_size[1])\n        X = d.preprocess(X)\n        X = X.transpose(2,0,1)\n        X = torch.from_numpy(X).float().unsqueeze(0).cuda()\n        with torch.no_grad():\n            dets = m(X)\n        dets = dets[0, :, [1,0,3,2,4]].cpu().numpy()\n        dets[:, [0,2]] *= scale_factor[1]\n        dets[:, [1,3]] *= scale_factor[0]\n        #img_w_bbox = draw_bbox(dcm.copy(), list(dets[dets[:,-1] >= 0.3, :4].astype('int')))\n        #plt.imshow(img_w_bbox); plt.show()\n        effdet_model_predictions[effdet_model_names[ind]].append(dets)\n    \n    # MMDetection-Swin\n    data = process_image_for_mmdet(dcm.copy(), dcmfile, mmdet_dataset.pipeline)\n    for ind, m in enumerate(mmdet_models):\n        with torch.no_grad():\n            dets = m(return_loss=False, rescale=True, **data)\n        dets = dets[0][0]\n        #img_w_bbox = draw_bbox(dcm.copy(), list(dets[dets[:,-1] >= 0.3, :4].astype('int')))\n        #plt.imshow(img_w_bbox); plt.show()\n        swin_model_predictions[swin_model_names[ind]].append(dets)\n        \n    # sigmoid\n    img = torch.from_numpy(seg019_dataset.process_image(dcm.copy())).float().cuda().unsqueeze(0)\n    with torch.no_grad():\n        out = [m(img) for m in seg019_models]\n        pcls = torch.sigmoid(torch.stack([o[1] for o in out], dim=0).mean(0))\n        pseg = 1.0 - torch.sigmoid(torch.stack([o[0].max(-1)[0].max(-1)[0] for o in out], dim=0).mean(0))\n        p = pcls\n        p[:, -1] = (p[:, -1] + pseg[:, 0]) / 2\n    seg019_cls_predictions.append(p.cpu().numpy())\n    \n    img = torch.from_numpy(seg032_dataset.process_image(dcm.copy())).float().cuda().unsqueeze(0)\n    with torch.no_grad():\n        out = [m(img) for m in seg032_models]\n        pcls = torch.sigmoid(torch.stack([o[1] for o in out], dim=0).mean(0))\n        pseg = 1.0 - torch.sigmoid(torch.stack([o[0].max(-1)[0].max(-1)[0] for o in out], dim=0).mean(0))\n        p = pcls\n        p[:, -1] = (p[:, -1] + pseg[:, 0]) / 2\n    seg032_cls_predictions.append(p.cpu().numpy())\n","metadata":{"papermill":{"duration":49.612273,"end_time":"2021-08-08T14:44:35.517194","exception":false,"start_time":"2021-08-08T14:43:45.904921","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:12:31.086109Z","iopub.execute_input":"2021-08-09T11:12:31.086459Z","iopub.status.idle":"2021-08-09T11:13:19.849054Z","shell.execute_reply.started":"2021-08-09T11:12:31.086422Z","shell.execute_reply":"2021-08-09T11:13:19.848076Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# create png","metadata":{"papermill":{"duration":0.052893,"end_time":"2021-08-08T14:44:35.617929","exception":false,"start_time":"2021-08-08T14:44:35.565036","status":"completed"},"tags":[]}},{"cell_type":"code","source":"%%time\n\n!mkdir -p /kaggle/tmp/jpg/\nPNG_DIR = '/kaggle/tmp/jpg/'\n\nfrom PIL import Image\nimport os\nimport pandas as pd\nimport cv2\nimport glob\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pydicom\nimport re\nimport torch\n\nfrom collections import defaultdict\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nfrom tqdm import tqdm\n\ndef read_xray(path, voi_lut = True, fix_monochrome = True):\n    # Original from: https://www.kaggle.com/raddar/convert-dicom-to-np-array-the-correct-way\n    dicom = pydicom.read_file(path)\n    \n    # VOI LUT (if available by DICOM device) is used to transform raw DICOM data to \n    # \"human-friendly\" view\n    if voi_lut:\n        data = apply_voi_lut(dicom.pixel_array, dicom)\n    else:\n        data = dicom.pixel_array\n               \n    # depending on this value, X-ray may look inverted - fix that:\n    if fix_monochrome and dicom.PhotometricInterpretation == \"MONOCHROME1\":\n        data = np.amax(data) - data\n        \n    data = data - np.min(data)\n    data = data / np.max(data)\n    data = (data * 255).astype(np.uint8)\n        \n    return data\n\ndef resize(array, size, keep_ratio=False, resample=Image.LANCZOS):\n    # Original from: https://www.kaggle.com/xhlulu/vinbigdata-process-and-resize-to-image\n    im = Image.fromarray(array)\n    \n    if keep_ratio:\n        im.thumbnail((size, size), resample)\n    else:\n        im = im.resize((size, size), resample)\n    \n    return im\n\nheights = []\nwidths = []\nimage_ids = []\nstudy_ids = []\npaths = []\nfor file in tqdm(dicom_files):\n    # set keep_ratio=True to have original aspect ratio\n    xray = read_xray(file)\n    im = resize(xray, size=1536)\n#     im = Image.fromarray(xray)\n    \n    filename = file.split('/')[-1].replace('.dcm', '.jpg')\n    study_id = file.split('/')[-3]\n    im.save(os.path.join(PNG_DIR, filename))\n    image_ids.append(filename.replace('.jpg', ''))\n    study_ids.append(study_id)\n    paths.append(os.path.join(PNG_DIR, filename))\n    heights.append(xray.shape[0])\n    widths.append(xray.shape[1])\ntest_for_yuji_df = pd.DataFrame({\n    'image_id': image_ids,\n    'study_id': study_ids,\n    'height': heights,\n    'width': widths,\n    'path': paths\n})\ntest_for_yuji_df","metadata":{"papermill":{"duration":6.718154,"end_time":"2021-08-08T14:44:42.383252","exception":false,"start_time":"2021-08-08T14:44:35.665098","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:13:19.853782Z","iopub.execute_input":"2021-08-09T11:13:19.856171Z","iopub.status.idle":"2021-08-09T11:13:26.776034Z","shell.execute_reply.started":"2021-08-09T11:13:19.856121Z","shell.execute_reply":"2021-08-09T11:13:26.775164Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Yolov5 Inference","metadata":{"papermill":{"duration":0.049913,"end_time":"2021-08-08T14:44:42.484042","exception":false,"start_time":"2021-08-08T14:44:42.434129","status":"completed"},"tags":[]}},{"cell_type":"code","source":"%%time\nif not EXCLUDE_YOLO:\n    import shutil\n    shutil.copytree('/kaggle/input/yolov5-version5/yolov5', '/kaggle/working/yolov5')\n\n    test_image_dir = f'/kaggle/tmp/jpg'\n    model_paths = [\n        '/kaggle/input/yolo-models/l6_v2/l6_v2/fold_2/weights/best.pt',\n        '/kaggle/input/yolo-models/l6_v2/l6_v2/fold_3/weights/best.pt',\n        '/kaggle/input/yolo-models/l_fold4.pt',\n    ]\n    model_names = ['l6_fold2', 'l6_fold3', 'l_fold4']\n    image_sizes = [512, 512, 512]\n    # modelnames = ['fold_0', 'fold_1', 'fold_2']\n    # image_sizes = [512, 512, 512]\n\n    os.chdir('/kaggle/working/yolov5') # install dependencies\n\n    def yolo2voc(image_height, image_width, bboxes):\n        \"\"\"\n        yolo => [xmid, ymid, w, h] (normalized)\n        voc  => [x1, y1, x2, y1]\n\n        \"\"\" \n        bboxes = bboxes.copy().astype(float) # otherwise all value will be 0 as voc_pascal dtype is np.int\n\n        bboxes[..., [0, 2]] = bboxes[..., [0, 2]]* image_width\n        bboxes[..., [1, 3]] = bboxes[..., [1, 3]]* image_height\n\n        bboxes[..., [0, 1]] = bboxes[..., [0, 1]] - bboxes[..., [2, 3]]/2\n        bboxes[..., [2, 3]] = bboxes[..., [0, 1]] + bboxes[..., [2, 3]]\n\n        return bboxes\n\n\n    yolo_pred_dfs = []\n    BBOX_COLS = ['x_min', 'y_min', 'x_max', 'y_max']\n\n    for image_size, model_name, model_path in zip(image_sizes, model_names, model_paths):\n        print(model_path)\n        !python detect.py --weights $model_path\\\n        --img $image_size --conf 0.001 --iou 0.45\\\n        --source $test_image_dir --save-txt --save-conf --exist-ok --max-det 100\n\n        image_ids = []\n        confs = []\n        boxes = []\n\n        for file_path in tqdm(glob.glob('runs/detect/exp/labels/*.txt')):\n            image_id = file_path.split('/')[-1].split('.')[0]\n            w, h = test_for_yuji_df.loc[test_for_yuji_df.image_id==image_id, ['width', 'height']].values[0]\n            f = open(file_path, 'r')\n            data = np.array(f.read().replace('\\n', ' ').strip().split(' ')).astype(np.float32).reshape(-1, 6)\n            data = data[:, [0, 5, 1, 2, 3, 4]]\n            confs += data[:, 1].tolist()\n            boxes += np.round(yolo2voc(h, w, data[:, 2:])).astype(int).tolist()\n            image_ids += [image_id]*len(data)\n\n        df=pd.DataFrame({'image_id':image_ids, 'conf': confs})\n        df[BBOX_COLS] = boxes\n        df['modelname'] = f'yolo_{model_name}'\n        yolo_pred_dfs.append(df)\n    yolo_pred_df = pd.concat(yolo_pred_dfs)\n\n    os.chdir('/kaggle/working')\n    yolo_pred_df.head()","metadata":{"papermill":{"duration":28.79908,"end_time":"2021-08-08T14:45:11.333229","exception":false,"start_time":"2021-08-08T14:44:42.534149","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:13:26.777625Z","iopub.execute_input":"2021-08-09T11:13:26.778058Z","iopub.status.idle":"2021-08-09T11:13:58.667485Z","shell.execute_reply.started":"2021-08-09T11:13:26.778014Z","shell.execute_reply":"2021-08-09T11:13:58.666583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create Detection DataFrame for WBF","metadata":{"papermill":{"duration":0.058472,"end_time":"2021-08-08T14:45:11.456488","exception":false,"start_time":"2021-08-08T14:45:11.398016","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def get_detection_df(model_predictions, filenames):\n    df_list = []\n    for k,v in model_predictions.items():\n        tmp_df_list = []\n        for ind, each_det in enumerate(v):\n            each_det = each_det[each_det[:,0] >= 0]\n            each_det = each_det[each_det[:,1] >= 0]\n            tmp_df = pd.DataFrame(each_det)\n            tmp_df.columns = ['x_min', 'y_min', 'x_max', 'y_max', 'conf']\n            tmp_df['modelname'] = k\n            tmp_df['image_id'] = filenames[ind].split('/')[-1].split('.')[0]\n            tmp_df_list.append(tmp_df)\n        df_list.append(pd.concat(tmp_df_list))\n    return pd.concat(df_list)\n\neffdet_df = get_detection_df(effdet_model_predictions, dicom_files)\nswin_df = get_detection_df(swin_model_predictions, dicom_files)\n\nif EXCLUDE_YOLO:\n    det_pred_df = pd.concat([effdet_df, swin_df])\nelse:    \n    det_pred_df = pd.concat([effdet_df, swin_df, yolo_pred_df])\n\ndet_pred_df['class_id'] = 0","metadata":{"papermill":{"duration":0.251074,"end_time":"2021-08-08T14:45:11.761249","exception":false,"start_time":"2021-08-08T14:45:11.510175","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:13:58.668963Z","iopub.execute_input":"2021-08-09T11:13:58.669306Z","iopub.status.idle":"2021-08-09T11:13:58.873043Z","shell.execute_reply.started":"2021-08-09T11:13:58.669267Z","shell.execute_reply":"2021-08-09T11:13:58.87213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"det_pred_df","metadata":{"papermill":{"duration":0.074701,"end_time":"2021-08-08T14:45:11.890215","exception":false,"start_time":"2021-08-08T14:45:11.815514","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:13:58.874393Z","iopub.execute_input":"2021-08-09T11:13:58.874761Z","iopub.status.idle":"2021-08-09T11:13:58.89807Z","shell.execute_reply.started":"2021-08-09T11:13:58.874723Z","shell.execute_reply":"2021-08-09T11:13:58.897237Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"det_pred_df.modelname.nunique(), det_pred_df.modelname.unique()","metadata":{"papermill":{"duration":0.06637,"end_time":"2021-08-08T14:45:12.012459","exception":false,"start_time":"2021-08-08T14:45:11.946089","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:13:58.902367Z","iopub.execute_input":"2021-08-09T11:13:58.902624Z","iopub.status.idle":"2021-08-09T11:13:58.916535Z","shell.execute_reply.started":"2021-08-09T11:13:58.902599Z","shell.execute_reply":"2021-08-09T11:13:58.915761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# WBF","metadata":{"papermill":{"duration":0.054621,"end_time":"2021-08-08T14:45:12.122129","exception":false,"start_time":"2021-08-08T14:45:12.067508","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!pip install --no-deps '/kaggle/input/new-ensemble-boxes/Weighted-Boxes-Fusion/' > /dev/null","metadata":{"papermill":{"duration":23.329183,"end_time":"2021-08-08T14:45:35.506213","exception":false,"start_time":"2021-08-08T14:45:12.17703","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:13:58.918267Z","iopub.execute_input":"2021-08-09T11:13:58.918518Z","iopub.status.idle":"2021-08-09T11:14:22.40713Z","shell.execute_reply.started":"2021-08-09T11:13:58.918494Z","shell.execute_reply":"2021-08-09T11:14:22.40583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from ensemble_boxes import *\ndef wbf(df, iou_thr = 0.5, skip_box_thr = 0.0, weights=None):\n    results = []\n    image_ids = df[\"image_id\"].unique()\n\n    for nnn, image_id in enumerate(tqdm(image_ids, total=len(image_ids))):\n        # All annotations for the current image.\n        data = df[df[\"image_id\"] == image_id]\n        data = data.reset_index(drop=True)\n\n        annotations = {}\n\n        # WBF expects the coordinates in 0-1 range.\n        max_value = data[[\"x_min\", \"y_min\", \"x_max\", \"y_max\"]].values.max()\n        data[[\"x_min\", \"y_min\", \"x_max\", \"y_max\"]] = data[[\"x_min\", \"y_min\", \"x_max\", \"y_max\"]] / max_value\n\n        # Loop through all of the annotations\n        for idx, row in data.iterrows():\n            modelname = row[\"modelname\"]\n            if modelname not in annotations:\n                annotations[modelname] = {\n                    \"boxes_list\": [],\n                    \"scores_list\": [],\n                    \"labels_list\": [],\n                }\n\n            annotations[modelname][\"boxes_list\"].append([row[\"x_min\"], row[\"y_min\"], row[\"x_max\"], row[\"y_max\"]])\n            annotations[modelname][\"scores_list\"].append(row[\"conf\"])\n            annotations[modelname][\"labels_list\"].append(row[\"class_id\"])\n\n        boxes_list = []\n        scores_list = []\n        labels_list = []\n\n        for annotator in annotations.keys():\n            boxes_list.append(annotations[annotator][\"boxes_list\"])\n            scores_list.append(annotations[annotator][\"scores_list\"])\n            labels_list.append(annotations[annotator][\"labels_list\"])\n\n        if weights is None:\n            weights = [1]*len(boxes_list)\n        boxes, scores, labels = weighted_boxes_fusion(\n            boxes_list,\n            scores_list,\n            labels_list,\n            weights=weights,\n            iou_thr=iou_thr,\n            skip_box_thr=skip_box_thr\n        )\n            \n        for idx, box in enumerate(boxes):\n            results.append({\n                \"image_id\": image_id,\n                \"class_id\": int(labels[idx]),\n                \"modelname\": \"wbf\",\n                'conf':scores[idx],\n                \"x_min\": box[0] * max_value,\n                \"y_min\": box[1] * max_value,\n                \"x_max\": box[2] * max_value,\n                \"y_max\": box[3] * max_value,\n            })\n\n    results = pd.DataFrame(results)\n    return results","metadata":{"papermill":{"duration":0.767849,"end_time":"2021-08-08T14:45:36.331074","exception":false,"start_time":"2021-08-08T14:45:35.563225","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:14:22.408935Z","iopub.execute_input":"2021-08-09T11:14:22.409303Z","iopub.status.idle":"2021-08-09T11:14:23.076647Z","shell.execute_reply.started":"2021-08-09T11:14:22.409259Z","shell.execute_reply":"2021-08-09T11:14:23.075783Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ndet_pred_df_wbf = wbf(det_pred_df, iou_thr=0.6, weights = [1]*det_pred_df.modelname.nunique())\ndet_pred_df_wbf.to_csv('det_pred_df_wbf.csv',index=False)\ndet_pred_df_wbf.to_csv('/kaggle/tmp/det_pred_df_wbf.csv',index=False)","metadata":{"papermill":{"duration":14.304653,"end_time":"2021-08-08T14:45:50.697484","exception":false,"start_time":"2021-08-08T14:45:36.392831","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:14:23.07795Z","iopub.execute_input":"2021-08-09T11:14:23.078294Z","iopub.status.idle":"2021-08-09T11:14:38.165233Z","shell.execute_reply.started":"2021-08-09T11:14:23.078259Z","shell.execute_reply":"2021-08-09T11:14:38.161771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"det_pred_df_wbf","metadata":{"papermill":{"duration":0.078219,"end_time":"2021-08-08T14:45:50.835545","exception":false,"start_time":"2021-08-08T14:45:50.757326","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:14:38.166802Z","iopub.execute_input":"2021-08-09T11:14:38.167253Z","iopub.status.idle":"2021-08-09T11:14:38.189723Z","shell.execute_reply.started":"2021-08-09T11:14:38.16721Z","shell.execute_reply":"2021-08-09T11:14:38.188653Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification yuji","metadata":{"papermill":{"duration":0.058157,"end_time":"2021-08-08T14:45:50.954104","exception":false,"start_time":"2021-08-08T14:45:50.895947","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!pip install /kaggle/input/segmentation-models-pytorch/pretrainedmodels-0.7.4/pretrainedmodels-0.7.4\n!pip install /kaggle/input/segmentation-models-pytorch/efficientnet_pytorch-0.6.3/efficientnet_pytorch-0.6.3\n!pip install /kaggle/input/timm-0-3-2/timm-0.3.2-py3-none-any.whl\n!pip install /kaggle/input/segmentation-models-pytorch/segmentation_models_pytorch-0.1.3-py3-none-any.whl\nimport segmentation_models_pytorch as smp\nfrom albumentations.pytorch import ToTensorV2\nfrom albumentations import Resize, Normalize, Compose    \n\nfrom torch.utils.data import Dataset\nfrom torch.utils.data import DataLoader\n\nclass AlbuAugment():\n    def __init__(self):\n        transformation = [\n            Resize(256, 256),\n            Normalize(),\n            ToTensorV2()\n        ]\n        self.transform = Compose(transformation)\n    \n    def __call__(self, image):\n        transformed = self.transform(image=image)\n        return transformed['image']        \n\nclass SegmentationDataset(Dataset):\n    def __init__(self, test):\n        self.paths = test.path.values\n        self.transform = AlbuAugment()\n    def __len__(self):\n        return len(self.paths)\n\n    def __getitem__(self, idx):\n        path = self.paths[idx]\n        image = cv2.imread(path)\n        name = path.split('/')[-1]\n        shape = image.shape\n#         print(shape)\n        image = self.transform(image=image)\n        return image, name, shape[:2]\n    \n    \n    \nimport segmentation_models_pytorch as smp\nimport gc\n\nmodel = smp.UnetPlusPlus('resnet50',\n    encoder_weights=None,\n    classes=1,    \n    ).cuda()\nmodel.load_state_dict(torch.load(\"/kaggle/input/lungfield-segmetation/segmentation-checkpoint.pth\", \"cpu\"))\nmodel.eval();\nloader = DataLoader(SegmentationDataset(test_for_yuji_df), batch_size=32, pin_memory=True, shuffle=False, num_workers=4)       \n!mkdir /kaggle/tmp/mask\n\n\n\ntbar = tqdm(loader)\noutputs = []\nwidths = []\nheights = []\nwith torch.no_grad():\n    for image, names, shapes in tbar:\n        image = image.cuda()\n        th = 0.5\n        output = (torch.sigmoid(model(image).cpu()).permute(0,2,3,1).numpy() > th).astype(np.uint8)\n        for crop, name, shape0, shape1 in zip(output, names, shapes[0],shapes[1]):\n            im = cv2.resize(crop, (shape1, shape0))\n            cv2.imwrite(f\"/kaggle/tmp/mask/{name}\", im)\ndel model\ngc.collect()\n\n!pip install /kaggle/input/timm049/timm-0.4.9-py3-none-any.whl\n\ntest_for_yuji_df.loc[:, 'mask_path'] = '/kaggle/tmp/mask/' + test_for_yuji_df.image_id.values + '.jpg'\ntest_for_yuji_df.to_csv('/kaggle/tmp/test_for_yuji_df.csv', index=False)","metadata":{"papermill":{"duration":136.752703,"end_time":"2021-08-08T14:48:07.765558","exception":false,"start_time":"2021-08-08T14:45:51.012855","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:14:38.191326Z","iopub.execute_input":"2021-08-09T11:14:38.191682Z","iopub.status.idle":"2021-08-09T11:16:57.956199Z","shell.execute_reply.started":"2021-08-09T11:14:38.191643Z","shell.execute_reply":"2021-08-09T11:16:57.955173Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# if DEBUG:\n#     det_pred_df_wbf=pd.read_csv('../input/for-debug200/kernel_detection.csv')\n#     det_pred_df_wbf.to_csv('/kaggle/tmp/det_pred_df_wbf.csv',index=False)","metadata":{"papermill":{"duration":0.073844,"end_time":"2021-08-08T14:48:07.908014","exception":false,"start_time":"2021-08-08T14:48:07.83417","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:16:57.957817Z","iopub.execute_input":"2021-08-09T11:16:57.958222Z","iopub.status.idle":"2021-08-09T11:16:57.964577Z","shell.execute_reply.started":"2021-08-09T11:16:57.958181Z","shell.execute_reply":"2021-08-09T11:16:57.963683Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del effdet_models, seg019_models, seg032_models, mmdet_models\n\nimport gc\ngc.collect()\ntorch.cuda.empty_cache()","metadata":{"papermill":{"duration":0.882079,"end_time":"2021-08-08T14:48:08.859634","exception":false,"start_time":"2021-08-08T14:48:07.977555","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:16:57.966097Z","iopub.execute_input":"2021-08-09T11:16:57.9666Z","iopub.status.idle":"2021-08-09T11:16:58.865352Z","shell.execute_reply.started":"2021-08-09T11:16:57.96656Z","shell.execute_reply":"2021-08-09T11:16:58.86347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.067392,"end_time":"2021-08-08T14:48:08.998189","exception":false,"start_time":"2021-08-08T14:48:08.930797","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.067113,"end_time":"2021-08-08T14:48:09.132768","exception":false,"start_time":"2021-08-08T14:48:09.065655","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import subprocess\nimport json\n\nDEFAULT_ATTRIBUTES = (\n    'index',\n    'uuid',\n    'name',\n    'timestamp',\n    'memory.total',\n    'memory.free',\n    'memory.used',\n    'utilization.gpu',\n    'utilization.memory'\n)\n\ndef get_gpu_info(nvidia_smi_path='nvidia-smi', keys=DEFAULT_ATTRIBUTES, no_units=True):\n    nu_opt = '' if not no_units else ',nounits'\n    cmd = '%s --query-gpu=%s --format=csv,noheader%s' % (nvidia_smi_path, ','.join(keys), nu_opt)\n    output = subprocess.check_output(cmd, shell=True)\n    lines = output.decode().split('\\n')\n    lines = [ line.strip() for line in lines if line.strip() != '' ]\n\n    return [ { k: v for k, v in zip(keys, line.split(', ')) } for line in lines ]\n\n\nimport pprint\npprint.pprint(get_gpu_info())","metadata":{"papermill":{"duration":0.193403,"end_time":"2021-08-08T14:48:09.393493","exception":false,"start_time":"2021-08-08T14:48:09.20009","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:16:58.869192Z","iopub.execute_input":"2021-08-09T11:16:58.869629Z","iopub.status.idle":"2021-08-09T11:16:59.055036Z","shell.execute_reply.started":"2021-08-09T11:16:58.869579Z","shell.execute_reply":"2021-08-09T11:16:59.053094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.chdir('/kaggle/input/siim-src-yuji')\n!python /kaggle/input/siim-src-yuji/train_one_fold.py --fold 0 -c model0changelr\n!python /kaggle/input/siim-src-yuji/train_one_fold.py --fold 0 -c swinmixupchangelr\nos.chdir('/kaggle/working')","metadata":{"papermill":{"duration":308.95638,"end_time":"2021-08-08T14:53:18.418633","exception":false,"start_time":"2021-08-08T14:48:09.462253","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:16:59.0606Z","iopub.execute_input":"2021-08-09T11:16:59.061152Z","iopub.status.idle":"2021-08-09T11:22:47.330257Z","shell.execute_reply.started":"2021-08-09T11:16:59.061104Z","shell.execute_reply":"2021-08-09T11:22:47.328045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.074522,"end_time":"2021-08-08T14:53:18.571509","exception":false,"start_time":"2021-08-08T14:53:18.496987","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"use_softmax = True","metadata":{"papermill":{"duration":0.083597,"end_time":"2021-08-08T14:53:18.731332","exception":false,"start_time":"2021-08-08T14:53:18.647735","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:22:47.332955Z","iopub.execute_input":"2021-08-09T11:22:47.333565Z","iopub.status.idle":"2021-08-09T11:22:47.338197Z","shell.execute_reply.started":"2021-08-09T11:22:47.333517Z","shell.execute_reply":"2021-08-09T11:22:47.337221Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from scipy.special import softmax\ndef sigmoid(x):\n    return 1/(1 + np.exp(-x))\n\ntest = test_for_yuji_df[['image_id', 'study_id']]\nlabels = ['Typical Appearance', 'Indeterminate Appearance', 'Atypical Appearance', 'Negative for Pneumonia', 'none']\nall_pred_cols = []\n# model0\npreds_4_model0 = []\npreds_opa_model0 = []\ndi = 'model0changelr'\n\n# n_folds = 3\nn_folds = 5 \n\npreds = np.load(f'/kaggle/tmp/results/{di}/tta_pred_fold0.npy')\n\nfor fold in range(n_folds):\n    pred = preds[:, fold, :, :]\n    if use_softmax:\n        pred4 = [softmax(p[:, :4], axis=1) for p in pred]\n    else:\n        pred4 = [sigmoid(p[:, :4]) for p in pred]    \n    pred4 = np.mean(pred4, axis=0)\n    pred_opa = [sigmoid(p[:, -1]) for p in pred]\n    pred_opa = np.mean(pred_opa, axis=0)\n\n    preds_4_model0.append(pred4)\n    preds_opa_model0.append(pred_opa)\nprint(len(preds_4_model0), len(preds_opa_model0))\npreds_4_model0 = np.mean(preds_4_model0, axis=0)\npreds_opa_model0 = np.mean(preds_opa_model0, axis=0)\n\npred_cols = [f'model0_pred_{l}' for l in labels]\ntest[pred_cols[:4]] = preds_4_model0\ntest[pred_cols[-1]] = preds_opa_model0\n\nall_pred_cols += pred_cols\n\n# model1\n# labels = ['Typical Appearance', 'Atypical Appearance', 'Negative for Pneumonia', 'none']\nlabels = ['Typical Appearance', 'Indeterminate Appearance', 'Atypical Appearance', 'Negative for Pneumonia', 'none']\npreds_4_model1 = []\npreds_opa_model1 = []\ndi = 'swinmixupchangelr'\n\n# n_folds = 3\nn_folds = 5\n\npreds = np.load(f'/kaggle/tmp/results/{di}/tta_pred_fold0.npy')\nfor fold in range(n_folds):\n    pred = preds[:, fold, :, :]\n    if use_softmax:\n        pred4 = [softmax(p[:, :4], axis=1) for p in pred]\n    else:\n        pred4 = [sigmoid(p[:, :4]) for p in pred]\n        \n    pred4 = np.mean(pred4, axis=0)\n    pred_opa = [sigmoid(p[:, -1]) for p in pred]\n    pred_opa = np.mean(pred_opa, axis=0)\n\n    preds_4_model1.append(pred4)\n    preds_opa_model1.append(pred_opa)\nprint(len(preds_4_model1), len(preds_opa_model1))\npreds_4_model1 = np.mean(preds_4_model1, axis=0)\npreds_opa_model1 = np.mean(preds_opa_model1, axis=0)\npred_cols = [f'model1_pred_{l}' for l in labels]\nall_pred_cols += pred_cols\ntest[pred_cols[:4]] = preds_4_model1\ntest[pred_cols[-1]] = preds_opa_model1\n\n\n# labels = ['Typical Appearance', 'Indeterminate Appearance', 'Atypical Appearance', 'Negative for Pneumonia', 'none']\n# preds_4_model2 = []\n# preds_opa_model2 = []\n# di = 'th04v3'\n\n# n_folds = 5\n\n# preds = np.load(f'/kaggle/tmp/results/{di}/tta_pred_fold0.npy')\n# for fold in range(n_folds):\n#     pred = preds[:, fold, :, :]\n#     if use_softmax:\n#         pred4 = [softmax(p[:, :4], axis=1) for p in pred]\n#     else:\n#         pred4 = [sigmoid(p[:, :4]) for p in pred]\n        \n#     pred4 = np.mean(pred4, axis=0)\n#     pred_opa = [sigmoid(p[:, -1]) for p in pred]\n#     pred_opa = np.mean(pred_opa, axis=0)\n\n#     preds_4_model2.append(pred4)\n#     preds_opa_model2.append(pred_opa)\n# print(len(preds_4_model2), len(preds_opa_model2))\n# preds_4_model2 = np.mean(preds_4_model2, axis=0)\n# preds_opa_model2 = np.mean(preds_opa_model2, axis=0)\n# pred_cols = [f'model2_pred_{l}' for l in labels]\n# all_pred_cols += pred_cols\n# test[pred_cols[:4]] = preds_4_model2\n# test[pred_cols[-1]] = preds_opa_model2\n","metadata":{"papermill":{"duration":0.124045,"end_time":"2021-08-08T14:53:18.929519","exception":false,"start_time":"2021-08-08T14:53:18.805474","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:22:47.340013Z","iopub.execute_input":"2021-08-09T11:22:47.340408Z","iopub.status.idle":"2021-08-09T11:22:47.409397Z","shell.execute_reply.started":"2021-08-09T11:22:47.340363Z","shell.execute_reply":"2021-08-09T11:22:47.407533Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test","metadata":{"papermill":{"duration":0.099926,"end_time":"2021-08-08T14:53:19.106367","exception":false,"start_time":"2021-08-08T14:53:19.006441","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:22:47.41107Z","iopub.execute_input":"2021-08-09T11:22:47.411509Z","iopub.status.idle":"2021-08-09T11:22:47.444762Z","shell.execute_reply.started":"2021-08-09T11:22:47.411462Z","shell.execute_reply":"2021-08-09T11:22:47.443922Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seg019_preds = np.vstack(seg019_cls_predictions)\nseg032_preds = np.vstack(seg032_cls_predictions)\nclass_pred_df = pd.DataFrame(seg019_preds)\nclass_pred_df.columns = ['seg019_ian_pred_Negative for Pneumonia', 'seg019_ian_pred_Atypical Appearance', 'seg019_ian_pred_Indeterminate Appearance', 'seg019_ian_pred_Typical Appearance', 'seg019_ian_pred_none']\nclass_pred_df['filename'] = dicom_files\nclass_pred_df['image_id'] = class_pred_df.filename.apply(lambda x: x.split('/')[-1].split('.')[0])\nclass_pred_df['study_id'] = class_pred_df.filename.apply(lambda x: x.split('/')[-3])\nclass_pred_df[['seg032_ian_pred_Negative for Pneumonia', 'seg032_ian_pred_Atypical Appearance', 'seg032_ian_pred_Indeterminate Appearance', 'seg032_ian_pred_Typical Appearance', 'seg032_ian_pred_none']] = seg032_preds","metadata":{"papermill":{"duration":0.090707,"end_time":"2021-08-08T14:53:19.273535","exception":false,"start_time":"2021-08-08T14:53:19.182828","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:22:47.446384Z","iopub.execute_input":"2021-08-09T11:22:47.446742Z","iopub.status.idle":"2021-08-09T11:22:47.462533Z","shell.execute_reply.started":"2021-08-09T11:22:47.446706Z","shell.execute_reply":"2021-08-09T11:22:47.461397Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# if DEBUG:\n#     class_pred_df = pd.read_csv('../input/for-debug200/kernel_classification2.csv')\n#     for col in ['model0_pred_Typical Appearance', 'model0_pred_Indeterminate Appearance', 'model0_pred_Atypical Appearance', 'model0_pred_Negative for Pneumonia', 'model0_pred_none', 'model1_pred_Typical Appearance', 'model1_pred_Indeterminate Appearance', 'model1_pred_Atypical Appearance', 'model1_pred_Negative for Pneumonia', 'model1_pred_none', 'area_max', 'area_min', 'area_std', 'area_mean', 'box_num', 'conf_max', 'conf_min', 'conf_std', 'conf_mean', 'negative', 'atypical', 'indeterminate', 'typical', 'none']:\n#         del class_pred_df[col]\n","metadata":{"papermill":{"duration":0.08375,"end_time":"2021-08-08T14:53:19.433203","exception":false,"start_time":"2021-08-08T14:53:19.349453","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:22:47.464527Z","iopub.execute_input":"2021-08-09T11:22:47.465012Z","iopub.status.idle":"2021-08-09T11:22:47.4697Z","shell.execute_reply.started":"2021-08-09T11:22:47.464968Z","shell.execute_reply":"2021-08-09T11:22:47.468294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_pred_df = class_pred_df.merge(test[['image_id'] + all_pred_cols], on='image_id')","metadata":{"papermill":{"duration":0.093893,"end_time":"2021-08-08T14:53:19.657545","exception":false,"start_time":"2021-08-08T14:53:19.563652","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:22:47.47491Z","iopub.execute_input":"2021-08-09T11:22:47.475258Z","iopub.status.idle":"2021-08-09T11:22:47.493832Z","shell.execute_reply.started":"2021-08-09T11:22:47.475213Z","shell.execute_reply":"2021-08-09T11:22:47.492844Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## stacking","metadata":{"papermill":{"duration":0.076439,"end_time":"2021-08-08T14:53:19.810655","exception":false,"start_time":"2021-08-08T14:53:19.734216","status":"completed"},"tags":[]}},{"cell_type":"code","source":"use_stacking = True","metadata":{"papermill":{"duration":0.081958,"end_time":"2021-08-08T14:53:19.968859","exception":false,"start_time":"2021-08-08T14:53:19.886901","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:22:47.497692Z","iopub.execute_input":"2021-08-09T11:22:47.498108Z","iopub.status.idle":"2021-08-09T11:22:47.50524Z","shell.execute_reply.started":"2021-08-09T11:22:47.498064Z","shell.execute_reply":"2021-08-09T11:22:47.504304Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_weights_map = {\n    'model0': 0.25,\n    'model1': 0.25,\n    'seg019': 0.25,\n    'seg032': 0.25,\n}\n\nfor label, label_yuji in zip(['negative', 'atypical', 'indeterminate', 'typical', 'none'], ['Negative for Pneumonia', 'Atypical Appearance', 'Indeterminate Appearance', 'Typical Appearance', 'none']):\n#     class_pred_df[label] = class_pred_df[f'seg019_ian_pred_{label_yuji}'] * model_weights_map['seg019'] + class_pred_df[f'seg032_ian_pred_{label_yuji}'] * model_weights_map['seg032'] + class_pred_df[f'model0_pred_{label_yuji}'] * model_weights_map['model0'] + class_pred_df[f'model1_pred_{label_yuji}'] * model_weights_map['model1'] + class_pred_df[f'model2_pred_{label_yuji}'] * model_weights_map['model2']\n    class_pred_df[label] = class_pred_df[f'seg019_ian_pred_{label_yuji}'] * model_weights_map['seg019'] + class_pred_df[f'seg032_ian_pred_{label_yuji}'] * model_weights_map['seg032'] + class_pred_df[f'model0_pred_{label_yuji}'] * model_weights_map['model0'] + class_pred_df[f'model1_pred_{label_yuji}'] * model_weights_map['model1']\n    ","metadata":{"papermill":{"duration":0.09288,"end_time":"2021-08-08T14:53:20.138707","exception":false,"start_time":"2021-08-08T14:53:20.045827","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:22:47.506818Z","iopub.execute_input":"2021-08-09T11:22:47.507227Z","iopub.status.idle":"2021-08-09T11:22:47.527203Z","shell.execute_reply.started":"2021-08-09T11:22:47.507196Z","shell.execute_reply":"2021-08-09T11:22:47.525959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.076165,"end_time":"2021-08-08T14:53:20.291457","exception":false,"start_time":"2021-08-08T14:53:20.215292","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# For each image, multiply by (1-none) ** 0.4 from classification predictions\nclass_pred_df = class_pred_df.sort_values('image_id').reset_index(drop=True)\nbbox_per_img = dict(det_pred_df_wbf.image_id.value_counts())\nnone_predictions = np.asarray([])\nfor image_id, score in zip(class_pred_df.image_id, class_pred_df.none):\n    none_predictions = np.concatenate([none_predictions, np.asarray([score] * bbox_per_img[image_id])])","metadata":{"papermill":{"duration":0.094689,"end_time":"2021-08-08T14:53:20.462481","exception":false,"start_time":"2021-08-08T14:53:20.367792","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:22:47.528784Z","iopub.execute_input":"2021-08-09T11:22:47.529319Z","iopub.status.idle":"2021-08-09T11:22:47.544082Z","shell.execute_reply.started":"2021-08-09T11:22:47.52919Z","shell.execute_reply":"2021-08-09T11:22:47.543017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ids = []\nconfs = []\nfor i, id_det in det_pred_df_wbf.groupby('image_id'):\n    ids.append(i)\n    confs.append(id_det.conf.max())\nid_confmax_df=pd.DataFrame({'image_id': ids, 'conf_max': confs})    \nid_confmax_df","metadata":{"execution":{"iopub.status.busy":"2021-08-09T11:22:47.547036Z","iopub.execute_input":"2021-08-09T11:22:47.547495Z","iopub.status.idle":"2021-08-09T11:22:47.574576Z","shell.execute_reply.started":"2021-08-09T11:22:47.54746Z","shell.execute_reply":"2021-08-09T11:22:47.573435Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_pred_df = class_pred_df.merge(id_confmax_df, on='image_id')","metadata":{"execution":{"iopub.status.busy":"2021-08-09T11:23:35.888675Z","iopub.execute_input":"2021-08-09T11:23:35.889083Z","iopub.status.idle":"2021-08-09T11:23:35.90116Z","shell.execute_reply.started":"2021-08-09T11:23:35.889047Z","shell.execute_reply":"2021-08-09T11:23:35.900108Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"conf_max_ratio = 0.3\nclass_pred_df['none'] = class_pred_df['none']*(1-conf_max_ratio) + (1-class_pred_df['conf_max'])*conf_max_ratio\nclass_pred_df","metadata":{"execution":{"iopub.status.busy":"2021-08-09T11:25:10.523661Z","iopub.execute_input":"2021-08-09T11:25:10.524017Z","iopub.status.idle":"2021-08-09T11:25:10.556825Z","shell.execute_reply.started":"2021-08-09T11:25:10.523984Z","shell.execute_reply":"2021-08-09T11:25:10.555881Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"det_pred_df_wbf = det_pred_df_wbf.sort_values('image_id').reset_index(drop=True)\ndet_pred_df_wbf['conf'] = det_pred_df_wbf.conf * ((1.0 - none_predictions) ** 0.4)","metadata":{"execution":{"iopub.status.busy":"2021-08-09T11:25:20.165964Z","iopub.execute_input":"2021-08-09T11:25:20.16634Z","iopub.status.idle":"2021-08-09T11:25:20.177295Z","shell.execute_reply.started":"2021-08-09T11:25:20.16631Z","shell.execute_reply":"2021-08-09T11:25:20.176337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv('../input/siim-covid19-detection/sample_submission.csv')\ndet_pred_df_wbf.image_id.nunique(), len(sub[sub.id.str.endswith('image')])","metadata":{"papermill":{"duration":0.102411,"end_time":"2021-08-08T14:53:20.641316","exception":false,"start_time":"2021-08-08T14:53:20.538905","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:25:21.916939Z","iopub.execute_input":"2021-08-09T11:25:21.917292Z","iopub.status.idle":"2021-08-09T11:25:21.948982Z","shell.execute_reply.started":"2021-08-09T11:25:21.917261Z","shell.execute_reply":"2021-08-09T11:25:21.947951Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.076981,"end_time":"2021-08-08T14:53:20.79521","exception":false,"start_time":"2021-08-08T14:53:20.718229","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for id, df in det_pred_df_wbf.groupby('image_id'):\n    pred_str = ''\n    df = df.sort_values('conf', ascending=False).reset_index(drop=True)\n    for _, row in df.iterrows():\n        pred_str += f'opacity {row.conf} {row.x_min} {row.y_min} {row.x_max} {row.y_max} '\n    class_none = class_pred_df[class_pred_df.image_id == id].none.iloc[0]\n    pred_str += f'none {class_none} 0 0 1 1 '\n    \n    if study_only:\n        pred_str = ''\n    \n    sub.loc[sub['id'].str.startswith(id), 'PredictionString'] = pred_str","metadata":{"papermill":{"duration":0.439455,"end_time":"2021-08-08T14:53:21.31157","exception":false,"start_time":"2021-08-08T14:53:20.872115","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:25:31.600787Z","iopub.execute_input":"2021-08-09T11:25:31.601225Z","iopub.status.idle":"2021-08-09T11:25:32.03363Z","shell.execute_reply.started":"2021-08-09T11:25:31.601191Z","shell.execute_reply":"2021-08-09T11:25:32.032689Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_order = ['negative','atypical','indeterminate','typical']\nfor id, df in class_pred_df.groupby('study_id'):\n    preds = df[label_order].max(0).values\n    pred_str = ''\n    for ind, label in enumerate(label_order):\n        pred_str += f'{label} {preds[ind]} 0 0 1 1 '\n    if image_only:\n        sub.loc[sub['id'].str.startswith(id), 'PredictionString'] = ''\n    else:\n        sub.loc[sub['id'].str.startswith(id), 'PredictionString'] = pred_str","metadata":{"papermill":{"duration":0.121571,"end_time":"2021-08-08T14:53:21.526486","exception":false,"start_time":"2021-08-08T14:53:21.404915","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:25:32.951677Z","iopub.execute_input":"2021-08-09T11:25:32.952064Z","iopub.status.idle":"2021-08-09T11:25:32.998813Z","shell.execute_reply.started":"2021-08-09T11:25:32.952027Z","shell.execute_reply":"2021-08-09T11:25:32.997906Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -r /kaggle/working/*","metadata":{"papermill":{"duration":0.442511,"end_time":"2021-08-08T14:53:22.046188","exception":false,"start_time":"2021-08-08T14:53:21.603677","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:10:36.032476Z","iopub.status.idle":"2021-08-09T11:10:36.03319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub.to_csv('submission.csv', index=False)","metadata":{"papermill":{"duration":0.151187,"end_time":"2021-08-08T14:53:22.275658","exception":false,"start_time":"2021-08-08T14:53:22.124471","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:10:36.034418Z","iopub.status.idle":"2021-08-09T11:10:36.035267Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub[(sub.id.str.startswith('5a0de0207028'))]","metadata":{"papermill":{"duration":0.093961,"end_time":"2021-08-08T14:53:22.447208","exception":false,"start_time":"2021-08-08T14:53:22.353247","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:10:36.036529Z","iopub.status.idle":"2021-08-09T11:10:36.037243Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub[(sub.id.str.startswith('f85b5d51e41d'))]","metadata":{"papermill":{"duration":0.089871,"end_time":"2021-08-08T14:53:22.614695","exception":false,"start_time":"2021-08-08T14:53:22.524824","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:10:36.038492Z","iopub.status.idle":"2021-08-09T11:10:36.039181Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"det_pred_df_wbf.to_csv('kernel_detection.csv', index=False)\ndet_pred_df.to_csv('kernel_detection_before_wbf.csv', index=False)\nclass_pred_df.to_csv('kernel_classification.csv', index=False)","metadata":{"papermill":{"duration":0.311723,"end_time":"2021-08-08T14:53:23.004694","exception":false,"start_time":"2021-08-08T14:53:22.692971","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:10:36.040443Z","iopub.status.idle":"2021-08-09T11:10:36.041135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"det_pred_df_wbf","metadata":{"papermill":{"duration":0.100527,"end_time":"2021-08-08T14:53:23.184513","exception":false,"start_time":"2021-08-08T14:53:23.083986","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:10:36.042447Z","iopub.status.idle":"2021-08-09T11:10:36.043173Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"det_pred_df","metadata":{"papermill":{"duration":0.101238,"end_time":"2021-08-08T14:53:23.365409","exception":false,"start_time":"2021-08-08T14:53:23.264171","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:10:36.044522Z","iopub.status.idle":"2021-08-09T11:10:36.045239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_pred_df","metadata":{"papermill":{"duration":0.113392,"end_time":"2021-08-08T14:53:23.562955","exception":false,"start_time":"2021-08-08T14:53:23.449563","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-08-09T11:10:36.046439Z","iopub.status.idle":"2021-08-09T11:10:36.047149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.080786,"end_time":"2021-08-08T14:53:23.725928","exception":false,"start_time":"2021-08-08T14:53:23.645142","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]}]}