{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"},{"sourceId":184645698,"sourceType":"kernelVersion"},{"sourceId":185085577,"sourceType":"kernelVersion"}],"dockerImageVersionId":30732,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport sys\nimport os\nfrom matplotlib import pyplot as plt\nimport cv2 as cv\nfrom PIL import Image\n\n!pip install transformers==4.42.0","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-07-12T20:50:03.474448Z","iopub.execute_input":"2024-07-12T20:50:03.474825Z","iopub.status.idle":"2024-07-12T20:50:32.065141Z","shell.execute_reply.started":"2024-07-12T20:50:03.474795Z","shell.execute_reply":"2024-07-12T20:50:32.063498Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#two channels vs 3\n#coordinates vs boxes","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import transformers\ntransformers.__version__","metadata":{"execution":{"iopub.status.busy":"2024-07-12T20:56:50.299229Z","iopub.execute_input":"2024-07-12T20:56:50.300113Z","iopub.status.idle":"2024-07-12T20:56:54.212514Z","shell.execute_reply.started":"2024-07-12T20:56:50.300076Z","shell.execute_reply":"2024-07-12T20:56:54.211479Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\n\nfrom PIL import Image\nfrom transformers import RTDetrForObjectDetection, RTDetrImageProcessor\nfrom transformers.image_transforms import center_to_corners_format\n\nimage_processor = RTDetrImageProcessor.from_pretrained(\"PekingU/rtdetr_r50vd_coco_o365\")\nmodel = RTDetrForObjectDetection.from_pretrained(\"PekingU/rtdetr_r50vd_coco_o365\")\nsum(p.numel() for p in model.parameters() if p.requires_grad)","metadata":{"execution":{"iopub.status.busy":"2024-07-12T20:56:54.214544Z","iopub.execute_input":"2024-07-12T20:56:54.215143Z","iopub.status.idle":"2024-07-12T20:57:18.281933Z","shell.execute_reply.started":"2024-07-12T20:56:54.215110Z","shell.execute_reply":"2024-07-12T20:57:18.280767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save_pretrained(\"cv_model\")","metadata":{"execution":{"iopub.status.busy":"2024-07-11T04:21:38.165315Z","iopub.execute_input":"2024-07-11T04:21:38.165790Z","iopub.status.idle":"2024-07-11T04:21:38.486402Z","shell.execute_reply.started":"2024-07-11T04:21:38.165751Z","shell.execute_reply":"2024-07-11T04:21:38.485126Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta = pd.read_csv('/kaggle/input/rsna-dataset/detailed_label.csv')\nadd = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv')\nmeta = meta.merge(add, on = ['study_id', 'series_id'])\nmeta[meta.study_id == 4003253]","metadata":{"execution":{"iopub.status.busy":"2024-07-12T20:57:21.412974Z","iopub.execute_input":"2024-07-12T20:57:21.413680Z","iopub.status.idle":"2024-07-12T20:57:21.764110Z","shell.execute_reply.started":"2024-07-12T20:57:21.413636Z","shell.execute_reply":"2024-07-12T20:57:21.762818Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_to_id = {k:v for k,v in zip(['left_neural_foraminal_narrowing_l1_l2',\n       'left_neural_foraminal_narrowing_l2_l3',\n       'left_neural_foraminal_narrowing_l3_l4',\n       'left_neural_foraminal_narrowing_l4_l5',\n       'left_neural_foraminal_narrowing_l5_s1',\n       'left_subarticular_stenosis_l1_l2', 'left_subarticular_stenosis_l2_l3',\n       'left_subarticular_stenosis_l3_l4', 'left_subarticular_stenosis_l4_l5',\n       'left_subarticular_stenosis_l5_s1',\n       'right_neural_foraminal_narrowing_l1_l2',\n       'right_neural_foraminal_narrowing_l2_l3',\n       'right_neural_foraminal_narrowing_l3_l4',\n       'right_neural_foraminal_narrowing_l4_l5',\n       'right_neural_foraminal_narrowing_l5_s1',\n       'right_subarticular_stenosis_l1_l2',\n       'right_subarticular_stenosis_l2_l3',\n       'right_subarticular_stenosis_l3_l4',\n       'right_subarticular_stenosis_l4_l5',\n       'right_subarticular_stenosis_l5_s1', 'spinal_canal_stenosis_l1_l2',\n       'spinal_canal_stenosis_l2_l3', 'spinal_canal_stenosis_l3_l4',\n       'spinal_canal_stenosis_l4_l5', 'spinal_canal_stenosis_l5_s1'], range(25))}\nmeta['class'] = meta.detailed_diagnose.apply(lambda x: label_to_id[x])","metadata":{"execution":{"iopub.status.busy":"2024-07-11T19:50:03.759834Z","iopub.execute_input":"2024-07-11T19:50:03.760353Z","iopub.status.idle":"2024-07-11T19:50:03.788685Z","shell.execute_reply.started":"2024-07-11T19:50:03.760316Z","shell.execute_reply":"2024-07-11T19:50:03.787619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta = meta.dropna() #sever nans for severity level\nstudy_id = meta.study_id.unique()\ndata = []\nfor p in study_id:\n    study = meta[meta.study_id == p]\n    series = study.series_id.unique()\n    for s in series:\n        serie = study[study.series_id == s]\n        instances = serie.instance_number.unique()\n        for i in instances:\n            instance = serie[serie.instance_number == i]\n            if f'{p}_{int(s)}_{int(i)}.jpg' in os.listdir('/kaggle/input/yolo-dataset/dataset/images/train'):\n                path = f'/kaggle/input/yolo-dataset/dataset/images/train/{p}_{int(s)}_{int(i)}.jpg'\n            elif f'{p}_{int(s)}_{int(i)}.jpg' in os.listdir('/kaggle/input/yolo-dataset/dataset/images/val'):\n                path =f'/kaggle/input/yolo-dataset/dataset/images/val/{p}_{int(s)}_{int(i)}.jpg'\n            else:\n                assert False\n            data.append({\n                \"study_id\":p,\n                \"series_id\":int(s),\n                \"instance\":int(i),\n                'filename': path,\n                'labels':{\n                    'class_labels':instance['class'].values,\n                    'boxes': instance[['x','y']].values\n                },\n                'classification': instance['severe_level_int'].values.astype(int),\n                'view': instance['series_description'].iloc[0],\n                \n            })","metadata":{"execution":{"iopub.status.busy":"2024-07-11T20:32:37.758450Z","iopub.execute_input":"2024-07-11T20:32:37.758857Z","iopub.status.idle":"2024-07-11T20:35:58.287110Z","shell.execute_reply.started":"2024-07-11T20:32:37.758825Z","shell.execute_reply":"2024-07-11T20:35:58.285906Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data[0]","metadata":{"execution":{"iopub.status.busy":"2024-07-11T19:51:43.841852Z","iopub.execute_input":"2024-07-11T19:51:43.842197Z","iopub.status.idle":"2024-07-11T19:51:43.849682Z","shell.execute_reply.started":"2024-07-11T19:51:43.842168Z","shell.execute_reply":"2024-07-11T19:51:43.848573Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from typing import Optional, Union\nfrom torch.utils.data.distributed import DistributedSampler\nfrom dataclasses import dataclass\n\n@dataclass\nclass DataCollator:\n    #device: str\n    processor: None\n    \n    def __call__(self, features):\n        filename = [sample['filename'] for sample in features]\n        labels = [sample['labels'].copy() for sample in features]\n        batch_size = len(features)\n        images = [Image.open(f).convert(\"RGB\") for f in filename]\n        batch = self.processor(images=images, return_tensors=\"pt\")\n        #scale the x and y to normalized coco\n        for i in range(len(labels)):\n            size = images[i].size #width and height of original photo\n            xy = labels[i]['boxes']/size\n            formatted_box = np.concatenate([xy, np.repeat([[5/size[0],5/size[1]]],len(xy),0)], axis = 1)\n            labels[i]['boxes'] = torch.tensor(formatted_box, dtype = torch.float)\n            labels[i]['class_labels'] = torch.tensor(labels[i]['class_labels'], dtype = torch.long)\n        batch['labels'] = labels\n        return batch","metadata":{"execution":{"iopub.status.busy":"2024-07-11T04:51:56.510376Z","iopub.execute_input":"2024-07-11T04:51:56.510902Z","iopub.status.idle":"2024-07-11T04:51:56.521955Z","shell.execute_reply.started":"2024-07-11T04:51:56.510862Z","shell.execute_reply":"2024-07-11T04:51:56.520536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import DataLoader\n\nloader = DataLoader(data, collate_fn = DataCollator(image_processor), batch_size = 2,drop_last=True,shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2024-07-11T04:51:58.500042Z","iopub.execute_input":"2024-07-11T04:51:58.500537Z","iopub.status.idle":"2024-07-11T04:51:58.506273Z","shell.execute_reply.started":"2024-07-11T04:51:58.500501Z","shell.execute_reply":"2024-07-11T04:51:58.504969Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for batch in loader:\n    break","metadata":{"execution":{"iopub.status.busy":"2024-07-11T04:51:59.878136Z","iopub.execute_input":"2024-07-11T04:51:59.878563Z","iopub.status.idle":"2024-07-11T04:51:59.918581Z","shell.execute_reply.started":"2024-07-11T04:51:59.878523Z","shell.execute_reply":"2024-07-11T04:51:59.917325Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pickle\nwith open('data.pkl', 'wb') as f:\n    pickle.dump(data,f)","metadata":{"execution":{"iopub.status.busy":"2024-07-11T02:09:32.337232Z","iopub.execute_input":"2024-07-11T02:09:32.337643Z","iopub.status.idle":"2024-07-11T02:09:32.782999Z","shell.execute_reply.started":"2024-07-11T02:09:32.337609Z","shell.execute_reply":"2024-07-11T02:09:32.781781Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# with open('data.pkl', 'rb') as f:\n#     test = pickle.load(f)","metadata":{"execution":{"iopub.status.busy":"2024-07-11T02:09:58.797967Z","iopub.execute_input":"2024-07-11T02:09:58.798370Z","iopub.status.idle":"2024-07-11T02:09:58.977002Z","shell.execute_reply.started":"2024-07-11T02:09:58.798333Z","shell.execute_reply":"2024-07-11T02:09:58.975920Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta[meta.study_id == 4003253]","metadata":{"execution":{"iopub.status.busy":"2024-07-11T20:18:51.535163Z","iopub.execute_input":"2024-07-11T20:18:51.535611Z","iopub.status.idle":"2024-07-11T20:18:51.567370Z","shell.execute_reply.started":"2024-07-11T20:18:51.535577Z","shell.execute_reply":"2024-07-11T20:18:51.566046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta = pd.read_csv('/kaggle/input/rsna-dataset/detailed_label.csv')\nadd = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv')\nmeta = meta.merge(add, on = ['study_id', 'series_id'])\nlabel_to_id = {k:v for k,v in zip(['left_neural_foraminal_narrowing_l1_l2',\n       'left_neural_foraminal_narrowing_l2_l3',\n       'left_neural_foraminal_narrowing_l3_l4',\n       'left_neural_foraminal_narrowing_l4_l5',\n       'left_neural_foraminal_narrowing_l5_s1',\n       'right_neural_foraminal_narrowing_l1_l2',\n       'right_neural_foraminal_narrowing_l2_l3',\n       'right_neural_foraminal_narrowing_l3_l4',\n       'right_neural_foraminal_narrowing_l4_l5',\n       'right_neural_foraminal_narrowing_l5_s1',\n], range(10))}\n\nmeta['class'] = meta.detailed_diagnose.apply(lambda x: label_to_id.get(x, -1))\nmeta = meta[meta['class']!=-1]\n\nmeta = meta.dropna() #sever nans for severity level\nstudy_id = meta.study_id.unique()\ndata = []\nfor p in study_id:\n    study = meta[meta.study_id == p]\n    series = study.series_id.unique()\n    for s in series:\n        serie = study[study.series_id == s]\n        instances = serie.instance_number.unique()\n        for i in instances:\n            instance = serie[serie.instance_number == i]\n            if f'{p}_{int(s)}_{int(i)}.jpg' in os.listdir('/kaggle/input/yolo-dataset/dataset/images/train'):\n                path = f'/kaggle/input/yolo-dataset/dataset/images/train/{p}_{int(s)}_{int(i)}.jpg'\n            elif f'{p}_{int(s)}_{int(i)}.jpg' in os.listdir('/kaggle/input/yolo-dataset/dataset/images/val'):\n                path =f'/kaggle/input/yolo-dataset/dataset/images/val/{p}_{int(s)}_{int(i)}.jpg'\n            else:\n                assert False\n            data.append({\n                \"study_id\":p,\n                \"series_id\":int(s),\n                \"instance\":int(i),\n                'filename': path,\n                'labels':{\n                    'class_labels':instance['class'].values,\n                    'boxes': instance[['x','y']].values\n                },\n                'classification': instance['severe_level_int'].values.astype(int),\n                'view': instance['series_description'].iloc[0],\n                \n            })\n            \nimport pickle\nwith open('data_ST1.pkl', 'wb') as f:\n    pickle.dump(data,f)","metadata":{"execution":{"iopub.status.busy":"2024-07-12T21:06:46.790631Z","iopub.execute_input":"2024-07-12T21:06:46.791465Z","iopub.status.idle":"2024-07-12T21:07:56.860561Z","shell.execute_reply.started":"2024-07-12T21:06:46.791424Z","shell.execute_reply":"2024-07-12T21:07:56.859335Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta = pd.read_csv('/kaggle/input/rsna-dataset/detailed_label.csv')\nadd = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv')\nmeta = meta.merge(add, on = ['study_id', 'series_id'])\n\nlabel_to_id = {k:v for k,v in zip([\n       'left_subarticular_stenosis_l1_l2', 'left_subarticular_stenosis_l2_l3',\n       'left_subarticular_stenosis_l3_l4', 'left_subarticular_stenosis_l4_l5',\n       'left_subarticular_stenosis_l5_s1',\n       'right_subarticular_stenosis_l1_l2',\n       'right_subarticular_stenosis_l2_l3',\n       'right_subarticular_stenosis_l3_l4',\n       'right_subarticular_stenosis_l4_l5',\n       'right_subarticular_stenosis_l5_s1'], range(10))}\n\nmeta['class'] = meta.detailed_diagnose.apply(lambda x: label_to_id.get(x, -1))\nmeta = meta[meta['class']!=-1]\n\nmeta = meta.dropna() #sever nans for severity level\nstudy_id = meta.study_id.unique()\ndata = []\nfor p in study_id:\n    study = meta[meta.study_id == p]\n    series = study.series_id.unique()\n    for s in series:\n        serie = study[study.series_id == s]\n        instances = serie.instance_number.unique()\n        for i in instances:\n            instance = serie[serie.instance_number == i]\n            if f'{p}_{int(s)}_{int(i)}.jpg' in os.listdir('/kaggle/input/yolo-dataset/dataset/images/train'):\n                path = f'/kaggle/input/yolo-dataset/dataset/images/train/{p}_{int(s)}_{int(i)}.jpg'\n            elif f'{p}_{int(s)}_{int(i)}.jpg' in os.listdir('/kaggle/input/yolo-dataset/dataset/images/val'):\n                path =f'/kaggle/input/yolo-dataset/dataset/images/val/{p}_{int(s)}_{int(i)}.jpg'\n            else:\n                assert False\n            data.append({\n                \"study_id\":p,\n                \"series_id\":int(s),\n                \"instance\":int(i),\n                'filename': path,\n                'labels':{\n                    'class_labels':instance['class'].values,\n                    'boxes': instance[['x','y']].values\n                },\n                'classification': instance['severe_level_int'].values.astype(int),\n                'view': instance['series_description'].iloc[0],\n                \n            })\n            \nimport pickle\nwith open('data_AT2.pkl', 'wb') as f:\n    pickle.dump(data,f)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta = pd.read_csv('/kaggle/input/rsna-dataset/detailed_label.csv')\nadd = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv')\nmeta = meta.merge(add, on = ['study_id', 'series_id'])\n\nlabel_to_id = {k:v for k,v in zip(['spinal_canal_stenosis_l1_l2',\n       'spinal_canal_stenosis_l2_l3', 'spinal_canal_stenosis_l3_l4',\n       'spinal_canal_stenosis_l4_l5', 'spinal_canal_stenosis_l5_s1'], range(5))}\nmeta['class'] = meta.detailed_diagnose.apply(lambda x: label_to_id.get(x, -1))\nmeta = meta[meta['class']!=-1]\n\nmeta = meta.dropna() #sever nans for severity level\nstudy_id = meta.study_id.unique()\ndata = []\nfor p in study_id:\n    study = meta[meta.study_id == p]\n    series = study.series_id.unique()\n    for s in series:\n        serie = study[study.series_id == s]\n        instances = serie.instance_number.unique()\n        for i in instances:\n            instance = serie[serie.instance_number == i]\n            if f'{p}_{int(s)}_{int(i)}.jpg' in os.listdir('/kaggle/input/yolo-dataset/dataset/images/train'):\n                path = f'/kaggle/input/yolo-dataset/dataset/images/train/{p}_{int(s)}_{int(i)}.jpg'\n            elif f'{p}_{int(s)}_{int(i)}.jpg' in os.listdir('/kaggle/input/yolo-dataset/dataset/images/val'):\n                path =f'/kaggle/input/yolo-dataset/dataset/images/val/{p}_{int(s)}_{int(i)}.jpg'\n            else:\n                assert False\n            data.append({\n                \"study_id\":p,\n                \"series_id\":int(s),\n                \"instance\":int(i),\n                'filename': path,\n                'labels':{\n                    'class_labels':instance['class'].values,\n                    'boxes': instance[['x','y']].values\n                },\n                'classification': instance['severe_level_int'].values.astype(int),\n                'view': instance['series_description'].iloc[0],\n                \n            })\n            \nimport pickle\nwith open('data_ST2.pkl', 'wb') as f:\n    pickle.dump(data,f)","metadata":{},"execution_count":null,"outputs":[]}]}