{
  "id": 127037,
  "title": "1st place solution (1/26 details updated)",
  "url": "/competitions/pku-autonomous-driving/discussion/127037",
  "author_name": "outrunner",
  "post_date": "2020-01-22T00:27:42.165000",
  "votes": 139,
  "comment_count": 79,
  "views": 0,
  "content": "<p>Thanks to everyone and congratulations to all the top teams. I'm on vacation, so I will post the details after the Chinese New Year.</p>\n\n<h1>In brief</h1>\n\n<ul>\n<li>data augmentation: h-flip, 3 axis rotate, color, noise, blur.</li>\n<li><a href=\"https://github.com/see--/keras-centernet\">keras hourglass centernet</a></li>\n<li>perspective transform for efficiency</li>\n<li>regression of yaw, cos(pitch), sin(pitch), rot_pi(roll), x, y, z, r</li>\n<li>blend 6 results (2 types of head * 3 types of transform)</li>\n<li>post process by fitting LB</li>\n</ul>\n\n<h1>Especially thanks to these kernels:</h1>\n\n<ul>\n<li><a href=\"https://www.kaggle.com/hocop1/centernet-baseline\">CenterNet Baseline</a> <a href=\"/hocop1\">@hocop1</a></li>\n<li><a href=\"https://www.kaggle.com/ebouteillon/augmented-reality\">Augmented Reality</a> <a href=\"/ebouteillon\">@ebouteillon</a></li>\n<li><a href=\"https://www.kaggle.com/its7171/metrics-evaluation-script\">metrics evaluation script</a> <a href=\"/its7171\">@its7171</a></li>\n</ul>\n\n<p>Happy Chinese New Year</p>\n\n<h1>1/26 details updated</h1>\n\n<h1>Network</h1>\n\n<p><img src=\"https://i.imgur.com/uFNfCFB.jpg\" alt=\"network\"></p>\n\n<p>My approach is based on <a href=\"https://github.com/see--/keras-centernet\">keras hourglass centernet</a>.\nSome notes:\n- <strong><em>6 Dof</em></strong>: regression of yaw, cos(pitch), sin(pitch), rot_pi(roll), x, y, z, distance\n- discard <strong><em>XY bias</em></strong> result finally.\n- remove <strong><em>Car types</em></strong> and <strong><em>XY bias</em></strong> in my second model.</p>\n\n<p><strong># Perspective transform</strong>\nTwo purpose:\n- reduce the size gap between small(far) and large(near) cars.\n- cover more outliers without extending image.</p>\n\n<p>I find the model don't predict well on the large car when I increase the input size, so I make them smaller. The extra benefit is to enclose outliers.</p>\n\n<p><strong>Original image:</strong>\n<img src=\"https://i.imgur.com/bNABgvS.jpg\" alt=\"original\">\n<strong>Transformed:</strong>\n<img src=\"https://i.imgur.com/Xe396jz.jpg\" alt=\"transformed\">\n<strong>Coverage comparison:</strong> (dots denote the GT location)\n<img src=\"https://i.imgur.com/JJYfmNn.jpg\" alt=\"coverage\">\n<strong>Validation result with outlier:</strong> (red dot: GT, green: predict heat map)\n<img src=\"https://i.imgur.com/s6UAHIO.png\" alt=\"transformed\"></p>\n\n<p><strong># Coordinate reference</strong>\nI think the same feature in different locations should get different results. So I join this layer to get better predictions, and apply random crop when training.</p>\n\n<h1>Data augmentation</h1>\n\n<p>I use: h-flip, camera rotate, color, noise, blur.</p>\n\n<p><strong># Camera rotation</strong>\nThis is the most important part of my approach. Since I only have 4001 training images, 5 bad, and 256 for validation. It is easily to overfit without rotation augmentation. </p>\n\n<p><strong>The augmentation looks like:</strong> (center is original image)\n<img src=\"https://i.imgur.com/kONFCcy.jpg\" alt=\"rotation augmentation\">\nPlease refer to <a href=\"https://www.kaggle.com/outrunner/rotation-augmentation\">this kernel</a> for details.</p>\n\n<h1>Training</h1>\n\n<ul>\n<li>Focal loss for heat map</li>\n<li>Huber for regression</li>\n<li>Adam optimizer</li>\n<li>Manually adjust learning rate from 10^-3.5 to 10^-5.5</li>\n<li>About 0.4M iterations</li>\n<li>Train: full network -&gt; part of -&gt; head only -&gt; full ...</li>\n<li>Change input size (random corp) and batch size every iteration</li>\n<li>One 2080Ti per training. (I have 2)</li>\n<li>Total 6 models, 2 heads * 3 transforms (different parameter and input size)</li>\n</ul>\n\n<h1>Inference</h1>\n\n<p>Please refer to <a href=\"https://www.kaggle.com/outrunner/autonomous-driving-1st-place-solution-inference\">this kernel</a> for details.</p>\n\n<p><strong># Test time augmentation</strong>\nFlip and multiple transformations, weighted average the predictions.</p>\n\n<p><strong># Blending</strong>\nTransform predictions to one model's transformation, weighted average 6 results.</p>\n\n<p><strong># Weighted average neighborhood</strong>\nWhen decoding, not only use the local maximum point but also take into account\nthe prediction around it.</p>\n\n<h1>Metric probing and Post processing</h1>\n\n<p>This is the first time I join a competition without knowing the evaluation metric. The probing is interesting, but there are some weird characters in the metric.</p>\n\n<p><strong>Probing procedure:</strong>\n<img src=\"https://i.imgur.com/ESMF5qS.jpg\" alt=\"Probing process\">\n<strong># Image wise</strong>\nSplit test images to two sets A and B, then: <strong>score(A) + score(B) = score(A+B)</strong></p>\n\n<p><strong># Confidence independent</strong>\nSo the metric is something like <strong>F1</strong> or <strong>TP/(TP+FN+FP)</strong></p>\n\n<p><strong># Rotation</strong>\nθ and θ+2π differently, so the score is directly impacted by roll prediction. Therefore, I train a model to predict global roll and get the score improvement.</p>\n\n<p><strong># Translation</strong>\nThe most weird thing is that when I shift X by some pixels, the LB score change  significantly. So I guess the Metric is:\n<code>sh\n(abs(x-xp)/abs(x) + abs(y-yp)/abs(y) + abs(z-zp)/abs(z))/3\n</code>\n<strong>And increase the threshold when abs(x) is small:</strong>\n<img src=\"https://i.imgur.com/BmYJ9CO.jpg\" alt=\"Confidence threshold\"></p>\n\n<p><strong>The overall post-processing:</strong></p>\n\n<ul>\n<li>[opt] replace x, y by X, Y, z, r (just like everybody do)</li>\n<li>[roll] replace instance roll by global roll</li>\n<li>[xs] shift X 2 pixels (don't know why)</li>\n<li>[rx] drop some cars whose x are near by zero, and keep a least car number per image</li>\n<li>[dz] drop duplicate cars</li>\n</ul>\n\n<p><strong># table of results:</strong>\n<img src=\"https://i.imgur.com/WSMGpUH.gif\" alt=\"table of results\">\n<em># parameters are the same as final submission, and some procedures are dependent</em></p>",
  "messages": [
    {
      "id": 725259,
      "postDate": "2020-01-22T00:27:42.167Z",
      "content": "<p>Thanks to everyone and congratulations to all the top teams. I'm on vacation, so I will post the details after the Chinese New Year.</p>\n\n<h1>In brief</h1>\n\n<ul>\n<li>data augmentation: h-flip, 3 axis rotate, color, noise, blur.</li>\n<li><a href=\"https://github.com/see--/keras-centernet\">keras hourglass centernet</a></li>\n<li>perspective transform for efficiency</li>\n<li>regression of yaw, cos(pitch), sin(pitch), rot_pi(roll), x, y, z, r</li>\n<li>blend 6 results (2 types of head * 3 types of transform)</li>\n<li>post process by fitting LB</li>\n</ul>\n\n<h1>Especially thanks to these kernels:</h1>\n\n<ul>\n<li><a href=\"https://www.kaggle.com/hocop1/centernet-baseline\">CenterNet Baseline</a> <a href=\"/hocop1\">@hocop1</a></li>\n<li><a href=\"https://www.kaggle.com/ebouteillon/augmented-reality\">Augmented Reality</a> <a href=\"/ebouteillon\">@ebouteillon</a></li>\n<li><a href=\"https://www.kaggle.com/its7171/metrics-evaluation-script\">metrics evaluation script</a> <a href=\"/its7171\">@its7171</a></li>\n</ul>\n\n<p>Happy Chinese New Year</p>\n\n<h1>1/26 details updated</h1>\n\n<h1>Network</h1>\n\n<p><img src=\"https://i.imgur.com/uFNfCFB.jpg\" alt=\"network\"></p>\n\n<p>My approach is based on <a href=\"https://github.com/see--/keras-centernet\">keras hourglass centernet</a>.\nSome notes:\n- <strong><em>6 Dof</em></strong>: regression of yaw, cos(pitch), sin(pitch), rot_pi(roll), x, y, z, distance\n- discard <strong><em>XY bias</em></strong> result finally.\n- remove <strong><em>Car types</em></strong> and <strong><em>XY bias</em></strong> in my second model.</p>\n\n<p><strong># Perspective transform</strong>\nTwo purpose:\n- reduce the size gap between small(far) and large(near) cars.\n- cover more outliers without extending image.</p>\n\n<p>I find the model don't predict well on the large car when I increase the input size, so I make them smaller. The extra benefit is to enclose outliers.</p>\n\n<p><strong>Original image:</strong>\n<img src=\"https://i.imgur.com/bNABgvS.jpg\" alt=\"original\">\n<strong>Transformed:</strong>\n<img src=\"https://i.imgur.com/Xe396jz.jpg\" alt=\"transformed\">\n<strong>Coverage comparison:</strong> (dots denote the GT location)\n<img src=\"https://i.imgur.com/JJYfmNn.jpg\" alt=\"coverage\">\n<strong>Validation result with outlier:</strong> (red dot: GT, green: predict heat map)\n<img src=\"https://i.imgur.com/s6UAHIO.png\" alt=\"transformed\"></p>\n\n<p><strong># Coordinate reference</strong>\nI think the same feature in different locations should get different results. So I join this layer to get better predictions, and apply random crop when training.</p>\n\n<h1>Data augmentation</h1>\n\n<p>I use: h-flip, camera rotate, color, noise, blur.</p>\n\n<p><strong># Camera rotation</strong>\nThis is the most important part of my approach. Since I only have 4001 training images, 5 bad, and 256 for validation. It is easily to overfit without rotation augmentation. </p>\n\n<p><strong>The augmentation looks like:</strong> (center is original image)\n<img src=\"https://i.imgur.com/kONFCcy.jpg\" alt=\"rotation augmentation\">\nPlease refer to <a href=\"https://www.kaggle.com/outrunner/rotation-augmentation\">this kernel</a> for details.</p>\n\n<h1>Training</h1>\n\n<ul>\n<li>Focal loss for heat map</li>\n<li>Huber for regression</li>\n<li>Adam optimizer</li>\n<li>Manually adjust learning rate from 10^-3.5 to 10^-5.5</li>\n<li>About 0.4M iterations</li>\n<li>Train: full network -&gt; part of -&gt; head only -&gt; full ...</li>\n<li>Change input size (random corp) and batch size every iteration</li>\n<li>One 2080Ti per training. (I have 2)</li>\n<li>Total 6 models, 2 heads * 3 transforms (different parameter and input size)</li>\n</ul>\n\n<h1>Inference</h1>\n\n<p>Please refer to <a href=\"https://www.kaggle.com/outrunner/autonomous-driving-1st-place-solution-inference\">this kernel</a> for details.</p>\n\n<p><strong># Test time augmentation</strong>\nFlip and multiple transformations, weighted average the predictions.</p>\n\n<p><strong># Blending</strong>\nTransform predictions to one model's transformation, weighted average 6 results.</p>\n\n<p><strong># Weighted average neighborhood</strong>\nWhen decoding, not only use the local maximum point but also take into account\nthe prediction around it.</p>\n\n<h1>Metric probing and Post processing</h1>\n\n<p>This is the first time I join a competition without knowing the evaluation metric. The probing is interesting, but there are some weird characters in the metric.</p>\n\n<p><strong>Probing procedure:</strong>\n<img src=\"https://i.imgur.com/ESMF5qS.jpg\" alt=\"Probing process\">\n<strong># Image wise</strong>\nSplit test images to two sets A and B, then: <strong>score(A) + score(B) = score(A+B)</strong></p>\n\n<p><strong># Confidence independent</strong>\nSo the metric is something like <strong>F1</strong> or <strong>TP/(TP+FN+FP)</strong></p>\n\n<p><strong># Rotation</strong>\nθ and θ+2π differently, so the score is directly impacted by roll prediction. Therefore, I train a model to predict global roll and get the score improvement.</p>\n\n<p><strong># Translation</strong>\nThe most weird thing is that when I shift X by some pixels, the LB score change  significantly. So I guess the Metric is:\n<code>sh\n(abs(x-xp)/abs(x) + abs(y-yp)/abs(y) + abs(z-zp)/abs(z))/3\n</code>\n<strong>And increase the threshold when abs(x) is small:</strong>\n<img src=\"https://i.imgur.com/BmYJ9CO.jpg\" alt=\"Confidence threshold\"></p>\n\n<p><strong>The overall post-processing:</strong></p>\n\n<ul>\n<li>[opt] replace x, y by X, Y, z, r (just like everybody do)</li>\n<li>[roll] replace instance roll by global roll</li>\n<li>[xs] shift X 2 pixels (don't know why)</li>\n<li>[rx] drop some cars whose x are near by zero, and keep a least car number per image</li>\n<li>[dz] drop duplicate cars</li>\n</ul>\n\n<p><strong># table of results:</strong>\n<img src=\"https://i.imgur.com/WSMGpUH.gif\" alt=\"table of results\">\n<em># parameters are the same as final submission, and some procedures are dependent</em></p>",
      "rawMarkdown": "Thanks to everyone and congratulations to all the top teams. I'm on vacation, so I will post the details after the Chinese New Year.\n\n# In brief\n - data augmentation: h-flip, 3 axis rotate, color, noise, blur.\n - [keras hourglass centernet](https://github.com/see--/keras-centernet)\n - perspective transform for efficiency\n - regression of yaw, cos(pitch), sin(pitch), rot_pi(roll), x, y, z, r\n - blend 6 results (2 types of head * 3 types of transform)\n - post process by fitting LB\n\n\n# Especially thanks to these kernels:\n - [CenterNet Baseline](https://www.kaggle.com/hocop1/centernet-baseline) @hocop1\n - [Augmented Reality](https://www.kaggle.com/ebouteillon/augmented-reality) @ebouteillon\n - [metrics evaluation script](https://www.kaggle.com/its7171/metrics-evaluation-script) @its7171\n\n\nHappy Chinese New Year\n\n# 1/26 details updated\n\n# Network\n\n![network](https://i.imgur.com/uFNfCFB.jpg)\n\nMy approach is based on [keras hourglass centernet](https://github.com/see--/keras-centernet).\nSome notes:\n- ***6 Dof***: regression of yaw, cos(pitch), sin(pitch), rot_pi(roll), x, y, z, distance\n- discard ***XY bias*** result finally.\n- remove ***Car types*** and ***XY bias*** in my second model.\n\n**# Perspective transform**\nTwo purpose:\n- reduce the size gap between small(far) and large(near) cars.\n- cover more outliers without extending image.\n\nI find the model don't predict well on the large car when I increase the input size, so I make them smaller. The extra benefit is to enclose outliers.\n\n**Original image:**\n![original](https://i.imgur.com/bNABgvS.jpg)\n**Transformed:**\n![transformed](https://i.imgur.com/Xe396jz.jpg)\n**Coverage comparison:** (dots denote the GT location)\n![coverage](https://i.imgur.com/JJYfmNn.jpg)\n**Validation result with outlier:** (red dot: GT, green: predict heat map)\n![transformed](https://i.imgur.com/s6UAHIO.png)\n\n**# Coordinate reference**\nI think the same feature in different locations should get different results. So I join this layer to get better predictions, and apply random crop when training.\n\n# Data augmentation\nI use: h-flip, camera rotate, color, noise, blur.\n\n**# Camera rotation**\nThis is the most important part of my approach. Since I only have 4001 training images, 5 bad, and 256 for validation. It is easily to overfit without rotation augmentation. \n\n**The augmentation looks like:** (center is original image)\n![rotation augmentation](https://i.imgur.com/kONFCcy.jpg)\nPlease refer to [this kernel](https://www.kaggle.com/outrunner/rotation-augmentation) for details.\n\n# Training\n- Focal loss for heat map\n- Huber for regression\n- Adam optimizer\n- Manually adjust learning rate from 10^-3.5 to 10^-5.5\n- About 0.4M iterations\n- Train: full network -&gt; part of -&gt; head only -&gt; full ...\n- Change input size (random corp) and batch size every iteration\n- One 2080Ti per training. (I have 2)\n- Total 6 models, 2 heads * 3 transforms (different parameter and input size)\n\n# Inference\nPlease refer to [this kernel](https://www.kaggle.com/outrunner/autonomous-driving-1st-place-solution-inference) for details.\n\n**# Test time augmentation**\nFlip and multiple transformations, weighted average the predictions.\n\n**# Blending**\nTransform predictions to one model's transformation, weighted average 6 results.\n\n**# Weighted average neighborhood**\nWhen decoding, not only use the local maximum point but also take into account\nthe prediction around it.\n\n# Metric probing and Post processing\nThis is the first time I join a competition without knowing the evaluation metric. The probing is interesting, but there are some weird characters in the metric.\n\n**Probing procedure:**\n![Probing process](https://i.imgur.com/ESMF5qS.jpg)\n**# Image wise**\nSplit test images to two sets A and B, then: **score(A) + score(B) = score(A+B)**\n\n**# Confidence independent**\nSo the metric is something like **F1** or **TP/(TP+FN+FP)**\n\n**# Rotation**\nθ and θ+2π differently, so the score is directly impacted by roll prediction. Therefore, I train a model to predict global roll and get the score improvement.\n\n**# Translation**\nThe most weird thing is that when I shift X by some pixels, the LB score change  significantly. So I guess the Metric is:\n```sh\n(abs(x-xp)/abs(x) + abs(y-yp)/abs(y) + abs(z-zp)/abs(z))/3\n```\n**And increase the threshold when abs(x) is small:**\n![Confidence threshold](https://i.imgur.com/BmYJ9CO.jpg)\n\n**The overall post-processing:**\n\n- [opt] replace x, y by X, Y, z, r (just like everybody do)\n- [roll] replace instance roll by global roll\n- [xs] shift X 2 pixels (don't know why)\n- [rx] drop some cars whose x are near by zero, and keep a least car number per image\n- [dz] drop duplicate cars\n\n**# table of results:**\n![table of results](https://i.imgur.com/WSMGpUH.gif)\n*# parameters are the same as final submission, and some procedures are dependent*",
      "votes": 139
    },
    {
      "id": 725325,
      "postDate": "2020-01-22T01:56:02.467Z",
      "content": "<p>太殺了</p>",
      "rawMarkdown": "太殺了",
      "votes": 6
    },
    {
      "id": 735751,
      "postDate": "2020-02-03T12:30:27.980Z",
      "content": "<p>強者我曾經的鄰居</p>",
      "rawMarkdown": "強者我曾經的鄰居",
      "votes": 2
    },
    {
      "id": 726851,
      "postDate": "2020-01-23T09:25:21.930Z",
      "content": "<p>Excellent, look forward to see your notebook</p>",
      "rawMarkdown": "Excellent, look forward to see your notebook",
      "votes": 1
    },
    {
      "id": 725304,
      "postDate": "2020-01-22T01:36:11.817Z",
      "content": "<p>Congrats on this solo win and your competition GM title!  Well done.</p>",
      "rawMarkdown": "Congrats on this solo win and your competition GM title!  Well done.",
      "votes": 2,
      "replies": [
        {
          "id": 726267,
          "postDate": "2020-01-23T00:34:07.570Z",
          "content": "<p>Thanks.</p>",
          "rawMarkdown": "Thanks.",
          "votes": 1
        }
      ]
    },
    {
      "id": 1715448,
      "postDate": "2022-03-08T02:45:07.193Z",
      "content": "<p>Congratulations!</p>",
      "rawMarkdown": "Congratulations!"
    },
    {
      "id": 899083,
      "postDate": "2020-06-24T00:54:18.397Z",
      "content": "<p>You are just amazing. I learned A LOT A LOT from you. Thank you very much, you are a true grandmaster.</p>",
      "rawMarkdown": "You are just amazing. I learned A LOT A LOT from you. Thank you very much, you are a true grandmaster."
    },
    {
      "id": 798500,
      "postDate": "2020-04-05T14:55:45.660Z",
      "content": "<p>Congratulation！\nMay I ask what's 'Coordinate reference'?\nHow do you get it?</p>",
      "rawMarkdown": "Congratulation！\nMay I ask what's 'Coordinate reference'?\nHow do you get it?",
      "replies": [
        {
          "id": 798977,
          "postDate": "2020-04-06T03:40:58.957Z",
          "content": "<p>just a scaled 2d coordinate:</p>\n\n<pre><code>ref = np.reshape(np.arange(0, xo*yo), (yo, xo, -1))\nref_x = ref % xo\nref_y = ref // xo\nref = np.dstack([(ref_x-(xo-1)/2)/100, ref_y/100])\n</code></pre>",
          "rawMarkdown": "just a scaled 2d coordinate:\n\n    ref = np.reshape(np.arange(0, xo*yo), (yo, xo, -1))\n    ref_x = ref % xo\n    ref_y = ref // xo\n    ref = np.dstack([(ref_x-(xo-1)/2)/100, ref_y/100])",
          "votes": 1
        }
      ]
    },
    {
      "id": 737218,
      "postDate": "2020-02-05T04:06:34.597Z",
      "content": "<blockquote>\n  <h1>Camera rotation</h1>\n  \n  <p>This is the most important part of my approach. Since I only have 4001 training images, 5 bad, and 256 for validation. It is easily to overfit without rotation augmentation.</p>\n</blockquote>\n\n<p>May I ask do you use this augmentation for training one model, or 6 augmentations methods individually for training 6 models?\nCan you also give us the improvement percentage w/wo using your augmentation? Many thanks!</p>",
      "rawMarkdown": "&gt; # Camera rotation\nThis is the most important part of my approach. Since I only have 4001 training images, 5 bad, and 256 for validation. It is easily to overfit without rotation augmentation.\n\nMay I ask do you use this augmentation for training one model, or 6 augmentations methods individually for training 6 models?\nCan you also give us the improvement percentage w/wo using your augmentation? Many thanks!",
      "replies": [
        {
          "id": 737226,
          "postDate": "2020-02-05T04:20:23.103Z",
          "content": "<p>Might not be the 100% correct information..But in my experiment, the mAP improve 0.01 for Camera rotation augmentation (Only train 50 epochs)</p>",
          "rawMarkdown": "Might not be the 100% correct information..But in my experiment, the mAP improve 0.01 for Camera rotation augmentation (Only train 50 epochs)",
          "votes": 1
        },
        {
          "id": 737239,
          "postDate": "2020-02-05T04:45:04.843Z",
          "content": "<p>Oh really, this is a huge improvement considering only 0.14 mAP. Thanks Xie , I think I am gonna try this technique out</p>",
          "rawMarkdown": "Oh really, this is a huge improvement considering only 0.14 mAP. Thanks Xie , I think I am gonna try this technique out",
          "votes": 1
        },
        {
          "id": 737273,
          "postDate": "2020-02-05T05:51:38.783Z",
          "content": "<ol>\n<li><p>all augmentation methods for all models in final submission</p></li>\n<li><p>the improvement:\n<img src=\"https://i.imgur.com/kTtvyRL.gif\" alt=\"scores2\"></p></li>\n</ol>\n\n<p>I think this is as important as you add ApolloScape dataset.</p>\n\n<p><a href=\"/xiejialun\">@xiejialun</a> , thanks for sharing.</p>",
          "rawMarkdown": "1. all augmentation methods for all models in final submission\n\n2. the improvement:\n![scores2](https://i.imgur.com/kTtvyRL.gif)\n\nI think this is as important as you add ApolloScape dataset.\n\n@xiejialun , thanks for sharing.",
          "votes": 1
        },
        {
          "id": 738222,
          "postDate": "2020-02-06T09:28:13.630Z",
          "content": "<p>Thanks for answering <a href=\"/outrunner\">@outrunner</a> , that table reveals more details. In terms of a single baseline model, we achieve similar result. May I also ask about the range you choose for the alpha, beta, gamma? I am trying to re-implement your training augmentation regiment in our system to see whether it can achieve similar improvement. Thanks a lot </p>",
          "rawMarkdown": "Thanks for answering @outrunner , that table reveals more details. In terms of a single baseline model, we achieve similar result. May I also ask about the range you choose for the alpha, beta, gamma? I am trying to re-implement your training augmentation regiment in our system to see whether it can achieve similar improvement. Thanks a lot "
        },
        {
          "id": 738224,
          "postDate": "2020-02-06T09:29:46.240Z",
          "content": "<p><a href=\"/xiejialun\">@xiejialun</a>  Could you tell us our range for  alpha, beta, gamma during training to achieve the 0.01 improvment? Thanks!</p>",
          "rawMarkdown": "@xiejialun  Could you tell us our range for  alpha, beta, gamma during training to achieve the 0.01 improvment? Thanks!"
        },
        {
          "id": 738245,
          "postDate": "2020-02-06T10:07:46.893Z",
          "content": "<p>The rotation range of alpha, beta and gamma is -5~5(degree) in my experiment.</p>",
          "rawMarkdown": "The rotation range of alpha, beta and gamma is -5~5(degree) in my experiment."
        },
        {
          "id": 738375,
          "postDate": "2020-02-06T13:01:00.437Z",
          "content": "<p>alpha = (p*8-5.65)*np.pi/180.\nbeta  = (np.random.random()*50-25)*np.pi/180.\ngamma = (np.random.random()*6-3)*np.pi/180. + beta/3.</p>\n\n<p>where p is in range(0,1) and keep tilt up and down 50-50 percentage</p>",
          "rawMarkdown": "alpha = (p\\*8-5.65)\\*np.pi/180.\nbeta  = (np.random.random()\\*50-25)\\*np.pi/180.\ngamma = (np.random.random()\\*6-3)\\*np.pi/180. + beta/3.\n\nwhere p is in range(0,1) and keep tilt up and down 50-50 percentage"
        },
        {
          "id": 738397,
          "postDate": "2020-02-06T13:25:30.707Z",
          "content": "<p>(1)Could you be a bit more specific by \"where p is in range(0,1) and keep tilt up and down 50-50 percentage\"  --do you mean by padding the  augmented image?\nshould the following augmentation just suffice?</p>\n\n<p><code>\nalpha = (np.random.random()*8-5.65)*np.pi/180.\nbeta = (np.random.random()*50-25)*np.pi/180.\ngamma = (np.random.random()*6-3)*np.pi/180. + beta/3\n</code>\nI only changer the p to np.random.random()--&gt; I am not quite sure why use the p in alpha but not others.</p>\n\n<p>(2) How did you come up with such specific values for the range, those values seems quite random for me. But the augmentation technique is quite refreshing\nThanks</p>",
          "rawMarkdown": "(1)Could you be a bit more specific by \"where p is in range(0,1) and keep tilt up and down 50-50 percentage\"  --do you mean by padding the  augmented image?\nshould the following augmentation just suffice?\n\n```\nalpha = (np.random.random()*8-5.65)*np.pi/180.\nbeta = (np.random.random()*50-25)*np.pi/180.\ngamma = (np.random.random()*6-3)*np.pi/180. + beta/3\n```\nI only changer the p to np.random.random()--&gt; I am not quite sure why use the p in alpha but not others.\n\n(2) How did you come up with such specific values for the range, those values seems quite random for me. But the augmentation technique is quite refreshing\nThanks"
        },
        {
          "id": 738429,
          "postDate": "2020-02-06T14:07:14.080Z",
          "content": "<p>I mean P(alpha&gt;0)=0.5\nfor a simple case, alpha = ((np.random.random()**0.5)*8-5.65)*np.pi/180.\nor just like others, alpha = (np.random.random()*6-3)*np.pi/180.\nThere is no obvious difference in test accuracy.</p>\n\n<p>I set tilt up more because I want to catch more cars in the sky when apply TTA since my vertical input size is narrower.</p>\n\n<p>Beta's range could as large as possible, in this competition, it performs like random shift in normal image pre-processing. But the horizon is not in image center, so offset the gamma by beta to keep roll in a proper range.</p>",
          "rawMarkdown": "I mean P(alpha&gt;0)=0.5\nfor a simple case, alpha = ((np.random.random()\\*\\*0.5)\\*8-5.65)\\*np.pi/180.\nor just like others, alpha = (np.random.random()\\*6-3)\\*np.pi/180.\nThere is no obvious difference in test accuracy.\n\nI set tilt up more because I want to catch more cars in the sky when apply TTA since my vertical input size is narrower.\n\nBeta's range could as large as possible, in this competition, it performs like random shift in normal image pre-processing. But the horizon is not in image center, so offset the gamma by beta to keep roll in a proper range.",
          "votes": 1
        }
      ]
    },
    {
      "id": 734619,
      "postDate": "2020-02-01T18:10:01.503Z",
      "content": "<p>Congratulations!</p>",
      "rawMarkdown": "Congratulations!"
    },
    {
      "id": 734257,
      "postDate": "2020-02-01T07:09:34.083Z",
      "content": "<p>谢谢分享。请问 prediction blending 部分，六个输出结果加权平均具体是什么意思呢？</p>",
      "rawMarkdown": "谢谢分享。请问 prediction blending 部分，六个输出结果加权平均具体是什么意思呢？",
      "replies": [
        {
          "id": 734391,
          "postDate": "2020-02-01T11:51:22.620Z",
          "content": "<p>two models blending example: <a href=\"https://www.kaggle.com/outrunner/autonomous-driving-1st-place-solution-inference\">https://www.kaggle.com/outrunner/autonomous-driving-1st-place-solution-inference</a></p>",
          "rawMarkdown": "two models blending example: https://www.kaggle.com/outrunner/autonomous-driving-1st-place-solution-inference"
        }
      ]
    },
    {
      "id": 734198,
      "postDate": "2020-02-01T04:38:06.887Z",
      "content": "<p>Congrats! Could I know what does \"h-flip\" mean?</p>",
      "rawMarkdown": "Congrats! Could I know what does \"h-flip\" mean?",
      "replies": [
        {
          "id": 734214,
          "postDate": "2020-02-01T05:09:25.960Z",
          "content": "<p>horizontal flip</p>",
          "rawMarkdown": "horizontal flip"
        },
        {
          "id": 734223,
          "postDate": "2020-02-01T05:35:27.167Z",
          "content": "<p>thanks!</p>",
          "rawMarkdown": "thanks!"
        }
      ]
    },
    {
      "id": 733208,
      "postDate": "2020-01-30T20:28:22.147Z",
      "content": "<p>Congratulations!!</p>",
      "rawMarkdown": "Congratulations!!"
    },
    {
      "id": 732523,
      "postDate": "2020-01-29T23:01:42.290Z",
      "content": "<p>Congrats and thank you for sharing.\nDid you always apply perspective transform, or randomly during training? </p>",
      "rawMarkdown": "Congrats and thank you for sharing.\nDid you always apply perspective transform, or randomly during training? ",
      "replies": [
        {
          "id": 732633,
          "postDate": "2020-01-30T03:06:16.280Z",
          "content": "<p>One transformation per model, thanks.</p>",
          "rawMarkdown": "One transformation per model, thanks.",
          "votes": 1
        }
      ]
    },
    {
      "id": 730499,
      "postDate": "2020-01-27T15:01:14.783Z",
      "content": "<p>Congratulations and thanks for sharing outstanding solution.\nI've never come up with perspective transformation.</p>",
      "rawMarkdown": "Congratulations and thanks for sharing outstanding solution.\nI've never come up with perspective transformation."
    },
    {
      "id": 730482,
      "postDate": "2020-01-27T14:40:59.847Z",
      "content": "<p>Congrats and thank you for sharing exciting solution. Metric probing is very cool!\nTranslation metric is really wired...</p>",
      "rawMarkdown": "Congrats and thank you for sharing exciting solution. Metric probing is very cool!\nTranslation metric is really wired..."
    },
    {
      "id": 730457,
      "postDate": "2020-01-27T14:05:22.883Z",
      "content": "<p>Congratulations and thanks for sharing! Are you planning to publish the training code?</p>",
      "rawMarkdown": "Congratulations and thanks for sharing! Are you planning to publish the training code?",
      "replies": [
        {
          "id": 732634,
          "postDate": "2020-01-30T03:06:34.027Z",
          "content": "<p>No, thanks.</p>",
          "rawMarkdown": "No, thanks."
        }
      ]
    },
    {
      "id": 729952,
      "postDate": "2020-01-26T21:56:08.437Z",
      "content": "<p>Congrats! I can't wait to see your detail solution.</p>",
      "rawMarkdown": "Congrats! I can't wait to see your detail solution."
    },
    {
      "id": 729405,
      "postDate": "2020-01-26T06:30:40.130Z",
      "content": "<p>happy new year</p>",
      "rawMarkdown": "happy new year"
    },
    {
      "id": 728460,
      "postDate": "2020-01-24T18:38:44.820Z",
      "content": "<p>happy new year</p>",
      "rawMarkdown": "happy new year"
    },
    {
      "id": 727958,
      "postDate": "2020-01-24T09:04:20.203Z",
      "content": "<p>Great job! Happy new year! </p>",
      "rawMarkdown": "Great job! Happy new year! "
    },
    {
      "id": 727378,
      "postDate": "2020-01-23T17:11:03.897Z",
      "content": "<p>Great job! </p>",
      "rawMarkdown": "Great job! "
    },
    {
      "id": 727134,
      "postDate": "2020-01-23T13:32:48.027Z",
      "content": "<p>Congrats <a href=\"/outrunner\">@outrunner</a>! Very interesting, have you used only Keras in your solution. Thanks for sharing.</p>",
      "rawMarkdown": "Congrats @outrunner! Very interesting, have you used only Keras in your solution. Thanks for sharing.",
      "replies": [
        {
          "id": 728199,
          "postDate": "2020-01-24T13:53:59.080Z",
          "content": "<p>Keras only, thanks.</p>",
          "rawMarkdown": "Keras only, thanks.",
          "votes": 1
        },
        {
          "id": 728946,
          "postDate": "2020-01-25T13:56:36.553Z",
          "content": "<p>That's awesome! congrats</p>",
          "rawMarkdown": "That's awesome! congrats"
        }
      ]
    },
    {
      "id": 727072,
      "postDate": "2020-01-23T12:42:19.870Z",
      "content": "<p>Great job! Happy new year! </p>",
      "rawMarkdown": "Great job! Happy new year! "
    },
    {
      "id": 726895,
      "postDate": "2020-01-23T09:57:22.920Z",
      "content": "<p>太强了！！膜拜大神！希望能从大神的kernel里学到怎么做数据处理。\n另外问一句，大神用的pytorch还是tensorflow?</p>",
      "rawMarkdown": "太强了！！膜拜大神！希望能从大神的kernel里学到怎么做数据处理。\n另外问一句，大神用的pytorch还是tensorflow?",
      "replies": [
        {
          "id": 729420,
          "postDate": "2020-01-26T07:20:07.170Z",
          "content": "<p>Keras/TF</p>",
          "rawMarkdown": "Keras/TF"
        }
      ]
    },
    {
      "id": 726372,
      "postDate": "2020-01-23T01:31:56.583Z",
      "content": "<p>well done!</p>",
      "rawMarkdown": "well done!"
    },
    {
      "id": 726118,
      "postDate": "2020-01-22T20:43:04.053Z",
      "content": "<p>Hi <a href=\"/outrunner\">@outrunner</a> , I did not find time to spend into this competition except two kernels. But I am really happy that this kernel somehow helped you and probably others. \nHappy Chinese new year. 😊</p>",
      "rawMarkdown": "Hi @outrunner , I did not find time to spend into this competition except two kernels. But I am really happy that this kernel somehow helped you and probably others. \nHappy Chinese new year. 😊",
      "replies": [
        {
          "id": 726252,
          "postDate": "2020-01-23T00:21:22.407Z",
          "content": "<p>I build the rotation augmentation by your kernel, and it help a lot. Thanks.</p>",
          "rawMarkdown": "I build the rotation augmentation by your kernel, and it help a lot. Thanks."
        }
      ]
    },
    {
      "id": 726059,
      "postDate": "2020-01-22T19:05:53.720Z",
      "content": "<p>congrats! 👍</p>",
      "rawMarkdown": "congrats! 👍"
    },
    {
      "id": 726010,
      "postDate": "2020-01-22T17:54:06.683Z",
      "content": "<p>Congratulations！话说这个也太强了</p>",
      "rawMarkdown": "Congratulations！话说这个也太强了"
    },
    {
      "id": 725864,
      "postDate": "2020-01-22T14:55:36.370Z",
      "content": "<p><a href=\"/outrunner\">@outrunner</a>  Congratualtions!! looking foraward for detailed discriptions!!</p>",
      "rawMarkdown": "@outrunner  Congratualtions!! looking foraward for detailed discriptions!!"
    },
    {
      "id": 725815,
      "postDate": "2020-01-22T14:13:13.423Z",
      "content": "<p>Congrats! 新年快乐！</p>",
      "rawMarkdown": "Congrats! 新年快乐！"
    },
    {
      "id": 725788,
      "postDate": "2020-01-22T13:56:10.817Z",
      "content": "<p>Congratulations!</p>",
      "rawMarkdown": "Congratulations!"
    },
    {
      "id": 725688,
      "postDate": "2020-01-22T11:49:02.950Z",
      "content": "<p>Congratulations !!!!!  Happy  New Year!</p>",
      "rawMarkdown": "Congratulations !!!!!  Happy  New Year!"
    },
    {
      "id": 725582,
      "postDate": "2020-01-22T09:02:57.207Z",
      "content": "<p>Congratulations on winning the Gold and title.</p>",
      "rawMarkdown": "Congratulations on winning the Gold and title."
    },
    {
      "id": 725538,
      "postDate": "2020-01-22T08:12:28.740Z",
      "content": "<p>Congratulations and happy new Chinese year. </p>",
      "rawMarkdown": "Congratulations and happy new Chinese year. "
    },
    {
      "id": 725472,
      "postDate": "2020-01-22T06:24:23.507Z",
      "content": "<p>Congrats! 新年快乐！</p>",
      "rawMarkdown": "Congrats! 新年快乐！"
    },
    {
      "id": 725466,
      "postDate": "2020-01-22T06:13:05.187Z",
      "content": "<p>Congratulations! Thanks for the quick summary, I'm looking forward for your in detail description :)</p>",
      "rawMarkdown": "Congratulations! Thanks for the quick summary, I'm looking forward for your in detail description :)\n"
    },
    {
      "id": 725419,
      "postDate": "2020-01-22T04:35:18.590Z",
      "content": "<p>Congratulations!\n太神了！！</p>",
      "rawMarkdown": "Congratulations!\n太神了！！\n"
    },
    {
      "id": 725361,
      "postDate": "2020-01-22T02:59:27.367Z",
      "content": "<p>Congratulations! Your result is awesome!!!\nCould you please give me a bit more detail about 3 axis rotate augmentation??\nThanks,</p>",
      "rawMarkdown": "Congratulations! Your result is awesome!!!\nCould you please give me a bit more detail about 3 axis rotate augmentation??\nThanks,",
      "replies": [
        {
          "id": 726255,
          "postDate": "2020-01-23T00:23:21.140Z",
          "content": "<p>Transform image and targets by rotating camera.</p>",
          "rawMarkdown": "Transform image and targets by rotating camera.",
          "votes": 1
        }
      ]
    },
    {
      "id": 725360,
      "postDate": "2020-01-22T02:57:54.257Z",
      "content": "<p>Nice!</p>",
      "rawMarkdown": "Nice!"
    },
    {
      "id": 725355,
      "postDate": "2020-01-22T02:44:40.643Z",
      "content": "<p>恭喜，春节快乐！</p>",
      "rawMarkdown": "恭喜，春节快乐！"
    },
    {
      "id": 725350,
      "postDate": "2020-01-22T02:35:06.060Z",
      "content": "<p>恭喜!!!! 太神啦!! 新年快樂大神~</p>",
      "rawMarkdown": "恭喜!!!! 太神啦!! 新年快樂大神~"
    },
    {
      "id": 725307,
      "postDate": "2020-01-22T01:41:13.093Z",
      "content": "<p>Congrats 1st place and new GM✨ 🎉  Thanks for sharing!!😄 👍 </p>",
      "rawMarkdown": "Congrats 1st place and new GM✨ 🎉  Thanks for sharing!!😄 👍 "
    },
    {
      "id": 725295,
      "postDate": "2020-01-22T01:22:17.180Z",
      "content": "<p>Congratulations! Happy New Year,anticipate the details later.</p>",
      "rawMarkdown": "Congratulations! Happy New Year,anticipate the details later."
    },
    {
      "id": 725293,
      "postDate": "2020-01-22T01:20:05.777Z",
      "content": "<p>恭喜呀，一个人冲到了第一名，新年快乐！</p>",
      "rawMarkdown": "恭喜呀，一个人冲到了第一名，新年快乐！"
    },
    {
      "id": 725291,
      "postDate": "2020-01-22T01:17:21.253Z",
      "content": "<p>恭喜!感觉我做的东西都差不多怎么结果差这么远😂 </p>",
      "rawMarkdown": "恭喜!感觉我做的东西都差不多怎么结果差这么远😂 ",
      "replies": [
        {
          "id": 726268,
          "postDate": "2020-01-23T00:34:38.133Z",
          "content": "<p>等我回家再跟你說😀</p>",
          "rawMarkdown": "等我回家再跟你說😀"
        }
      ]
    },
    {
      "id": 725290,
      "postDate": "2020-01-22T01:11:49.987Z",
      "content": "<p>Congratulations!</p>",
      "rawMarkdown": "Congratulations!"
    },
    {
      "id": 725285,
      "postDate": "2020-01-22T01:05:23.900Z",
      "content": "<p>恭喜恭喜，happy chinese new year</p>",
      "rawMarkdown": "恭喜恭喜，happy chinese new year"
    },
    {
      "id": 725278,
      "postDate": "2020-01-22T00:51:43.550Z",
      "content": "<p>恭喜恭喜🎊🍾️春节快乐！</p>",
      "rawMarkdown": "\n恭喜恭喜🎊🍾️春节快乐！"
    },
    {
      "id": 725271,
      "postDate": "2020-01-22T00:42:37.780Z",
      "content": "<p>Congratulations! Happy Chinese New Year! </p>",
      "rawMarkdown": "Congratulations! Happy Chinese New Year! "
    },
    {
      "id": 725269,
      "postDate": "2020-01-22T00:39:17.267Z",
      "content": "<p>Congrats!</p>",
      "rawMarkdown": "Congrats!"
    },
    {
      "id": 725266,
      "postDate": "2020-01-22T00:36:07.893Z",
      "content": "<p>Congratulations! I assume perspective transform played an important role in getting better results?</p>",
      "rawMarkdown": "Congratulations! I assume perspective transform played an important role in getting better results?",
      "replies": [
        {
          "id": 726265,
          "postDate": "2020-01-23T00:29:45.973Z",
          "content": "<p>Sure.</p>",
          "rawMarkdown": "Sure.",
          "votes": 1
        }
      ]
    },
    {
      "id": 725263,
      "postDate": "2020-01-22T00:33:06.720Z",
      "content": "<p>Awesome! Congrats!</p>",
      "rawMarkdown": "Awesome! Congrats!"
    },
    {
      "id": 725260,
      "postDate": "2020-01-22T00:30:16.140Z",
      "content": "<p>Congrats! Can't wait to see your detail solution.</p>",
      "rawMarkdown": "Congrats! Can't wait to see your detail solution."
    },
    {
      "id": 725344,
      "postDate": "2020-01-22T02:28:39.210Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 732034,
      "postDate": "2020-01-29T12:07:49.220Z",
      "content": "<p>Congrats,Thanks for sharing !</p>",
      "rawMarkdown": "Congrats,Thanks for sharing !",
      "votes": 5
    },
    {
      "id": 945523,
      "postDate": "2020-07-25T23:00:11.167Z",
      "content": "<p>Thanks for sharing!</p>",
      "rawMarkdown": "Thanks for sharing!"
    }
  ],
  "comments": [
    {
      "id": 725325,
      "author_name": "Marcus Lin",
      "author_url": "",
      "post_date": "2020-01-22T01:56:02.467000",
      "content": "<p>太殺了</p>",
      "votes": 6,
      "replies": []
    },
    {
      "id": 735751,
      "author_name": "Jubilance Chen",
      "author_url": "",
      "post_date": "2020-02-03T12:30:27.980000",
      "content": "<p>強者我曾經的鄰居</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 726851,
      "author_name": "Yangyang",
      "author_url": "",
      "post_date": "2020-01-23T09:25:21.930000",
      "content": "<p>Excellent, look forward to see your notebook</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 725304,
      "author_name": "CPMP",
      "author_url": "",
      "post_date": "2020-01-22T01:36:11.817000",
      "content": "<p>Congrats on this solo win and your competition GM title!  Well done.</p>",
      "votes": 2,
      "replies": [
        {
          "id": 726267,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-01-23T00:34:07.570000",
          "content": "<p>Thanks.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1715448,
      "author_name": "Zahra Roozbehi",
      "author_url": "",
      "post_date": "2022-03-08T02:45:07.193000",
      "content": "<p>Congratulations!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 899083,
      "author_name": "Eric Hou(CV engineer)",
      "author_url": "",
      "post_date": "2020-06-24T00:54:18.397000",
      "content": "<p>You are just amazing. I learned A LOT A LOT from you. Thank you very much, you are a true grandmaster.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 798500,
      "author_name": "DiegoJohnson",
      "author_url": "",
      "post_date": "2020-04-05T14:55:45.660000",
      "content": "<p>Congratulation！\nMay I ask what's 'Coordinate reference'?\nHow do you get it?</p>",
      "votes": 0,
      "replies": [
        {
          "id": 798977,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-04-06T03:40:58.957000",
          "content": "<p>just a scaled 2d coordinate:</p>\n\n<pre><code>ref = np.reshape(np.arange(0, xo*yo), (yo, xo, -1))\nref_x = ref % xo\nref_y = ref // xo\nref = np.dstack([(ref_x-(xo-1)/2)/100, ref_y/100])\n</code></pre>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 737218,
      "author_name": "stevenwudi",
      "author_url": "",
      "post_date": "2020-02-05T04:06:34.597000",
      "content": "<blockquote>\n  <h1>Camera rotation</h1>\n  \n  <p>This is the most important part of my approach. Since I only have 4001 training images, 5 bad, and 256 for validation. It is easily to overfit without rotation augmentation.</p>\n</blockquote>\n\n<p>May I ask do you use this augmentation for training one model, or 6 augmentations methods individually for training 6 models?\nCan you also give us the improvement percentage w/wo using your augmentation? Many thanks!</p>",
      "votes": 0,
      "replies": [
        {
          "id": 737226,
          "author_name": "Tsai29",
          "author_url": "",
          "post_date": "2020-02-05T04:20:23.103000",
          "content": "<p>Might not be the 100% correct information..But in my experiment, the mAP improve 0.01 for Camera rotation augmentation (Only train 50 epochs)</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 737239,
          "author_name": "stevenwudi",
          "author_url": "",
          "post_date": "2020-02-05T04:45:04.843000",
          "content": "<p>Oh really, this is a huge improvement considering only 0.14 mAP. Thanks Xie , I think I am gonna try this technique out</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 737273,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-02-05T05:51:38.783000",
          "content": "<ol>\n<li><p>all augmentation methods for all models in final submission</p></li>\n<li><p>the improvement:\n<img src=\"https://i.imgur.com/kTtvyRL.gif\" alt=\"scores2\"></p></li>\n</ol>\n\n<p>I think this is as important as you add ApolloScape dataset.</p>\n\n<p><a href=\"/xiejialun\">@xiejialun</a> , thanks for sharing.</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 738222,
          "author_name": "stevenwudi",
          "author_url": "",
          "post_date": "2020-02-06T09:28:13.630000",
          "content": "<p>Thanks for answering <a href=\"/outrunner\">@outrunner</a> , that table reveals more details. In terms of a single baseline model, we achieve similar result. May I also ask about the range you choose for the alpha, beta, gamma? I am trying to re-implement your training augmentation regiment in our system to see whether it can achieve similar improvement. Thanks a lot </p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 738224,
          "author_name": "stevenwudi",
          "author_url": "",
          "post_date": "2020-02-06T09:29:46.240000",
          "content": "<p><a href=\"/xiejialun\">@xiejialun</a>  Could you tell us our range for  alpha, beta, gamma during training to achieve the 0.01 improvment? Thanks!</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 738245,
          "author_name": "Tsai29",
          "author_url": "",
          "post_date": "2020-02-06T10:07:46.893000",
          "content": "<p>The rotation range of alpha, beta and gamma is -5~5(degree) in my experiment.</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 738375,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-02-06T13:01:00.437000",
          "content": "<p>alpha = (p*8-5.65)*np.pi/180.\nbeta  = (np.random.random()*50-25)*np.pi/180.\ngamma = (np.random.random()*6-3)*np.pi/180. + beta/3.</p>\n\n<p>where p is in range(0,1) and keep tilt up and down 50-50 percentage</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 738397,
          "author_name": "stevenwudi",
          "author_url": "",
          "post_date": "2020-02-06T13:25:30.707000",
          "content": "<p>(1)Could you be a bit more specific by \"where p is in range(0,1) and keep tilt up and down 50-50 percentage\"  --do you mean by padding the  augmented image?\nshould the following augmentation just suffice?</p>\n\n<p><code>\nalpha = (np.random.random()*8-5.65)*np.pi/180.\nbeta = (np.random.random()*50-25)*np.pi/180.\ngamma = (np.random.random()*6-3)*np.pi/180. + beta/3\n</code>\nI only changer the p to np.random.random()--&gt; I am not quite sure why use the p in alpha but not others.</p>\n\n<p>(2) How did you come up with such specific values for the range, those values seems quite random for me. But the augmentation technique is quite refreshing\nThanks</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 738429,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-02-06T14:07:14.080000",
          "content": "<p>I mean P(alpha&gt;0)=0.5\nfor a simple case, alpha = ((np.random.random()**0.5)*8-5.65)*np.pi/180.\nor just like others, alpha = (np.random.random()*6-3)*np.pi/180.\nThere is no obvious difference in test accuracy.</p>\n\n<p>I set tilt up more because I want to catch more cars in the sky when apply TTA since my vertical input size is narrower.</p>\n\n<p>Beta's range could as large as possible, in this competition, it performs like random shift in normal image pre-processing. But the horizon is not in image center, so offset the gamma by beta to keep roll in a proper range.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 734619,
      "author_name": "Marvin Zajonz",
      "author_url": "",
      "post_date": "2020-02-01T18:10:01.503000",
      "content": "<p>Congratulations!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 734257,
      "author_name": "yudan qiu",
      "author_url": "",
      "post_date": "2020-02-01T07:09:34.083000",
      "content": "<p>谢谢分享。请问 prediction blending 部分，六个输出结果加权平均具体是什么意思呢？</p>",
      "votes": 0,
      "replies": [
        {
          "id": 734391,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-02-01T11:51:22.620000",
          "content": "<p>two models blending example: <a href=\"https://www.kaggle.com/outrunner/autonomous-driving-1st-place-solution-inference\">https://www.kaggle.com/outrunner/autonomous-driving-1st-place-solution-inference</a></p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 734198,
      "author_name": "Lazy Alpha",
      "author_url": "",
      "post_date": "2020-02-01T04:38:06.887000",
      "content": "<p>Congrats! Could I know what does \"h-flip\" mean?</p>",
      "votes": 0,
      "replies": [
        {
          "id": 734214,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-02-01T05:09:25.960000",
          "content": "<p>horizontal flip</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 734223,
          "author_name": "Lazy Alpha",
          "author_url": "",
          "post_date": "2020-02-01T05:35:27.167000",
          "content": "<p>thanks!</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 733208,
      "author_name": "Manish Nayak",
      "author_url": "",
      "post_date": "2020-01-30T20:28:22.147000",
      "content": "<p>Congratulations!!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 732523,
      "author_name": "corochann",
      "author_url": "",
      "post_date": "2020-01-29T23:01:42.290000",
      "content": "<p>Congrats and thank you for sharing.\nDid you always apply perspective transform, or randomly during training? </p>",
      "votes": 0,
      "replies": [
        {
          "id": 732633,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-01-30T03:06:16.280000",
          "content": "<p>One transformation per model, thanks.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 730499,
      "author_name": "yama",
      "author_url": "",
      "post_date": "2020-01-27T15:01:14.783000",
      "content": "<p>Congratulations and thanks for sharing outstanding solution.\nI've never come up with perspective transformation.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 730482,
      "author_name": "yu4u",
      "author_url": "",
      "post_date": "2020-01-27T14:40:59.847000",
      "content": "<p>Congrats and thank you for sharing exciting solution. Metric probing is very cool!\nTranslation metric is really wired...</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 730457,
      "author_name": "Ilya Belkin",
      "author_url": "",
      "post_date": "2020-01-27T14:05:22.883000",
      "content": "<p>Congratulations and thanks for sharing! Are you planning to publish the training code?</p>",
      "votes": 0,
      "replies": [
        {
          "id": 732634,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-01-30T03:06:34.027000",
          "content": "<p>No, thanks.</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 729952,
      "author_name": "MarcoWang",
      "author_url": "",
      "post_date": "2020-01-26T21:56:08.437000",
      "content": "<p>Congrats! I can't wait to see your detail solution.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 729405,
      "author_name": "张鉴鸾",
      "author_url": "",
      "post_date": "2020-01-26T06:30:40.130000",
      "content": "<p>happy new year</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 728460,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-24T18:38:44.820000",
      "content": "<p>happy new year</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 727958,
      "author_name": "Tony",
      "author_url": "",
      "post_date": "2020-01-24T09:04:20.203000",
      "content": "<p>Great job! Happy new year! </p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 727378,
      "author_name": "Ajnas M",
      "author_url": "",
      "post_date": "2020-01-23T17:11:03.897000",
      "content": "<p>Great job! </p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 727134,
      "author_name": "Giba",
      "author_url": "",
      "post_date": "2020-01-23T13:32:48.027000",
      "content": "<p>Congrats <a href=\"/outrunner\">@outrunner</a>! Very interesting, have you used only Keras in your solution. Thanks for sharing.</p>",
      "votes": 0,
      "replies": [
        {
          "id": 728199,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-01-24T13:53:59.080000",
          "content": "<p>Keras only, thanks.</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 728946,
          "author_name": "Giba",
          "author_url": "",
          "post_date": "2020-01-25T13:56:36.553000",
          "content": "<p>That's awesome! congrats</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 727072,
      "author_name": "Haley",
      "author_url": "",
      "post_date": "2020-01-23T12:42:19.870000",
      "content": "<p>Great job! Happy new year! </p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 726895,
      "author_name": "THU崔晏菲",
      "author_url": "",
      "post_date": "2020-01-23T09:57:22.920000",
      "content": "<p>太强了！！膜拜大神！希望能从大神的kernel里学到怎么做数据处理。\n另外问一句，大神用的pytorch还是tensorflow?</p>",
      "votes": 0,
      "replies": [
        {
          "id": 729420,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-01-26T07:20:07.170000",
          "content": "<p>Keras/TF</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 726372,
      "author_name": "Sahar S",
      "author_url": "",
      "post_date": "2020-01-23T01:31:56.583000",
      "content": "<p>well done!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 726118,
      "author_name": "Eric Bouteillon",
      "author_url": "",
      "post_date": "2020-01-22T20:43:04.053000",
      "content": "<p>Hi <a href=\"/outrunner\">@outrunner</a> , I did not find time to spend into this competition except two kernels. But I am really happy that this kernel somehow helped you and probably others. \nHappy Chinese new year. 😊</p>",
      "votes": 0,
      "replies": [
        {
          "id": 726252,
          "author_name": "outrunner",
          "author_url": "",
          "post_date": "2020-01-23T00:21:22.407000",
          "content": "<p>I build the rotation augmentation by your kernel, and it help a lot. Thanks.</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 726059,
      "author_name": "Dmitrii Shustrov",
      "author_url": "",
      "post_date": "2020-01-22T19:05:53.720000",
      "content": "<p>congrats! 👍</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 726010,
      "author_name": "Zhao Gong",
      "author_url": "",
      "post_date": "2020-01-22T17:54:06.683000",
      "content": "<p>Congratulations！话说这个也太强了</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725864,
      "author_name": "A/C",
      "author_url": "",
      "post_date": "2020-01-22T14:55:36.370000",
      "content": "<p><a href=\"/outrunner\">@outrunner</a>  Congratualtions!! looking foraward for detailed discriptions!!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725815,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T14:13:13.423000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725788,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T13:56:10.817000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725688,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T11:49:02.950000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725582,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T09:02:57.207000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725538,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T08:12:28.740000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725472,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T06:24:23.507000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725466,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T06:13:05.187000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725419,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T04:35:18.590000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725361,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T02:59:27.367000",
      "content": "",
      "votes": 0,
      "replies": [
        {
          "id": 726255,
          "author_name": "",
          "author_url": "",
          "post_date": "2020-01-23T00:23:21.140000",
          "content": "",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 725360,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T02:57:54.257000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725355,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T02:44:40.643000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725350,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T02:35:06.060000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725307,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T01:41:13.093000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725295,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T01:22:17.180000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725293,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T01:20:05.777000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725291,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T01:17:21.253000",
      "content": "",
      "votes": 0,
      "replies": [
        {
          "id": 726268,
          "author_name": "",
          "author_url": "",
          "post_date": "2020-01-23T00:34:38.133000",
          "content": "",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 725290,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T01:11:49.987000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725285,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T01:05:23.900000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725278,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T00:51:43.550000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725271,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T00:42:37.780000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725269,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T00:39:17.267000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725266,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T00:36:07.893000",
      "content": "",
      "votes": 0,
      "replies": [
        {
          "id": 726265,
          "author_name": "",
          "author_url": "",
          "post_date": "2020-01-23T00:29:45.973000",
          "content": "",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 725263,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T00:33:06.720000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725260,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T00:30:16.140000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 725344,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-22T02:28:39.210000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 732034,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-01-29T12:07:49.220000",
      "content": "",
      "votes": 5,
      "replies": []
    },
    {
      "id": 945523,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-07-25T23:00:11.167000",
      "content": "",
      "votes": 0,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "725259": "Thanks to everyone and congratulations to all the top teams. I'm on vacation, so I will post the details after the Chinese New Year.\n\n# In brief\n - data augmentation: h-flip, 3 axis rotate, color, noise, blur.\n - [keras hourglass centernet](https://github.com/see--/keras-centernet)\n - perspective transform for efficiency\n - regression of yaw, cos(pitch), sin(pitch), rot_pi(roll), x, y, z, r\n - blend 6 results (2 types of head * 3 types of transform)\n - post process by fitting LB\n\n\n# Especially thanks to these kernels:\n - [CenterNet Baseline](https://www.kaggle.com/hocop1/centernet-baseline) @hocop1\n - [Augmented Reality](https://www.kaggle.com/ebouteillon/augmented-reality) @ebouteillon\n - [metrics evaluation script](https://www.kaggle.com/its7171/metrics-evaluation-script) @its7171\n\n\nHappy Chinese New Year\n\n# 1/26 details updated\n\n# Network\n\n![network](https://i.imgur.com/uFNfCFB.jpg)\n\nMy approach is based on [keras hourglass centernet](https://github.com/see--/keras-centernet).\nSome notes:\n- ***6 Dof***: regression of yaw, cos(pitch), sin(pitch), rot_pi(roll), x, y, z, distance\n- discard ***XY bias*** result finally.\n- remove ***Car types*** and ***XY bias*** in my second model.\n\n**# Perspective transform**\nTwo purpose:\n- reduce the size gap between small(far) and large(near) cars.\n- cover more outliers without extending image.\n\nI find the model don't predict well on the large car when I increase the input size, so I make them smaller. The extra benefit is to enclose outliers.\n\n**Original image:**\n![original](https://i.imgur.com/bNABgvS.jpg)\n**Transformed:**\n![transformed](https://i.imgur.com/Xe396jz.jpg)\n**Coverage comparison:** (dots denote the GT location)\n![coverage](https://i.imgur.com/JJYfmNn.jpg)\n**Validation result with outlier:** (red dot: GT, green: predict heat map)\n![transformed](https://i.imgur.com/s6UAHIO.png)\n\n**# Coordinate reference**\nI think the same feature in different locations should get different results. So I join this layer to get better predictions, and apply random crop when training.\n\n# Data augmentation\nI use: h-flip, camera rotate, color, noise, blur.\n\n**# Camera rotation**\nThis is the most important part of my approach. Since I only have 4001 training images, 5 bad, and 256 for validation. It is easily to overfit without rotation augmentation. \n\n**The augmentation looks like:** (center is original image)\n![rotation augmentation](https://i.imgur.com/kONFCcy.jpg)\nPlease refer to [this kernel](https://www.kaggle.com/outrunner/rotation-augmentation) for details.\n\n# Training\n- Focal loss for heat map\n- Huber for regression\n- Adam optimizer\n- Manually adjust learning rate from 10^-3.5 to 10^-5.5\n- About 0.4M iterations\n- Train: full network -&gt; part of -&gt; head only -&gt; full ...\n- Change input size (random corp) and batch size every iteration\n- One 2080Ti per training. (I have 2)\n- Total 6 models, 2 heads * 3 transforms (different parameter and input size)\n\n# Inference\nPlease refer to [this kernel](https://www.kaggle.com/outrunner/autonomous-driving-1st-place-solution-inference) for details.\n\n**# Test time augmentation**\nFlip and multiple transformations, weighted average the predictions.\n\n**# Blending**\nTransform predictions to one model's transformation, weighted average 6 results.\n\n**# Weighted average neighborhood**\nWhen decoding, not only use the local maximum point but also take into account\nthe prediction around it.\n\n# Metric probing and Post processing\nThis is the first time I join a competition without knowing the evaluation metric. The probing is interesting, but there are some weird characters in the metric.\n\n**Probing procedure:**\n![Probing process](https://i.imgur.com/ESMF5qS.jpg)\n**# Image wise**\nSplit test images to two sets A and B, then: **score(A) + score(B) = score(A+B)**\n\n**# Confidence independent**\nSo the metric is something like **F1** or **TP/(TP+FN+FP)**\n\n**# Rotation**\nθ and θ+2π differently, so the score is directly impacted by roll prediction. Therefore, I train a model to predict global roll and get the score improvement.\n\n**# Translation**\nThe most weird thing is that when I shift X by some pixels, the LB score change  significantly. So I guess the Metric is:\n```sh\n(abs(x-xp)/abs(x) + abs(y-yp)/abs(y) + abs(z-zp)/abs(z))/3\n```\n**And increase the threshold when abs(x) is small:**\n![Confidence threshold](https://i.imgur.com/BmYJ9CO.jpg)\n\n**The overall post-processing:**\n\n- [opt] replace x, y by X, Y, z, r (just like everybody do)\n- [roll] replace instance roll by global roll\n- [xs] shift X 2 pixels (don't know why)\n- [rx] drop some cars whose x are near by zero, and keep a least car number per image\n- [dz] drop duplicate cars\n\n**# table of results:**\n![table of results](https://i.imgur.com/WSMGpUH.gif)\n*# parameters are the same as final submission, and some procedures are dependent*",
    "725325": "太殺了",
    "735751": "強者我曾經的鄰居",
    "726851": "Excellent, look forward to see your notebook",
    "725304": "Congrats on this solo win and your competition GM title!  Well done.",
    "1715448": "Congratulations!",
    "899083": "You are just amazing. I learned A LOT A LOT from you. Thank you very much, you are a true grandmaster.",
    "798500": "Congratulation！\nMay I ask what's 'Coordinate reference'?\nHow do you get it?",
    "737218": "&gt; # Camera rotation\nThis is the most important part of my approach. Since I only have 4001 training images, 5 bad, and 256 for validation. It is easily to overfit without rotation augmentation.\n\nMay I ask do you use this augmentation for training one model, or 6 augmentations methods individually for training 6 models?\nCan you also give us the improvement percentage w/wo using your augmentation? Many thanks!",
    "734619": "Congratulations!",
    "734257": "谢谢分享。请问 prediction blending 部分，六个输出结果加权平均具体是什么意思呢？",
    "734198": "Congrats! Could I know what does \"h-flip\" mean?",
    "733208": "Congratulations!!",
    "732523": "Congrats and thank you for sharing.\nDid you always apply perspective transform, or randomly during training? ",
    "730499": "Congratulations and thanks for sharing outstanding solution.\nI've never come up with perspective transformation.",
    "730482": "Congrats and thank you for sharing exciting solution. Metric probing is very cool!\nTranslation metric is really wired...",
    "730457": "Congratulations and thanks for sharing! Are you planning to publish the training code?",
    "729952": "Congrats! I can't wait to see your detail solution.",
    "729405": "happy new year",
    "728460": "happy new year",
    "727958": "Great job! Happy new year! ",
    "727378": "Great job! ",
    "727134": "Congrats @outrunner! Very interesting, have you used only Keras in your solution. Thanks for sharing.",
    "727072": "Great job! Happy new year! ",
    "726895": "太强了！！膜拜大神！希望能从大神的kernel里学到怎么做数据处理。\n另外问一句，大神用的pytorch还是tensorflow?",
    "726372": "well done!",
    "726118": "Hi @outrunner , I did not find time to spend into this competition except two kernels. But I am really happy that this kernel somehow helped you and probably others. \nHappy Chinese new year. 😊",
    "726059": "congrats! 👍",
    "726010": "Congratulations！话说这个也太强了",
    "725864": "@outrunner  Congratualtions!! looking foraward for detailed discriptions!!",
    "725815": "Congrats! 新年快乐！",
    "725788": "Congratulations!",
    "725688": "Congratulations !!!!!  Happy  New Year!",
    "725582": "Congratulations on winning the Gold and title.",
    "725538": "Congratulations and happy new Chinese year. ",
    "725472": "Congrats! 新年快乐！",
    "725466": "Congratulations! Thanks for the quick summary, I'm looking forward for your in detail description :)\n",
    "725419": "Congratulations!\n太神了！！\n",
    "725361": "Congratulations! Your result is awesome!!!\nCould you please give me a bit more detail about 3 axis rotate augmentation??\nThanks,",
    "725360": "Nice!",
    "725355": "恭喜，春节快乐！",
    "725350": "恭喜!!!! 太神啦!! 新年快樂大神~",
    "725307": "Congrats 1st place and new GM✨ 🎉  Thanks for sharing!!😄 👍 ",
    "725295": "Congratulations! Happy New Year,anticipate the details later.",
    "725293": "恭喜呀，一个人冲到了第一名，新年快乐！",
    "725291": "恭喜!感觉我做的东西都差不多怎么结果差这么远😂 ",
    "725290": "Congratulations!",
    "725285": "恭喜恭喜，happy chinese new year",
    "725278": "\n恭喜恭喜🎊🍾️春节快乐！",
    "725271": "Congratulations! Happy Chinese New Year! ",
    "725269": "Congrats!",
    "725266": "Congratulations! I assume perspective transform played an important role in getting better results?",
    "725263": "Awesome! Congrats!",
    "725260": "Congrats! Can't wait to see your detail solution.",
    "725344": "",
    "732034": "Congrats,Thanks for sharing !",
    "945523": "Thanks for sharing!"
  }
}