{
  "id": 57643,
  "title": "cone slicing, straightening helix and fitting",
  "url": "/competitions/trackml-particle-identification/discussion/57643",
  "author_name": "",
  "post_date": "2018-05-26T15:57:35.376153200Z",
  "votes": 29,
  "comment_count": 10,
  "views": 0,
  "content": "<p>for your reference:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334129/9518/helix_fit.png\" alt=\"enter image description here\"></p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334129/9517/helix_code.png\" alt=\"enter image description here\"></p>",
  "messages": [
    {
      "id": "334129",
      "postDate": "05/26/2018 15:57:35",
      "content": "<p>for your reference:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334129/9518/helix_fit.png\" alt=\"enter image description here\"></p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334129/9517/helix_code.png\" alt=\"enter image description here\"></p>",
      "rawMarkdown": "for your reference:\n\n  ![enter image description here][1]\n\n  ![enter image description here][2]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334129/9518/helix_fit.png\n  [2]: https://storage.googleapis.com/kaggle-forum-message-attachments/334129/9517/helix_code.png",
      "votes": null
    },
    {
      "id": "334160",
      "postDate": "05/26/2018 16:53:46",
      "content": "<p>slicing at different angles:</p>",
      "rawMarkdown": "slicing at different angles:",
      "votes": null
    },
    {
      "id": "334164",
      "postDate": "05/26/2018 17:04:25",
      "content": "<p>straighten the tracks:</p>\n\n<p>solid line (s=x,y,z) : ground truth track</p>\n\n<p>dotted line (rx,ry,rz) : straightened tracks (see code)</p>\n\n<pre><code>                s = t #t=xyz  #helix \n\n                x0,y0,r0,m2,m1,m0 = param\n                theta0 = np.arctan2(y0,x0)\n                yy=s[:,1]-y0\n                xx=s[:,0]-x0\n                x = xx*np.cos(-theta0)-yy*np.sin(-theta0)\n                y = xx*np.sin(-theta0)+yy*np.cos(-theta0)\n                theta = np.arctan2(y,-x) \n                rxx = (x+r0)*np.cos(0.5*theta)-y*np.sin(0.5*theta)-r0\n                ryy = (x+r0)*np.sin(0.5*theta)+y*np.cos(0.5*theta)\n                rx  = rxx*np.cos(theta0)-ryy*np.sin(theta0)+x0\n                ry  = rxx*np.sin(theta0)+ryy*np.cos(theta0)+y0\n                rz  = s[:,2]\n</code></pre>\n\n<hr>\n\n<p>I think one solution to the kaggle challenge is :</p>\n\n<p>1) slice the hits into cones,</p>\n\n<p>2) transform  so that curves become straight tracks</p>\n\n<p>3) detect straight tracks </p>\n\n<p>4) some curve tracks do not occur at some slice angles. Use machine learning to reject unlikely case. But this is not necessary because the kaggle metric do not penalized ghost track (false positive).  The most important thing is to get the true tracks well covered.</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334164/9522/straighten.png\" alt=\"enter image description here\"></p>",
      "rawMarkdown": "straighten the tracks:\n\n   solid line (s=x,y,z) : ground truth track\n\n   dotted line (rx,ry,rz) : straightened tracks (see code)\n\n\n    \n                    s = t #t=xyz  #helix \n                    \n                    x0,y0,r0,m2,m1,m0 = param\n                    theta0 = np.arctan2(y0,x0)\n                    yy=s[:,1]-y0\n                    xx=s[:,0]-x0\n                    x = xx*np.cos(-theta0)-yy*np.sin(-theta0)\n                    y = xx*np.sin(-theta0)+yy*np.cos(-theta0)\n                    theta = np.arctan2(y,-x) \n                    rxx = (x+r0)*np.cos(0.5*theta)-y*np.sin(0.5*theta)-r0\n                    ryy = (x+r0)*np.sin(0.5*theta)+y*np.cos(0.5*theta)\n                    rx  = rxx*np.cos(theta0)-ryy*np.sin(theta0)+x0\n                    ry  = rxx*np.sin(theta0)+ryy*np.cos(theta0)+y0\n                    rz  = s[:,2]\n \n\n---\n\n\nI think one solution to the kaggle challenge is :\n\n\n\n   1) slice the hits into cones,\n\n   2) transform  so that curves become straight tracks\n    \n   3) detect straight tracks \n\n   4) some curve tracks do not occur at some slice angles. Use machine learning to reject unlikely case. But this is not necessary because the kaggle metric do not penalized ghost track (false positive).  The most important thing is to get the true tracks well covered.\n\n\n  ![enter image description here][1]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334164/9522/straighten.png",
      "votes": null
    },
    {
      "id": "334197",
      "postDate": "05/26/2018 18:07:00",
      "content": "<p>Regarding point 4... The unrolling based attempts overwrite track assignment if the number of hits in the new track is greater than the number of hits for an old track. </p>\n\n<p>Multiple solutions could run consecutively, by having the unroll solution assign tracks, then have the same input given to this solution and assign tracks based on the larger number of hits per track... </p>\n\n<p>This would be problematic if there were false positives though, so there is probably value in addressing point 4. I'm not sure what approach would be best though....</p>",
      "rawMarkdown": "Regarding point 4... The unrolling based attempts overwrite track assignment if the number of hits in the new track is greater than the number of hits for an old track. \n\nMultiple solutions could run consecutively, by having the unroll solution assign tracks, then have the same input given to this solution and assign tracks based on the larger number of hits per track... \n\nThis would be problematic if there were false positives though, so there is probably value in addressing point 4. I'm not sure what approach would be best though....",
      "votes": null
    },
    {
      "id": "334240",
      "postDate": "05/26/2018 18:51:47",
      "content": "<p>Perhaps one should start with narrow cones, run track detection. Keep hits with low-confidence tracks as 'unclassified', then run those with larger cones. Continue until the cone spans approx half a detector. Then do a final detection on remaining hits, possibly with another kind of model since those tracks would travel more around XY than outwards in Z.</p>",
      "rawMarkdown": "Perhaps one should start with narrow cones, run track detection. Keep hits with low-confidence tracks as 'unclassified', then run those with larger cones. Continue until the cone spans approx half a detector. Then do a final detection on remaining hits, possibly with another kind of model since those tracks would travel more around XY than outwards in Z.",
      "votes": null
    },
    {
      "id": "334429",
      "postDate": "05/27/2018 11:00:56",
      "content": "<p>it turns out that you probably don't have to straighten the helix at all. Just slice the cone and work in polar coordinates. Everything is straight in \"polar coordinates\" (e.g. you can use the 3d coordinate system  [x,y]  --&gt; [ r, cos(theta), sin(theta)] ) :</p>\n\n<hr>\n\n<p>2d polar</p>\n\n<p>Top: ground truth track  ( left: x,y coordinates,   right:theta, r coordinates)</p>\n\n<p>Bottom: straighten track</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334429/9526/polar.png\" alt=\"enter image description here\"></p>\n\n<hr>\n\n<p>3d polar</p>\n\n<p>from <a href=\"https://www.kaggle.com/mikhailhushchyn/hough-transform\">https://www.kaggle.com/mikhailhushchyn/hough-transform</a></p>\n\n<p>r=2*r0*cos(theta - theta0) = A + B*cos(theta) + C*sin(theta) = linear in 3d</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334429/9527/polar2.png\" alt=\"enter image description here\"></p>\n\n<pre><code>    r  = (xyz[:,0]**2 + xyz[:,1]**2)**0.5\n    a  = np.arctan2(xyz[:,1],xyz[:,0])\n    s  = np.sin(a)\n    c  = np.cos(a)\n    rsc = np.column_stack([r,s,c])\n    ax2.plot(rsc[:,0],rsc[:,1],rsc[:,2],'.',color = [0,0,0], markersize=1)\n</code></pre>",
      "rawMarkdown": "it turns out that you probably don't have to straighten the helix at all. Just slice the cone and work in polar coordinates. Everything is straight in \"polar coordinates\" (e.g. you can use the 3d coordinate system  [x,y]  --&gt; [ r, cos(theta), sin(theta)] ) :\n\n---\n2d polar\n\nTop: ground truth track  ( left: x,y coordinates,   right:theta, r coordinates)\n\nBottom: straighten track\n\n  ![enter image description here][1]\n\n\n---\n3d polar\n\nfrom https://www.kaggle.com/mikhailhushchyn/hough-transform\n\nr=2*r0*cos(theta - theta0) = A + B*cos(theta) + C*sin(theta) = linear in 3d\n\n   ![enter image description here][2]\n\n\n\n        r  = (xyz[:,0]**2 + xyz[:,1]**2)**0.5\n        a  = np.arctan2(xyz[:,1],xyz[:,0])\n        s  = np.sin(a)\n        c  = np.cos(a)\n        rsc = np.column_stack([r,s,c])\n        ax2.plot(rsc[:,0],rsc[:,1],rsc[:,2],'.',color = [0,0,0], markersize=1)\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334429/9526/polar.png\n  [2]: https://storage.googleapis.com/kaggle-forum-message-attachments/334429/9527/polar2.png",
      "votes": null
    },
    {
      "id": "334462",
      "postDate": "05/27/2018 12:53:27",
      "content": "<p>Finally, what i think is a feasible solution for deep learning framework:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334462/9529/deep3.png\" alt=\"enter image description here\"></p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334462/9528/deep1.png\" alt=\"enter image description here\"></p>",
      "rawMarkdown": "Finally, what i think is a feasible solution for deep learning framework:\n\n   ![enter image description here][1]\n\n   ![enter image description here][2]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334462/9529/deep3.png\n  [2]: https://storage.googleapis.com/kaggle-forum-message-attachments/334462/9528/deep1.png",
      "votes": null
    },
    {
      "id": "334551",
      "postDate": "05/27/2018 20:13:25",
      "content": "<p>check also the graph based cnn method mentioned at:</p>\n\n<p><a href=\"https://indico.cern.ch/event/658267/contributions/2881175/attachments/1621912/2581064/Farrell_heptrkx_ctd2018.pdf\">https://indico.cern.ch/event/658267/contributions/2881175/attachments/1621912/2581064/Farrell_heptrkx_ctd2018.pdf</a></p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334551/9531/graph%20cnn.png\" alt=\"enter image description here\"></p>",
      "rawMarkdown": "check also the graph based cnn method mentioned at:\n\nhttps://indico.cern.ch/event/658267/contributions/2881175/attachments/1621912/2581064/Farrell_heptrkx_ctd2018.pdf\n\n\n  ![enter image description here][1]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334551/9531/graph%20cnn.png",
      "votes": null
    },
    {
      "id": "334729",
      "postDate": "05/28/2018 09:33:35",
      "content": "<p>end-to-end faster-rcnn like apporach:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334729/9536/Slide1.png\" alt=\"enter image description here\"></p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334729/9537/Slide2.png\" alt=\"enter image description here\"></p>",
      "rawMarkdown": "end-to-end faster-rcnn like apporach:\n\n  ![enter image description here][1]\n\n  ![enter image description here][2]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334729/9536/Slide1.png\n  [2]: https://storage.googleapis.com/kaggle-forum-message-attachments/334729/9537/Slide2.png",
      "votes": null
    },
    {
      "id": "334874",
      "postDate": "05/28/2018 16:20:43",
      "content": "<p>reference:</p>\n\n<p><a href=\"http://slideplayer.com/slide/5023247/\">http://slideplayer.com/slide/5023247/</a></p>\n\n<p><img src=\"http://images.slideplayer.com/16/5023247/slides/slide_10.jpg\" alt=\"enter image description here\"></p>",
      "rawMarkdown": "reference:\n\n  http://slideplayer.com/slide/5023247/\n\n\n  ![enter image description here][1]\n\n\n  [1]: http://images.slideplayer.com/16/5023247/slides/slide_10.jpg",
      "votes": null
    },
    {
      "id": "346714",
      "postDate": "06/22/2018 08:25:27",
      "content": "<p>plot of a,r,z:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/346714/9657/animated.gif\" alt=\"enter image description here\"></p>",
      "rawMarkdown": "plot of a,r,z:\n\n\n  ![enter image description here][1]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/346714/9657/animated.gif",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 334160,
      "author_name": "hengck23",
      "author_url": "",
      "post_date": "05/26/2018 16:53:46",
      "content": "<p>slicing at different angles:</p>",
      "votes": null,
      "replies": [
        {
          "id": 334240,
          "author_name": "jonnor",
          "author_url": "",
          "post_date": "05/26/2018 18:51:47",
          "content": "<p>Perhaps one should start with narrow cones, run track detection. Keep hits with low-confidence tracks as 'unclassified', then run those with larger cones. Continue until the cone spans approx half a detector. Then do a final detection on remaining hits, possibly with another kind of model since those tracks would travel more around XY than outwards in Z.</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 334164,
      "author_name": "hengck23",
      "author_url": "",
      "post_date": "05/26/2018 17:04:25",
      "content": "<p>straighten the tracks:</p>\n\n<p>solid line (s=x,y,z) : ground truth track</p>\n\n<p>dotted line (rx,ry,rz) : straightened tracks (see code)</p>\n\n<pre><code>                s = t #t=xyz  #helix \n\n                x0,y0,r0,m2,m1,m0 = param\n                theta0 = np.arctan2(y0,x0)\n                yy=s[:,1]-y0\n                xx=s[:,0]-x0\n                x = xx*np.cos(-theta0)-yy*np.sin(-theta0)\n                y = xx*np.sin(-theta0)+yy*np.cos(-theta0)\n                theta = np.arctan2(y,-x) \n                rxx = (x+r0)*np.cos(0.5*theta)-y*np.sin(0.5*theta)-r0\n                ryy = (x+r0)*np.sin(0.5*theta)+y*np.cos(0.5*theta)\n                rx  = rxx*np.cos(theta0)-ryy*np.sin(theta0)+x0\n                ry  = rxx*np.sin(theta0)+ryy*np.cos(theta0)+y0\n                rz  = s[:,2]\n</code></pre>\n\n<hr>\n\n<p>I think one solution to the kaggle challenge is :</p>\n\n<p>1) slice the hits into cones,</p>\n\n<p>2) transform  so that curves become straight tracks</p>\n\n<p>3) detect straight tracks </p>\n\n<p>4) some curve tracks do not occur at some slice angles. Use machine learning to reject unlikely case. But this is not necessary because the kaggle metric do not penalized ghost track (false positive).  The most important thing is to get the true tracks well covered.</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334164/9522/straighten.png\" alt=\"enter image description here\"></p>",
      "votes": null,
      "replies": [
        {
          "id": 334197,
          "author_name": "macfarll",
          "author_url": "",
          "post_date": "05/26/2018 18:07:00",
          "content": "<p>Regarding point 4... The unrolling based attempts overwrite track assignment if the number of hits in the new track is greater than the number of hits for an old track. </p>\n\n<p>Multiple solutions could run consecutively, by having the unroll solution assign tracks, then have the same input given to this solution and assign tracks based on the larger number of hits per track... </p>\n\n<p>This would be problematic if there were false positives though, so there is probably value in addressing point 4. I'm not sure what approach would be best though....</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 334429,
      "author_name": "hengck23",
      "author_url": "",
      "post_date": "05/27/2018 11:00:56",
      "content": "<p>it turns out that you probably don't have to straighten the helix at all. Just slice the cone and work in polar coordinates. Everything is straight in \"polar coordinates\" (e.g. you can use the 3d coordinate system  [x,y]  --&gt; [ r, cos(theta), sin(theta)] ) :</p>\n\n<hr>\n\n<p>2d polar</p>\n\n<p>Top: ground truth track  ( left: x,y coordinates,   right:theta, r coordinates)</p>\n\n<p>Bottom: straighten track</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334429/9526/polar.png\" alt=\"enter image description here\"></p>\n\n<hr>\n\n<p>3d polar</p>\n\n<p>from <a href=\"https://www.kaggle.com/mikhailhushchyn/hough-transform\">https://www.kaggle.com/mikhailhushchyn/hough-transform</a></p>\n\n<p>r=2*r0*cos(theta - theta0) = A + B*cos(theta) + C*sin(theta) = linear in 3d</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334429/9527/polar2.png\" alt=\"enter image description here\"></p>\n\n<pre><code>    r  = (xyz[:,0]**2 + xyz[:,1]**2)**0.5\n    a  = np.arctan2(xyz[:,1],xyz[:,0])\n    s  = np.sin(a)\n    c  = np.cos(a)\n    rsc = np.column_stack([r,s,c])\n    ax2.plot(rsc[:,0],rsc[:,1],rsc[:,2],'.',color = [0,0,0], markersize=1)\n</code></pre>",
      "votes": null,
      "replies": []
    },
    {
      "id": 334462,
      "author_name": "hengck23",
      "author_url": "",
      "post_date": "05/27/2018 12:53:27",
      "content": "<p>Finally, what i think is a feasible solution for deep learning framework:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334462/9529/deep3.png\" alt=\"enter image description here\"></p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334462/9528/deep1.png\" alt=\"enter image description here\"></p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 334551,
      "author_name": "hengck23",
      "author_url": "",
      "post_date": "05/27/2018 20:13:25",
      "content": "<p>check also the graph based cnn method mentioned at:</p>\n\n<p><a href=\"https://indico.cern.ch/event/658267/contributions/2881175/attachments/1621912/2581064/Farrell_heptrkx_ctd2018.pdf\">https://indico.cern.ch/event/658267/contributions/2881175/attachments/1621912/2581064/Farrell_heptrkx_ctd2018.pdf</a></p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334551/9531/graph%20cnn.png\" alt=\"enter image description here\"></p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 334729,
      "author_name": "hengck23",
      "author_url": "",
      "post_date": "05/28/2018 09:33:35",
      "content": "<p>end-to-end faster-rcnn like apporach:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334729/9536/Slide1.png\" alt=\"enter image description here\"></p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/334729/9537/Slide2.png\" alt=\"enter image description here\"></p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 334874,
      "author_name": "hengck23",
      "author_url": "",
      "post_date": "05/28/2018 16:20:43",
      "content": "<p>reference:</p>\n\n<p><a href=\"http://slideplayer.com/slide/5023247/\">http://slideplayer.com/slide/5023247/</a></p>\n\n<p><img src=\"http://images.slideplayer.com/16/5023247/slides/slide_10.jpg\" alt=\"enter image description here\"></p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 346714,
      "author_name": "hengck23",
      "author_url": "",
      "post_date": "06/22/2018 08:25:27",
      "content": "<p>plot of a,r,z:</p>\n\n<p><img src=\"https://storage.googleapis.com/kaggle-forum-message-attachments/346714/9657/animated.gif\" alt=\"enter image description here\"></p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "334129": "for your reference:\n\n  ![enter image description here][1]\n\n  ![enter image description here][2]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334129/9518/helix_fit.png\n  [2]: https://storage.googleapis.com/kaggle-forum-message-attachments/334129/9517/helix_code.png",
    "334160": "slicing at different angles:",
    "334164": "straighten the tracks:\n\n   solid line (s=x,y,z) : ground truth track\n\n   dotted line (rx,ry,rz) : straightened tracks (see code)\n\n\n    \n                    s = t #t=xyz  #helix \n                    \n                    x0,y0,r0,m2,m1,m0 = param\n                    theta0 = np.arctan2(y0,x0)\n                    yy=s[:,1]-y0\n                    xx=s[:,0]-x0\n                    x = xx*np.cos(-theta0)-yy*np.sin(-theta0)\n                    y = xx*np.sin(-theta0)+yy*np.cos(-theta0)\n                    theta = np.arctan2(y,-x) \n                    rxx = (x+r0)*np.cos(0.5*theta)-y*np.sin(0.5*theta)-r0\n                    ryy = (x+r0)*np.sin(0.5*theta)+y*np.cos(0.5*theta)\n                    rx  = rxx*np.cos(theta0)-ryy*np.sin(theta0)+x0\n                    ry  = rxx*np.sin(theta0)+ryy*np.cos(theta0)+y0\n                    rz  = s[:,2]\n \n\n---\n\n\nI think one solution to the kaggle challenge is :\n\n\n\n   1) slice the hits into cones,\n\n   2) transform  so that curves become straight tracks\n    \n   3) detect straight tracks \n\n   4) some curve tracks do not occur at some slice angles. Use machine learning to reject unlikely case. But this is not necessary because the kaggle metric do not penalized ghost track (false positive).  The most important thing is to get the true tracks well covered.\n\n\n  ![enter image description here][1]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334164/9522/straighten.png",
    "334197": "Regarding point 4... The unrolling based attempts overwrite track assignment if the number of hits in the new track is greater than the number of hits for an old track. \n\nMultiple solutions could run consecutively, by having the unroll solution assign tracks, then have the same input given to this solution and assign tracks based on the larger number of hits per track... \n\nThis would be problematic if there were false positives though, so there is probably value in addressing point 4. I'm not sure what approach would be best though....",
    "334240": "Perhaps one should start with narrow cones, run track detection. Keep hits with low-confidence tracks as 'unclassified', then run those with larger cones. Continue until the cone spans approx half a detector. Then do a final detection on remaining hits, possibly with another kind of model since those tracks would travel more around XY than outwards in Z.",
    "334429": "it turns out that you probably don't have to straighten the helix at all. Just slice the cone and work in polar coordinates. Everything is straight in \"polar coordinates\" (e.g. you can use the 3d coordinate system  [x,y]  --&gt; [ r, cos(theta), sin(theta)] ) :\n\n---\n2d polar\n\nTop: ground truth track  ( left: x,y coordinates,   right:theta, r coordinates)\n\nBottom: straighten track\n\n  ![enter image description here][1]\n\n\n---\n3d polar\n\nfrom https://www.kaggle.com/mikhailhushchyn/hough-transform\n\nr=2*r0*cos(theta - theta0) = A + B*cos(theta) + C*sin(theta) = linear in 3d\n\n   ![enter image description here][2]\n\n\n\n        r  = (xyz[:,0]**2 + xyz[:,1]**2)**0.5\n        a  = np.arctan2(xyz[:,1],xyz[:,0])\n        s  = np.sin(a)\n        c  = np.cos(a)\n        rsc = np.column_stack([r,s,c])\n        ax2.plot(rsc[:,0],rsc[:,1],rsc[:,2],'.',color = [0,0,0], markersize=1)\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334429/9526/polar.png\n  [2]: https://storage.googleapis.com/kaggle-forum-message-attachments/334429/9527/polar2.png",
    "334462": "Finally, what i think is a feasible solution for deep learning framework:\n\n   ![enter image description here][1]\n\n   ![enter image description here][2]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334462/9529/deep3.png\n  [2]: https://storage.googleapis.com/kaggle-forum-message-attachments/334462/9528/deep1.png",
    "334551": "check also the graph based cnn method mentioned at:\n\nhttps://indico.cern.ch/event/658267/contributions/2881175/attachments/1621912/2581064/Farrell_heptrkx_ctd2018.pdf\n\n\n  ![enter image description here][1]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334551/9531/graph%20cnn.png",
    "334729": "end-to-end faster-rcnn like apporach:\n\n  ![enter image description here][1]\n\n  ![enter image description here][2]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/334729/9536/Slide1.png\n  [2]: https://storage.googleapis.com/kaggle-forum-message-attachments/334729/9537/Slide2.png",
    "334874": "reference:\n\n  http://slideplayer.com/slide/5023247/\n\n\n  ![enter image description here][1]\n\n\n  [1]: http://images.slideplayer.com/16/5023247/slides/slide_10.jpg",
    "346714": "plot of a,r,z:\n\n\n  ![enter image description here][1]\n\n\n  [1]: https://storage.googleapis.com/kaggle-forum-message-attachments/346714/9657/animated.gif"
  },
  "source": "meta"
}