{
  "id": 58782,
  "title": "Some results with PointNet",
  "url": "/competitions/trackml-particle-identification/discussion/58782",
  "author_name": "",
  "post_date": "2018-06-13T15:27:54.430591600Z",
  "votes": 12,
  "comment_count": 13,
  "views": 0,
  "content": "<p>I have been working with PointNet since the third week of this challenge and I have reached this far.\nIt is not enough to go as far as to make a submission and as time is passing I may never reach that far.</p>\n\n<p>Because of the structure of the code I use:   <a href=\"https://github.com/lyj19940105/pointnet-keras\">https://github.com/lyj19940105/pointnet-keras</a> </p>\n\n<p>I decided the the most adventurous change on it would be in the last FC layers. That forced me to work with events of no more that 256 tracks.   I work with events in bins of transverse momentum:</p>\n\n<p>Pt&gt;2.5 GeV/c for the high momentum tracks and Pt between 1.15 and 1.25 GeV/c for intermediate momenta.</p>\n\n<p>Following the structure of the PointNet model, the training input are arrays that contain the Hough transformed point coordinates and the truth is the index of the track (as they appear in the input files) presented as one-hot vectors.</p>\n\n<p>I used categorical_crossentropy as loss and accuracy as metric.</p>\n\n<p>Training had to be done with GPU and even then, each momentum bin needed more that 10 hours to reach  training accuracy of ~35% and val_acc at ~23 for Pt&gt;2.5 GeV/c:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_last20ep_pt2p5.png\" alt=\"TensorBoard Pt&gt;2.5GeV/c\"></p>\n\n<p>The figure below shows the display for one event from the validation set with transverse momentum  between 1.15 and 1.25 GeV/c bin and it should show a single track (165th in that event):</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_1p15_1p25.png\" alt=\"Event 1 1.15&lt;Pt&lt;1.25 GeV/c\"></p>\n\n<p>This is anecdotal evidence that PointNet can recognize the pattern of tracks. And that is a source of satisfaction to me. But why so many tracks? I tried adding thresholds to the softmax predictions but have not been successful in cleaning up the event.</p>\n\n<p>I know that it is getting late to get a decent submission, I wish this topic gets some comments from others using PointNet. Thanks</p>\n\n<p>p.s. I will update this entry as I go along, my goal is to use score_event on my results, maybe that will help with the debugging.</p>",
  "messages": [
    {
      "id": "342486",
      "postDate": "06/13/2018 15:27:54",
      "content": "<p>I have been working with PointNet since the third week of this challenge and I have reached this far.\nIt is not enough to go as far as to make a submission and as time is passing I may never reach that far.</p>\n\n<p>Because of the structure of the code I use:   <a href=\"https://github.com/lyj19940105/pointnet-keras\">https://github.com/lyj19940105/pointnet-keras</a> </p>\n\n<p>I decided the the most adventurous change on it would be in the last FC layers. That forced me to work with events of no more that 256 tracks.   I work with events in bins of transverse momentum:</p>\n\n<p>Pt&gt;2.5 GeV/c for the high momentum tracks and Pt between 1.15 and 1.25 GeV/c for intermediate momenta.</p>\n\n<p>Following the structure of the PointNet model, the training input are arrays that contain the Hough transformed point coordinates and the truth is the index of the track (as they appear in the input files) presented as one-hot vectors.</p>\n\n<p>I used categorical_crossentropy as loss and accuracy as metric.</p>\n\n<p>Training had to be done with GPU and even then, each momentum bin needed more that 10 hours to reach  training accuracy of ~35% and val_acc at ~23 for Pt&gt;2.5 GeV/c:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_last20ep_pt2p5.png\" alt=\"TensorBoard Pt&gt;2.5GeV/c\"></p>\n\n<p>The figure below shows the display for one event from the validation set with transverse momentum  between 1.15 and 1.25 GeV/c bin and it should show a single track (165th in that event):</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_1p15_1p25.png\" alt=\"Event 1 1.15&lt;Pt&lt;1.25 GeV/c\"></p>\n\n<p>This is anecdotal evidence that PointNet can recognize the pattern of tracks. And that is a source of satisfaction to me. But why so many tracks? I tried adding thresholds to the softmax predictions but have not been successful in cleaning up the event.</p>\n\n<p>I know that it is getting late to get a decent submission, I wish this topic gets some comments from others using PointNet. Thanks</p>\n\n<p>p.s. I will update this entry as I go along, my goal is to use score_event on my results, maybe that will help with the debugging.</p>",
      "rawMarkdown": "I have been working with PointNet since the third week of this challenge and I have reached this far.\nIt is not enough to go as far as to make a submission and as time is passing I may never reach that far.\n\nBecause of the structure of the code I use:   https://github.com/lyj19940105/pointnet-keras \n\nI decided the the most adventurous change on it would be in the last FC layers. That forced me to work with events of no more that 256 tracks.   I work with events in bins of transverse momentum:\n\n\nPt&gt;2.5 GeV/c for the high momentum tracks and Pt between 1.15 and 1.25 GeV/c for intermediate momenta.\n\nFollowing the structure of the PointNet model, the training input are arrays that contain the Hough transformed point coordinates and the truth is the index of the track (as they appear in the input files) presented as one-hot vectors.\n\nI used categorical_crossentropy as loss and accuracy as metric.\n\nTraining had to be done with GPU and even then, each momentum bin needed more that 10 hours to reach  training accuracy of ~35% and val_acc at ~23 for Pt&gt;2.5 GeV/c:\n\n![TensorBoard Pt&gt;2.5GeV/c][1]\n\n\nThe figure below shows the display for one event from the validation set with transverse momentum  between 1.15 and 1.25 GeV/c bin and it should show a single track (165th in that event):\n\n![Event 1 1.15",
      "votes": null
    },
    {
      "id": "343014",
      "postDate": "06/14/2018 14:54:54",
      "content": "<p>I tried to update my previous entry but it got garbled. \nHere I want to add the corresponding figures for tracks with transverse momentum greater that 2.5 GeV/c:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_Pt2p5_trck188.png\" alt=\"Clean track \"></p>\n\n<p>The figure above should be the expected outcome of prediction with a single track.</p>\n\n<p>Unfortunately, the same event produces the figure below:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_pt2p5_trk180.png\" alt=\"A &quot;star&quot; in the same event\"></p>\n\n<p>This looks disappointing, but the fact that the model is picking up aligned sets of points is tantalizing.</p>\n\n<p>I continue to looks for possible bugs introduced by the user. </p>",
      "rawMarkdown": "I tried to update my previous entry but it got garbled. \nHere I want to add the corresponding figures for tracks with transverse momentum greater that 2.5 GeV/c:\n\n![Clean track ][1]\n\nThe figure above should be the expected outcome of prediction with a single track.\n\nUnfortunately, the same event produces the figure below:\n\n![A \"star\" in the same event][2]\n\nThis looks disappointing, but the fact that the model is picking up aligned sets of points is tantalizing.\n\nI continue to looks for possible bugs introduced by the user. \n\n\n  [1]: https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_Pt2p5_trck188.png\n  [2]: https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_pt2p5_trk180.png",
      "votes": null
    },
    {
      "id": "343017",
      "postDate": "06/14/2018 15:05:02",
      "content": "<p>HI, how do you know the momentum for test data?</p>",
      "rawMarkdown": "HI, how do you know the momentum for test data?",
      "votes": null
    },
    {
      "id": "343064",
      "postDate": "06/14/2018 16:42:13",
      "content": "<p>I haven't touched the test data yet. I take 20% of train_1 to make my validation set, the model is not trained with those events.</p>",
      "rawMarkdown": "I haven't touched the test data yet. I take 20% of train_1 to make my validation set, the model is not trained with those events.",
      "votes": null
    },
    {
      "id": "343066",
      "postDate": "06/14/2018 16:47:16",
      "content": "<p>I am just looking to see if PointNet can find tracks. Splitting the input in momentum bin for training is fine so far. I do not know yet how to combine the weights and do predictions on the test set. It may be that the only solution is to train the complete events. I was hoping to get some advice from PointNet authors and other to see how much one can modify the model. I think one could increase the maximum number of filters in the 1D convolutions</p>",
      "rawMarkdown": "I am just looking to see if PointNet can find tracks. Splitting the input in momentum bin for training is fine so far. I do not know yet how to combine the weights and do predictions on the test set. It may be that the only solution is to train the complete events. I was hoping to get some advice from PointNet authors and other to see how much one can modify the model. I think one could increase the maximum number of filters in the 1D convolutions",
      "votes": null
    },
    {
      "id": "343077",
      "postDate": "06/14/2018 17:03:29",
      "content": "<p>OK, I may have misunderstood.  You split training data using momentum.  Question is: isn't this leading to models that can only score data split by momentum?  In that case then you cannot score test data as we don't have the momentum there.</p>\n\n<p>I'm happy to be entirely wrong ;)</p>",
      "rawMarkdown": "OK, I may have misunderstood.  You split training data using momentum.  Question is: isn't this leading to models that can only score data split by momentum?  In that case then you cannot score test data as we don't have the momentum there.\n\nI'm happy to be entirely wrong ;)",
      "votes": null
    },
    {
      "id": "343086",
      "postDate": "06/14/2018 17:14:03",
      "content": "<p>You are right. My thinking so far was that I would train the model piece-wise with momentum cuts.\nI do not know yet how to merge the different weights. The more I think about this,  it looks like the only simple solution is to modify the model parameters and train trained with complete events.  </p>",
      "rawMarkdown": "You are right. My thinking so far was that I would train the model piece-wise with momentum cuts.\nI do not know yet how to merge the different weights. The more I think about this,  it looks like the only simple solution is to modify the model parameters and train trained with complete events.",
      "votes": null
    },
    {
      "id": "343970",
      "postDate": "06/16/2018 16:05:05",
      "content": "<p>Thanks for sharing @Ramiro, the biggest challenge of this competition is, as @CPMP pointed out, train data and test data have different features, that means we have to train a DL model only using the features shared with the test data as well. (I'd be very happy to be wrong too). So only coordinates, detector (volume, module, layer, cell) IDs can be used. This makes supervised learning really challenging. Any thoughts are highly welcome. </p>",
      "rawMarkdown": "Thanks for sharing @Ramiro, the biggest challenge of this competition is, as @CPMP pointed out, train data and test data have different features, that means we have to train a DL model only using the features shared with the test data as well. (I'd be very happy to be wrong too). So only coordinates, detector (volume, module, layer, cell) IDs can be used. This makes supervised learning really challenging. Any thoughts are highly welcome.",
      "votes": null
    },
    {
      "id": "343981",
      "postDate": "06/16/2018 16:39:47",
      "content": "<p>Hi,</p>\n\n<p>Is your implementation of a Point Net more of a classification network or a segmentation network? Does the model predict the track id for a group of points or does it predict the track id for each point? </p>\n\n<p>Thanks</p>",
      "rawMarkdown": "Hi,\n\nIs your implementation of a Point Net more of a classification network or a segmentation network? Does the model predict the track id for a group of points or does it predict the track id for each point? \n\nThanks",
      "votes": null
    },
    {
      "id": "344043",
      "postDate": "06/16/2018 20:14:34",
      "content": "<p>Hi Nicole,\nI agree with you and @CPMP, I'm now exploring the possible splitting of the data using the polar angle of the input (as suggested by @Heng CherKeng in the diagram of <a href=\"https://www.kaggle.com/c/trackml-particle-identification/discussion/58623#343861\">https://www.kaggle.com/c/trackml-particle-identification/discussion/58623#343861</a>).</p>\n\n<p>Actual particles get bent in the transverse plane and tend to keep their polar angle constant (barring  the effect of multiple scattering which should be small). </p>\n\n<p>As I write this I realize that my first attempt at using polar angle will need to include the fact that particles originate from a distribution of vertices that spreads with gaussian sigma=55mm. </p>",
      "rawMarkdown": "Hi Nicole,\nI agree with you and @CPMP, I'm now exploring the possible splitting of the data using the polar angle of the input (as suggested by @Heng CherKeng in the diagram of https://www.kaggle.com/c/trackml-particle-identification/discussion/58623#343861).\n\nActual particles get bent in the transverse plane and tend to keep their polar angle constant (barring  the effect of multiple scattering which should be small). \n\nAs I write this I realize that my first attempt at using polar angle will need to include the fact that particles originate from a distribution of vertices that spreads with gaussian sigma=55mm.",
      "votes": null
    },
    {
      "id": "344047",
      "postDate": "06/16/2018 20:25:13",
      "content": "<p>Hi,\nI'm using PointNet in its segmentation 'incarnation'. The output gives me the track id for every point. </p>\n\n<p>A problem may arise from the fact that tracks are uniformly distributed along several parameters, we are not dealing with a finite set of classes as is the case in other  classification or segmentation projects.</p>",
      "rawMarkdown": "Hi,\nI'm using PointNet in its segmentation 'incarnation'. The output gives me the track id for every point. \n\nA problem may arise from the fact that tracks are uniformly distributed along several parameters, we are not dealing with a finite set of classes as is the case in other  classification or segmentation projects.",
      "votes": null
    },
    {
      "id": "344399",
      "postDate": "06/17/2018 21:57:05",
      "content": "<p>first note that there are pointnet (single scale) and pointnet++ (multi-scale)</p>\n\n<p>next, here are a few ways to formulate the problem:</p>\n\n<ul>\n<li>a. instance segmentation: find a way to generate possible groups of hits. Given a group = instance = { h1, h2, h3 ... hN}, most of its hits belong to a single track. Some of the hits may be noise. Then:</li>\n</ul>\n\n<p>{ h1, h2, h3 ... hN} --&gt; pointnet --&gt; {1,1,0,0,...1}</p>\n\n<p>1 and 0 mean if the hit belongs to the track or not. </p>\n\n<ul>\n<li>b. semantic segmentation. For each, we want to classify them as : {noise, start of track, end of track, part of track}, { direction of track, if it is part of track}. The point net has two output.</li>\n</ul>\n\n<p>Then</p>\n\n<p>{ h1, h2, h3 ... hN... all hits in a cone slice}  --&gt; pointnet --&gt; {0,1,0,2 ...} , {  .... 1_degree,  ....4_degree ...}</p>\n\n<p>finally, in post processing, link the tracks from start to end using direction information. It is also possible to use LSTM for post processing</p>\n\n<ul>\n<li><p>c.  semantic segmentation. Instead of hits, we consider \"pair of hits\". let pij = directed link from hit_i to hit_j:</p>\n\n<p>{ p12, p13, .......}  --&gt;   pointnet --&gt; {0,1,0,1 ...} , </p></li>\n</ul>\n\n<p>1 and 0 mean if the pair is link or not.  </p>",
      "rawMarkdown": "first note that there are pointnet (single scale) and pointnet++ (multi-scale)\n\nnext, here are a few ways to formulate the problem:\n\n  - a. instance segmentation: find a way to generate possible groups of hits. Given a group = instance = { h1, h2, h3 ... hN}, most of its hits belong to a single track. Some of the hits may be noise. Then:\n\n{ h1, h2, h3 ... hN} --&gt; pointnet --&gt; {1,1,0,0,...1}\n\n1 and 0 mean if the hit belongs to the track or not. \n\n\n  - b. semantic segmentation. For each, we want to classify them as : {noise, start of track, end of track, part of track}, { direction of track, if it is part of track}. The point net has two output.\n\nThen\n\n{ h1, h2, h3 ... hN... all hits in a cone slice}  --&gt; pointnet --&gt; {0,1,0,2 ...} , {  .... 1_degree,  ....4_degree ...}\n\nfinally, in post processing, link the tracks from start to end using direction information. It is also possible to use LSTM for post processing\n\n\n  - c.  semantic segmentation. Instead of hits, we consider \"pair of hits\". let pij = directed link from hit_i to hit_j:\n\n   { p12, p13, .......}  --&gt;   pointnet --&gt; {0,1,0,1 ...} , \n\n1 and 0 mean if the pair is link or not.",
      "votes": null
    },
    {
      "id": "347808",
      "postDate": "06/25/2018 13:16:46",
      "content": "<p>Thanks for sharing <a href=\"/ramiro\">@ramiro</a>! I was wondering if you had made any more progress on this?</p>",
      "rawMarkdown": "Thanks for sharing @ramiro! I was wondering if you had made any more progress on this?",
      "votes": null
    },
    {
      "id": "347881",
      "postDate": "06/25/2018 15:46:59",
      "content": "<p>Hi @Seb,\nI'm now trying to do something similar with PointNet++ but I'm moving slowly. Thanks for your interest.</p>",
      "rawMarkdown": "Hi @Seb,\nI'm now trying to do something similar with PointNet++ but I'm moving slowly. Thanks for your interest.",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 343014,
      "author_name": "rdebbe",
      "author_url": "",
      "post_date": "06/14/2018 14:54:54",
      "content": "<p>I tried to update my previous entry but it got garbled. \nHere I want to add the corresponding figures for tracks with transverse momentum greater that 2.5 GeV/c:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_Pt2p5_trck188.png\" alt=\"Clean track \"></p>\n\n<p>The figure above should be the expected outcome of prediction with a single track.</p>\n\n<p>Unfortunately, the same event produces the figure below:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_pt2p5_trk180.png\" alt=\"A &quot;star&quot; in the same event\"></p>\n\n<p>This looks disappointing, but the fact that the model is picking up aligned sets of points is tantalizing.</p>\n\n<p>I continue to looks for possible bugs introduced by the user. </p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 343017,
      "author_name": "cpmpml",
      "author_url": "",
      "post_date": "06/14/2018 15:05:02",
      "content": "<p>HI, how do you know the momentum for test data?</p>",
      "votes": null,
      "replies": [
        {
          "id": 343064,
          "author_name": "rdebbe",
          "author_url": "",
          "post_date": "06/14/2018 16:42:13",
          "content": "<p>I haven't touched the test data yet. I take 20% of train_1 to make my validation set, the model is not trained with those events.</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 343066,
          "author_name": "rdebbe",
          "author_url": "",
          "post_date": "06/14/2018 16:47:16",
          "content": "<p>I am just looking to see if PointNet can find tracks. Splitting the input in momentum bin for training is fine so far. I do not know yet how to combine the weights and do predictions on the test set. It may be that the only solution is to train the complete events. I was hoping to get some advice from PointNet authors and other to see how much one can modify the model. I think one could increase the maximum number of filters in the 1D convolutions</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 343077,
          "author_name": "cpmpml",
          "author_url": "",
          "post_date": "06/14/2018 17:03:29",
          "content": "<p>OK, I may have misunderstood.  You split training data using momentum.  Question is: isn't this leading to models that can only score data split by momentum?  In that case then you cannot score test data as we don't have the momentum there.</p>\n\n<p>I'm happy to be entirely wrong ;)</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 343086,
          "author_name": "rdebbe",
          "author_url": "",
          "post_date": "06/14/2018 17:14:03",
          "content": "<p>You are right. My thinking so far was that I would train the model piece-wise with momentum cuts.\nI do not know yet how to merge the different weights. The more I think about this,  it looks like the only simple solution is to modify the model parameters and train trained with complete events.  </p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 343970,
      "author_name": "nicolefinnie",
      "author_url": "",
      "post_date": "06/16/2018 16:05:05",
      "content": "<p>Thanks for sharing @Ramiro, the biggest challenge of this competition is, as @CPMP pointed out, train data and test data have different features, that means we have to train a DL model only using the features shared with the test data as well. (I'd be very happy to be wrong too). So only coordinates, detector (volume, module, layer, cell) IDs can be used. This makes supervised learning really challenging. Any thoughts are highly welcome. </p>",
      "votes": null,
      "replies": [
        {
          "id": 344043,
          "author_name": "rdebbe",
          "author_url": "",
          "post_date": "06/16/2018 20:14:34",
          "content": "<p>Hi Nicole,\nI agree with you and @CPMP, I'm now exploring the possible splitting of the data using the polar angle of the input (as suggested by @Heng CherKeng in the diagram of <a href=\"https://www.kaggle.com/c/trackml-particle-identification/discussion/58623#343861\">https://www.kaggle.com/c/trackml-particle-identification/discussion/58623#343861</a>).</p>\n\n<p>Actual particles get bent in the transverse plane and tend to keep their polar angle constant (barring  the effect of multiple scattering which should be small). </p>\n\n<p>As I write this I realize that my first attempt at using polar angle will need to include the fact that particles originate from a distribution of vertices that spreads with gaussian sigma=55mm. </p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 343981,
      "author_name": "bkkaggle",
      "author_url": "",
      "post_date": "06/16/2018 16:39:47",
      "content": "<p>Hi,</p>\n\n<p>Is your implementation of a Point Net more of a classification network or a segmentation network? Does the model predict the track id for a group of points or does it predict the track id for each point? </p>\n\n<p>Thanks</p>",
      "votes": null,
      "replies": [
        {
          "id": 344047,
          "author_name": "rdebbe",
          "author_url": "",
          "post_date": "06/16/2018 20:25:13",
          "content": "<p>Hi,\nI'm using PointNet in its segmentation 'incarnation'. The output gives me the track id for every point. </p>\n\n<p>A problem may arise from the fact that tracks are uniformly distributed along several parameters, we are not dealing with a finite set of classes as is the case in other  classification or segmentation projects.</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 344399,
      "author_name": "hengck23",
      "author_url": "",
      "post_date": "06/17/2018 21:57:05",
      "content": "<p>first note that there are pointnet (single scale) and pointnet++ (multi-scale)</p>\n\n<p>next, here are a few ways to formulate the problem:</p>\n\n<ul>\n<li>a. instance segmentation: find a way to generate possible groups of hits. Given a group = instance = { h1, h2, h3 ... hN}, most of its hits belong to a single track. Some of the hits may be noise. Then:</li>\n</ul>\n\n<p>{ h1, h2, h3 ... hN} --&gt; pointnet --&gt; {1,1,0,0,...1}</p>\n\n<p>1 and 0 mean if the hit belongs to the track or not. </p>\n\n<ul>\n<li>b. semantic segmentation. For each, we want to classify them as : {noise, start of track, end of track, part of track}, { direction of track, if it is part of track}. The point net has two output.</li>\n</ul>\n\n<p>Then</p>\n\n<p>{ h1, h2, h3 ... hN... all hits in a cone slice}  --&gt; pointnet --&gt; {0,1,0,2 ...} , {  .... 1_degree,  ....4_degree ...}</p>\n\n<p>finally, in post processing, link the tracks from start to end using direction information. It is also possible to use LSTM for post processing</p>\n\n<ul>\n<li><p>c.  semantic segmentation. Instead of hits, we consider \"pair of hits\". let pij = directed link from hit_i to hit_j:</p>\n\n<p>{ p12, p13, .......}  --&gt;   pointnet --&gt; {0,1,0,1 ...} , </p></li>\n</ul>\n\n<p>1 and 0 mean if the pair is link or not.  </p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 347808,
      "author_name": "sjb1988",
      "author_url": "",
      "post_date": "06/25/2018 13:16:46",
      "content": "<p>Thanks for sharing <a href=\"/ramiro\">@ramiro</a>! I was wondering if you had made any more progress on this?</p>",
      "votes": null,
      "replies": [
        {
          "id": 347881,
          "author_name": "rdebbe",
          "author_url": "",
          "post_date": "06/25/2018 15:46:59",
          "content": "<p>Hi @Seb,\nI'm now trying to do something similar with PointNet++ but I'm moving slowly. Thanks for your interest.</p>",
          "votes": null,
          "replies": []
        }
      ]
    }
  ],
  "raw_markdown_by_id": {
    "342486": "I have been working with PointNet since the third week of this challenge and I have reached this far.\nIt is not enough to go as far as to make a submission and as time is passing I may never reach that far.\n\nBecause of the structure of the code I use:   https://github.com/lyj19940105/pointnet-keras \n\nI decided the the most adventurous change on it would be in the last FC layers. That forced me to work with events of no more that 256 tracks.   I work with events in bins of transverse momentum:\n\n\nPt&gt;2.5 GeV/c for the high momentum tracks and Pt between 1.15 and 1.25 GeV/c for intermediate momenta.\n\nFollowing the structure of the PointNet model, the training input are arrays that contain the Hough transformed point coordinates and the truth is the index of the track (as they appear in the input files) presented as one-hot vectors.\n\nI used categorical_crossentropy as loss and accuracy as metric.\n\nTraining had to be done with GPU and even then, each momentum bin needed more that 10 hours to reach  training accuracy of ~35% and val_acc at ~23 for Pt&gt;2.5 GeV/c:\n\n![TensorBoard Pt&gt;2.5GeV/c][1]\n\n\nThe figure below shows the display for one event from the validation set with transverse momentum  between 1.15 and 1.25 GeV/c bin and it should show a single track (165th in that event):\n\n![Event 1 1.15",
    "343014": "I tried to update my previous entry but it got garbled. \nHere I want to add the corresponding figures for tracks with transverse momentum greater that 2.5 GeV/c:\n\n![Clean track ][1]\n\nThe figure above should be the expected outcome of prediction with a single track.\n\nUnfortunately, the same event produces the figure below:\n\n![A \"star\" in the same event][2]\n\nThis looks disappointing, but the fact that the model is picking up aligned sets of points is tantalizing.\n\nI continue to looks for possible bugs introduced by the user. \n\n\n  [1]: https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_Pt2p5_trck188.png\n  [2]: https://storage.googleapis.com/kaggle_trackml_debbe/PointNet_pt2p5_trk180.png",
    "343017": "HI, how do you know the momentum for test data?",
    "343064": "I haven't touched the test data yet. I take 20% of train_1 to make my validation set, the model is not trained with those events.",
    "343066": "I am just looking to see if PointNet can find tracks. Splitting the input in momentum bin for training is fine so far. I do not know yet how to combine the weights and do predictions on the test set. It may be that the only solution is to train the complete events. I was hoping to get some advice from PointNet authors and other to see how much one can modify the model. I think one could increase the maximum number of filters in the 1D convolutions",
    "343077": "OK, I may have misunderstood.  You split training data using momentum.  Question is: isn't this leading to models that can only score data split by momentum?  In that case then you cannot score test data as we don't have the momentum there.\n\nI'm happy to be entirely wrong ;)",
    "343086": "You are right. My thinking so far was that I would train the model piece-wise with momentum cuts.\nI do not know yet how to merge the different weights. The more I think about this,  it looks like the only simple solution is to modify the model parameters and train trained with complete events.",
    "343970": "Thanks for sharing @Ramiro, the biggest challenge of this competition is, as @CPMP pointed out, train data and test data have different features, that means we have to train a DL model only using the features shared with the test data as well. (I'd be very happy to be wrong too). So only coordinates, detector (volume, module, layer, cell) IDs can be used. This makes supervised learning really challenging. Any thoughts are highly welcome.",
    "343981": "Hi,\n\nIs your implementation of a Point Net more of a classification network or a segmentation network? Does the model predict the track id for a group of points or does it predict the track id for each point? \n\nThanks",
    "344043": "Hi Nicole,\nI agree with you and @CPMP, I'm now exploring the possible splitting of the data using the polar angle of the input (as suggested by @Heng CherKeng in the diagram of https://www.kaggle.com/c/trackml-particle-identification/discussion/58623#343861).\n\nActual particles get bent in the transverse plane and tend to keep their polar angle constant (barring  the effect of multiple scattering which should be small). \n\nAs I write this I realize that my first attempt at using polar angle will need to include the fact that particles originate from a distribution of vertices that spreads with gaussian sigma=55mm.",
    "344047": "Hi,\nI'm using PointNet in its segmentation 'incarnation'. The output gives me the track id for every point. \n\nA problem may arise from the fact that tracks are uniformly distributed along several parameters, we are not dealing with a finite set of classes as is the case in other  classification or segmentation projects.",
    "344399": "first note that there are pointnet (single scale) and pointnet++ (multi-scale)\n\nnext, here are a few ways to formulate the problem:\n\n  - a. instance segmentation: find a way to generate possible groups of hits. Given a group = instance = { h1, h2, h3 ... hN}, most of its hits belong to a single track. Some of the hits may be noise. Then:\n\n{ h1, h2, h3 ... hN} --&gt; pointnet --&gt; {1,1,0,0,...1}\n\n1 and 0 mean if the hit belongs to the track or not. \n\n\n  - b. semantic segmentation. For each, we want to classify them as : {noise, start of track, end of track, part of track}, { direction of track, if it is part of track}. The point net has two output.\n\nThen\n\n{ h1, h2, h3 ... hN... all hits in a cone slice}  --&gt; pointnet --&gt; {0,1,0,2 ...} , {  .... 1_degree,  ....4_degree ...}\n\nfinally, in post processing, link the tracks from start to end using direction information. It is also possible to use LSTM for post processing\n\n\n  - c.  semantic segmentation. Instead of hits, we consider \"pair of hits\". let pij = directed link from hit_i to hit_j:\n\n   { p12, p13, .......}  --&gt;   pointnet --&gt; {0,1,0,1 ...} , \n\n1 and 0 mean if the pair is link or not.",
    "347808": "Thanks for sharing @ramiro! I was wondering if you had made any more progress on this?",
    "347881": "Hi @Seb,\nI'm now trying to do something similar with PointNet++ but I'm moving slowly. Thanks for your interest."
  },
  "source": "meta"
}