{
  "id": 31576,
  "title": "7th Place short overview.",
  "content": "<p>Hello guys, here we provide a first, quick overview over the 7th place solution. We will follow that up with a more detailed write-up, this just serves as a short methodological overview. Congrats to the top performing teams!</p>\n\n<p><strong>DL package</strong>: We implemented all networks directly in tensorflow on ubuntu 14.04 machines.</p>\n\n<p><strong>Approach</strong>: We solely relied on the nodule annotations of LUNA/LIDC and the dsb cancer labels for building our framework. The general approach can be divided into 3 main steps, namely:</p>\n\n<p><strong>1) Segmenting nodules:</strong> We first trained a segmentation network (standard UNET architecture) with the LUNA/LIDC information to segment lungs nodules. The network was trained on random 128x128 crops of lung slices which were sampled randomly from all 3 room axis (not only axial) with the corresponding nodule annotation mask (we used elliptical annotations). We just sampled slices which section a nodule annotation. We treated every sampled slice as an independent data record. At prediction time we apply this network to all slices of a CT Scan <strong>in all 3 room axis</strong>. This leaves us with three 3D probability map tensors, which we simply average. This results in a single 3D probabilty map tensor for each lung CT scan.</p>\n\n<p><strong>2) Find nodule candidates:</strong> We use an iterative cluster algorithm to find clusters in the 3D probability clouds from step 1). The main idea here was to threshold the 3D probability maps from the segmentation network with a low value (0.2) and run a clustering. This will result in probability cloud clusters of arbitrary size. If the size of a cluster exceeds the plausible nodule size, we further increase the threshold in this cloud and again run the clustering to detect single or multiple subclusters. We repeat this process until all probability cloud cluster is \"condensed\" to single clusters of a plausible nodule size. The center of these final clusters is used to extract a 64x64x64 region from this location from the lung. This will result in &lt;100 candidates for each lung. We sort the candidate tensors with the sum of the probability contained in the 64x64x64 crop and <strong>only use the first 20 candidates</strong> for the final step.</p>\n\n<p>2.1) (optional / we wish we had) At this step it would be straight forward to apply an malignancy classification network to each of the extracted candidates and obtain a more meaningful candidate set for the final classifier. Unfortunately, we did not notice the malignancy information contained in the LIDC dataset. There is a good chance for improvement here.</p>\n\n<p><strong>3) Predict cancer on patient level</strong>: From step 2) <strong>we obtain 20 64x64x64 candidates for each patient</strong> in the dsb dataset. We use those candidates to train a 3D resnet for cancer classification. We do not only use the pixel information from the lung CT scan but also the probability map information from the segmentation network as a second input channel. The intuition behind including the probability map from the segmentation network is that the segmentation is trained on larger patches (128x128) and has, therefore, more context information than the stage 2 classifier. By including the probability map the stage 2 classifier is able to reuse the extracted context information of the segmentation network, which is contained in the predicted segmentation maps.</p>\n\n<p>We <strong>feed the 20 candidates simultaneously</strong> in the network. This means a single input record has the dimension (20,64,64,64,2), where the 1. dimension stands for the 20 candidates, 2nd-4th are the spatial dimensions, and the 5th dimension encodes the two channels (lung CT pixel information, 3D probability output from the segmentation net in stage1). We assign the dsb patient label to this 5D tensor, resulting in the following <strong>datarecord-label-pair: (20,64,64,64,2) &lt;-&gt; cancer label</strong>.</p>\n\n<p>The network architecture is a 3D convolution network designed in a way that it reuses its weights in the candidate dimension. We did that by simply reshaping the candidate dimension into the batch dimension while training/predicting: (Batchsize,20,64,64,64,2) -&gt; (Batchsize x 20,64,64,64,2). We then apply a resnet 3D network, which convolves the 3 spatial dimensions and reduces the input tensor with shape (Batchsize x 20,64,64,64,2) to an output tensor with dimension (Batchsize x 20, 1). On this tensor, we apply a sigmoid function the normalize the values. We reshape this tensor back to (Batchsize, 20) and <strong>apply a reduction function</strong> to arrive at a single probability for each patient. We experimented with a few different reduction functions, for example, Noisy-AND/Noisy-OR, but in practice, a simple maximum function performed the best. The max(tensor, axis=1)-function reduces the (Batchsize, 20)-tensor to an (Batchsize, 1)-tensor. The intuition behind reducing the 20 candidate probabilities with the maximum function to a single patient probability is, that the most \"cancerous\" nodule also determines the cancer likelihood of the whole patient. This final output scalar will be the prediction for a patient. This setup is directly end-to-end trainable from X candidates per patient to a single prediction per patient.</p>\n\n<p><strong>Additional notes on the multicandidate classifier</strong>: It is important to use a reduction function which is <strong>invariant to permutation of the candidates</strong> (Max, Average, Noisy-AND, ...) since their ordering is expected to be imperfect due to the fact that the segmentation network which produces the candidates is trained to predict <strong>all</strong> nodules, not only malignant ones. So when e.g. using an MLP to reduce the (Batchsize, 20) tensor to a single (Batchsize, 1) output, the classifier can actually fail when permutating the 20 candidates, since a individual weight is used for every candidate. A simple example with 5 candidates, where only one correlates with the actual patient label: A (0, cancer, 0, 0, 0) input should produce the same prediction as a (cancer, 0, 0, 0, 0) input. When having a relatively small dataset where it's necessary to combine multiple equivalent candidates one can greatly reduce overfitting effects by making the classifier invariant to those candidate permutations.</p>\n\n<p><strong>General Model Optimization:</strong> We did spend nearly no time optimizing the network architectures or optimizer parameters, since we simply ran out of time and the runs are lengthy.</p>",
  "comments": [
    {
      "id": 175123,
      "author_name": "Wintermute",
      "author_url": "",
      "post_date": "2017-04-13T21:39:28.623000",
      "content": "<p>Congratulations! Very impressive results especially without using false positive reduction or malignancy labels. A couple of questions. 1) did you use lung segmentation at all? 2) when you sample slices training samples for nodule segmentation, did you centre the slice at the nodule centroid or randomly?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 175183,
          "author_name": "Niklas Köhler",
          "author_url": "",
          "post_date": "2017-04-14T06:43:00.057000",
          "content": "<p>Thanks! \n1) Yes, we used a lung segmentation to reduce the computation load. We did it with a segmentation network, for which we annotated around 40 lungs manually. We then cropped each lung to the smallest rectangle which contains both lung wings. Using a network was actually the fastest way for us to get robust results.\n2) We used all slices for training which section the nodule annotation centroid, not just the center. From these sectioning slices, we cropped an 128x128 pxl area randomly. We resampled all Scans to 1x1x1 mm resolution for the segmentation.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 255866,
      "author_name": "felinna",
      "author_url": "",
      "post_date": "2017-12-10T11:58:55.590000",
      "content": "<p>Hi Niklas Köhler, </p>\n\n<p>I tried your ideal \"We do not only use the pixel information from the lung CT scan but also the probability map information from the segmentation network as a second input channel\" in lung nodule detection task, and the performance is improved. I want to employ the ideal in my paper. Do you publish any paper about it? Then I can cite it.</p>\n\n<p>Thanks.</p>\n\n<p>Ling.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 226376,
      "author_name": "guyu",
      "author_url": "",
      "post_date": "2017-10-02T04:03:27.817000",
      "content": "<p>hi,Niklas Köhler. Congratulations! Thank you for sharing your codes in github.\nI have a question to ask you.\nI found you use a python package 'hellsicht'. Could you provide it?  Or what can be replacement?\nThanks!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 221857,
      "author_name": "Vitaly Bushaev",
      "author_url": "",
      "post_date": "2017-09-16T14:21:15.010000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 180588,
      "author_name": "Haichao Yu",
      "author_url": "",
      "post_date": "2017-05-06T02:46:43.273000",
      "content": "<p>Congratulations! I have a question: what kind of clustering algorithm did you employ? Thanks.</p>",
      "votes": 0,
      "replies": [
        {
          "id": 181368,
          "author_name": "Niklas Köhler",
          "author_url": "",
          "post_date": "2017-05-09T09:11:21.473000",
          "content": "<p>We used the sklearn implementation of DBSCAN:\n<a href=\"http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html\">http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html</a></p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 175388,
      "author_name": "felinna",
      "author_url": "",
      "post_date": "2017-04-15T06:55:39.067000",
      "content": "<p>Really nice works. Thanks for sharing it. We only used 2 candidates to train a 2-channel CNN(I tried 3, but it was worse than 2).  You did much better than us to use 20 candidates(multicandidate classifier) and probability map. We am curious about the improvement of using probability map. Do you compared the result of using or not using this? We inspect the values in our probability maps, they are around 0.95 or 0.05(very big or very small). So we thought it did not contained much information and did not use it. But it turns out to be a bad decision compared to your work.</p>",
      "votes": 0,
      "replies": [
        {
          "id": 175824,
          "author_name": "Niklas Köhler",
          "author_url": "",
          "post_date": "2017-04-17T18:20:29.113000",
          "content": "<p>Thanks! Including the probability maps lowered the error on our local holdout set from around 0.46 to 0.44 and significantly reduced training time. The networks trained with probability map inputs needed half of the training epochs to converge. This was especially helpful for the 3D networks, which train about 10hours. We have two main explanation attempts why the maps improve performance:</p>\n\n<p>1) Since we trained the segmentation network on a larger patch of the lung slice, the probability map can contain more context information than the actually crop, which the classifier has as input. Here is an example for illustration: The segmentation network can recognize a certain nodule because its characteristic distance to the lung wall and draws a higher/larger/... probability map. When cropping the nodule with a smaller crop size, the wall vanishes as well as the crucial hypothetical distance feature. This would lead to a worse prediction. The same logic applies for example for pairs of nodules. Where the existence of a second nodule raises the probability for the first one. By including the probability map of the segmentation network, the \"out of crop range\"-features can still be considered by the classification network. </p>\n\n<p>2) The segmentation map can be used as an \"attention\" mechanism for the second classification network. By looking at the segmentation map the classification network has a trivial indicator which pixels in the input are the most important ones - namely the ones where the probability map channel has non-zero values. Since we have a very limited amount of training data this can counteract overfitting, since it favors the generalizing solution (looking at the nodules) for classifying cancer, instead of remembering e.g. characteristic pixels in the upper left corner of the input and simply remembering that this patient has cancer (which of course would not translate to unknown data).</p>\n\n<p>Of course these reason are just very rough, first ideas, but they maybe give an intuition about why the maps actually can help. Your argument with the very extreme values either at 0 or 1 (if true on all maps, haven't checked that yet) make my first point less likely, but in principle even the difference between 0.95 and 0.99 in the map could make a difference.  One could actually test that easily by setting everything above 0.9 to 1.0 and measure the performance again.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 175186,
      "author_name": "KapilYadav",
      "author_url": "",
      "post_date": "2017-04-14T07:19:42.407000",
      "content": "<p>Congratulations DL Munich Team and Niklas Köhler. I find this a unique approach and with lots of thought going in defining the network structure and other algorithms.\nA quick question - What kind of GPUs/RAM were required that can do such kind of processing? Can you please share the hardware specs that you used?</p>",
      "votes": 0,
      "replies": [
        {
          "id": 175218,
          "author_name": "Niklas Köhler",
          "author_url": "",
          "post_date": "2017-04-14T11:31:48.700000",
          "content": "<p>Thanks! The machine we ran the final pipeline on was a Ubuntu 14.04 system with 32GB of RAM, an \ni7-4930K and a single GTX 1080. The entire preprocessing + network training + prediction takes around 72hours on this machine.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    }
  ],
  "comment_count": 11,
  "messages": [
    {
      "id": 175031,
      "postDate": "2017-04-13T14:53:59.360Z",
      "content": "<p>Hello guys, here we provide a first, quick overview over the 7th place solution. We will follow that up with a more detailed write-up, this just serves as a short methodological overview. Congrats to the top performing teams!</p>\n\n<p><strong>DL package</strong>: We implemented all networks directly in tensorflow on ubuntu 14.04 machines.</p>\n\n<p><strong>Approach</strong>: We solely relied on the nodule annotations of LUNA/LIDC and the dsb cancer labels for building our framework. The general approach can be divided into 3 main steps, namely:</p>\n\n<p><strong>1) Segmenting nodules:</strong> We first trained a segmentation network (standard UNET architecture) with the LUNA/LIDC information to segment lungs nodules. The network was trained on random 128x128 crops of lung slices which were sampled randomly from all 3 room axis (not only axial) with the corresponding nodule annotation mask (we used elliptical annotations). We just sampled slices which section a nodule annotation. We treated every sampled slice as an independent data record. At prediction time we apply this network to all slices of a CT Scan <strong>in all 3 room axis</strong>. This leaves us with three 3D probability map tensors, which we simply average. This results in a single 3D probabilty map tensor for each lung CT scan.</p>\n\n<p><strong>2) Find nodule candidates:</strong> We use an iterative cluster algorithm to find clusters in the 3D probability clouds from step 1). The main idea here was to threshold the 3D probability maps from the segmentation network with a low value (0.2) and run a clustering. This will result in probability cloud clusters of arbitrary size. If the size of a cluster exceeds the plausible nodule size, we further increase the threshold in this cloud and again run the clustering to detect single or multiple subclusters. We repeat this process until all probability cloud cluster is \"condensed\" to single clusters of a plausible nodule size. The center of these final clusters is used to extract a 64x64x64 region from this location from the lung. This will result in &lt;100 candidates for each lung. We sort the candidate tensors with the sum of the probability contained in the 64x64x64 crop and <strong>only use the first 20 candidates</strong> for the final step.</p>\n\n<p>2.1) (optional / we wish we had) At this step it would be straight forward to apply an malignancy classification network to each of the extracted candidates and obtain a more meaningful candidate set for the final classifier. Unfortunately, we did not notice the malignancy information contained in the LIDC dataset. There is a good chance for improvement here.</p>\n\n<p><strong>3) Predict cancer on patient level</strong>: From step 2) <strong>we obtain 20 64x64x64 candidates for each patient</strong> in the dsb dataset. We use those candidates to train a 3D resnet for cancer classification. We do not only use the pixel information from the lung CT scan but also the probability map information from the segmentation network as a second input channel. The intuition behind including the probability map from the segmentation network is that the segmentation is trained on larger patches (128x128) and has, therefore, more context information than the stage 2 classifier. By including the probability map the stage 2 classifier is able to reuse the extracted context information of the segmentation network, which is contained in the predicted segmentation maps.</p>\n\n<p>We <strong>feed the 20 candidates simultaneously</strong> in the network. This means a single input record has the dimension (20,64,64,64,2), where the 1. dimension stands for the 20 candidates, 2nd-4th are the spatial dimensions, and the 5th dimension encodes the two channels (lung CT pixel information, 3D probability output from the segmentation net in stage1). We assign the dsb patient label to this 5D tensor, resulting in the following <strong>datarecord-label-pair: (20,64,64,64,2) &lt;-&gt; cancer label</strong>.</p>\n\n<p>The network architecture is a 3D convolution network designed in a way that it reuses its weights in the candidate dimension. We did that by simply reshaping the candidate dimension into the batch dimension while training/predicting: (Batchsize,20,64,64,64,2) -&gt; (Batchsize x 20,64,64,64,2). We then apply a resnet 3D network, which convolves the 3 spatial dimensions and reduces the input tensor with shape (Batchsize x 20,64,64,64,2) to an output tensor with dimension (Batchsize x 20, 1). On this tensor, we apply a sigmoid function the normalize the values. We reshape this tensor back to (Batchsize, 20) and <strong>apply a reduction function</strong> to arrive at a single probability for each patient. We experimented with a few different reduction functions, for example, Noisy-AND/Noisy-OR, but in practice, a simple maximum function performed the best. The max(tensor, axis=1)-function reduces the (Batchsize, 20)-tensor to an (Batchsize, 1)-tensor. The intuition behind reducing the 20 candidate probabilities with the maximum function to a single patient probability is, that the most \"cancerous\" nodule also determines the cancer likelihood of the whole patient. This final output scalar will be the prediction for a patient. This setup is directly end-to-end trainable from X candidates per patient to a single prediction per patient.</p>\n\n<p><strong>Additional notes on the multicandidate classifier</strong>: It is important to use a reduction function which is <strong>invariant to permutation of the candidates</strong> (Max, Average, Noisy-AND, ...) since their ordering is expected to be imperfect due to the fact that the segmentation network which produces the candidates is trained to predict <strong>all</strong> nodules, not only malignant ones. So when e.g. using an MLP to reduce the (Batchsize, 20) tensor to a single (Batchsize, 1) output, the classifier can actually fail when permutating the 20 candidates, since a individual weight is used for every candidate. A simple example with 5 candidates, where only one correlates with the actual patient label: A (0, cancer, 0, 0, 0) input should produce the same prediction as a (cancer, 0, 0, 0, 0) input. When having a relatively small dataset where it's necessary to combine multiple equivalent candidates one can greatly reduce overfitting effects by making the classifier invariant to those candidate permutations.</p>\n\n<p><strong>General Model Optimization:</strong> We did spend nearly no time optimizing the network architectures or optimizer parameters, since we simply ran out of time and the runs are lengthy.</p>",
      "rawMarkdown": "Hello guys, here we provide a first, quick overview over the 7th place solution. We will follow that up with a more detailed write-up, this just serves as a short methodological overview. Congrats to the top performing teams!\n\n**DL package**: We implemented all networks directly in tensorflow on ubuntu 14.04 machines.\n\n**Approach**: We solely relied on the nodule annotations of LUNA/LIDC and the dsb cancer labels for building our framework. The general approach can be divided into 3 main steps, namely:\n\n**1) Segmenting nodules:** We first trained a segmentation network (standard UNET architecture) with the LUNA/LIDC information to segment lungs nodules. The network was trained on random 128x128 crops of lung slices which were sampled randomly from all 3 room axis (not only axial) with the corresponding nodule annotation mask (we used elliptical annotations). We just sampled slices which section a nodule annotation. We treated every sampled slice as an independent data record. At prediction time we apply this network to all slices of a CT Scan **in all 3 room axis**. This leaves us with three 3D probability map tensors, which we simply average. This results in a single 3D probabilty map tensor for each lung CT scan.\n\n**2) Find nodule candidates:** We use an iterative cluster algorithm to find clusters in the 3D probability clouds from step 1). The main idea here was to threshold the 3D probability maps from the segmentation network with a low value (0.2) and run a clustering. This will result in probability cloud clusters of arbitrary size. If the size of a cluster exceeds the plausible nodule size, we further increase the threshold in this cloud and again run the clustering to detect single or multiple subclusters. We repeat this process until all probability cloud cluster is \"condensed\" to single clusters of a plausible nodule size. The center of these final clusters is used to extract a 64x64x64 region from this location from the lung. This will result in <100 candidates for each lung. We sort the candidate tensors with the sum of the probability contained in the 64x64x64 crop and **only use the first 20 candidates** for the final step.\n\n2.1) (optional / we wish we had) At this step it would be straight forward to apply an malignancy classification network to each of the extracted candidates and obtain a more meaningful candidate set for the final classifier. Unfortunately, we did not notice the malignancy information contained in the LIDC dataset. There is a good chance for improvement here.\n\n**3) Predict cancer on patient level**: From step 2) **we obtain 20 64x64x64 candidates for each patient** in the dsb dataset. We use those candidates to train a 3D resnet for cancer classification. We do not only use the pixel information from the lung CT scan but also the probability map information from the segmentation network as a second input channel. The intuition behind including the probability map from the segmentation network is that the segmentation is trained on larger patches (128x128) and has, therefore, more context information than the stage 2 classifier. By including the probability map the stage 2 classifier is able to reuse the extracted context information of the segmentation network, which is contained in the predicted segmentation maps.\n\nWe **feed the 20 candidates simultaneously** in the network. This means a single input record has the dimension (20,64,64,64,2), where the 1. dimension stands for the 20 candidates, 2nd-4th are the spatial dimensions, and the 5th dimension encodes the two channels (lung CT pixel information, 3D probability output from the segmentation net in stage1). We assign the dsb patient label to this 5D tensor, resulting in the following **datarecord-label-pair: (20,64,64,64,2) <-> cancer label**.\n\nThe network architecture is a 3D convolution network designed in a way that it reuses its weights in the candidate dimension. We did that by simply reshaping the candidate dimension into the batch dimension while training/predicting: (Batchsize,20,64,64,64,2) -> (Batchsize x 20,64,64,64,2). We then apply a resnet 3D network, which convolves the 3 spatial dimensions and reduces the input tensor with shape (Batchsize x 20,64,64,64,2) to an output tensor with dimension (Batchsize x 20, 1). On this tensor, we apply a sigmoid function the normalize the values. We reshape this tensor back to (Batchsize, 20) and **apply a reduction function** to arrive at a single probability for each patient. We experimented with a few different reduction functions, for example, Noisy-AND/Noisy-OR, but in practice, a simple maximum function performed the best. The max(tensor, axis=1)-function reduces the (Batchsize, 20)-tensor to an (Batchsize, 1)-tensor. The intuition behind reducing the 20 candidate probabilities with the maximum function to a single patient probability is, that the most \"cancerous\" nodule also determines the cancer likelihood of the whole patient. This final output scalar will be the prediction for a patient. This setup is directly end-to-end trainable from X candidates per patient to a single prediction per patient.\n\n**Additional notes on the multicandidate classifier**: It is important to use a reduction function which is **invariant to permutation of the candidates** (Max, Average, Noisy-AND, ...) since their ordering is expected to be imperfect due to the fact that the segmentation network which produces the candidates is trained to predict **all** nodules, not only malignant ones. So when e.g. using an MLP to reduce the (Batchsize, 20) tensor to a single (Batchsize, 1) output, the classifier can actually fail when permutating the 20 candidates, since a individual weight is used for every candidate. A simple example with 5 candidates, where only one correlates with the actual patient label: A (0, cancer, 0, 0, 0) input should produce the same prediction as a (cancer, 0, 0, 0, 0) input. When having a relatively small dataset where it's necessary to combine multiple equivalent candidates one can greatly reduce overfitting effects by making the classifier invariant to those candidate permutations.\n\n**General Model Optimization:** We did spend nearly no time optimizing the network architectures or optimizer parameters, since we simply ran out of time and the runs are lengthy.",
      "votes": 40
    },
    {
      "id": 175123,
      "postDate": "2017-04-13T21:39:28.623Z",
      "content": "<p>Congratulations! Very impressive results especially without using false positive reduction or malignancy labels. A couple of questions. 1) did you use lung segmentation at all? 2) when you sample slices training samples for nodule segmentation, did you centre the slice at the nodule centroid or randomly?</p>",
      "rawMarkdown": "Congratulations! Very impressive results especially without using false positive reduction or malignancy labels. A couple of questions. 1) did you use lung segmentation at all? 2) when you sample slices training samples for nodule segmentation, did you centre the slice at the nodule centroid or randomly?",
      "votes": 1,
      "replies": [
        {
          "id": 175183,
          "postDate": "2017-04-14T06:43:00.057Z",
          "content": "<p>Thanks! \n1) Yes, we used a lung segmentation to reduce the computation load. We did it with a segmentation network, for which we annotated around 40 lungs manually. We then cropped each lung to the smallest rectangle which contains both lung wings. Using a network was actually the fastest way for us to get robust results.\n2) We used all slices for training which section the nodule annotation centroid, not just the center. From these sectioning slices, we cropped an 128x128 pxl area randomly. We resampled all Scans to 1x1x1 mm resolution for the segmentation.</p>",
          "rawMarkdown": "Thanks! \n1) Yes, we used a lung segmentation to reduce the computation load. We did it with a segmentation network, for which we annotated around 40 lungs manually. We then cropped each lung to the smallest rectangle which contains both lung wings. Using a network was actually the fastest way for us to get robust results.\n2) We used all slices for training which section the nodule annotation centroid, not just the center. From these sectioning slices, we cropped an 128x128 pxl area randomly. We resampled all Scans to 1x1x1 mm resolution for the segmentation.",
          "votes": 1
        }
      ]
    },
    {
      "id": 255866,
      "postDate": "2017-12-10T11:58:55.590Z",
      "content": "<p>Hi Niklas Köhler, </p>\n\n<p>I tried your ideal \"We do not only use the pixel information from the lung CT scan but also the probability map information from the segmentation network as a second input channel\" in lung nodule detection task, and the performance is improved. I want to employ the ideal in my paper. Do you publish any paper about it? Then I can cite it.</p>\n\n<p>Thanks.</p>\n\n<p>Ling.</p>",
      "rawMarkdown": "Hi Niklas Köhler, \n\nI tried your ideal \"We do not only use the pixel information from the lung CT scan but also the probability map information from the segmentation network as a second input channel\" in lung nodule detection task, and the performance is improved. I want to employ the ideal in my paper. Do you publish any paper about it? Then I can cite it.\n\nThanks.\n\nLing."
    },
    {
      "id": 226376,
      "postDate": "2017-10-02T04:03:27.817Z",
      "content": "<p>hi,Niklas Köhler. Congratulations! Thank you for sharing your codes in github.\nI have a question to ask you.\nI found you use a python package 'hellsicht'. Could you provide it?  Or what can be replacement?\nThanks!</p>",
      "rawMarkdown": "hi,Niklas Köhler. Congratulations! Thank you for sharing your codes in github.\nI have a question to ask you.\nI found you use a python package 'hellsicht'. Could you provide it?  Or what can be replacement?\nThanks!"
    },
    {
      "id": 221857,
      "postDate": "2017-09-16T14:21:15.010Z",
      "rawMarkdown": ""
    },
    {
      "id": 180588,
      "postDate": "2017-05-06T02:46:43.273Z",
      "content": "<p>Congratulations! I have a question: what kind of clustering algorithm did you employ? Thanks.</p>",
      "rawMarkdown": "Congratulations! I have a question: what kind of clustering algorithm did you employ? Thanks.",
      "replies": [
        {
          "id": 181368,
          "postDate": "2017-05-09T09:11:21.473Z",
          "content": "<p>We used the sklearn implementation of DBSCAN:\n<a href=\"http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html\">http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html</a></p>",
          "rawMarkdown": "We used the sklearn implementation of DBSCAN:\nhttp://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html",
          "votes": 1
        }
      ]
    },
    {
      "id": 175388,
      "postDate": "2017-04-15T06:55:39.067Z",
      "content": "<p>Really nice works. Thanks for sharing it. We only used 2 candidates to train a 2-channel CNN(I tried 3, but it was worse than 2).  You did much better than us to use 20 candidates(multicandidate classifier) and probability map. We am curious about the improvement of using probability map. Do you compared the result of using or not using this? We inspect the values in our probability maps, they are around 0.95 or 0.05(very big or very small). So we thought it did not contained much information and did not use it. But it turns out to be a bad decision compared to your work.</p>",
      "rawMarkdown": "Really nice works. Thanks for sharing it. We only used 2 candidates to train a 2-channel CNN(I tried 3, but it was worse than 2).  You did much better than us to use 20 candidates(multicandidate classifier) and probability map. We am curious about the improvement of using probability map. Do you compared the result of using or not using this? We inspect the values in our probability maps, they are around 0.95 or 0.05(very big or very small). So we thought it did not contained much information and did not use it. But it turns out to be a bad decision compared to your work.",
      "replies": [
        {
          "id": 175824,
          "postDate": "2017-04-17T18:20:29.113Z",
          "content": "<p>Thanks! Including the probability maps lowered the error on our local holdout set from around 0.46 to 0.44 and significantly reduced training time. The networks trained with probability map inputs needed half of the training epochs to converge. This was especially helpful for the 3D networks, which train about 10hours. We have two main explanation attempts why the maps improve performance:</p>\n\n<p>1) Since we trained the segmentation network on a larger patch of the lung slice, the probability map can contain more context information than the actually crop, which the classifier has as input. Here is an example for illustration: The segmentation network can recognize a certain nodule because its characteristic distance to the lung wall and draws a higher/larger/... probability map. When cropping the nodule with a smaller crop size, the wall vanishes as well as the crucial hypothetical distance feature. This would lead to a worse prediction. The same logic applies for example for pairs of nodules. Where the existence of a second nodule raises the probability for the first one. By including the probability map of the segmentation network, the \"out of crop range\"-features can still be considered by the classification network. </p>\n\n<p>2) The segmentation map can be used as an \"attention\" mechanism for the second classification network. By looking at the segmentation map the classification network has a trivial indicator which pixels in the input are the most important ones - namely the ones where the probability map channel has non-zero values. Since we have a very limited amount of training data this can counteract overfitting, since it favors the generalizing solution (looking at the nodules) for classifying cancer, instead of remembering e.g. characteristic pixels in the upper left corner of the input and simply remembering that this patient has cancer (which of course would not translate to unknown data).</p>\n\n<p>Of course these reason are just very rough, first ideas, but they maybe give an intuition about why the maps actually can help. Your argument with the very extreme values either at 0 or 1 (if true on all maps, haven't checked that yet) make my first point less likely, but in principle even the difference between 0.95 and 0.99 in the map could make a difference.  One could actually test that easily by setting everything above 0.9 to 1.0 and measure the performance again.</p>",
          "rawMarkdown": "Thanks! Including the probability maps lowered the error on our local holdout set from around 0.46 to 0.44 and significantly reduced training time. The networks trained with probability map inputs needed half of the training epochs to converge. This was especially helpful for the 3D networks, which train about 10hours. We have two main explanation attempts why the maps improve performance:\n\n1) Since we trained the segmentation network on a larger patch of the lung slice, the probability map can contain more context information than the actually crop, which the classifier has as input. Here is an example for illustration: The segmentation network can recognize a certain nodule because its characteristic distance to the lung wall and draws a higher/larger/... probability map. When cropping the nodule with a smaller crop size, the wall vanishes as well as the crucial hypothetical distance feature. This would lead to a worse prediction. The same logic applies for example for pairs of nodules. Where the existence of a second nodule raises the probability for the first one. By including the probability map of the segmentation network, the \"out of crop range\"-features can still be considered by the classification network. \n\n2) The segmentation map can be used as an \"attention\" mechanism for the second classification network. By looking at the segmentation map the classification network has a trivial indicator which pixels in the input are the most important ones - namely the ones where the probability map channel has non-zero values. Since we have a very limited amount of training data this can counteract overfitting, since it favors the generalizing solution (looking at the nodules) for classifying cancer, instead of remembering e.g. characteristic pixels in the upper left corner of the input and simply remembering that this patient has cancer (which of course would not translate to unknown data).\n\nOf course these reason are just very rough, first ideas, but they maybe give an intuition about why the maps actually can help. Your argument with the very extreme values either at 0 or 1 (if true on all maps, haven't checked that yet) make my first point less likely, but in principle even the difference between 0.95 and 0.99 in the map could make a difference.  One could actually test that easily by setting everything above 0.9 to 1.0 and measure the performance again.\n",
          "votes": 1
        }
      ]
    },
    {
      "id": 175186,
      "postDate": "2017-04-14T07:19:42.407Z",
      "content": "<p>Congratulations DL Munich Team and Niklas Köhler. I find this a unique approach and with lots of thought going in defining the network structure and other algorithms.\nA quick question - What kind of GPUs/RAM were required that can do such kind of processing? Can you please share the hardware specs that you used?</p>",
      "rawMarkdown": "Congratulations DL Munich Team and Niklas Köhler. I find this a unique approach and with lots of thought going in defining the network structure and other algorithms.\nA quick question - What kind of GPUs/RAM were required that can do such kind of processing? Can you please share the hardware specs that you used?",
      "replies": [
        {
          "id": 175218,
          "postDate": "2017-04-14T11:31:48.700Z",
          "content": "<p>Thanks! The machine we ran the final pipeline on was a Ubuntu 14.04 system with 32GB of RAM, an \ni7-4930K and a single GTX 1080. The entire preprocessing + network training + prediction takes around 72hours on this machine.</p>",
          "rawMarkdown": "Thanks! The machine we ran the final pipeline on was a Ubuntu 14.04 system with 32GB of RAM, an \ni7-4930K and a single GTX 1080. The entire preprocessing + network training + prediction takes around 72hours on this machine.",
          "votes": 1
        }
      ]
    }
  ],
  "complete": true,
  "source": "live",
  "fetched_at": "2026-10-22T09:16:03Z",
  "competition_id": 6004,
  "competition_slug": "data-science-bowl-2017",
  "team_id": 448463,
  "solution_url": "/competitions/data-science-bowl-2017/writeups/dl-munich-7th-place-short-overview"
}