{
  "id": 187821,
  "title": "1st Place Solution",
  "url": "/competitions/landmark-recognition-2020/discussion/187821",
  "author_name": "Dieter",
  "post_date": "2020-09-30T12:17:17.420000",
  "votes": 196,
  "comment_count": 93,
  "views": 0,
  "content": "<p>Thanks to google and kaggle for hosting this yearly competition. It was a lot of fun exploring and learning all about global, local descriptors and algorithms to match similar images.</p>\n<h3>Brief Summary</h3>\n<p>Our solution is an ensemble of 7 global descriptor only models trained with arcface loss. We classify landmarks by KNN on an extended version of the train dataset and efficiently rerank predictions and filter noise using cosine similarity to non-landmark images. We did not use any local descriptors.</p>\n<h3>Detailed Summary</h3>\n<p>Below we give a detailed description of our solution of which architecture is only a small part.<br>\nVideo content of us presenting the solution is available under:</p>\n<p>NVIDIA Grandmaster Series Ep2 <a href=\"https://youtu.be/VxNDH6qLZ_Q\" target=\"_blank\">https://youtu.be/VxNDH6qLZ_Q</a><br>\nChai Time Data Science <a href=\"https://youtu.be/NRl3lMlixPc\" target=\"_blank\">https://youtu.be/NRl3lMlixPc</a></p>\n<h4>Pipeline</h4>\n<p>We wanted to use this competition as a chance to improve our pipeline and coding skills. While in past competitions we mainly used jupyter notebooks locally, we switched to a collaborative approach using scripts with github versioning for this one. After some acclimatization we clearly saw a benefit of our pipeline consisting of the following tools</p>\n<p>Github: Versioning and code sharing<br>\nNeptune: logging and visualisation<br>\nKaggle API: dataset upload/ download<br>\nGCP: data storage</p>\n<p>So in practice we downloaded preprocessed data from google storage, trained our models using pytorch lightning where we logged with neptune and uploaded the latest version of our git repo and model weights to a kaggle dataset to use it in our inference kernel. This allowed us to experiment and iterate quickly.</p>\n<p>We are planning to release our code on github soon after some clean up.</p>\n<h4>Architectures</h4>\n<p>Our ensemble consists of 7 models using the following backbones available in the timm repository. Instead of much augmentation we trained our models on different image scales using albumentations.</p>\n<ul>\n<li>2x seresnext101 - SmallMaxSize(512) -&gt; RandomCrop(448,448)</li>\n<li>1x seresnext101 - Resize(686,686) -&gt; RandomCrop(568,568)</li>\n<li>1x b3 - LongestMaxSize(512) -&gt; PadIfNeeded -&gt; RandomCrop(448,448)</li>\n<li>1x b3 - LongestMaxSize(664) -&gt; PadIfNeeded -&gt; RandomCrop(600,600)</li>\n<li>1x resnet152 - Resize(544,672) -&gt; RandomCrop(512,512)</li>\n<li>1x res2net101 - Resize(544,672) -&gt; RandomCrop(512,512)</li>\n</ul>\n<p>We normalize the images by the mean and std of the imagenet dataset before feeding them into a pretrained backbone. All models use GeM pooling for aggregating backbone outputs. We use a simple Linear(512) + BN + PReLU neck before feeding into an arc margin head with m ranging from 0.3 to 0.4 predicting one of the 81313 landmarks. We use the 512 dimensional output of the neck as the image embedding (= global descriptor) The following illustrates our setup for a SEResnext101 backbone.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1424766%2F6872393fee6bc154a4bf7d0127b62061%2FScreenshot%202020-09-30%20at%2013.30.05.png?generation=1601467910231165&amp;alt=media\" alt=\"\"></p>\n<h4>Training strategy/ schedule</h4>\n<p>We train all our models on gldv2 clean data only. Each model is trained for 10 epochs with a cosine annealing scheduler having one warm-up epoch. We use SGD optimizer with maximum lr of 0.05 and weight decay of 1e-4 across all models.</p>\n<h4>Ranking post-processing</h4>\n<p>As previous editions of this competition have shown, properly ranking and re-ranking predictions is crucial to improve the GAP metric at hand that is sensitive to how landmarks and non-landmarks are ranked respectively. So one major aspect is to specifically penalize non-landmarks that constitute a large portion of the test set. We always tracked both overall GAP as well as landmark-only GAP separately and evaluated all ranking experiments on our validation set that resembled the test set quite well. There are quite different ways to approach this ranking problem, and different ways can lead to success, but here is what we found to work extremely well.</p>\n<p>In the following graphic we visualize the main concepts of our ranking process. Test refers to the test set on the leaderboard, so the images we need to rank. Train refers to the candidate images we can use to determine the labels and the confidence. One important thing here is that we increased this set of images by all available images for the classes from gldv2_clean from gldv2_full. The 3rd place solution [1] notes that extending the dataset to include also these images improves their training, but what we found is that this is even more useful to be included in the inference process, which makes sense as there are more images to choose from. This also worked well on CV which is how we found it. And finally, Non-landmark includes all non-landmark images from the gldv2 test set. We then calculate all-pairs similarity between all of these sets. A measures the similarity to all available landmarks and their confidence. B measures the similarity of all train images to all non-landmark images and C does the same for the test images. </p>\n<p>The core idea is now to penalize A by B and C, so to penalize images that are similar to the non-landmark images. A is calculated between each test image and each train image. B and C are calculated by the mean similarity between the image and the top-5 (or 10) most similar non-landmark images.</p>\n<p>Then, the first step is to penalize A_ij by B_j, pick the top-3 most similar images, and sum the confidence for the same label and then pick the highest. Afterwards, this score is further penalized by C_i. Actually, using both B and C for penalization is a bit redundant, and just using either of those brings good improvements, with just using B is better than just using C.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1424766%2F1e262e5afd63136dec8bc07e686a365a%2FScreenshot%202020-09-30%20at%2014.13.22.png?generation=1601468018948485&amp;alt=media\" alt=\"\"></p>\n<p>This whole procedure helps us to boost the actual landmarks to higher ranks and to penalize non-landmarks and rank them lower. Specifically B helps us to eliminate noise from the Train images. This gave both impressive boosts on CV and LB. <br>\nOne more important thing to note here is that when calculating cosine similarity between different sets, the similarity metric benefits from similarly scaled vectors. So what we do is that we fit a QuantileTransformer (other scalers work similarly well) on the test set, and apply them on the train and non-landmark datasets. This makes the scores way more stable and we assume that this also adjusts differently sized images better.</p>\n<h4>Blending</h4>\n<p>For blending our various models, we first l2-normalize them separately and concatenate them and apply above mentioned quantile transformer on each feature. We then calculate for each model separately the top 3 scores from above and then sum the same labels across all top 3 scores from all models and select the maximum label. For calculating C, we use the concatenated embeddings. This procedure is a bit more robust compared to just using the concatenated embeddings, but for simplicity one can also rely on that approach as it produces very similar rankings.</p>\n<h4>A word on local descriptors</h4>\n<p>We tried hard getting something out of local descriptors. For that we tried DELG as well as superpoint.<br>\nDELG: first we tried to port the pretrained DELG to pytorch but gave up after struggling for a day with tf1 and tf2.0 mixups in the original implementation. Instead we extracted local features using the tf implementation directly as done in the public baseline. <br>\nSuperpoint: We extracted local descriptors using the pretrained superpoint net, which is very fast.<br>\nWe matched keypoints straight forward and applied RANSAC after. However the improvement even when using different image scales etc. was very small for both, DELG and Superpoint, and computational time for extracting and matching keypoints (especially when using DELG) was very high. Hence we did not use local descriptors in our final submissions.</p>\n<h4>What did not work</h4>\n<ul>\n<li>Training together with gldv1</li>\n<li>Training together with gldv2 full</li>\n<li>Using index dataset 2019</li>\n<li>Using test set from 2019 stage1 </li>\n<li>Hyperbolic image embeddings</li>\n<li>Superglue</li>\n<li>Deformable Grid</li>\n<li>1000 other things</li>\n</ul>\n<p>Thanks for reading. Questions welcome.</p>\n<p>[1] <a href=\"https://www.kaggle.com/c/landmark-recognition-2020/discussion/187757\" target=\"_blank\">https://www.kaggle.com/c/landmark-recognition-2020/discussion/187757</a></p>\n<p>update:<br>\npaper: <a href=\"https://arxiv.org/abs/2010.01650\" target=\"_blank\">https://arxiv.org/abs/2010.01650</a><br>\ncode: <a href=\"https://github.com/psinger/kaggle-landmark-recognition-2020-1st-place\" target=\"_blank\">https://github.com/psinger/kaggle-landmark-recognition-2020-1st-place</a></p>",
  "messages": [
    {
      "id": 1032735,
      "postDate": "2020-09-30T12:17:17.420Z",
      "content": "<p>Thanks to google and kaggle for hosting this yearly competition. It was a lot of fun exploring and learning all about global, local descriptors and algorithms to match similar images.</p>\n<h3>Brief Summary</h3>\n<p>Our solution is an ensemble of 7 global descriptor only models trained with arcface loss. We classify landmarks by KNN on an extended version of the train dataset and efficiently rerank predictions and filter noise using cosine similarity to non-landmark images. We did not use any local descriptors.</p>\n<h3>Detailed Summary</h3>\n<p>Below we give a detailed description of our solution of which architecture is only a small part.<br>\nVideo content of us presenting the solution is available under:</p>\n<p>NVIDIA Grandmaster Series Ep2 <a href=\"https://youtu.be/VxNDH6qLZ_Q\" target=\"_blank\">https://youtu.be/VxNDH6qLZ_Q</a><br>\nChai Time Data Science <a href=\"https://youtu.be/NRl3lMlixPc\" target=\"_blank\">https://youtu.be/NRl3lMlixPc</a></p>\n<h4>Pipeline</h4>\n<p>We wanted to use this competition as a chance to improve our pipeline and coding skills. While in past competitions we mainly used jupyter notebooks locally, we switched to a collaborative approach using scripts with github versioning for this one. After some acclimatization we clearly saw a benefit of our pipeline consisting of the following tools</p>\n<p>Github: Versioning and code sharing<br>\nNeptune: logging and visualisation<br>\nKaggle API: dataset upload/ download<br>\nGCP: data storage</p>\n<p>So in practice we downloaded preprocessed data from google storage, trained our models using pytorch lightning where we logged with neptune and uploaded the latest version of our git repo and model weights to a kaggle dataset to use it in our inference kernel. This allowed us to experiment and iterate quickly.</p>\n<p>We are planning to release our code on github soon after some clean up.</p>\n<h4>Architectures</h4>\n<p>Our ensemble consists of 7 models using the following backbones available in the timm repository. Instead of much augmentation we trained our models on different image scales using albumentations.</p>\n<ul>\n<li>2x seresnext101 - SmallMaxSize(512) -&gt; RandomCrop(448,448)</li>\n<li>1x seresnext101 - Resize(686,686) -&gt; RandomCrop(568,568)</li>\n<li>1x b3 - LongestMaxSize(512) -&gt; PadIfNeeded -&gt; RandomCrop(448,448)</li>\n<li>1x b3 - LongestMaxSize(664) -&gt; PadIfNeeded -&gt; RandomCrop(600,600)</li>\n<li>1x resnet152 - Resize(544,672) -&gt; RandomCrop(512,512)</li>\n<li>1x res2net101 - Resize(544,672) -&gt; RandomCrop(512,512)</li>\n</ul>\n<p>We normalize the images by the mean and std of the imagenet dataset before feeding them into a pretrained backbone. All models use GeM pooling for aggregating backbone outputs. We use a simple Linear(512) + BN + PReLU neck before feeding into an arc margin head with m ranging from 0.3 to 0.4 predicting one of the 81313 landmarks. We use the 512 dimensional output of the neck as the image embedding (= global descriptor) The following illustrates our setup for a SEResnext101 backbone.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1424766%2F6872393fee6bc154a4bf7d0127b62061%2FScreenshot%202020-09-30%20at%2013.30.05.png?generation=1601467910231165&amp;alt=media\" alt=\"\"></p>\n<h4>Training strategy/ schedule</h4>\n<p>We train all our models on gldv2 clean data only. Each model is trained for 10 epochs with a cosine annealing scheduler having one warm-up epoch. We use SGD optimizer with maximum lr of 0.05 and weight decay of 1e-4 across all models.</p>\n<h4>Ranking post-processing</h4>\n<p>As previous editions of this competition have shown, properly ranking and re-ranking predictions is crucial to improve the GAP metric at hand that is sensitive to how landmarks and non-landmarks are ranked respectively. So one major aspect is to specifically penalize non-landmarks that constitute a large portion of the test set. We always tracked both overall GAP as well as landmark-only GAP separately and evaluated all ranking experiments on our validation set that resembled the test set quite well. There are quite different ways to approach this ranking problem, and different ways can lead to success, but here is what we found to work extremely well.</p>\n<p>In the following graphic we visualize the main concepts of our ranking process. Test refers to the test set on the leaderboard, so the images we need to rank. Train refers to the candidate images we can use to determine the labels and the confidence. One important thing here is that we increased this set of images by all available images for the classes from gldv2_clean from gldv2_full. The 3rd place solution [1] notes that extending the dataset to include also these images improves their training, but what we found is that this is even more useful to be included in the inference process, which makes sense as there are more images to choose from. This also worked well on CV which is how we found it. And finally, Non-landmark includes all non-landmark images from the gldv2 test set. We then calculate all-pairs similarity between all of these sets. A measures the similarity to all available landmarks and their confidence. B measures the similarity of all train images to all non-landmark images and C does the same for the test images. </p>\n<p>The core idea is now to penalize A by B and C, so to penalize images that are similar to the non-landmark images. A is calculated between each test image and each train image. B and C are calculated by the mean similarity between the image and the top-5 (or 10) most similar non-landmark images.</p>\n<p>Then, the first step is to penalize A_ij by B_j, pick the top-3 most similar images, and sum the confidence for the same label and then pick the highest. Afterwards, this score is further penalized by C_i. Actually, using both B and C for penalization is a bit redundant, and just using either of those brings good improvements, with just using B is better than just using C.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1424766%2F1e262e5afd63136dec8bc07e686a365a%2FScreenshot%202020-09-30%20at%2014.13.22.png?generation=1601468018948485&amp;alt=media\" alt=\"\"></p>\n<p>This whole procedure helps us to boost the actual landmarks to higher ranks and to penalize non-landmarks and rank them lower. Specifically B helps us to eliminate noise from the Train images. This gave both impressive boosts on CV and LB. <br>\nOne more important thing to note here is that when calculating cosine similarity between different sets, the similarity metric benefits from similarly scaled vectors. So what we do is that we fit a QuantileTransformer (other scalers work similarly well) on the test set, and apply them on the train and non-landmark datasets. This makes the scores way more stable and we assume that this also adjusts differently sized images better.</p>\n<h4>Blending</h4>\n<p>For blending our various models, we first l2-normalize them separately and concatenate them and apply above mentioned quantile transformer on each feature. We then calculate for each model separately the top 3 scores from above and then sum the same labels across all top 3 scores from all models and select the maximum label. For calculating C, we use the concatenated embeddings. This procedure is a bit more robust compared to just using the concatenated embeddings, but for simplicity one can also rely on that approach as it produces very similar rankings.</p>\n<h4>A word on local descriptors</h4>\n<p>We tried hard getting something out of local descriptors. For that we tried DELG as well as superpoint.<br>\nDELG: first we tried to port the pretrained DELG to pytorch but gave up after struggling for a day with tf1 and tf2.0 mixups in the original implementation. Instead we extracted local features using the tf implementation directly as done in the public baseline. <br>\nSuperpoint: We extracted local descriptors using the pretrained superpoint net, which is very fast.<br>\nWe matched keypoints straight forward and applied RANSAC after. However the improvement even when using different image scales etc. was very small for both, DELG and Superpoint, and computational time for extracting and matching keypoints (especially when using DELG) was very high. Hence we did not use local descriptors in our final submissions.</p>\n<h4>What did not work</h4>\n<ul>\n<li>Training together with gldv1</li>\n<li>Training together with gldv2 full</li>\n<li>Using index dataset 2019</li>\n<li>Using test set from 2019 stage1 </li>\n<li>Hyperbolic image embeddings</li>\n<li>Superglue</li>\n<li>Deformable Grid</li>\n<li>1000 other things</li>\n</ul>\n<p>Thanks for reading. Questions welcome.</p>\n<p>[1] <a href=\"https://www.kaggle.com/c/landmark-recognition-2020/discussion/187757\" target=\"_blank\">https://www.kaggle.com/c/landmark-recognition-2020/discussion/187757</a></p>\n<p>update:<br>\npaper: <a href=\"https://arxiv.org/abs/2010.01650\" target=\"_blank\">https://arxiv.org/abs/2010.01650</a><br>\ncode: <a href=\"https://github.com/psinger/kaggle-landmark-recognition-2020-1st-place\" target=\"_blank\">https://github.com/psinger/kaggle-landmark-recognition-2020-1st-place</a></p>",
      "rawMarkdown": "Thanks to google and kaggle for hosting this yearly competition. It was a lot of fun exploring and learning all about global, local descriptors and algorithms to match similar images.\n\n### Brief Summary\n\nOur solution is an ensemble of 7 global descriptor only models trained with arcface loss. We classify landmarks by KNN on an extended version of the train dataset and efficiently rerank predictions and filter noise using cosine similarity to non-landmark images. We did not use any local descriptors.\n\n### Detailed Summary\n\nBelow we give a detailed description of our solution of which architecture is only a small part.\nVideo content of us presenting the solution is available under:\n\nNVIDIA Grandmaster Series Ep2 https://youtu.be/VxNDH6qLZ_Q\nChai Time Data Science https://youtu.be/NRl3lMlixPc\n\n\n#### Pipeline\nWe wanted to use this competition as a chance to improve our pipeline and coding skills. While in past competitions we mainly used jupyter notebooks locally, we switched to a collaborative approach using scripts with github versioning for this one. After some acclimatization we clearly saw a benefit of our pipeline consisting of the following tools\n\nGithub: Versioning and code sharing\nNeptune: logging and visualisation\nKaggle API: dataset upload/ download\nGCP: data storage\n\nSo in practice we downloaded preprocessed data from google storage, trained our models using pytorch lightning where we logged with neptune and uploaded the latest version of our git repo and model weights to a kaggle dataset to use it in our inference kernel. This allowed us to experiment and iterate quickly.\n\nWe are planning to release our code on github soon after some clean up.\n\n#### Architectures\n\nOur ensemble consists of 7 models using the following backbones available in the timm repository. Instead of much augmentation we trained our models on different image scales using albumentations.\n\n- 2x seresnext101 - SmallMaxSize(512) -> RandomCrop(448,448)\n- 1x seresnext101 - Resize(686,686) -> RandomCrop(568,568)\n- 1x b3 - LongestMaxSize(512) -> PadIfNeeded -> RandomCrop(448,448)\n- 1x b3 - LongestMaxSize(664) -> PadIfNeeded -> RandomCrop(600,600)\n- 1x resnet152 - Resize(544,672) -> RandomCrop(512,512)\n- 1x res2net101 - Resize(544,672) -> RandomCrop(512,512)\n\nWe normalize the images by the mean and std of the imagenet dataset before feeding them into a pretrained backbone. All models use GeM pooling for aggregating backbone outputs. We use a simple Linear(512) + BN + PReLU neck before feeding into an arc margin head with m ranging from 0.3 to 0.4 predicting one of the 81313 landmarks. We use the 512 dimensional output of the neck as the image embedding (= global descriptor) The following illustrates our setup for a SEResnext101 backbone.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1424766%2F6872393fee6bc154a4bf7d0127b62061%2FScreenshot%202020-09-30%20at%2013.30.05.png?generation=1601467910231165&alt=media)\n\n#### Training strategy/ schedule\n\nWe train all our models on gldv2 clean data only. Each model is trained for 10 epochs with a cosine annealing scheduler having one warm-up epoch. We use SGD optimizer with maximum lr of 0.05 and weight decay of 1e-4 across all models.\n\n#### Ranking post-processing\n\nAs previous editions of this competition have shown, properly ranking and re-ranking predictions is crucial to improve the GAP metric at hand that is sensitive to how landmarks and non-landmarks are ranked respectively. So one major aspect is to specifically penalize non-landmarks that constitute a large portion of the test set. We always tracked both overall GAP as well as landmark-only GAP separately and evaluated all ranking experiments on our validation set that resembled the test set quite well. There are quite different ways to approach this ranking problem, and different ways can lead to success, but here is what we found to work extremely well.\n\nIn the following graphic we visualize the main concepts of our ranking process. Test refers to the test set on the leaderboard, so the images we need to rank. Train refers to the candidate images we can use to determine the labels and the confidence. One important thing here is that we increased this set of images by all available images for the classes from gldv2_clean from gldv2_full. The 3rd place solution [1] notes that extending the dataset to include also these images improves their training, but what we found is that this is even more useful to be included in the inference process, which makes sense as there are more images to choose from. This also worked well on CV which is how we found it. And finally, Non-landmark includes all non-landmark images from the gldv2 test set. We then calculate all-pairs similarity between all of these sets. A measures the similarity to all available landmarks and their confidence. B measures the similarity of all train images to all non-landmark images and C does the same for the test images. \n\nThe core idea is now to penalize A by B and C, so to penalize images that are similar to the non-landmark images. A is calculated between each test image and each train image. B and C are calculated by the mean similarity between the image and the top-5 (or 10) most similar non-landmark images.\n\nThen, the first step is to penalize A_ij by B_j, pick the top-3 most similar images, and sum the confidence for the same label and then pick the highest. Afterwards, this score is further penalized by C_i. Actually, using both B and C for penalization is a bit redundant, and just using either of those brings good improvements, with just using B is better than just using C.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1424766%2F1e262e5afd63136dec8bc07e686a365a%2FScreenshot%202020-09-30%20at%2014.13.22.png?generation=1601468018948485&alt=media)\n\nThis whole procedure helps us to boost the actual landmarks to higher ranks and to penalize non-landmarks and rank them lower. Specifically B helps us to eliminate noise from the Train images. This gave both impressive boosts on CV and LB. \nOne more important thing to note here is that when calculating cosine similarity between different sets, the similarity metric benefits from similarly scaled vectors. So what we do is that we fit a QuantileTransformer (other scalers work similarly well) on the test set, and apply them on the train and non-landmark datasets. This makes the scores way more stable and we assume that this also adjusts differently sized images better.\n\n#### Blending\n\nFor blending our various models, we first l2-normalize them separately and concatenate them and apply above mentioned quantile transformer on each feature. We then calculate for each model separately the top 3 scores from above and then sum the same labels across all top 3 scores from all models and select the maximum label. For calculating C, we use the concatenated embeddings. This procedure is a bit more robust compared to just using the concatenated embeddings, but for simplicity one can also rely on that approach as it produces very similar rankings.\n \n#### A word on local descriptors\n\nWe tried hard getting something out of local descriptors. For that we tried DELG as well as superpoint.\nDELG: first we tried to port the pretrained DELG to pytorch but gave up after struggling for a day with tf1 and tf2.0 mixups in the original implementation. Instead we extracted local features using the tf implementation directly as done in the public baseline. \nSuperpoint: We extracted local descriptors using the pretrained superpoint net, which is very fast.\nWe matched keypoints straight forward and applied RANSAC after. However the improvement even when using different image scales etc. was very small for both, DELG and Superpoint, and computational time for extracting and matching keypoints (especially when using DELG) was very high. Hence we did not use local descriptors in our final submissions.\n\n#### What did not work\n\n- Training together with gldv1\n- Training together with gldv2 full\n- Using index dataset 2019\n- Using test set from 2019 stage1 \n- Hyperbolic image embeddings\n- Superglue\n- Deformable Grid\n- 1000 other things\n\nThanks for reading. Questions welcome.\n \n[1] https://www.kaggle.com/c/landmark-recognition-2020/discussion/187757\n\nupdate:\npaper: https://arxiv.org/abs/2010.01650\ncode: https://github.com/psinger/kaggle-landmark-recognition-2020-1st-place",
      "votes": 196
    },
    {
      "id": 1032747,
      "postDate": "2020-09-30T12:28:16.803Z",
      "content": "<p>It looks so simple, it must have been very hard to converge on this.  Congrats for the awesome win.</p>",
      "rawMarkdown": "It looks so simple, it must have been very hard to converge on this.  Congrats for the awesome win.",
      "votes": 13
    },
    {
      "id": 1032757,
      "postDate": "2020-09-30T12:31:59.900Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> , impressive solution! And the way you collaborate with each other is a very good example for all the Kagglers.</p>\n<p>My main problem with this competition was not having a representative validation scheme. We couldn't think of using the previous competition labels as you guys did, therefore our team overfit LB.</p>",
      "rawMarkdown": "Congrats @christofhenkel @philippsinger , impressive solution! And the way you collaborate with each other is a very good example for all the Kagglers.\n\nMy main problem with this competition was not having a representative validation scheme. We couldn't think of using the previous competition labels as you guys did, therefore our team overfit LB.",
      "votes": 9
    },
    {
      "id": 1032753,
      "postDate": "2020-09-30T12:30:58.877Z",
      "content": "<p>Congratulations, dieter and psi. Good job with a nice Ranking post-processing.<br>\nI have a question: what about your best private score without post processing?</p>",
      "rawMarkdown": "Congratulations, dieter and psi. Good job with a nice Ranking post-processing.\nI have a question: what about your best private score without post processing?",
      "votes": 5,
      "replies": [
        {
          "id": 1032771,
          "postDate": "2020-09-30T12:41:58.290Z",
          "content": "<p>Hard to say. We submitted the last single model without any reranking 2 weeks ago. That model was at 0.52 private LB and is not part of our final ensemble.</p>",
          "rawMarkdown": "Hard to say. We submitted the last single model without any reranking 2 weeks ago. That model was at 0.52 private LB and is not part of our final ensemble.",
          "votes": 3
        },
        {
          "id": 1032776,
          "postDate": "2020-09-30T12:47:09.663Z",
          "content": "<p>ok, thanks for you reply. <br>\nIt is best if you intend to submit with pure model only in the future, which can be used to verify the generalization of your models.</p>",
          "rawMarkdown": "ok, thanks for you reply. \nIt is best if you intend to submit with pure model only in the future, which can be used to verify the generalization of your models.",
          "votes": 2
        },
        {
          "id": 1032782,
          "postDate": "2020-09-30T12:53:02.123Z",
          "content": "<p>Not sure how that would showcase generalizability as the specific goal of this competition was to shape a solution that works well on ranking landmarks and non-landmarks conjoint and we optimized the models specifically with that objective in mind.</p>",
          "rawMarkdown": "Not sure how that would showcase generalizability as the specific goal of this competition was to shape a solution that works well on ranking landmarks and non-landmarks conjoint and we optimized the models specifically with that objective in mind.",
          "votes": 3
        }
      ]
    },
    {
      "id": 1495836,
      "postDate": "2021-08-29T20:36:19.687Z",
      "content": "<p>great work, simple. Congrats</p>",
      "rawMarkdown": "great work, simple. Congrats",
      "votes": 1
    },
    {
      "id": 1032841,
      "postDate": "2020-09-30T13:26:43.583Z",
      "content": "<p>Thank you for your sharing and Congrats Psi and Dieter Grandpa 😁. I wonder why you use Prelu instead of relu(or any other activations) in your neck part?</p>",
      "rawMarkdown": "Thank you for your sharing and Congrats Psi and Dieter Grandpa 😁. I wonder why you use Prelu instead of relu(or any other activations) in your neck part?",
      "votes": 3
    },
    {
      "id": 1055389,
      "postDate": "2020-10-20T18:10:51.243Z",
      "content": "<p>I love your collaboration pipeline!  👍💯</p>",
      "rawMarkdown": "I love your collaboration pipeline!  👍💯",
      "votes": 1
    },
    {
      "id": 1054050,
      "postDate": "2020-10-19T16:04:37.817Z",
      "content": "<p>May I ask what is <code>SmallMaxSize</code> and <code>LongestMaxSize</code> preprocessing?</p>",
      "rawMarkdown": "May I ask what is `SmallMaxSize` and `LongestMaxSize` preprocessing?",
      "votes": 1,
      "replies": [
        {
          "id": 1054090,
          "postDate": "2020-10-19T16:50:34.037Z",
          "content": "<p>Best is to check Albumentation docu for explanation.</p>",
          "rawMarkdown": "Best is to check Albumentation docu for explanation.",
          "votes": 1
        },
        {
          "id": 1054241,
          "postDate": "2020-10-19T19:23:28.723Z",
          "content": "<p><a href=\"https://github.com/albumentations-team/albumentations/blob/master/albumentations/augmentations/transforms.py#L407-L441\" target=\"_blank\">https://github.com/albumentations-team/albumentations/blob/master/albumentations/augmentations/transforms.py#L407-L441</a></p>\n<blockquote>\n  <p>Rescale an image so that minimum side is equal to max_size, keeping the aspect ratio of the initial image.</p>\n</blockquote>\n<p>and LongestMaxSize accordingly</p>",
          "rawMarkdown": "https://github.com/albumentations-team/albumentations/blob/master/albumentations/augmentations/transforms.py#L407-L441\n\n> Rescale an image so that minimum side is equal to max_size, keeping the aspect ratio of the initial image.\n\nand LongestMaxSize accordingly",
          "votes": 1
        },
        {
          "id": 1054482,
          "postDate": "2020-10-20T01:36:28.857Z",
          "content": "<p>Thank you! So that's from albumentations.</p>",
          "rawMarkdown": "Thank you! So that's from albumentations.",
          "votes": 1
        }
      ]
    },
    {
      "id": 1041188,
      "postDate": "2020-10-07T15:45:02.920Z",
      "content": "<p>congratulation!! <br>\nThanks for sharing!! very helpful </p>",
      "rawMarkdown": "congratulation!! \nThanks for sharing!! very helpful ",
      "votes": 1
    },
    {
      "id": 1037091,
      "postDate": "2020-10-04T15:44:47.863Z",
      "content": "<p>Awesome work. Congrats!</p>",
      "rawMarkdown": "Awesome work. Congrats!",
      "votes": 1
    },
    {
      "id": 1035876,
      "postDate": "2020-10-03T07:25:35.193Z",
      "content": "<p>Congratulations, Great stuff.</p>",
      "rawMarkdown": "Congratulations, Great stuff.",
      "votes": 1
    },
    {
      "id": 1035526,
      "postDate": "2020-10-02T19:08:53.317Z",
      "content": "<p>Congratulations both of you and today i learned a lot .<br>\nthanks for sharing such a great overview of your work </p>",
      "rawMarkdown": "Congratulations both of you and today i learned a lot .\nthanks for sharing such a great overview of your work \n",
      "votes": 1
    },
    {
      "id": 1035332,
      "postDate": "2020-10-02T16:35:31.517Z",
      "content": "<p>Congrats guys! <br>\nQQ: What processor did you guys use to train the model? <br>\nI tried running it on colab tpu but there was quite a few issues with that and it was pretty slow.</p>",
      "rawMarkdown": "Congrats guys! \nQQ: What processor did you guys use to train the model? \nI tried running it on colab tpu but there was quite a few issues with that and it was pretty slow.",
      "votes": 1,
      "replies": [
        {
          "id": 1035357,
          "postDate": "2020-10-02T16:54:14.197Z",
          "content": "<p>GPUs, Pytorch on TPUs is way too unstable yet</p>",
          "rawMarkdown": "GPUs, Pytorch on TPUs is way too unstable yet",
          "votes": 5
        },
        {
          "id": 1035405,
          "postDate": "2020-10-02T17:37:52.170Z",
          "content": "<p>I guess on your own machines? Or did you use Colab (maybe pro) + Kaggle?</p>",
          "rawMarkdown": "I guess on your own machines? Or did you use Colab (maybe pro) + Kaggle?"
        },
        {
          "id": 1035418,
          "postDate": "2020-10-02T17:42:06.580Z",
          "rawMarkdown": "",
          "isDeleted": true
        },
        {
          "id": 1035419,
          "postDate": "2020-10-02T17:42:06.580Z",
          "content": "<p>Own machines.</p>",
          "rawMarkdown": "Own machines.",
          "votes": 1
        }
      ]
    },
    {
      "id": 1033326,
      "postDate": "2020-09-30T21:06:01.783Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> and <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a>. In the end the margin of your win was quite something and says a lot about the thorough and innovative work you've done. Thank you for sharing the details… I think I'll need to read that through one more time!</p>",
      "rawMarkdown": "Congrats @christofhenkel and @philippsinger. In the end the margin of your win was quite something and says a lot about the thorough and innovative work you've done. Thank you for sharing the details... I think I'll need to read that through one more time!",
      "votes": 1
    },
    {
      "id": 1033136,
      "postDate": "2020-09-30T17:28:17.900Z",
      "content": "<p>Awesome work <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> and <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> !</p>",
      "rawMarkdown": "Awesome work @philippsinger and @christofhenkel !",
      "votes": 1
    },
    {
      "id": 1033040,
      "postDate": "2020-09-30T16:02:20.327Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> and <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> on result. Thanks for sharing details solution!</p>",
      "rawMarkdown": "Congrats @christofhenkel and @philippsinger on result. Thanks for sharing details solution!",
      "votes": 1
    },
    {
      "id": 1032960,
      "postDate": "2020-09-30T14:55:04.297Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> and <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> ! Thanks for sharing this amazing solution.</p>",
      "rawMarkdown": "Congrats @philippsinger and @christofhenkel ! Thanks for sharing this amazing solution.",
      "votes": 1
    },
    {
      "id": 1032838,
      "postDate": "2020-09-30T13:24:56.027Z",
      "content": "<p>Thanks for the Write-up. </p>\n<p>Curious to look at the pipeline and the implementation. Do share when you can. Thanks! </p>",
      "rawMarkdown": "Thanks for the Write-up. \n\nCurious to look at the pipeline and the implementation. Do share when you can. Thanks! ",
      "votes": 1
    },
    {
      "id": 1032811,
      "postDate": "2020-09-30T13:09:20.647Z",
      "content": "<p>Congratulations with the 1st place! 🎉🎉🎉 Thanks for the detailed write-up. That's an amazing amount of attention to details, and It's remarkable that you trained only on gldv2-clean set, in contrast to other top teams.</p>",
      "rawMarkdown": "Congratulations with the 1st place! 🎉🎉🎉 Thanks for the detailed write-up. That's an amazing amount of attention to details, and It's remarkable that you trained only on gldv2-clean set, in contrast to other top teams.",
      "votes": 1,
      "replies": [
        {
          "id": 1032816,
          "postDate": "2020-09-30T13:11:21.090Z",
          "content": "<p>Thanks, congrats also on your result. We used extra data for inference, others for training. Maybe those have similar effects, but at least on CV we did not see much change with extra training data.</p>",
          "rawMarkdown": "Thanks, congrats also on your result. We used extra data for inference, others for training. Maybe those have similar effects, but at least on CV we did not see much change with extra training data.",
          "votes": 3
        }
      ]
    },
    {
      "id": 1094115,
      "postDate": "2020-11-28T10:29:43.070Z",
      "content": "<p>updated description with video links of us presenting the solution:<br>\nNVIDIA Grandmaster Series Ep2 <a href=\"https://youtu.be/VxNDH6qLZ_Q\" target=\"_blank\">https://youtu.be/VxNDH6qLZ_Q</a><br>\nChai Time Data Science <a href=\"https://youtu.be/NRl3lMlixPc\" target=\"_blank\">https://youtu.be/NRl3lMlixPc</a></p>",
      "rawMarkdown": "updated description with video links of us presenting the solution:\nNVIDIA Grandmaster Series Ep2 https://youtu.be/VxNDH6qLZ_Q\nChai Time Data Science https://youtu.be/NRl3lMlixPc",
      "votes": 2,
      "replies": [
        {
          "id": 1094422,
          "postDate": "2020-11-28T15:52:23.970Z",
          "content": "<p>I am seeing you in the video the first time. I thought you were an old man. but it seems that the Profile picture is an old man. But you are absolutely a young man</p>",
          "rawMarkdown": "I am seeing you in the video the first time. I thought you were an old man. but it seems that the Profile picture is an old man. But you are absolutely a young man",
          "votes": 3
        },
        {
          "id": 1094531,
          "postDate": "2020-11-28T17:38:46.680Z",
          "content": "<p>Is this one from the \"best videos\" series? 😄</p>\n<p>For the curious, here is the reference: <a href=\"https://twitter.com/kagglingdieter/status/1319312923840348166?s=20\" target=\"_blank\">https://twitter.com/kagglingdieter/status/1319312923840348166?s=20</a>. </p>",
          "rawMarkdown": "Is this one from the \"best videos\" series? 😄\n\nFor the curious, here is the reference: https://twitter.com/kagglingdieter/status/1319312923840348166?s=20. ",
          "votes": 1
        }
      ]
    },
    {
      "id": 1038860,
      "postDate": "2020-10-06T05:51:08.800Z",
      "content": "<p>There is a paper now: <a href=\"https://arxiv.org/pdf/2010.01650.pdf\" target=\"_blank\">https://arxiv.org/pdf/2010.01650.pdf</a><br>\n👍</p>",
      "rawMarkdown": "There is a paper now: https://arxiv.org/pdf/2010.01650.pdf\n👍",
      "votes": 2
    },
    {
      "id": 1035640,
      "postDate": "2020-10-02T22:47:48.457Z",
      "content": "<p>Well deserved win <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> with a very clean solution.<br>\nAnd thanks a lot for the writeup.</p>\n<p>I like how you cleverly used the right tools to set up a fast pipeline. I'll definetly have to look into neptune myself. </p>",
      "rawMarkdown": "Well deserved win @christofhenkel @philippsinger with a very clean solution.\nAnd thanks a lot for the writeup.\n\nI like how you cleverly used the right tools to set up a fast pipeline. I'll definetly have to look into neptune myself. ",
      "votes": 2
    },
    {
      "id": 1035366,
      "postDate": "2020-10-02T17:05:36.700Z",
      "content": "<p>nicenicenicenicenicenicenicenicenicenice</p>",
      "rawMarkdown": "nicenicenicenicenicenicenicenicenicenice",
      "votes": 2,
      "replies": [
        {
          "id": 1035371,
          "postDate": "2020-10-02T17:15:29.713Z",
          "content": "<p>Thx. Thats how I felt when private LB was revealed</p>",
          "rawMarkdown": "Thx. Thats how I felt when private LB was revealed",
          "votes": 3
        }
      ]
    },
    {
      "id": 1033855,
      "postDate": "2020-10-01T10:11:04.440Z",
      "content": "<p>Congratulations, well deserved! Very smart reranking scheme!</p>",
      "rawMarkdown": "Congratulations, well deserved! Very smart reranking scheme!",
      "votes": 2
    },
    {
      "id": 1033241,
      "postDate": "2020-09-30T19:05:26.080Z",
      "content": "<p>Once again, post-processing is the key. Not sure I 100% understand your re-ranking procedure but seems quite clever. <br>\nFinally, I was waiting for some (paint) quality diagrams and you delivered! <br>\nWell done and congratulations on the win!</p>",
      "rawMarkdown": "Once again, post-processing is the key. Not sure I 100% understand your re-ranking procedure but seems quite clever. \nFinally, I was waiting for some (paint) quality diagrams and you delivered! \nWell done and congratulations on the win!",
      "votes": 2
    },
    {
      "id": 1033165,
      "postDate": "2020-09-30T17:59:56.657Z",
      "content": "<p>Congratulations! Just plain simply wonderfull work :-)</p>",
      "rawMarkdown": "Congratulations! Just plain simply wonderfull work :-)",
      "votes": 2
    },
    {
      "id": 2512530,
      "postDate": "2023-11-04T15:46:42.090Z",
      "content": "<p>Nice work!</p>",
      "rawMarkdown": "Nice work!"
    },
    {
      "id": 2294136,
      "postDate": "2023-06-09T19:25:09.657Z",
      "content": "<p>This is incredible. Thank you for sharing! Great source of information.</p>",
      "rawMarkdown": "This is incredible. Thank you for sharing! Great source of information."
    },
    {
      "id": 1985325,
      "postDate": "2022-10-13T08:46:47.373Z",
      "content": "<p>Great Work.</p>",
      "rawMarkdown": "Great Work."
    },
    {
      "id": 1838751,
      "postDate": "2022-06-30T19:13:32.067Z",
      "content": "<p>appreciate your efforts. it's not so easy as it seems.</p>",
      "rawMarkdown": "appreciate your efforts. it's not so easy as it seems."
    },
    {
      "id": 1838749,
      "postDate": "2022-06-30T19:12:47.587Z",
      "content": "<p>appreciate your efforts. it's not so easy as it as it seems.</p>",
      "rawMarkdown": "appreciate your efforts. it's not so easy as it as it seems."
    },
    {
      "id": 1521942,
      "postDate": "2021-09-23T17:22:06.247Z",
      "content": "<p>Incredible</p>",
      "rawMarkdown": "Incredible"
    },
    {
      "id": 1496341,
      "postDate": "2021-08-30T09:51:11.063Z",
      "content": "<p>A very clean &amp; organized way to tackle problems of real life for newcomers. <br>\nThanks for sharing.</p>",
      "rawMarkdown": "A very clean & organized way to tackle problems of real life for newcomers. \nThanks for sharing."
    },
    {
      "id": 1082602,
      "postDate": "2020-11-18T03:59:59.003Z",
      "content": "<p>Hi, in the solution's paper, it says</p>\n<blockquote>\n  <p>In order to efficiently distinguish a large amount of imbalanced classes, we embed images into a 512 dimensional feature space as extracted from the pooling layer of various CNN backbone models.</p>\n</blockquote>\n<p>Does this mean that using an image embedding automatically alleviates the problem associated with having imbalanced classes?  If it does, how?  I can see assigning weights to the classes, but I don't understand how the use of embedding helps.</p>",
      "rawMarkdown": "Hi, in the solution's paper, it says\n\n> In order to efficiently distinguish a large amount of imbalanced classes, we embed images into a 512 dimensional feature space as extracted from the pooling layer of various CNN backbone models.\n\nDoes this mean that using an image embedding automatically alleviates the problem associated with having imbalanced classes?  If it does, how?  I can see assigning weights to the classes, but I don't understand how the use of embedding helps.\n"
    },
    {
      "id": 1042192,
      "postDate": "2020-10-08T06:00:56.217Z",
      "content": "<p>Awesome work. Nice description.</p>",
      "rawMarkdown": "Awesome work. Nice description."
    },
    {
      "id": 1040861,
      "postDate": "2020-10-07T12:10:27.303Z",
      "content": "<p>Amazing! 💯💯</p>",
      "rawMarkdown": "Amazing! 💯💯"
    },
    {
      "id": 1040310,
      "postDate": "2020-10-07T04:43:23.777Z",
      "content": "<p>Great work, Congratulations!!<br>\nThanks for the writeup. It really helps beginners like me to understand the approach in a better way</p>",
      "rawMarkdown": "Great work, Congratulations!!\nThanks for the writeup. It really helps beginners like me to understand the approach in a better way"
    },
    {
      "id": 1039762,
      "postDate": "2020-10-06T19:19:30.563Z",
      "content": "<p>Very Greate! </p>",
      "rawMarkdown": "Very Greate! \n"
    },
    {
      "id": 1038234,
      "postDate": "2020-10-05T16:58:35.950Z",
      "content": "<p>Great Job… Interesting</p>",
      "rawMarkdown": "Great Job... Interesting"
    },
    {
      "id": 1037557,
      "postDate": "2020-10-05T05:45:38.550Z",
      "content": "<p>Congratulations</p>",
      "rawMarkdown": "Congratulations"
    },
    {
      "id": 1037487,
      "postDate": "2020-10-05T04:27:58.413Z",
      "content": "<p>Great explanation for the solution.</p>",
      "rawMarkdown": "Great explanation for the solution."
    },
    {
      "id": 1037190,
      "postDate": "2020-10-04T17:04:56.543Z",
      "content": "<p>elegantly explained!! very insightful </p>",
      "rawMarkdown": "elegantly explained!! very insightful "
    },
    {
      "id": 1037007,
      "postDate": "2020-10-04T13:57:50.460Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> and <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a>. Thanks for sharing your solution with us.</p>",
      "rawMarkdown": "Congrats @philippsinger and @christofhenkel. Thanks for sharing your solution with us."
    },
    {
      "id": 1036864,
      "postDate": "2020-10-04T11:02:19.840Z",
      "content": "<p>Looks good</p>",
      "rawMarkdown": "Looks good"
    },
    {
      "id": 1036856,
      "postDate": "2020-10-04T10:47:06.833Z",
      "content": "<p>Congratulations and thank you for this solution</p>",
      "rawMarkdown": "Congratulations and thank you for this solution"
    },
    {
      "id": 1036764,
      "postDate": "2020-10-04T08:59:50.697Z",
      "content": "<p>Awesome Work! Congratulations.</p>",
      "rawMarkdown": "Awesome Work! Congratulations."
    },
    {
      "id": 1036619,
      "postDate": "2020-10-04T04:38:01.683Z",
      "content": "<p>Congratulations</p>",
      "rawMarkdown": "Congratulations"
    },
    {
      "id": 1036546,
      "postDate": "2020-10-03T23:39:47.850Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> and <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> on result. Thanks for sharing details solution!</p>",
      "rawMarkdown": "Congrats @christofhenkel and @philippsinger on result. Thanks for sharing details solution!"
    },
    {
      "id": 1035874,
      "postDate": "2020-10-03T07:20:38.100Z",
      "content": "<p>Congratulations</p>",
      "rawMarkdown": "Congratulations"
    },
    {
      "id": 1035724,
      "postDate": "2020-10-03T02:34:21.837Z",
      "content": "<p>Interesting.</p>",
      "rawMarkdown": "Interesting."
    },
    {
      "id": 1035480,
      "postDate": "2020-10-02T18:34:02.477Z",
      "content": "<p>Did you ever tried on EfficientNet. what time it took to run on GPU all these 1.4m images to train.<br>\nEven in OpenVaccine Competition it takes a lot time to run the augmented data.<br>\nDid you run for some fold or not. If then , it takes a lot days to train </p>",
      "rawMarkdown": "Did you ever tried on EfficientNet. what time it took to run on GPU all these 1.4m images to train.\nEven in OpenVaccine Competition it takes a lot time to run the augmented data.\nDid you run for some fold or not. If then , it takes a lot days to train ",
      "replies": [
        {
          "id": 1035488,
          "postDate": "2020-10-02T18:36:47.080Z",
          "content": "<p>we have 2 efficientnet b3 in our ensemble. Training one of our models takes roughly 24h on 8xV100</p>",
          "rawMarkdown": "we have 2 efficientnet b3 in our ensemble. Training one of our models takes roughly 24h on 8xV100"
        },
        {
          "id": 1035563,
          "postDate": "2020-10-02T19:59:40.290Z",
          "content": "<p>Thanks for your kind reply. It seems pretty simple and professional approach<br>\nBut have a single question:<br>\nDid the result of Eff works pretty good we tried but didn't cross the baseline with GeM</p>",
          "rawMarkdown": "Thanks for your kind reply. It seems pretty simple and professional approach\nBut have a single question:\nDid the result of Eff works pretty good we tried but didn't cross the baseline with GeM"
        }
      ]
    },
    {
      "id": 1034845,
      "postDate": "2020-10-02T08:24:45.967Z",
      "content": "<p>congrat awesome</p>",
      "rawMarkdown": "congrat awesome"
    },
    {
      "id": 1034825,
      "postDate": "2020-10-02T08:02:46.190Z",
      "content": "<p>Congratulations. I learned a lot today!</p>",
      "rawMarkdown": "Congratulations. I learned a lot today!"
    },
    {
      "id": 1034422,
      "postDate": "2020-10-01T18:11:43.057Z",
      "content": "<p>Congratulations, well deserved! </p>",
      "rawMarkdown": "Congratulations, well deserved! "
    },
    {
      "id": 1034402,
      "postDate": "2020-10-01T17:50:30.977Z",
      "content": "<p>Op work👍 Just plain simply wonderful work</p>",
      "rawMarkdown": "Op work👍 Just plain simply wonderful work"
    },
    {
      "id": 1034156,
      "postDate": "2020-10-01T14:49:25.247Z",
      "content": "<p>Congratulations!!!</p>",
      "rawMarkdown": "Congratulations!!!"
    },
    {
      "id": 1034128,
      "postDate": "2020-10-01T14:17:30.197Z",
      "content": "<p>Congratulations guys, your solution is clever and simple.</p>\n<p>I have 2 questions regarding modeling part:</p>\n<ol>\n<li>Did you train p value in GeM layer or had it fixed (e.g. 3.0)?</li>\n<li>Did you L2 normalize embedding after PReLU layer when dealing with single model?</li>\n</ol>",
      "rawMarkdown": "Congratulations guys, your solution is clever and simple.\n\nI have 2 questions regarding modeling part:\n1. Did you train p value in GeM layer or had it fixed (e.g. 3.0)?\n2. Did you L2 normalize embedding after PReLU layer when dealing with single model?",
      "replies": [
        {
          "id": 1034192,
          "postDate": "2020-10-01T15:09:12.280Z",
          "content": "<p>Thanks! We did both, fixing p and setting it as trainable parameter. Overall there was not much difference in performance between both. Yes, L2 norm was after PReLU.</p>",
          "rawMarkdown": "Thanks! We did both, fixing p and setting it as trainable parameter. Overall there was not much difference in performance between both. Yes, L2 norm was after PReLU.",
          "votes": 2
        }
      ]
    },
    {
      "id": 1033760,
      "postDate": "2020-10-01T08:43:59.823Z",
      "content": "<p>Congrats  <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a>. Not participated in this competition but really impressed by your first place solution</p>",
      "rawMarkdown": "Congrats  @christofhenkel. Not participated in this competition but really impressed by your first place solution"
    },
    {
      "id": 1033355,
      "postDate": "2020-09-30T22:34:07.737Z",
      "content": "<p>Congratulations!</p>",
      "rawMarkdown": "Congratulations!"
    },
    {
      "id": 1033320,
      "postDate": "2020-09-30T20:53:54.707Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a></p>",
      "rawMarkdown": "Congrats @christofhenkel @philippsinger"
    },
    {
      "id": 1033243,
      "postDate": "2020-09-30T19:07:42.223Z",
      "content": "<p>Interested to learn more about the \"1000 other things\" item. ;)</p>",
      "rawMarkdown": "Interested to learn more about the \"1000 other things\" item. ;)"
    },
    {
      "id": 1033238,
      "postDate": "2020-09-30T19:02:02.760Z",
      "content": "<p>Well done! Congratularions </p>",
      "rawMarkdown": "Well done! Congratularions "
    },
    {
      "id": 1033011,
      "postDate": "2020-09-30T15:40:01.307Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> and <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> .Amazing solution Indeed</p>",
      "rawMarkdown": "Congrats @philippsinger and @christofhenkel .Amazing solution Indeed"
    },
    {
      "id": 1032989,
      "postDate": "2020-09-30T15:19:35.263Z",
      "content": "<p>That's amazing 😍<br>\nCongratulations 👍</p>",
      "rawMarkdown": "That's amazing 😍\nCongratulations 👍"
    },
    {
      "id": 1032940,
      "postDate": "2020-09-30T14:26:33.240Z",
      "content": "<p>Congratulations!! Great Job! 🎉</p>",
      "rawMarkdown": "Congratulations!! Great Job! 🎉"
    },
    {
      "id": 1032857,
      "postDate": "2020-09-30T13:37:05.617Z",
      "content": "<p>Congratulation! Great job!!!! 🎉</p>",
      "rawMarkdown": "Congratulation! Great job!!!! 🎉"
    },
    {
      "id": 1032845,
      "postDate": "2020-09-30T13:27:32.597Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> and <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> for an amazing win.</p>",
      "rawMarkdown": "Congrats @philippsinger and @christofhenkel for an amazing win."
    },
    {
      "id": 1032795,
      "postDate": "2020-09-30T13:01:46.243Z",
      "content": "<p>I thought of using Multi layer abstraction pooling of various layer which used by <a href=\"https://www.kaggle.com/anokas\" target=\"_blank\">@anokas</a> in Google Landmark recognition 2018<br>\nbut we were too late to implement.<br>\nwe had a greate validation part which only downcasted by 0.3 between 0.5 in from public set to private.<br>\nThe only problem was we didnt have time to run for few epochs for only 10 epochs on size of 356 </p>",
      "rawMarkdown": "I thought of using Multi layer abstraction pooling of various layer which used by @anokas in Google Landmark recognition 2018\nbut we were too late to implement.\nwe had a greate validation part which only downcasted by 0.3 between 0.5 in from public set to private.\nThe only problem was we didnt have time to run for few epochs for only 10 epochs on size of 356 "
    },
    {
      "id": 1032788,
      "postDate": "2020-09-30T12:58:25.710Z",
      "content": "<p>We wasted time on Bigger networks like EFF7<br>\nNever thought about this amazing guy .having an excellent solution and congratz to Ranking Postprocessing.Congratz to <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> </p>",
      "rawMarkdown": "We wasted time on Bigger networks like EFF7\nNever thought about this amazing guy .having an excellent solution and congratz to Ranking Postprocessing.Congratz to @christofhenkel @philippsinger "
    },
    {
      "id": 1297782,
      "postDate": "2021-05-08T09:59:11.757Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 1039986,
      "postDate": "2020-10-07T00:23:09.353Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 1039609,
      "postDate": "2020-10-06T17:08:12.657Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 1037781,
      "postDate": "2020-10-05T10:37:18.373Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 1034013,
      "postDate": "2020-10-01T12:31:17.743Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 1032866,
      "postDate": "2020-09-30T13:44:42.163Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 1038967,
      "postDate": "2020-10-06T07:59:04.360Z",
      "content": "<p>Nice description. Thanks!</p>",
      "rawMarkdown": "Nice description. Thanks!",
      "votes": 2
    },
    {
      "id": 1033207,
      "postDate": "2020-09-30T18:30:15.233Z",
      "content": "<p>Congrats, thanks for sharing:)</p>",
      "rawMarkdown": "Congrats, thanks for sharing:)"
    }
  ],
  "comments": [
    {
      "id": 1032747,
      "author_name": "CPMP",
      "author_url": "",
      "post_date": "2020-09-30T12:28:16.803000",
      "content": "<p>It looks so simple, it must have been very hard to converge on this.  Congrats for the awesome win.</p>",
      "votes": 13,
      "replies": []
    },
    {
      "id": 1032757,
      "author_name": "Ahmet Erdem",
      "author_url": "",
      "post_date": "2020-09-30T12:31:59.900000",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> , impressive solution! And the way you collaborate with each other is a very good example for all the Kagglers.</p>\n<p>My main problem with this competition was not having a representative validation scheme. We couldn't think of using the previous competition labels as you guys did, therefore our team overfit LB.</p>",
      "votes": 9,
      "replies": []
    },
    {
      "id": 1032753,
      "author_name": "Gary",
      "author_url": "",
      "post_date": "2020-09-30T12:30:58.877000",
      "content": "<p>Congratulations, dieter and psi. Good job with a nice Ranking post-processing.<br>\nI have a question: what about your best private score without post processing?</p>",
      "votes": 5,
      "replies": [
        {
          "id": 1032771,
          "author_name": "Dieter",
          "author_url": "",
          "post_date": "2020-09-30T12:41:58.290000",
          "content": "<p>Hard to say. We submitted the last single model without any reranking 2 weeks ago. That model was at 0.52 private LB and is not part of our final ensemble.</p>",
          "votes": 3,
          "replies": []
        },
        {
          "id": 1032776,
          "author_name": "Gary",
          "author_url": "",
          "post_date": "2020-09-30T12:47:09.663000",
          "content": "<p>ok, thanks for you reply. <br>\nIt is best if you intend to submit with pure model only in the future, which can be used to verify the generalization of your models.</p>",
          "votes": 2,
          "replies": []
        },
        {
          "id": 1032782,
          "author_name": "Psi",
          "author_url": "",
          "post_date": "2020-09-30T12:53:02.123000",
          "content": "<p>Not sure how that would showcase generalizability as the specific goal of this competition was to shape a solution that works well on ranking landmarks and non-landmarks conjoint and we optimized the models specifically with that objective in mind.</p>",
          "votes": 3,
          "replies": []
        }
      ]
    },
    {
      "id": 1495836,
      "author_name": "Fuco",
      "author_url": "",
      "post_date": "2021-08-29T20:36:19.687000",
      "content": "<p>great work, simple. Congrats</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1032841,
      "author_name": "Bibek",
      "author_url": "",
      "post_date": "2020-09-30T13:26:43.583000",
      "content": "<p>Thank you for your sharing and Congrats Psi and Dieter Grandpa 😁. I wonder why you use Prelu instead of relu(or any other activations) in your neck part?</p>",
      "votes": 3,
      "replies": []
    },
    {
      "id": 1055389,
      "author_name": "Matt Yates",
      "author_url": "",
      "post_date": "2020-10-20T18:10:51.243000",
      "content": "<p>I love your collaboration pipeline!  👍💯</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1054050,
      "author_name": "Long Luu",
      "author_url": "",
      "post_date": "2020-10-19T16:04:37.817000",
      "content": "<p>May I ask what is <code>SmallMaxSize</code> and <code>LongestMaxSize</code> preprocessing?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1054090,
          "author_name": "Psi",
          "author_url": "",
          "post_date": "2020-10-19T16:50:34.037000",
          "content": "<p>Best is to check Albumentation docu for explanation.</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 1054241,
          "author_name": "Dieter",
          "author_url": "",
          "post_date": "2020-10-19T19:23:28.723000",
          "content": "<p><a href=\"https://github.com/albumentations-team/albumentations/blob/master/albumentations/augmentations/transforms.py#L407-L441\" target=\"_blank\">https://github.com/albumentations-team/albumentations/blob/master/albumentations/augmentations/transforms.py#L407-L441</a></p>\n<blockquote>\n  <p>Rescale an image so that minimum side is equal to max_size, keeping the aspect ratio of the initial image.</p>\n</blockquote>\n<p>and LongestMaxSize accordingly</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 1054482,
          "author_name": "Long Luu",
          "author_url": "",
          "post_date": "2020-10-20T01:36:28.857000",
          "content": "<p>Thank you! So that's from albumentations.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1041188,
      "author_name": "Aditi Kothiya",
      "author_url": "",
      "post_date": "2020-10-07T15:45:02.920000",
      "content": "<p>congratulation!! <br>\nThanks for sharing!! very helpful </p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1037091,
      "author_name": "Sheikh Amaan Asghar",
      "author_url": "",
      "post_date": "2020-10-04T15:44:47.863000",
      "content": "<p>Awesome work. Congrats!</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1035876,
      "author_name": "Aryamaan Srivastava",
      "author_url": "",
      "post_date": "2020-10-03T07:25:35.193000",
      "content": "<p>Congratulations, Great stuff.</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1035526,
      "author_name": "Surekha Ramireddy",
      "author_url": "",
      "post_date": "2020-10-02T19:08:53.317000",
      "content": "<p>Congratulations both of you and today i learned a lot .<br>\nthanks for sharing such a great overview of your work </p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1035332,
      "author_name": "_CA℟L_",
      "author_url": "",
      "post_date": "2020-10-02T16:35:31.517000",
      "content": "<p>Congrats guys! <br>\nQQ: What processor did you guys use to train the model? <br>\nI tried running it on colab tpu but there was quite a few issues with that and it was pretty slow.</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1035357,
          "author_name": "Psi",
          "author_url": "",
          "post_date": "2020-10-02T16:54:14.197000",
          "content": "<p>GPUs, Pytorch on TPUs is way too unstable yet</p>",
          "votes": 5,
          "replies": []
        },
        {
          "id": 1035405,
          "author_name": "Yassine Alouini",
          "author_url": "",
          "post_date": "2020-10-02T17:37:52.170000",
          "content": "<p>I guess on your own machines? Or did you use Colab (maybe pro) + Kaggle?</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1035418,
          "author_name": "",
          "author_url": "",
          "post_date": "2020-10-02T17:42:06.580000",
          "content": "",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1035419,
          "author_name": "Psi",
          "author_url": "",
          "post_date": "2020-10-02T17:42:06.580000",
          "content": "<p>Own machines.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1033326,
      "author_name": "Andy Penrose",
      "author_url": "",
      "post_date": "2020-09-30T21:06:01.783000",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> and <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a>. In the end the margin of your win was quite something and says a lot about the thorough and innovative work you've done. Thank you for sharing the details… I think I'll need to read that through one more time!</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1033136,
      "author_name": "olivier",
      "author_url": "",
      "post_date": "2020-09-30T17:28:17.900000",
      "content": "<p>Awesome work <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> and <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> !</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1033040,
      "author_name": "KhanhVD",
      "author_url": "",
      "post_date": "2020-09-30T16:02:20.327000",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> and <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> on result. Thanks for sharing details solution!</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1032960,
      "author_name": "Giba",
      "author_url": "",
      "post_date": "2020-09-30T14:55:04.297000",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> and <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> ! Thanks for sharing this amazing solution.</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1032838,
      "author_name": "AR",
      "author_url": "",
      "post_date": "2020-09-30T13:24:56.027000",
      "content": "<p>Thanks for the Write-up. </p>\n<p>Curious to look at the pipeline and the implementation. Do share when you can. Thanks! </p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1032811,
      "author_name": "Chan Kha Vu",
      "author_url": "",
      "post_date": "2020-09-30T13:09:20.647000",
      "content": "<p>Congratulations with the 1st place! 🎉🎉🎉 Thanks for the detailed write-up. That's an amazing amount of attention to details, and It's remarkable that you trained only on gldv2-clean set, in contrast to other top teams.</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1032816,
          "author_name": "Psi",
          "author_url": "",
          "post_date": "2020-09-30T13:11:21.090000",
          "content": "<p>Thanks, congrats also on your result. We used extra data for inference, others for training. Maybe those have similar effects, but at least on CV we did not see much change with extra training data.</p>",
          "votes": 3,
          "replies": []
        }
      ]
    },
    {
      "id": 1094115,
      "author_name": "Dieter",
      "author_url": "",
      "post_date": "2020-11-28T10:29:43.070000",
      "content": "<p>updated description with video links of us presenting the solution:<br>\nNVIDIA Grandmaster Series Ep2 <a href=\"https://youtu.be/VxNDH6qLZ_Q\" target=\"_blank\">https://youtu.be/VxNDH6qLZ_Q</a><br>\nChai Time Data Science <a href=\"https://youtu.be/NRl3lMlixPc\" target=\"_blank\">https://youtu.be/NRl3lMlixPc</a></p>",
      "votes": 2,
      "replies": [
        {
          "id": 1094422,
          "author_name": "Mohammed Rizin V K",
          "author_url": "",
          "post_date": "2020-11-28T15:52:23.970000",
          "content": "<p>I am seeing you in the video the first time. I thought you were an old man. but it seems that the Profile picture is an old man. But you are absolutely a young man</p>",
          "votes": 3,
          "replies": []
        },
        {
          "id": 1094531,
          "author_name": "Yassine Alouini",
          "author_url": "",
          "post_date": "2020-11-28T17:38:46.680000",
          "content": "<p>Is this one from the \"best videos\" series? 😄</p>\n<p>For the curious, here is the reference: <a href=\"https://twitter.com/kagglingdieter/status/1319312923840348166?s=20\" target=\"_blank\">https://twitter.com/kagglingdieter/status/1319312923840348166?s=20</a>. </p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1038860,
      "author_name": "Yassine Alouini",
      "author_url": "",
      "post_date": "2020-10-06T05:51:08.800000",
      "content": "<p>There is a paper now: <a href=\"https://arxiv.org/pdf/2010.01650.pdf\" target=\"_blank\">https://arxiv.org/pdf/2010.01650.pdf</a><br>\n👍</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 1035640,
      "author_name": "Pascal Pfeiffer",
      "author_url": "",
      "post_date": "2020-10-02T22:47:48.457000",
      "content": "<p>Well deserved win <a href=\"https://www.kaggle.com/christofhenkel\" target=\"_blank\">@christofhenkel</a> <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> with a very clean solution.<br>\nAnd thanks a lot for the writeup.</p>\n<p>I like how you cleverly used the right tools to set up a fast pipeline. I'll definetly have to look into neptune myself. </p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 1035366,
      "author_name": "1000-7",
      "author_url": "",
      "post_date": "2020-10-02T17:05:36.700000",
      "content": "<p>nicenicenicenicenicenicenicenicenicenice</p>",
      "votes": 2,
      "replies": [
        {
          "id": 1035371,
          "author_name": "Dieter",
          "author_url": "",
          "post_date": "2020-10-02T17:15:29.713000",
          "content": "<p>Thx. Thats how I felt when private LB was revealed</p>",
          "votes": 3,
          "replies": []
        }
      ]
    },
    {
      "id": 1033855,
      "author_name": "Eduardo Rocha de Andrade",
      "author_url": "",
      "post_date": "2020-10-01T10:11:04.440000",
      "content": "<p>Congratulations, well deserved! Very smart reranking scheme!</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 1033241,
      "author_name": "Yassine Alouini",
      "author_url": "",
      "post_date": "2020-09-30T19:05:26.080000",
      "content": "<p>Once again, post-processing is the key. Not sure I 100% understand your re-ranking procedure but seems quite clever. <br>\nFinally, I was waiting for some (paint) quality diagrams and you delivered! <br>\nWell done and congratulations on the win!</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 1033165,
      "author_name": "Robin Smits",
      "author_url": "",
      "post_date": "2020-09-30T17:59:56.657000",
      "content": "<p>Congratulations! Just plain simply wonderfull work :-)</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 2512530,
      "author_name": "Lukas Scholz",
      "author_url": "",
      "post_date": "2023-11-04T15:46:42.090000",
      "content": "<p>Nice work!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2294136,
      "author_name": "Fernando Sckaff",
      "author_url": "",
      "post_date": "2023-06-09T19:25:09.657000",
      "content": "<p>This is incredible. Thank you for sharing! Great source of information.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1985325,
      "author_name": "Haroon Khan",
      "author_url": "",
      "post_date": "2022-10-13T08:46:47.373000",
      "content": "<p>Great Work.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1838751,
      "author_name": "Sohail Ahmed",
      "author_url": "",
      "post_date": "2022-06-30T19:13:32.067000",
      "content": "<p>appreciate your efforts. it's not so easy as it seems.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1838749,
      "author_name": "",
      "author_url": "",
      "post_date": "2022-06-30T19:12:47.587000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1521942,
      "author_name": "",
      "author_url": "",
      "post_date": "2021-09-23T17:22:06.247000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1496341,
      "author_name": "",
      "author_url": "",
      "post_date": "2021-08-30T09:51:11.063000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1082602,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-11-18T03:59:59.003000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1042192,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-08T06:00:56.217000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1040861,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-07T12:10:27.303000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1040310,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-07T04:43:23.777000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1039762,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-06T19:19:30.563000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1038234,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-05T16:58:35.950000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1037557,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-05T05:45:38.550000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1037487,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-05T04:27:58.413000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1037190,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-04T17:04:56.543000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1037007,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-04T13:57:50.460000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1036864,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-04T11:02:19.840000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1036856,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-04T10:47:06.833000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1036764,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-04T08:59:50.697000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1036619,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-04T04:38:01.683000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1036546,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-03T23:39:47.850000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1035874,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-03T07:20:38.100000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1035724,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-03T02:34:21.837000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1035480,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-02T18:34:02.477000",
      "content": "",
      "votes": 0,
      "replies": [
        {
          "id": 1035488,
          "author_name": "",
          "author_url": "",
          "post_date": "2020-10-02T18:36:47.080000",
          "content": "",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1035563,
          "author_name": "",
          "author_url": "",
          "post_date": "2020-10-02T19:59:40.290000",
          "content": "",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1034845,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-02T08:24:45.967000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1034825,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-02T08:02:46.190000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1034422,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-01T18:11:43.057000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1034402,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-01T17:50:30.977000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1034156,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-01T14:49:25.247000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1034128,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-01T14:17:30.197000",
      "content": "",
      "votes": 0,
      "replies": [
        {
          "id": 1034192,
          "author_name": "",
          "author_url": "",
          "post_date": "2020-10-01T15:09:12.280000",
          "content": "",
          "votes": 2,
          "replies": []
        }
      ]
    },
    {
      "id": 1033760,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-01T08:43:59.823000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1033355,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T22:34:07.737000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1033320,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T20:53:54.707000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1033243,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T19:07:42.223000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1033238,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T19:02:02.760000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1033011,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T15:40:01.307000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1032989,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T15:19:35.263000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1032940,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T14:26:33.240000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1032857,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T13:37:05.617000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1032845,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T13:27:32.597000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1032795,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T13:01:46.243000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1032788,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T12:58:25.710000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1297782,
      "author_name": "",
      "author_url": "",
      "post_date": "2021-05-08T09:59:11.757000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1039986,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-07T00:23:09.353000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1039609,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-06T17:08:12.657000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1037781,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-05T10:37:18.373000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1034013,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-01T12:31:17.743000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1032866,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T13:44:42.163000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1038967,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-10-06T07:59:04.360000",
      "content": "",
      "votes": 2,
      "replies": []
    },
    {
      "id": 1033207,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-09-30T18:30:15.233000",
      "content": "",
      "votes": 0,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "1032735": "Thanks to google and kaggle for hosting this yearly competition. It was a lot of fun exploring and learning all about global, local descriptors and algorithms to match similar images.\n\n### Brief Summary\n\nOur solution is an ensemble of 7 global descriptor only models trained with arcface loss. We classify landmarks by KNN on an extended version of the train dataset and efficiently rerank predictions and filter noise using cosine similarity to non-landmark images. We did not use any local descriptors.\n\n### Detailed Summary\n\nBelow we give a detailed description of our solution of which architecture is only a small part.\nVideo content of us presenting the solution is available under:\n\nNVIDIA Grandmaster Series Ep2 https://youtu.be/VxNDH6qLZ_Q\nChai Time Data Science https://youtu.be/NRl3lMlixPc\n\n\n#### Pipeline\nWe wanted to use this competition as a chance to improve our pipeline and coding skills. While in past competitions we mainly used jupyter notebooks locally, we switched to a collaborative approach using scripts with github versioning for this one. After some acclimatization we clearly saw a benefit of our pipeline consisting of the following tools\n\nGithub: Versioning and code sharing\nNeptune: logging and visualisation\nKaggle API: dataset upload/ download\nGCP: data storage\n\nSo in practice we downloaded preprocessed data from google storage, trained our models using pytorch lightning where we logged with neptune and uploaded the latest version of our git repo and model weights to a kaggle dataset to use it in our inference kernel. This allowed us to experiment and iterate quickly.\n\nWe are planning to release our code on github soon after some clean up.\n\n#### Architectures\n\nOur ensemble consists of 7 models using the following backbones available in the timm repository. Instead of much augmentation we trained our models on different image scales using albumentations.\n\n- 2x seresnext101 - SmallMaxSize(512) -> RandomCrop(448,448)\n- 1x seresnext101 - Resize(686,686) -> RandomCrop(568,568)\n- 1x b3 - LongestMaxSize(512) -> PadIfNeeded -> RandomCrop(448,448)\n- 1x b3 - LongestMaxSize(664) -> PadIfNeeded -> RandomCrop(600,600)\n- 1x resnet152 - Resize(544,672) -> RandomCrop(512,512)\n- 1x res2net101 - Resize(544,672) -> RandomCrop(512,512)\n\nWe normalize the images by the mean and std of the imagenet dataset before feeding them into a pretrained backbone. All models use GeM pooling for aggregating backbone outputs. We use a simple Linear(512) + BN + PReLU neck before feeding into an arc margin head with m ranging from 0.3 to 0.4 predicting one of the 81313 landmarks. We use the 512 dimensional output of the neck as the image embedding (= global descriptor) The following illustrates our setup for a SEResnext101 backbone.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1424766%2F6872393fee6bc154a4bf7d0127b62061%2FScreenshot%202020-09-30%20at%2013.30.05.png?generation=1601467910231165&alt=media)\n\n#### Training strategy/ schedule\n\nWe train all our models on gldv2 clean data only. Each model is trained for 10 epochs with a cosine annealing scheduler having one warm-up epoch. We use SGD optimizer with maximum lr of 0.05 and weight decay of 1e-4 across all models.\n\n#### Ranking post-processing\n\nAs previous editions of this competition have shown, properly ranking and re-ranking predictions is crucial to improve the GAP metric at hand that is sensitive to how landmarks and non-landmarks are ranked respectively. So one major aspect is to specifically penalize non-landmarks that constitute a large portion of the test set. We always tracked both overall GAP as well as landmark-only GAP separately and evaluated all ranking experiments on our validation set that resembled the test set quite well. There are quite different ways to approach this ranking problem, and different ways can lead to success, but here is what we found to work extremely well.\n\nIn the following graphic we visualize the main concepts of our ranking process. Test refers to the test set on the leaderboard, so the images we need to rank. Train refers to the candidate images we can use to determine the labels and the confidence. One important thing here is that we increased this set of images by all available images for the classes from gldv2_clean from gldv2_full. The 3rd place solution [1] notes that extending the dataset to include also these images improves their training, but what we found is that this is even more useful to be included in the inference process, which makes sense as there are more images to choose from. This also worked well on CV which is how we found it. And finally, Non-landmark includes all non-landmark images from the gldv2 test set. We then calculate all-pairs similarity between all of these sets. A measures the similarity to all available landmarks and their confidence. B measures the similarity of all train images to all non-landmark images and C does the same for the test images. \n\nThe core idea is now to penalize A by B and C, so to penalize images that are similar to the non-landmark images. A is calculated between each test image and each train image. B and C are calculated by the mean similarity between the image and the top-5 (or 10) most similar non-landmark images.\n\nThen, the first step is to penalize A_ij by B_j, pick the top-3 most similar images, and sum the confidence for the same label and then pick the highest. Afterwards, this score is further penalized by C_i. Actually, using both B and C for penalization is a bit redundant, and just using either of those brings good improvements, with just using B is better than just using C.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1424766%2F1e262e5afd63136dec8bc07e686a365a%2FScreenshot%202020-09-30%20at%2014.13.22.png?generation=1601468018948485&alt=media)\n\nThis whole procedure helps us to boost the actual landmarks to higher ranks and to penalize non-landmarks and rank them lower. Specifically B helps us to eliminate noise from the Train images. This gave both impressive boosts on CV and LB. \nOne more important thing to note here is that when calculating cosine similarity between different sets, the similarity metric benefits from similarly scaled vectors. So what we do is that we fit a QuantileTransformer (other scalers work similarly well) on the test set, and apply them on the train and non-landmark datasets. This makes the scores way more stable and we assume that this also adjusts differently sized images better.\n\n#### Blending\n\nFor blending our various models, we first l2-normalize them separately and concatenate them and apply above mentioned quantile transformer on each feature. We then calculate for each model separately the top 3 scores from above and then sum the same labels across all top 3 scores from all models and select the maximum label. For calculating C, we use the concatenated embeddings. This procedure is a bit more robust compared to just using the concatenated embeddings, but for simplicity one can also rely on that approach as it produces very similar rankings.\n \n#### A word on local descriptors\n\nWe tried hard getting something out of local descriptors. For that we tried DELG as well as superpoint.\nDELG: first we tried to port the pretrained DELG to pytorch but gave up after struggling for a day with tf1 and tf2.0 mixups in the original implementation. Instead we extracted local features using the tf implementation directly as done in the public baseline. \nSuperpoint: We extracted local descriptors using the pretrained superpoint net, which is very fast.\nWe matched keypoints straight forward and applied RANSAC after. However the improvement even when using different image scales etc. was very small for both, DELG and Superpoint, and computational time for extracting and matching keypoints (especially when using DELG) was very high. Hence we did not use local descriptors in our final submissions.\n\n#### What did not work\n\n- Training together with gldv1\n- Training together with gldv2 full\n- Using index dataset 2019\n- Using test set from 2019 stage1 \n- Hyperbolic image embeddings\n- Superglue\n- Deformable Grid\n- 1000 other things\n\nThanks for reading. Questions welcome.\n \n[1] https://www.kaggle.com/c/landmark-recognition-2020/discussion/187757\n\nupdate:\npaper: https://arxiv.org/abs/2010.01650\ncode: https://github.com/psinger/kaggle-landmark-recognition-2020-1st-place",
    "1032747": "It looks so simple, it must have been very hard to converge on this.  Congrats for the awesome win.",
    "1032757": "Congrats @christofhenkel @philippsinger , impressive solution! And the way you collaborate with each other is a very good example for all the Kagglers.\n\nMy main problem with this competition was not having a representative validation scheme. We couldn't think of using the previous competition labels as you guys did, therefore our team overfit LB.",
    "1032753": "Congratulations, dieter and psi. Good job with a nice Ranking post-processing.\nI have a question: what about your best private score without post processing?",
    "1495836": "great work, simple. Congrats",
    "1032841": "Thank you for your sharing and Congrats Psi and Dieter Grandpa 😁. I wonder why you use Prelu instead of relu(or any other activations) in your neck part?",
    "1055389": "I love your collaboration pipeline!  👍💯",
    "1054050": "May I ask what is `SmallMaxSize` and `LongestMaxSize` preprocessing?",
    "1041188": "congratulation!! \nThanks for sharing!! very helpful ",
    "1037091": "Awesome work. Congrats!",
    "1035876": "Congratulations, Great stuff.",
    "1035526": "Congratulations both of you and today i learned a lot .\nthanks for sharing such a great overview of your work \n",
    "1035332": "Congrats guys! \nQQ: What processor did you guys use to train the model? \nI tried running it on colab tpu but there was quite a few issues with that and it was pretty slow.",
    "1033326": "Congrats @christofhenkel and @philippsinger. In the end the margin of your win was quite something and says a lot about the thorough and innovative work you've done. Thank you for sharing the details... I think I'll need to read that through one more time!",
    "1033136": "Awesome work @philippsinger and @christofhenkel !",
    "1033040": "Congrats @christofhenkel and @philippsinger on result. Thanks for sharing details solution!",
    "1032960": "Congrats @philippsinger and @christofhenkel ! Thanks for sharing this amazing solution.",
    "1032838": "Thanks for the Write-up. \n\nCurious to look at the pipeline and the implementation. Do share when you can. Thanks! ",
    "1032811": "Congratulations with the 1st place! 🎉🎉🎉 Thanks for the detailed write-up. That's an amazing amount of attention to details, and It's remarkable that you trained only on gldv2-clean set, in contrast to other top teams.",
    "1094115": "updated description with video links of us presenting the solution:\nNVIDIA Grandmaster Series Ep2 https://youtu.be/VxNDH6qLZ_Q\nChai Time Data Science https://youtu.be/NRl3lMlixPc",
    "1038860": "There is a paper now: https://arxiv.org/pdf/2010.01650.pdf\n👍",
    "1035640": "Well deserved win @christofhenkel @philippsinger with a very clean solution.\nAnd thanks a lot for the writeup.\n\nI like how you cleverly used the right tools to set up a fast pipeline. I'll definetly have to look into neptune myself. ",
    "1035366": "nicenicenicenicenicenicenicenicenicenice",
    "1033855": "Congratulations, well deserved! Very smart reranking scheme!",
    "1033241": "Once again, post-processing is the key. Not sure I 100% understand your re-ranking procedure but seems quite clever. \nFinally, I was waiting for some (paint) quality diagrams and you delivered! \nWell done and congratulations on the win!",
    "1033165": "Congratulations! Just plain simply wonderfull work :-)",
    "2512530": "Nice work!",
    "2294136": "This is incredible. Thank you for sharing! Great source of information.",
    "1985325": "Great Work.",
    "1838751": "appreciate your efforts. it's not so easy as it seems.",
    "1838749": "appreciate your efforts. it's not so easy as it as it seems.",
    "1521942": "Incredible",
    "1496341": "A very clean & organized way to tackle problems of real life for newcomers. \nThanks for sharing.",
    "1082602": "Hi, in the solution's paper, it says\n\n> In order to efficiently distinguish a large amount of imbalanced classes, we embed images into a 512 dimensional feature space as extracted from the pooling layer of various CNN backbone models.\n\nDoes this mean that using an image embedding automatically alleviates the problem associated with having imbalanced classes?  If it does, how?  I can see assigning weights to the classes, but I don't understand how the use of embedding helps.\n",
    "1042192": "Awesome work. Nice description.",
    "1040861": "Amazing! 💯💯",
    "1040310": "Great work, Congratulations!!\nThanks for the writeup. It really helps beginners like me to understand the approach in a better way",
    "1039762": "Very Greate! \n",
    "1038234": "Great Job... Interesting",
    "1037557": "Congratulations",
    "1037487": "Great explanation for the solution.",
    "1037190": "elegantly explained!! very insightful ",
    "1037007": "Congrats @philippsinger and @christofhenkel. Thanks for sharing your solution with us.",
    "1036864": "Looks good",
    "1036856": "Congratulations and thank you for this solution",
    "1036764": "Awesome Work! Congratulations.",
    "1036619": "Congratulations",
    "1036546": "Congrats @christofhenkel and @philippsinger on result. Thanks for sharing details solution!",
    "1035874": "Congratulations",
    "1035724": "Interesting.",
    "1035480": "Did you ever tried on EfficientNet. what time it took to run on GPU all these 1.4m images to train.\nEven in OpenVaccine Competition it takes a lot time to run the augmented data.\nDid you run for some fold or not. If then , it takes a lot days to train ",
    "1034845": "congrat awesome",
    "1034825": "Congratulations. I learned a lot today!",
    "1034422": "Congratulations, well deserved! ",
    "1034402": "Op work👍 Just plain simply wonderful work",
    "1034156": "Congratulations!!!",
    "1034128": "Congratulations guys, your solution is clever and simple.\n\nI have 2 questions regarding modeling part:\n1. Did you train p value in GeM layer or had it fixed (e.g. 3.0)?\n2. Did you L2 normalize embedding after PReLU layer when dealing with single model?",
    "1033760": "Congrats  @christofhenkel. Not participated in this competition but really impressed by your first place solution",
    "1033355": "Congratulations!",
    "1033320": "Congrats @christofhenkel @philippsinger",
    "1033243": "Interested to learn more about the \"1000 other things\" item. ;)",
    "1033238": "Well done! Congratularions ",
    "1033011": "Congrats @philippsinger and @christofhenkel .Amazing solution Indeed",
    "1032989": "That's amazing 😍\nCongratulations 👍",
    "1032940": "Congratulations!! Great Job! 🎉",
    "1032857": "Congratulation! Great job!!!! 🎉",
    "1032845": "Congrats @philippsinger and @christofhenkel for an amazing win.",
    "1032795": "I thought of using Multi layer abstraction pooling of various layer which used by @anokas in Google Landmark recognition 2018\nbut we were too late to implement.\nwe had a greate validation part which only downcasted by 0.3 between 0.5 in from public set to private.\nThe only problem was we didnt have time to run for few epochs for only 10 epochs on size of 356 ",
    "1032788": "We wasted time on Bigger networks like EFF7\nNever thought about this amazing guy .having an excellent solution and congratz to Ranking Postprocessing.Congratz to @christofhenkel @philippsinger ",
    "1297782": "",
    "1039986": "",
    "1039609": "",
    "1037781": "",
    "1034013": "",
    "1032866": "",
    "1038967": "Nice description. Thanks!",
    "1033207": "Congrats, thanks for sharing:)"
  }
}