{"cells":[{"metadata":{},"cell_type":"markdown","source":"# DICOM Image Data Generator\nI made it for Keras/Tensorflow, probably can be used with other things too.\n- Channels-last format\n- Binary outputs (includes `any` category)\n- Add your own image augmentation"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport pydicom\nimport cv2","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"train_panda = pd.read_csv(os.path.join('/kaggle/input/rsna-intracranial-hemorrhage-detection/','stage_1_train.csv'))\ntrain_panda.iloc[:6]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class dicom_generator:\n    def __init__(self,panda,subset='train',batch_size=12):\n        self.panda = panda\n        self.length = len(panda)\n        self.subset = subset\n        self.batch_size = batch_size\n        self.position = 0\n        if (self.subset == 'test'):\n            self.subpath = 'stage_1_test_images'\n        else:\n            self.subpath = 'stage_1_train_images'\n            \n    def __iter__(self):\n        return self\n        \n    def __next__(self):\n        X,y = np.empty((self.batch_size,512,512,1)),[]\n        for i in range(self.batch_size):\n            filepath = os.path.join('/kaggle/input/rsna-intracranial-hemorrhage-detection/',\n                                    self.subpath,\"_\".join((self.panda['ID'].iloc[self.position]).split(\"_\", 2)[:2])+'.dcm')\n            dicom = pydicom.dcmread(filepath).pixel_array\n            # here's good place to do your own image augmentation\n            if (dicom.shape[0] != 512): # occasionally image sizes in this dataset vary\n                dicom = cv2.resize(dicom,dsize=(512,512),interpolation=cv2.INTER_CUBIC)\n            X[i] = np.expand_dims(np.expand_dims(dicom,axis=0),axis=3).astype(float)/10\n            y.append(self.panda['Label'].iloc[self.position:self.position+6].transpose().to_numpy())\n            self.position += 6\n            if (self.position >= self.length):\n                self.position = 0\n        if (self.subset == 'test'):\n            return X\n        else:\n            return (X,np.asarray(y))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"my_generator = dicom_generator(train_panda)\n\nexample_X, example_y = next(my_generator)\nprint(example_X.shape)\nprint(np.asarray(example_y).shape)\n\nfrom matplotlib import pyplot as plt\n%matplotlib inline\n\nplt.imshow(np.squeeze(example_X[0]))","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":1}