{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"vscode":{"interpreter":{"hash":"f7241b2af102f7e024509099765066b36197b195077f7bfac6e5bc041ba17c8c"}},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"},{"sourceId":6089786,"sourceType":"datasetVersion","datasetId":3487378},{"sourceId":6267500,"sourceType":"datasetVersion","datasetId":3581068},{"sourceId":9324078,"sourceType":"datasetVersion","datasetId":5521028},{"sourceId":9352418,"sourceType":"datasetVersion","datasetId":5520878},{"sourceId":9549601,"sourceType":"datasetVersion","datasetId":5520938},{"sourceId":9549604,"sourceType":"datasetVersion","datasetId":5698705},{"sourceId":135925962,"sourceType":"kernelVersion"},{"sourceId":143511308,"sourceType":"kernelVersion"}],"dockerImageVersionId":30747,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### Imports","metadata":{}},{"cell_type":"code","source":"import os\nimport gc\nimport re\nimport sys\nimport cv2\nimport glob\nimport json\nimport torch\nimport shutil\nimport warnings\nimport numpy as np\nimport pandas as pd\nimport torch.nn.functional as F\nimport matplotlib.pyplot as plt\n\nfrom tqdm.notebook import tqdm\nfrom scipy.special import softmax\nfrom collections import Counter\nfrom joblib import Parallel, delayed\n\nwarnings.simplefilter(\"ignore\", FutureWarning)","metadata":{"execution":{"iopub.status.busy":"2024-10-04T23:03:10.416568Z","iopub.execute_input":"2024-10-04T23:03:10.416854Z","iopub.status.idle":"2024-10-04T23:03:15.269802Z","shell.execute_reply.started":"2024-10-04T23:03:10.416828Z","shell.execute_reply":"2024-10-04T23:03:15.268861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if os.path.exists(\"/kaggle/input/rsna-lumbar-spine-code/src\"):\n    !cp -r /kaggle/input/rsna-lumbar-spine-code/src ./\n    sys.path.append(\"src\")\n\nfrom util.torch import load_model_weights\nfrom util.plots import plot_mask, add_rect\nfrom util.metrics import rsna_loss\n\nfrom data.processing import process_and_save\nfrom data.transforms import get_transfos\nfrom data.dataset import CropDataset, CoordsDataset\nfrom data.preparation import prepare_data_crop\n\nfrom inference.seg import get_crops\nfrom inference.dataset import ImageInfDataset, FeatureInfDataset, SafeDataset\nfrom inference.lvl1 import predict, Config\nfrom inference.utils import sub_to_dict\n\nif os.path.exists(\"/kaggle/input/timm-smp\"):\n    sys.path.append(\n        \"/kaggle/input/timm-smp/pytorch-image-models-main/pytorch-image-models-main\"\n    )\n    sys.path.append(\n        \"/kaggle/input/timm-smp/segmentation_models.pytorch-master/segmentation_models.pytorch-master\"\n    )\nfrom model_zoo.models import define_model\nfrom model_zoo.models_lvl2 import define_model as define_model_2\n# from model_zoo.models_seg import define_model as define_model_seg\n# from model_zoo.models_seg import convert_3\n\nfrom params import CLASSES_SEG, MODES, LEVELS_, SEVERITIES, LEVELS","metadata":{"execution":{"iopub.status.busy":"2024-10-04T23:03:15.271598Z","iopub.execute_input":"2024-10-04T23:03:15.272049Z","iopub.status.idle":"2024-10-04T23:03:19.883971Z","shell.execute_reply.started":"2024-10-04T23:03:15.272004Z","shell.execute_reply":"2024-10-04T23:03:19.882964Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Params","metadata":{}},{"cell_type":"code","source":"EVAL = False\nDEBUG = False\n\n# ROOT_DATA_DIR = \"../input/\"\n# DEBUG_DATA_DIR = \"../output/dataset_debug/\"  # Todo\n# SAVE_FOLDER = \"../output/tmp/\"\n# shutil.rmtree(SAVE_FOLDER)\n\nROOT_DATA_DIR = \"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/\"\nDEBUG_DATA_DIR = \"/kaggle/input/rsna-2024-debug/\"\nSAVE_FOLDER = \"/tmp/\"\n\nos.makedirs(SAVE_FOLDER, exist_ok=True)\nos.makedirs(SAVE_FOLDER + \"npy/\", exist_ok=True)\nos.makedirs(SAVE_FOLDER + \"mid/\", exist_ok=True)\nos.makedirs(SAVE_FOLDER + \"csv/\", exist_ok=True)","metadata":{"execution":{"iopub.status.busy":"2024-10-04T23:03:19.885238Z","iopub.execute_input":"2024-10-04T23:03:19.885554Z","iopub.status.idle":"2024-10-04T23:03:19.895765Z","shell.execute_reply.started":"2024-10-04T23:03:19.885526Z","shell.execute_reply":"2024-10-04T23:03:19.894870Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DATA_PATH = ROOT_DATA_DIR + \"test_images/\"\nfolds_dict = {}\n\nif DEBUG:\n    df_meta = pd.read_csv(ROOT_DATA_DIR + \"train_series_descriptions.csv\")\nelse:\n    df_meta = pd.read_csv(ROOT_DATA_DIR + \"test_series_descriptions.csv\")\n\ndf_meta[\"weighting\"] = df_meta[\"series_description\"].apply(lambda x: x.split()[1][:2])\ndf_meta[\"orient\"] = df_meta[\"series_description\"].apply(lambda x: x.split()[0])\ndf_meta[\"study_series\"] = df_meta[\"study_id\"].astype(str) + \"_\" + df_meta[\"series_id\"].astype(str)\n\nif DEBUG:\n    if EVAL:\n        DATA_PATH = ROOT_DATA_DIR + \"train_images/\"\n        FOLDS_FILE = DEBUG_DATA_DIR + \"train_folded_v1.csv\"\n        folds = pd.read_csv(FOLDS_FILE)\n        df_meta = df_meta.merge(folds, how=\"left\")\n        df_meta = df_meta[df_meta['fold'] == 1].reset_index(drop=True)\n    else:\n        DATA_PATH = DEBUG_DATA_DIR + \"debug_images/\"\n        df_meta = df_meta.head(3)\n\n        # df_meta_ = df_meta.copy()\n        # df_meta_['study_id'] += 1\n        # df_meta_ = df_meta_[df_meta_['orient'] == \"Axial\"]\n        # df_meta = pd.concat([df_meta, df_meta_], ignore_index=True)\n        # df_meta[\"study_series\"] = df_meta[\"study_id\"].astype(str) + \"_\" + df_meta[\"series_id\"].astype(str)","metadata":{"execution":{"iopub.status.busy":"2024-10-04T23:03:19.897752Z","iopub.execute_input":"2024-10-04T23:03:19.898015Z","iopub.status.idle":"2024-10-04T23:03:20.064480Z","shell.execute_reply.started":"2024-10-04T23:03:19.897993Z","shell.execute_reply":"2024-10-04T23:03:20.063686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BATCH_SIZE = 32\nBATCH_SIZE_2 = 512\nUSE_FP16 = True\n\nNUM_WORKERS = os.cpu_count()\n\nFOLD = 1 if DEBUG else \"fullfit_0\"\nPLOT = DEBUG and not EVAL","metadata":{"execution":{"iopub.status.busy":"2024-10-04T23:03:20.065637Z","iopub.execute_input":"2024-10-04T23:03:20.065967Z","iopub.status.idle":"2024-10-04T23:03:20.070867Z","shell.execute_reply.started":"2024-10-04T23:03:20.065939Z","shell.execute_reply":"2024-10-04T23:03:20.069850Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EXP_FOLDERS = {}\n\nCOORDS_FOLDERS = {\n    \"sag\": (\"/kaggle/input/rsna-2024-weights-1/2024-08-29_0/\", FOLD),\n}\n\nCROP_EXP_FOLDERS = {\n    \"crop\": (\"/kaggle/input/rsna-2024-weights-2/2024-10-04_1/\", [FOLD], \"crops_0.1\"),\n    \"crop_2\": (\"/kaggle/input/rsna-2024-weights-2/2024-10-04_9/\", [FOLD], \"crops_0.1\"),\n    \"scs_crop_coords\": (\"/kaggle/input/rsna-2024-weights-2/2024-10-04_34/\", [FOLD], \"crops_0.1\"),  # 5f -0.005 scs\n    \"scs_crop_coords_2\": (\"/kaggle/input/rsna-2024-weights-2/2024-10-04_37/\", [FOLD], \"crops_0.1\"),  # 3f -0.005 scs\n}\n\nEXP_FOLDERS_2 = [\n    \"/kaggle/input/rsna-2024-weights-2/2024-10-04_42/\",  # 0.3861\n]\n\nFOLDS_2 = [FOLD] # if DEBUG else [0, 1, 2, 3]\n\n# EXP_FOLDER_3D = \"../logs/2024-07-31/25/\"\n\nfor f in EXP_FOLDERS_2:\n    folders = Config(json.load(open(f + \"config.json\", \"r\"))).exp_folders\n    print(\"-> Level 2 model:\", f)\n    for k in folders:\n        print(k, folders[k], EXP_FOLDERS.get(k, CROP_EXP_FOLDERS.get(k, [\"?\"]))[0])\n    print()\n\n    \nfor k in EXP_FOLDERS:\n    assert os.path.exists(EXP_FOLDERS[k][0]), f\"Model not found: {k}\"\nfor k in CROP_EXP_FOLDERS:\n    assert os.path.exists(CROP_EXP_FOLDERS[k][0]), f\"Crop model not found: {k}\"\nfor k in COORDS_FOLDERS:\n    assert os.path.exists(COORDS_FOLDERS[k][0]), f\"Coords model not found: {k}\"","metadata":{"execution":{"iopub.status.busy":"2024-10-04T23:03:20.072183Z","iopub.execute_input":"2024-10-04T23:03:20.073105Z","iopub.status.idle":"2024-10-04T23:03:20.098174Z","shell.execute_reply.started":"2024-10-04T23:03:20.073070Z","shell.execute_reply":"2024-10-04T23:03:20.097348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_meta.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-10-04T23:03:20.099158Z","iopub.execute_input":"2024-10-04T23:03:20.099573Z","iopub.status.idle":"2024-10-04T23:03:20.124132Z","shell.execute_reply.started":"2024-10-04T23:03:20.099541Z","shell.execute_reply":"2024-10-04T23:03:20.123304Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Preparation","metadata":{}},{"cell_type":"code","source":"_ = Parallel(n_jobs=NUM_WORKERS)(\n    delayed(process_and_save)(\n        df_meta['study_id'][i],\n        df_meta['series_id'][i],\n        df_meta['orient'][i],\n        DATA_PATH,\n        save_folder=SAVE_FOLDER,\n        save_meta=False,\n        save_middle_frame=True,\n    ) for i in tqdm(range(len(df_meta)))\n)","metadata":{"execution":{"iopub.status.busy":"2024-10-04T23:03:20.125222Z","iopub.execute_input":"2024-10-04T23:03:20.125543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Sagittal Coords","metadata":{}},{"cell_type":"code","source":"df_sag = df_meta[df_meta[\"orient\"] == \"Sagittal\"].reset_index(drop=True)\ndf_sag = df_sag[df_sag.columns[:6]]\n\ndf_sag['img_path'] = SAVE_FOLDER + \"mid/\" + df_sag[\"study_series\"] + \".png\"\ndf_sag['target'] = [np.ones((5, 2)) for _ in range(len(df_sag))]\n\ndf_sag.head(3)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"config_sag = Config(json.load(open(COORDS_FOLDERS['sag'][0] + \"config.json\", \"r\")))\n\nmodel_sag = define_model(\n    config_sag.name,\n    drop_rate=config_sag.drop_rate,\n    drop_path_rate=config_sag.drop_path_rate,\n    pooling=config_sag.pooling,\n    num_classes=config_sag.num_classes,\n    num_classes_aux=config_sag.num_classes_aux,\n    n_channels=config_sag.n_channels,\n    reduce_stride=config_sag.reduce_stride,\n    pretrained=False,\n)\nmodel_sag = model_sag.cuda().eval()\n\nweights = COORDS_FOLDERS['sag'][0] + f\"{config_sag.name}_{COORDS_FOLDERS['sag'][1]}.pt\"\nmodel_sag = load_model_weights(model_sag, weights, verbose=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ntransfos = get_transfos(augment=False, resize=config_sag.resize, use_keypoints=True)\ndataset = CoordsDataset(df_sag, transforms=transfos)\ndataset = SafeDataset(dataset)\n\npreds_sag, _ = predict(model_sag, dataset, config_sag.loss_config, batch_size=32, use_fp16=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DELTAS = [0.1]  #, 0.15]\n\nfor delta in DELTAS:\n    os.makedirs(SAVE_FOLDER + f\"crops_{delta}\", exist_ok=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for idx in tqdm(range(len(df_sag))):\n    study_series = df_sag[\"study_series\"][idx]\n    imgs_path = SAVE_FOLDER + \"npy/\" + study_series + \".npy\"\n\n    imgs = np.load(imgs_path)\n\n    preds = preds_sag[idx].reshape(-1, 2).copy()\n\n    for delta in DELTAS:  # , 0.15\n        crops = np.concatenate([preds, preds], -1)\n        crops[:, [0, 1]] -= delta\n        crops[:, [2, 3]] += delta\n        crops = crops.clip(0, 1)\n\n        crops[:, [0, 2]] *= imgs.shape[2]\n        crops[:, [1, 3]] *= imgs.shape[1]\n        crops = crops.astype(int)\n\n        img_crops = []\n        for i, (x0, y0, x1, y1) in enumerate(crops):\n\n            crop = imgs[:, y0: y1, x0: x1].copy()\n            # crop = np.zeros((3, 1, 1))\n            try:\n                assert crop.shape[2] >= 1 and crop.shape[1] >= 1\n            except AssertionError:\n                # print('!!')\n                # pass\n                crop = imgs.copy()\n\n            np.save(SAVE_FOLDER + f\"crops_{delta}/{study_series}_{LEVELS_[i]}.npy\", crop)\n            img_crops.append(crop[len(crop) // 2])\n\n        if PLOT:\n            preds[:, 0] *= imgs.shape[2]\n            preds[:, 1] *= imgs.shape[1]\n\n            plt.figure(figsize=(8, 8))\n            plt.imshow(imgs[len(imgs) // 2], cmap=\"gray\")\n            plt.scatter(preds[:, 0], preds[:, 1], marker=\"x\", label=\"center\")\n            plt.title(study_series)\n            plt.axis(False)\n            plt.legend()\n            plt.show()\n\n            plt.figure(figsize=(20, 4))\n            for i in range(5):\n                plt.subplot(1, 5, i + 1)\n                plt.imshow(img_crops[i], cmap=\"gray\")\n                plt.axis(False)\n                plt.title(LEVELS[i])\n            plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if DEBUG and not EVAL:\n    ref_folder = DEBUG_DATA_DIR + \"coords_crops_0.1_2/\"\n    df_ref = prepare_data_crop(ROOT_DATA_DIR, ref_folder).head(10)\n\n    df_ref['img_path_2'] = df_ref['img_path'].apply(\n        lambda x: re.sub(ref_folder, SAVE_FOLDER + f\"crops_0.1/\", x)\n    )\n\n    for i in range(len(df_ref)):\n        cref = np.load(df_ref['img_path'][i])\n        c = np.load(df_ref['img_path_2'][i])\n        assert (cref == c).all()\n        # plt.subplot(1, 2, 1)\n        # plt.imshow(c[len(c) // 2], cmap=\"gray\")\n        # plt.subplot(1, 2, 2)\n        # plt.imshow(cref[len(cref) // 2], cmap=\"gray\")\n        # plt.show()\n        # break","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Crop models","metadata":{}},{"cell_type":"code","source":"df = df_meta.copy()\n\ndf[\"target\"] = 0\ndf[\"coords\"] = 0\n\ndf[\"level\"] = [LEVELS for _ in range(len(df))]\ndf[\"level_\"] = [LEVELS_ for _ in range(len(df))]\ndf = df.explode([\"level\", \"level_\"]).reset_index(drop=True)\ndf[\"img_path_\"] = df[\"study_series\"] + \"_\" + df[\"level_\"] + \".npy\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"crop_fts = {}\nfor mode in tqdm(CROP_EXP_FOLDERS, total=len(CROP_EXP_FOLDERS)):\n    exp_folder, folds, crop_folder = CROP_EXP_FOLDERS[mode]\n    print(f\"- Model {mode} - {exp_folder}\")\n\n    config = Config(json.load(open(exp_folder + \"config.json\", \"r\")))\n\n    if mode in [\"crop\", \"crop_2\"]:\n        df_mode = df[df['orient'] == \"Sagittal\"].reset_index(drop=True)\n        df_mode[\"side\"] = \"Center\"\n    elif \"scs\" in mode:\n        df_mode = df[df['orient'] == \"Sagittal\"]\n        df_mode = df_mode[df_mode[\"weighting\"] == \"T2\"].reset_index(drop=True)\n        df_mode[\"side\"] = \"Center\"\n    elif \"nfn\" in mode:\n        df_mode = df[df['orient'] == \"Sagittal\"]\n        df_mode[\"side\"] = [\"Right\", \"Left\"]\n        df_mode = df_mode.explode(\"side\").reset_index(drop=True)\n        df_mode = df_mode.sort_values(\n            [\"study_id\", \"series_id\", \"side\", \"level\"],\n            ascending=[True, True, False, True],\n            ignore_index=True\n        )\n    elif \"ss\" in mode:\n        df_mode = df[df['orient'] == \"Axial\"]\n        df_mode[\"side\"] = [\"Right\", \"Left\"]\n        df_mode = df_mode.explode(\"side\").reset_index(drop=True)\n        df_mode = df_mode.sort_values(\n            [\"study_id\", \"series_id\", \"side\", \"level\"],\n            ascending=[True, True, False, True],\n            ignore_index=True\n        )\n\n    df_mode['img_path'] = SAVE_FOLDER + crop_folder + \"/\" + df_mode[\"img_path_\"]\n\n    transfos = get_transfos(augment=False, resize=config.resize, crop=config.crop)\n    dataset = CropDataset(\n        df_mode,\n        targets=\"target\",\n        transforms=transfos,\n        frames_chanel=config.frames_chanel,\n        n_frames=config.n_frames,\n        stride=config.stride,\n        train=False,\n        load_in_ram=False,\n    )\n    dataset = SafeDataset(dataset)\n\n    model = define_model(\n        config.name,\n        drop_rate=config.drop_rate,\n        drop_path_rate=config.drop_path_rate,\n        pooling=config.pooling,\n        head_3d=config.head_3d,\n        n_frames=config.n_frames,\n        num_classes=config.num_classes,\n        num_classes_aux=config.num_classes_aux,\n        n_channels=config.n_channels,\n        reduce_stride=config.reduce_stride,\n        pretrained=False,\n    )\n    model = model.cuda().eval()\n\n    if mode == \"crop_2\":\n        model.delta = 1\n\n    preds = []\n    for fold in folds:\n        weights = exp_folder + f\"{config.name}_{fold}.pt\"\n        model = load_model_weights(model, weights, verbose=1)\n\n        pred, _ = predict(\n            model,\n            dataset,\n            config.loss_config,\n            batch_size=BATCH_SIZE,\n            use_fp16=USE_FP16,\n            num_workers=NUM_WORKERS,\n        )\n        preds.append(pred)\n\n    preds = np.mean(preds, 0)\n\n    if PLOT:\n        df_ref = pd.read_csv(exp_folder + f\"df_val_{FOLD}.csv\").head(len(preds))\n        # order_ref = df_ref.sort_values([\"side\", \"level\"]).index.values\n        preds_ref = np.load(exp_folder + f\"pred_inf_{FOLD}.npy\")[: len(preds)]  # [order_ref]\n\n        # plt.figure(figsize=(8, 4))\n        # plt.subplot(1, 2, 1)\n        # plt.plot(preds)\n        # plt.subplot(1, 2, 2)\n        # plt.plot(preds_ref)\n        # plt.show()\n\n        delta = (np.abs(preds - preds_ref)).max()\n        print(preds.shape, preds_ref.shape)\n        print(f\"{mode} delta:\", delta)\n\n    idx = df_mode[[\"study_id\", \"series_id\", \"level\", \"side\"]].values.astype(str).tolist()\n    idx = [\"_\".join(i) for i in idx]\n    crop_fts[mode] = dict(zip(idx, preds))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Level 2","metadata":{}},{"cell_type":"code","source":"# csv_fts = {\n#     \"ch\": sub_to_dict(\"submission.csv\"),\n#     \"dh\": sub_to_dict(\"submission.csv\"),\n# }","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# csv_fts = {}\n# for k in ['ch', 'dh']:\n#     # config_2.exp_folders['dh'], config_2.exp_folders['ch']\n#     file = torch.load(config_2.exp_folders[k])\n#     csv_fts[k] = dict(zip(\n#         file[\"study_id\"].tolist(),\n#         file['logits'].float().cpu().numpy(),\n#     ))\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DELTA_SCS = [0, 0, 0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_2 = df_meta[\n    [\"study_id\", \"series_id\", \"series_description\"]\n].groupby('study_id').agg(list).reset_index()\n\nall_preds = []\nfor exp_folder in EXP_FOLDERS_2:\n    config_2 = Config(json.load(open(exp_folder + \"config.json\", \"r\")))\n\n    # LOCAL\n    csv_fts = {}\n    # for k in config_2.exp_folders:\n    #     if \"ch\" in k or \"dh\" in k:\n    #         file = torch.load(config_2.exp_folders[k])\n    #         csv_fts[k] = dict(zip(\n    #             file[\"study_id\"].tolist(),\n    #             file['logits'].float().cpu().numpy(),\n    #         ))\n\n    dataset = FeatureInfDataset(\n        df_2,\n        config_2.exp_folders,\n        crop_fts,\n        csv_fts,\n        save_folder=SAVE_FOLDER,\n    )\n    dataset = SafeDataset(dataset)\n\n    model = define_model_2(\n        config_2.name,\n        ft_dim=config_2.ft_dim,\n        layer_dim=config_2.layer_dim,\n        dense_dim=config_2.dense_dim,\n        p=config_2.p,\n        n_fts=config_2.n_fts,\n        resize=config_2.resize,\n        num_classes=config_2.num_classes,\n        num_classes_aux=config_2.num_classes_aux,\n    )\n    model = model.eval().cuda()\n\n    for fold in FOLDS_2:\n        weights = exp_folder + f\"{config_2.name}_{fold}.pt\"\n        model = load_model_weights(model, weights, verbose=config_2.local_rank == 0)\n\n        preds, _ = predict(\n            model,\n            dataset,\n            {\"activation\": \"\"},\n            batch_size=BATCH_SIZE_2,\n            use_fp16=USE_FP16,\n            num_workers=NUM_WORKERS,\n        )\n\n#         preds[:, :5, 0] += DELTA_SCS[0]\n#         preds[:, :5, 1] += DELTA_SCS[1]\n#         preds[:, :5, 2] += DELTA_SCS[2]\n\n        preds = softmax(preds, axis=-1)\n\n#         print(preds[:, :5, 2].mean())\n#         print(preds[:, :5, 1].mean())\n\n        if DEBUG and not EVAL:\n            preds_ref = np.load(EXP_FOLDERS_2[0] + f\"pred_val_{fold}.npy\")[:1]\n            delta = np.abs(preds - preds_ref).max()\n            print(f\"Model {exp_folder} delta:\", delta)\n\n        all_preds.append(preds)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = np.mean(all_preds, 0).astype(np.float64)\nstudies = df_2[[\"study_id\"]].copy().astype(int)\n\nrows = []\nfor i in range(len(studies)):\n    for c, injury in enumerate(config_2.targets):\n        rows.append(\n            {\n                \"row_id\": f'{studies[\"study_id\"].values[i]}_{injury}',\n                \"normal_mild\": preds[i, c, 0],\n                \"moderate\": preds[i, c, 1],\n                \"severe\": preds[i, c, 2],\n            }\n        )\n\nsub = pd.DataFrame(rows)\nsub.to_csv(\"submission.csv\", index=False)\nsub.tail(25)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if EVAL:\n    y = pd.read_csv(ROOT_DATA_DIR + \"train.csv\")\n\n    for c in y.columns[1:]:\n        y[c] = y[c].map(dict(zip(SEVERITIES, [0, 1, 2]))).fillna(-1)\n    y = y.astype(int)\n\n    df_val = studies.copy().merge(y, how=\"left\")\n\n    avg_loss, losses = rsna_loss(df_val[config_2.targets].values, preds, verbose=1)\n\n    for k, v in losses.items():\n        print(f\"- {k}_loss\\t: {v:.3f}\")\n\n    print(f\"\\n -> CV Score : {avg_loss :.3f}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Done ! ","metadata":{}}]}