{"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":"code","source":"#%matplotlib inline\n#這是juoyter notebook的magic word˙\n\nimport matplotlib\nimport matplotlib.pyplot as plt\nfrom IPython import display","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-12-02T13:29:21.312892Z","iopub.execute_input":"2021-12-02T13:29:21.313434Z","iopub.status.idle":"2021-12-02T13:29:21.319369Z","shell.execute_reply.started":"2021-12-02T13:29:21.313391Z","shell.execute_reply":"2021-12-02T13:29:21.317918Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n#判斷是否在jupyter notebook上\ndef is_in_ipython():\n    \"Is the code running in the ipython environment (jupyter including)\"\n    program_name = os.path.basename(os.getenv('_', ''))\n\n    if ('jupyter-notebook' in program_name or # jupyter-notebook\n        'ipython'          in program_name or # ipython\n        'jupyter' in program_name or  # jupyter\n        'JPY_PARENT_PID'   in os.environ):    # ipython-notebook\n        return True\n    else:\n        return False\n\n\n#判斷是否在colab上\ndef is_in_colab():\n    if not is_in_ipython(): return False\n    try:\n        from google import colab\n        return True\n    except: return False\n\n#判斷是否在kaggke_kernal上\ndef is_in_kaggle_kernal():\n    if 'kaggle' in os.environ['PYTHONPATH']:\n        return True\n    else:\n        return False\n\nif is_in_colab():\n    from google.colab import drive\n    drive.mount('/content/gdrive')","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:29:21.321536Z","iopub.execute_input":"2021-12-02T13:29:21.323162Z","iopub.status.idle":"2021-12-02T13:29:21.344652Z","shell.execute_reply.started":"2021-12-02T13:29:21.323123Z","shell.execute_reply":"2021-12-02T13:29:21.343419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.environ['TRIDENT_BACKEND'] = 'pytorch'\n\nif is_in_kaggle_kernal():\n    os.environ['TRIDENT_HOME'] = './trident'\n    \nelif is_in_colab():\n    os.environ['TRIDENT_HOME'] = '/content/gdrive/My Drive/trident'\n\n#為確保安裝最新版 \n!pip uninstall tridentx -y\n!pip install ../input/trident/tridentx-0.7.4-py3-none-any.whl --upgrade\n!pip install pydicom --upgrade\n!pip install python-gdcm  --upgrade\n!pip install imutils\nimport imutils\nimport json\nimport copy\nimport numpy as np\n#調用trident api\nimport trident as T\nfrom trident import *\nfrom trident.models import resnet,efficientnet\nimport random\nfrom tqdm import tqdm\nimport pydicom\nimport gdcm\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nimport scipy","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:29:21.350103Z","iopub.execute_input":"2021-12-02T13:29:21.351531Z","iopub.status.idle":"2021-12-02T13:30:14.828125Z","shell.execute_reply.started":"2021-12-02T13:29:21.351493Z","shell.execute_reply":"2021-12-02T13:30:14.827223Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import shutil\nmake_dir_if_need('./Models/')\nshutil.copy('../input/rsna-miccai-brain-tumor-3dmodel/Models/densenet121_all.pth','./Models/densenet121_all.pth')","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:14.829918Z","iopub.execute_input":"2021-12-02T13:30:14.830286Z","iopub.status.idle":"2021-12-02T13:30:15.714418Z","shell.execute_reply.started":"2021-12-02T13:30:14.830246Z","shell.execute_reply":"2021-12-02T13:30:15.713506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if is_gpu_available():\n    torch.cuda.synchronize()\n    torch.cuda.empty_cache()\n    gc.collect()","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:15.715707Z","iopub.execute_input":"2021-12-02T13:30:15.716268Z","iopub.status.idle":"2021-12-02T13:30:15.841451Z","shell.execute_reply.started":"2021-12-02T13:30:15.71623Z","shell.execute_reply":"2021-12-02T13:30:15.840505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from mpl_toolkits.mplot3d.art3d import Poly3DCollection\n# from skimage import measure\n\n# def plot_3d(image, threshold=400): \n#     p = image.transpose(2,1,0)\n#     verts, faces, normals, values = measure.marching_cubes_lewiner(p, threshold)\n#     fig = plt.figure(figsize=(10, 10))\n#     ax = fig.add_subplot(111, projection='3d')\n#     mesh = Poly3DCollection(verts[faces], alpha=0.1)\n#     face_color = [0.5, 0.5, 1]\n#     mesh.set_facecolor(face_color)\n#     ax.add_collection3d(mesh)\n#     ax.set_xlim(0, p.shape[0])\n#     ax.set_ylim(0, p.shape[1])\n#     ax.set_zlim(0, p.shape[2])\n\n#     plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:15.842812Z","iopub.execute_input":"2021-12-02T13:30:15.843213Z","iopub.status.idle":"2021-12-02T13:30:15.856449Z","shell.execute_reply.started":"2021-12-02T13:30:15.843167Z","shell.execute_reply":"2021-12-02T13:30:15.855291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from matplotlib import animation, rc\n# rc('animation', html='jshtml')\n\n\n# def create_animation(ims):\n#     fig = plt.figure(figsize=(6, 6))\n#     plt.axis('off')\n#     im = plt.imshow(ims[0], cmap=\"gray\")\n\n#     def animate_func(i):\n#         im.set_array(ims[i])\n#         return [im]\n\n#     return animation.FuncAnimation(fig, animate_func, frames = len(ims), interval = 1000//24)","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:15.859636Z","iopub.execute_input":"2021-12-02T13:30:15.859935Z","iopub.status.idle":"2021-12-02T13:30:15.868884Z","shell.execute_reply.started":"2021-12-02T13:30:15.859908Z","shell.execute_reply":"2021-12-02T13:30:15.867983Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Conv3d_Block(Layer):\n    def __init__(self, kernel_size=(3, 3, 3), num_filters=None, strides=1, auto_pad=True, padding_mode='zero',\n                 activation=None, normalization=None, use_spectral=False, use_bias=False, dilation=1, groups=1,\n                 add_noise=False, noise_intensity=0.005, dropout_rate=0, name=None, depth_multiplier=None,\n                 keep_output=False, sequence_rank='cna', **kwargs):\n        super(Conv3d_Block, self).__init__(name=name, keep_output=keep_output)\n        self.rank = 3\n        if sequence_rank in ['cna', 'nac', 'acn']:\n            self.sequence_rank = sequence_rank\n        else:\n            self.sequence_rank = 'cna'\n        self.kernel_size = kernel_size\n        self.num_filters = num_filters\n        self.strides = strides\n\n        self.padding_mode = padding_mode\n        padding = kwargs.get('padding', None)\n        if 'padding' in kwargs:\n            kwargs.pop('padding')\n        if isinstance(padding, str) and auto_pad == False:\n            auto_pad = (padding.lower() == 'same')\n        elif isinstance(padding, int) and padding > 0:\n            padding = _triple(padding)\n            auto_pad = False\n        elif isinstance(padding, tuple):\n            auto_pad = False\n            pass\n        self.auto_pad = auto_pad\n        self.padding = padding\n        # if self.auto_pad == False:\n        #     self.padding = 0\n        # else:\n        #     self.padding= tuple([n-2 for n in  list(self.kernel_size)]) if hasattr(self.kernel_size,'__len__') else\n        #     self.kernel_size-2\n\n        self.use_bias = use_bias\n        self.dilation = dilation\n        self.groups = groups\n\n        self.add_noise = add_noise\n        self.noise_intensity = noise_intensity\n        self.dropout_rate = dropout_rate\n        self.droupout = None\n        self.depth_multiplier = depth_multiplier\n        self.keep_output = keep_output\n\n        norm = get_normalization(normalization)\n        conv = Conv3d(kernel_size=self.kernel_size, num_filters=self.num_filters, strides=self.strides,\n                      auto_pad=self.auto_pad, padding_mode=self.padding_mode, activation=None,\n                      use_bias=self.use_bias, dilation=self.dilation, groups=self.groups,\n                      depth_multiplier=self.depth_multiplier, padding=self.padding, **kwargs).to(self.device)\n        self.use_spectral = use_spectral\n        if isinstance(norm, SpectralNorm):\n            self.use_spectral = True\n            norm = None\n            conv = nn.utils.spectral_norm(conv)\n        if (hasattr(self, 'sequence_rank') and self.sequence_rank == 'cna') or not hasattr(self, 'sequence_rank'):\n            self.add_module('conv', conv)\n            self.add_module('norm', norm)\n            self.add_module('activation',  get_activation(activation,only_layer=True))\n\n        elif self.sequence_rank == 'nac':\n            self.add_module('norm', norm)\n            self.add_module('activation',  get_activation(activation,only_layer=True))\n            self.add_module('conv', conv)\n\n        elif self.sequence_rank == 'acn':\n            self.add_module('activation',  get_activation(activation,only_layer=True))\n            self.add_module('conv', conv)\n            self.add_module('norm', norm)\n        self._name = name\n\n    def build(self, input_shape: TensorShape):\n        if not self._built:\n\n            self.conv.input_shape = input_shape\n            if self.use_spectral:\n                self.conv = nn.utils.spectral_norm(self.conv)\n                if self.norm is SpectralNorm:\n                    self.norm = None\n\n            # if self.norm is not None:\n            #     self.norm.input_shape = self.conv.output_shape\n            self.to(self.device)\n            self._built = True\n\n    def forward(self, x, **kwargs):\n\n        if not hasattr(self, 'sequence_rank'):\n            setattr(self, 'sequence_rank', 'cna')\n        if self.add_noise == True and self.training == True:\n            noise = self.noise_intensity * torch.randn_like(x, dtype=x.dtype)\n            x = x + noise\n        for child in list(self.children())[:3]:\n            if child is not None:\n                x = child(x)\n        if self.training and self.dropout_rate > 0:\n            x = F.dropout(x, p=self.dropout_rate, training=self.training)\n        return x\n\n    def extra_repr(self):\n        s = 'kernel_size={kernel_size}, {num_filters}, strides={strides}'\n        if 'activation' in self.__dict__ and self.__dict__['activation'] is not None:\n            if inspect.isfunction(self.__dict__['activation']):\n                s += ', activation={0}'.format(self.__dict__['activation'].__name__)\n            elif isinstance(self.__dict__['activation'], nn.Module):\n                s += ', activation={0}'.format(self.__dict__['activation']).__repr__()\n        return s.format(**self.__dict__)\n    \n\nclass DepthwiseConv3d_Block(Layer):\n    def __init__(self, kernel_size=(3, 3, 3), num_filters=None, strides=1, auto_pad=True, padding_mode='zero',\n                 activation=None, normalization=None, use_spectral=False, use_bias=False, dilation=1, groups=1,\n                 add_noise=False, noise_intensity=0.005, dropout_rate=0, name=None, depth_multiplier=None,\n                 keep_output=False, sequence_rank='cna', **kwargs):\n        super(Conv3d_Block, self).__init__(name=name, keep_output=keep_output)\n        self.rank = 3\n        if sequence_rank in ['cna', 'nac', 'acn']:\n            self.sequence_rank = sequence_rank\n        else:\n            self.sequence_rank = 'cna'\n        self.kernel_size = kernel_size\n        self.num_filters = num_filters\n        self.strides = strides\n\n        self.padding_mode = padding_mode\n        padding = kwargs.get('padding', None)\n        if 'padding' in kwargs:\n            kwargs.pop('padding')\n        if isinstance(padding, str) and auto_pad == False:\n            auto_pad = (padding.lower() == 'same')\n        elif isinstance(padding, int) and padding > 0:\n            padding = _triple(padding)\n            auto_pad = False\n        elif isinstance(padding, tuple):\n            auto_pad = False\n            pass\n        self.auto_pad = auto_pad\n        self.padding = padding\n        # if self.auto_pad == False:\n        #     self.padding = 0\n        # else:\n        #     self.padding= tuple([n-2 for n in  list(self.kernel_size)]) if hasattr(self.kernel_size,'__len__') else\n        #     self.kernel_size-2\n\n        self.use_bias = use_bias\n        self.dilation = dilation\n        self.groups = groups\n\n        self.add_noise = add_noise\n        self.noise_intensity = noise_intensity\n        self.dropout_rate = dropout_rate\n        self.droupout = None\n        self.depth_multiplier = depth_multiplier\n        self.keep_output = keep_output\n\n        norm = get_normalization(normalization)\n        conv = DepthwiseConv3d(kernel_size=self.kernel_size, num_filters=self.num_filters, strides=self.strides,\n                      auto_pad=self.auto_pad, padding_mode=self.padding_mode, activation=None,\n                      use_bias=self.use_bias, dilation=self.dilation, groups=self.groups,\n                      depth_multiplier=self.depth_multiplier, padding=self.padding, **kwargs).to(self.device)\n        self.use_spectral = use_spectral\n        if isinstance(norm, SpectralNorm):\n            self.use_spectral = True\n            norm = None\n            conv = nn.utils.spectral_norm(conv)\n        if (hasattr(self, 'sequence_rank') and self.sequence_rank == 'cna') or not hasattr(self, 'sequence_rank'):\n            self.add_module('conv', conv)\n            self.add_module('norm', norm)\n            self.add_module('activation',  get_activation(activation,only_layer=True))\n\n        elif self.sequence_rank == 'nac':\n            self.add_module('norm', norm)\n            self.add_module('activation',  get_activation(activation,only_layer=True))\n            self.add_module('conv', conv)\n\n        elif self.sequence_rank == 'acn':\n            self.add_module('activation',  get_activation(activation,only_layer=True))\n            self.add_module('conv', conv)\n            self.add_module('norm', norm)\n        self._name = name\n\n    def build(self, input_shape: TensorShape):\n        if not self._built:\n\n            self.conv.input_shape = input_shape\n            if self.use_spectral:\n                self.conv = nn.utils.spectral_norm(self.conv)\n                if self.norm is SpectralNorm:\n                    self.norm = None\n\n            # if self.norm is not None:\n            #     self.norm.input_shape = self.conv.output_shape\n            self.to(self.device)\n            self._built = True\n\n    def forward(self, x, **kwargs):\n\n        if not hasattr(self, 'sequence_rank'):\n            setattr(self, 'sequence_rank', 'cna')\n        if self.add_noise == True and self.training == True:\n            noise = self.noise_intensity * torch.randn_like(x, dtype=x.dtype)\n            x = x + noise\n        for child in list(self.children())[:3]:\n            if child is not None:\n                x = child(x)\n        if self.training and self.dropout_rate > 0:\n            x = F.dropout(x, p=self.dropout_rate, training=self.training)\n        return x\n\n    def extra_repr(self):\n        s = 'kernel_size={kernel_size}, {num_filters}, strides={strides}'\n        if 'activation' in self.__dict__ and self.__dict__['activation'] is not None:\n            if inspect.isfunction(self.__dict__['activation']):\n                s += ', activation={0}'.format(self.__dict__['activation'].__name__)\n            elif isinstance(self.__dict__['activation'], nn.Module):\n                s += ', activation={0}'.format(self.__dict__['activation']).__repr__()\n        return s.format(**self.__dict__)","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:15.872452Z","iopub.execute_input":"2021-12-02T13:30:15.872774Z","iopub.status.idle":"2021-12-02T13:30:15.914731Z","shell.execute_reply.started":"2021-12-02T13:30:15.872741Z","shell.execute_reply":"2021-12-02T13:30:15.913734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef DenseLayer(growth_rate,name=''):\n    \"\"\"\n    The basic normalization, convolution and activation combination for dense connection\n\n    Args:\n        growth_rate (int):The growth rate regulates how much new information each layer contributes to the global state\n        name (str): None of this dense layer\n\n    Returns:\n        An instrance of dense layer.\n\n    \"\"\"\n    items = OrderedDict()\n    items['norm']=BatchNorm()\n    items['relu']=Relu()\n    items['conv1']=Conv3d_Block((1,1,1),4 * growth_rate,strides=1,activation='relu',auto_pad=True,padding_mode='zero',use_bias=False,normalization='batch')\n    items['conv2']=Conv3d((3,3,3),growth_rate,strides=1,auto_pad=True,padding_mode='zero',use_bias=False)\n    return  Sequential(items)\n\nclass DenseBlock(Layer):\n    def __init__(self, num_layers,  growth_rate=32, drop_rate=0.2,keep_output=False,name=''):\n        \"\"\"\n        The dense connected block.\n        Feature-maps of eachconvolution layer are used as inputs into all subsequent layers\n\n        Args:\n            num_layers (int):  number of dense layers in this block\n            growth_rate (int):The growth rate regulates how much new information each layer contributes to the global state\n            drop_rate (decimal):  the drop out rate of this dense block\n            keep_output (bool):  If True, the output tensor will kept\n            name (str):Name of this dense block .\n\n        Returns:\n            An instrance of dense block.\n\n        \"\"\"\n        super(DenseBlock, self).__init__()\n        if len(name)>0:\n            self.name=name\n        self.keep_output=keep_output\n        for i in range(num_layers):\n            layer = DenseLayer(growth_rate,name='denselayer%d' % (i + 1))\n            self.add_module('denselayer%d' % (i + 1), layer)\n\n    def forward(self, x, **kwargs):\n        for name, layer in self.named_children():\n            new_features = layer(x)\n            x=torch.cat([x,new_features], 1)\n        return x\n    \ndef TransitionDown(reduction,name=''):\n    \"\"\"\n     The block for transition-down, down-sampling by using depthwise convolution with strides==2\n\n    Args:\n        reduction (float): The depth_multiplier to transition-down the dense features\n        name (str): Name of the transition-down process\n\n    Returns:\n        An instrance of transition-down .\n\n    \"\"\"\n    return DepthwiseConv3d_Block((3,3,3),depth_multiplier=reduction,strides=2,activation='leaky_relu',normalization='batch', dropout_rate=0.2)\n\ndef Transition(reduction,name=''):\n    \"\"\"\n     The block for transition-down, down-sampling by average pooling\n    Args:\n        reduction (float): The depth_multiplier to transition-down the dense features\n        name (str): Name of the transition-down process\n\n    Returns:\n        An instrance of transition-down .\n\n\n    \"\"\"\n    items=OrderedDict()\n    items['norm']=BatchNorm()\n    items['relu']=Relu()\n    items['conv1']=Conv3d((3,3,3),num_filters=None, depth_multiplier=reduction, strides=2, auto_pad=True,use_bias=False)\n    return Sequential(items,name=name)\n\n\n\nclass GlobalAvgPool3d(Layer):\n    \"\"\"Global Average Pooling Imprementation \"\"\"\n    def __init__(self, keepdims=False, name='global_avg_pool',**kwargs):\n        \"\"\"\n\n        Args:\n            keepdims ():\n            name ():\n        \"\"\"\n        super(GlobalAvgPool3d, self).__init__(name=name)\n        self.keepdims = kwargs.get('keepdim',keepdims)\n\n    def build(self, input_shape:TensorShape):\n        if self._built == False:\n            if self.keepdims == True:\n                output_shape = input_shape.dims\n                output_shape[2] = 1\n                output_shape[3] = 1\n                self.output_shape = TensorShape(output_shape)\n            else:\n                self.output_shape = TensorShape(input_shape[:2])\n            self._built = True\n\n    def forward(self, x, **kwargs):\n\n        N,C,D,H,W=x.size()\n        x = x.view(N, C, -1).mean(dim=-1, keepdim=self.keepdims)\n        return x\n","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:15.917003Z","iopub.execute_input":"2021-12-02T13:30:15.917398Z","iopub.status.idle":"2021-12-02T13:30:15.934602Z","shell.execute_reply.started":"2021-12-02T13:30:15.917352Z","shell.execute_reply":"2021-12-02T13:30:15.933814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def DenseNet3d(blocks,\n             growth_rate=16,\n             initial_filters=32,\n             include_top=True,\n             pretrained=True,\n             input_shape=(1,256,192,192),\n             num_classes=2,\n             name='',\n             **kwargs):\n    \"\"\"'\n    Instantiates the DenseNet architecture.\n    Optionally loads weights pre-trained on ImageNet.\n\n    Args\n        blocks (tuple/ list of int ): numbers of building blocks for the dense layers.\n\n        growth_rate (int):The growth rate regulates how much new information each layer contributes to the global state\n\n        initial_filters (int): the channel of the first convolution layer\n\n        pretrained (bool): If True, returns a model pre-trained on ImageNet.\n\n        input_shape (tuple or list): the default input image size in CHW order (C, H, W)\n\n        num_classes (int): number of classes\n\n        name (string): anme of the model\n\n    Returns\n        A trident image classification model instance.\n\n    \"\"\"\n    densenet=Sequential()\n    densenet.add_module('conv1/conv',Conv3d_Block((3,3,3),initial_filters,strides=2,use_bias=False,auto_pad=True,padding_mode='zero',activation='relu',normalization='batch', name='conv1/conv'))\n    densenet.add_module('transitiondown0', Transition(0.5))\n    densenet.add_module('denseblock1', DenseBlock(blocks[0],growth_rate=growth_rate,drop_rate=0.2))\n    densenet.add_module('transitiondown1', Transition(0.5))\n    densenet.add_module('denseblock2', DenseBlock(blocks[1], growth_rate=growth_rate,drop_rate=0.0))\n    densenet.add_module('transitiondown2', Transition(0.5))\n    densenet.add_module('denseblock3', DenseBlock(blocks[2], growth_rate=growth_rate,drop_rate=0.2))\n    densenet.add_module('transitiondown3', Transition(0.5))\n    densenet.add_module('denseblock4', DenseBlock(blocks[3], growth_rate=growth_rate,drop_rate=0.0))\n    densenet.add_module('classifier_norm',BatchNorm(name='classifier_norm'))\n    densenet.add_module('classifier_relu', Relu(name='classifier_relu'))\n    if include_top:\n        densenet.add_module('avg_pool', GlobalAvgPool3d(name='avg_pool'))\n        densenet.add_module('classifier', Dense(8, activation=None, name='classifier'))\n        densenet.add_module('softmax',SoftMax())\n        \n    densenet.name = name\n\n    model=ImageClassificationModel(input_shape=input_shape,output=densenet)\n    # model.summary()\n    return model\n        \ndensenet121 =DenseNet3d([6, 12, 24, 16],16,32, include_top=True, input_shape=(1,256,192,192), num_classes=2,name='densenet3d121')\ndensenet121.model[-1].add_noise=True\ndensenet121.model[-1].noise_intensity=0.08\ndensenet121.summary()","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:15.935788Z","iopub.execute_input":"2021-12-02T13:30:15.936277Z","iopub.status.idle":"2021-12-02T13:30:20.656211Z","shell.execute_reply.started":"2021-12-02T13:30:15.936239Z","shell.execute_reply":"2021-12-02T13:30:20.655147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nfrom tqdm import tqdm\ndf_train=pd.read_csv('../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv')\nprint(df_train)\n\nlabels=[]\ntypes=[]\nimages=[]\nfor i in tqdm(range(len(df_train['BraTS21ID']))):\n    id=df_train['BraTS21ID'][i]\n    img_path1='../input/rsna-miccai-brain-tumor-baseline/resample_images/{0}/{1}_flair.npz'.format(('00000'+str(id))[-5:],('00000'+str(id))[-5:])\n    if os.path.exists(img_path1):\n        labels.append(df_train['MGMT_value'][i])\n        images.append(img_path1)\n        types.append(0)\n    img_path2='../input/rsna-miccai-brain-tumor-baseline/resample_images/{0}/{1}_t1w.npz'.format(('00000'+str(id))[-5:],('00000'+str(id))[-5:])\n    if os.path.exists(img_path2):\n        labels.append(2+df_train['MGMT_value'][i])\n        images.append(img_path2)\n        types.append(1)\n    img_path3='../input/rsna-miccai-brain-tumor-baseline/resample_images/{0}/{1}_t1wce.npz'.format(('00000'+str(id))[-5:],('00000'+str(id))[-5:])\n    if os.path.exists(img_path3):\n        labels.append(4+df_train['MGMT_value'][i])\n        images.append(img_path3)\n        types.append(2)\n    img_path4='../input/rsna-miccai-brain-tumor-baseline/resample_images/{0}/{1}_t2w.npz'.format(('00000'+str(id))[-5:],('00000'+str(id))[-5:])\n    if os.path.exists(img_path4):\n        labels.append(6+df_train['MGMT_value'][i])\n        images.append(img_path4)\n        types.append(3)\nprint(len(labels))\nprint(len(images))\n        \n    ","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.657518Z","iopub.execute_input":"2021-12-02T13:30:20.657861Z","iopub.status.idle":"2021-12-02T13:30:20.706444Z","shell.execute_reply.started":"2021-12-02T13:30:20.657824Z","shell.execute_reply":"2021-12-02T13:30:20.705545Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ArrayDataset(Dataset):\n    def __init__(self, arrays,symbol='array'):\n        r\"\"\"\n        ArrayDataset is a dataset for numpy array data, one or more numpy arrays\n         are needed to initiate the dataset. And the dimensions represented sample number\n         are expected to be the same.\n        \"\"\"\n        super().__init__( arrays)\n        self.symbol=symbol\n  \n\n    def __getitem__(self, index: int):\n        img_path=self.items[index]\n        img=np.load(img_path)['arr_0']\n        img=scipy.ndimage.interpolation.zoom(img,np.array([241.0/img.shape[0],1,1]), mode='nearest')\n        background_img=np.zeros((1,256,192,192))\n        if img.shape[1]>192:\n            offset=(img.shape[1]-192)//2\n            img=img[:,offset:192+offset,:]\n        if img.shape[2]>192:\n            offset=(img.shape[2]-192)//2\n            img=img[:,:,offset:192+offset]\n        y_offset=random.choice(range(192-img.shape[1])) if 192-img.shape[1]>1 else 0\n        x_offset=random.choice(range(192-img.shape[2])) if 192-img.shape[2]>1 else 0\n        background_img[0,:img.shape[0],y_offset:img.shape[1]+y_offset,x_offset:img.shape[2]+x_offset]=img\n        return background_img/max(background_img.max(),1)\n\n    def __len__(self) -> int:\n        return len(self.items)\n    def data_transform(self, img_data):\n\n        if isinstance(img_data, np.ndarray):\n            for fc in self.transform_funcs:\n                if (inspect.isfunction(fc) or isinstance(fc, Transform)) and fc is not image_backend_adaption:\n                    img_data = fc(img_data, spec=self.element_spec)\n\n            return img_data\n        else:\n            return img_data","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.709429Z","iopub.execute_input":"2021-12-02T13:30:20.710553Z","iopub.status.idle":"2021-12-02T13:30:20.72636Z","shell.execute_reply.started":"2021-12-02T13:30:20.710185Z","shell.execute_reply":"2021-12-02T13:30:20.725375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds1=ArrayDataset(images,symbol='image3d')\nds2=LabelDataset(labels,symbol='label')\ndata_provider=DataProvider(traindata=Iterator(data=ds1,label=ds2))\nimg_data,label_data=data_provider.next()\nprint(img_data.shape)","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.72947Z","iopub.execute_input":"2021-12-02T13:30:20.729883Z","iopub.status.idle":"2021-12-02T13:30:20.846775Z","shell.execute_reply.started":"2021-12-02T13:30:20.72985Z","shell.execute_reply":"2021-12-02T13:30:20.845098Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def accuracy_binary(output,target):\n    output_np=to_numpy(argmax(output,-1))\n    target_np=to_numpy(target)\n    for k in range(len(output_np)):\n        output_np[k]=output_np[k]%2\n        target_np[k]=target_np[k]%2\n    return np.equal(output_np,target_np).mean()\n\ndef accuracy_mri(output,target):\n    output_np=to_numpy(argmax(output,-1))\n    target_np=to_numpy(target)\n    output_np=output_np//2\n    target_np=target_np//2\n\n    return np.equal(output_np,target_np).mean()\n    ","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.848084Z","iopub.status.idle":"2021-12-02T13:30:20.848863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#densenet121.load_model('./Models/densenet121_flair.pth')\ndensenet121.load_model('./Models/densenet121_all.pth')\ndensenet121.with_optimizer(optimizer=DiffGrad,lr=1e-3,betas=(0.9, 0.999),gradient_centralization='all')\\\n.with_loss(CrossEntropyLoss(auto_balance=True))\\\n.with_loss(F1ScoreLoss(beta=0.5))\\\n.with_metric(accuracy,name='accuracy')\\\n.with_metric(accuracy_binary,name='accuracy_binary')\\\n.with_metric(accuracy_mri,name='accuracy_mri')\\\n.with_regularizer('l2',reg_weight=1e-8)\\\n.with_grad_clipping(3)\\\n.with_accumulate_grads(5)\\\n.with_learning_rate_scheduler(StepLR(frequency=1000,unit='batch',gamma=0.5))\\\n.with_model_save_path('./Models/densenet121_all.pth')\\\n.with_automatic_mixed_precision_training()\n\n","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.850111Z","iopub.status.idle":"2021-12-02T13:30:20.850855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"densenet121.adjust_learning_rate(5e-4)\n\nplan=TrainingPlan()\\\n    .add_training_item(densenet121,name='densenet121')\\\n    .with_data_loader(data_provider)\\\n    .with_batch_size(8)\\\n    .repeat_epochs(1)\\\n    .print_gradients_scheduling(100,unit='batch') \\\n    .print_progress_scheduling(5,unit='batch') \\\n    .display_loss_metric_curve_scheduling(200)\\\n    .save_model_scheduling(10,unit='batch')\n\n\nplan.only_steps(10000)","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.852122Z","iopub.status.idle":"2021-12-02T13:30:20.85294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_folders=glob.glob('../input/rsna-miccai-brain-tumor-baseline/test_resample_images/*')\nBraTS21ID=[ folder.split('/')[-1] for folder in test_folders]\nprint(len(BraTS21ID))\nresult_dict=OrderedDict()\n\n\ntypes=[]\nimages=[]\nfor i in tqdm(range(len(BraTS21ID))):\n    id=BraTS21ID[i]\n    result_dict[id]=OrderedDict()\n    img_path1='../input/rsna-miccai-brain-tumor-baseline/test_resample_images/{0}/{1}_flair.npz'.format(('00000'+str(id))[-5:],('00000'+str(id))[-5:])\n    if os.path.exists(img_path1):\n        result_dict[id]['flair']=OrderedDict()\n        result_dict[id]['flair']['img_path']=img_path1\n        images.append(img_path1)\n        types.append(0)\n    img_path2='../input/rsna-miccai-brain-tumor-baseline/test_resample_images/{0}/{1}_t1w.npz'.format(('00000'+str(id))[-5:],('00000'+str(id))[-5:])\n    if os.path.exists(img_path2):\n        result_dict[id]['t1w']=OrderedDict()\n        result_dict[id]['t1w']['img_path']=img_path2\n        images.append(img_path2)\n        types.append(1)\n    img_path3='../input/rsna-miccai-brain-tumor-baseline/test_resample_images/{0}/{1}_t1wce.npz'.format(('00000'+str(id))[-5:],('00000'+str(id))[-5:])\n    if os.path.exists(img_path3):\n        result_dict[id]['t1wce']=OrderedDict()\n        result_dict[id]['t1wce']['img_path']=img_path3\n        images.append(img_path3)\n        types.append(2)\n    img_path4='../input/rsna-miccai-brain-tumor-baseline/test_resample_images/{0}/{1}_t2w.npz'.format(('00000'+str(id))[-5:],('00000'+str(id))[-5:])\n    if os.path.exists(img_path4):\n        result_dict[id]['t2w']=OrderedDict()\n        result_dict[id]['t2w']['img_path']=img_path4\n        images.append(img_path4)\n        types.append(3)\nprint(len(images))\n","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.854253Z","iopub.status.idle":"2021-12-02T13:30:20.855025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_ds1=ArrayDataset(images,symbol='image3d')\ntest_ds2=ImageDataset(images,object_type=ObjectType.image_path,symbol='img_path')\n\n\ntest_data_provider=DataProvider(traindata=Iterator(data=test_ds1,label=test_ds2,is_shuffle=False))\nimg_data,label_data=test_data_provider.next()\nprint(img_data.shape)\nprint(label_data)","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.856225Z","iopub.status.idle":"2021-12-02T13:30:20.857873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#清除gpu快取\nimport torch\nif is_gpu_available():\n    torch.cuda.synchronize()\n    torch.cuda.empty_cache()\n    gc.collect()\n    densenet121.cpu()\n    densenet121.cuda()","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.859133Z","iopub.status.idle":"2021-12-02T13:30:20.859958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"densenet121.eval()\ntest_data_provider.batch_size=4\ntest_data_provider.traindata.batch_sampler.reset()\ntotal_img=0\n\nfor i ,(img,img_path) in tqdm(enumerate(test_data_provider)):\n\n    output=densenet121(img)\n    \n    for k in range(len(output)):\n        _,filename,_=split_path(img_path[k].decode())\n        imageid,mri_type=filename.split('_')\n        if mri_type=='flair':\n            result_dict[imageid][mri_type]['result1']=output[k,1]/(output[k,0]+output[k,1])\n            result_dict[imageid][mri_type]['result2']=output[k,1]+output[k,3]+output[k,5]+output[k,7]\n        elif mri_type=='t1w':\n            result_dict[imageid][mri_type]['result1']=output[k,3]/(output[k,2]+output[k,3])\n            result_dict[imageid][mri_type]['result2']=output[k,1]+output[k,3]+output[k,5]+output[k,7]\n        elif mri_type=='t1wce':\n            result_dict[imageid][mri_type]['result1']=output[k,5]/(output[k,4]+output[k,5])\n            result_dict[imageid][mri_type]['result2']=output[k,1]+output[k,3]+output[k,5]+output[k,7]\n        elif mri_type=='t2w':\n            result_dict[imageid][mri_type]['result1']=output[k,7]/(output[k,6]+output[k,7])\n            result_dict[imageid][mri_type]['result2']=output[k,1]+output[k,3]+output[k,5]+output[k,7]\n        total_img+=1\n        if total_img==342:\n            break\n            \n \n\n    ","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.861294Z","iopub.status.idle":"2021-12-02T13:30:20.863477Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"f=open('../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv','r',encoding='utf-8-sig')\nrows=f.readlines()\nprint(len(rows))\n#檢視一下大會給的提交範例\nprint(rows[:5])\nprint(rows[-5:])\n\n","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.864753Z","iopub.status.idle":"2021-12-02T13:30:20.865601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_rows=['BraTS21ID,MGMT_value\\n']\nfor k,v in result_dict.items():\n    \n    prob=0\n    prob+=v['flair']['result1'] if 'flair' in v and 'result1' in v['flair'] else 0\n    prob+=v['flair']['result2'] if 'flair' in v  and 'result2' in v['flair'] else 0\n    prob+=v['t1w']['result1'] if 't1w' in v  and 'result1' in v['t1w'] else 0\n    prob+=v['t1w']['result2'] if 't1w' in v  and 'result2' in v['t1w'] else 0\n    prob+=v['t1wce']['result1'] if 't1wce' in v  and 'result1' in v['t1wce'] else 0\n    prob+=v['t1wce']['result2'] if 't1wce' in v  and 'result2' in v['t1wce'] else 0\n    prob+=v['t2w']['result1'] if 't2w' in v  and 'result1' in v['t2w'] else 0\n    prob+=v['t2w']['result2'] if 't2w' in v  and 'result2' in v['t2w'] else 0\n    prob=prob/8.0\n   \n    \n    submission_rows.append('{0},{1}\\n'.format(k,prob))\n#確認提交檔筆數\nprint(len(submission_rows))\n#寫入提交檔\nmake_dir_if_need('./results')\nwith open('./submission.csv','w',encoding='utf-8-sig') as f:\n    f.writelines(submission_rows)\n#再讀取一次確認何大會給的範例格式是否一致\nfr=open('./submission.csv','r',encoding='utf-8-sig')\nrows=fr.readlines()\nprint(rows[:5])\nprint(rows[-5:])","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.866859Z","iopub.status.idle":"2021-12-02T13:30:20.867695Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#api_token={\"username\":\"your_username\",\"key\":\"your_token\"} #請換成你自己的kaggle認證#請換成你自己的kaggle認證\napi_token={\"username\":\"allanyiinai\",\"key\":\"a8b4e3c9cd45634f1c22bfc357253208\"}\nimport json\nimport zipfile\nimport os\n\nif not os.path.exists(\"/root/.kaggle\"):\n    os.makedirs(\"/root/.kaggle\")\n\nwith open('/root/.kaggle/kaggle.json', 'w') as file:\n    json.dump(api_token, file)\n!chmod 600 /root/.kaggle/kaggle.json\n \nif not os.path.exists(\"/kaggle\"):\n    os.makedirs(\"/kaggle\")\n!kaggle competitions submit -c rsna-miccai-brain-tumor-radiogenomic-classification -f './submission.csv' -m '3d densenet'","metadata":{"execution":{"iopub.status.busy":"2021-12-02T13:30:20.868967Z","iopub.status.idle":"2021-12-02T13:30:20.869779Z"},"trusted":true},"execution_count":null,"outputs":[]}]}