{
  "id": 391635,
  "title": "1st place solution",
  "url": "/competitions/nfl-player-contact-detection/discussion/391635",
  "author_name": "nvnn",
  "post_date": "2023-03-02T04:17:06.820000",
  "votes": 138,
  "comment_count": 53,
  "views": 0,
  "content": "<p>Thanks to NFL and Kaggle for hosting this interesting competition.<br>\nMy approach comprises three main components</p>\n<ul>\n<li>A weak xgb model to remove easy negative samples</li>\n<li>A CNN to classify contact</li>\n<li>A xgb model to post-process the output.</li>\n</ul>\n<p>Since my xgb preprocessing was not really good compare to other teams (CV ~ 0.72),I will only elaborate on my CNN and post-processing method in this write-up.<br>\n<strong>1. 3D CNN for Video Classification</strong><br>\n<strong><em>1.1 Input generator</em></strong></p>\n<p>I separate the modeling and training of player-player (PP) and player-ground (PG) contacts.<br>\nThe PP model is trained using input from three sources, namely endzone video, sideline video, and tracking data. On the other hand, the PG model is trained using input from only two sources, namely endzone video and sideline video. Notably, including tracking data does not result in improved performance for the PG model.</p>\n<p><strong><em>1.1.1 Input generator for PP model</em></strong></p>\n<p>The endzone and sideline videos are processed similarly. Firstly, I extract 18 images from neighboring frames, namely {frame[-44], -37, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, frame[37]}. The frame[-44] represents 44 frames prior to the current sample's estimated frame. This sampling technique enables the model to observe more frames close to the estimated frame. </p>\n<p>Next, I mask the players' heads in contact with a black or white circle to guide the model's attention to the relevant players. Rather than using an additional channel, I mark the players' heads directly into the image. I made this decision to maintain the input's 3-channel format, which maximizes the utilization of the pretrained weight file. Finally, I crop each image around the players' contact area using a crop size of 10 times the mean helmet box size within the specified frame range.</p>\n<p>To enable the tracking data to be stacked with images from the endzone and sideline, I simulate the tracking data as images. To accomplish this, I use the OpenCV cv2.circle function to plot each player's position in a specific step on a black background. I assign two different colors to represent the two teams, and players in contact are depicted with bigger and brighter circles (radius is 5, and pixel value is 255), while background players are depicted with smaller and darker circles (radius is 3, and pixel value is 127). By integrating this information into the input, the model can learn the interaction of all players from a bird's eye view. The input to the PP model is displayed in the GIF below.</p>\n<p><img src=\"https://i.ibb.co/sKJ5zHP/output.gif\" alt=\"\"></p>\n<p><strong><em>1.1.2 Input generator for PG model</em></strong><br>\nThe endzone and sideline videos are processed similarly to the PP model, with the exception that the PG model uses a longer input sequence of 23 neighboring frames, ranging from [-54, -48, -42, -36, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, 36, 42, 48, 54]. </p>\n<p>The PG model does not include simulated tracking images as they do not improve the PG CV score. </p>\n<p>Unlike the PP model, I can use a longer sequence of images in the PG model because the tracking images are not included. In the PP model, the maximum sequence length that can fit into my GPU is 18 images.</p>\n<p><strong><em>1.2 Model</em></strong><br>\nGiven that the input appears to resemble an action classification task rather than a standard 3D classification, I opted to use an action recognition model to address this problem. After reviewing the <a href=\"https://github.com/open-mmlab/mmaction2\" target=\"_blank\">mmaction2 repository</a>, it became clear that the CSN series delivered the most impressive results in the Kinetics-400 dataset. As a result, I selected resnet50-irCSN and fine-tuned it for this particular task.</p>\n<p><strong><em>1.3 Training</em></strong></p>\n<p>During training, I apply the following augmentations to the endzone and sideline images and randomly swap them. As for the tracking images, I only use horizontal and vertical flips as augmentations.</p>\n<pre><code>base_aug = [\n        A.RandomResizedCrop(always_apply=False, p=1.0, height=cfg.img_size, width=cfg.img_size, scale=(0.7, 1.2), ratio=(0.75, 1.3), interpolation=1),\n        A.OneOf([\n            A.RandomGamma(gamma_limit=(30, 150), p=1),\n            A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.3, p=1),\n            A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.2, p=1),\n            A.HueSaturationValue(hue_shift_limit=20, sat_shift_limit=30, val_shift_limit=20, p=1),\n            A.CLAHE(clip_limit=5.0, tile_grid_size=(5, 5), p=1),\n        ], p=0.6),\n        A.HorizontalFlip(p=0.5), \n        A.ShiftScaleRotate(shift_limit=0.0, scale_limit=0.1, rotate_limit=15,\n                                        interpolation=cv2.INTER_LINEAR, border_mode=cv2.BORDER_CONSTANT, p=0.8),\n        A.Cutout(max_h_size=int(50), max_w_size=int(50), num_holes=2, p=0.5),\n    ]\n\ncfg.train_transform = A.ReplayCompose(base_aug)\n</code></pre>\n<p>I used a linear scheduler for the learning rate and trained the model for one epoch. In the final submission, I trained the model using all available data with 4 seeds.</p>\n<p><strong>2. XGB Postprocessing</strong><br>\nI employed a simple xgb model to combine the predictions of pre-xgb and cnn. Through experimentation, I discovered that the optimal feature for post-processing in PP and PG models slightly differs.</p>\n<p><strong><em>2.1 PP postprocessing</em></strong><br>\nFirst, I calculated an ensemble probability from the CNN and preprocessing xgb model as follows: prob = 0.2pre_xgb_prob + 0.8cnn_prob. <br>\nThen, I used the probability from the 20 neighboring steps as features for the xgb model, i.e., {prob(-10), prob(-9), …, prob(0), prob(1), …, prob(9)}, where prob(-10) represents the probability of the same pair of players in the prior 10 steps.<br>\nThis postprocessing method improved my PP CV score by approximately 0.005.</p>\n<p><strong><em>2.2 PG postprocessing</em></strong><br>\n I calculated an ensemble probability from the CNN and preprocessing xgb model as follows: prob = 0.15pre_xgb_prob + 0.85cnn_prob. <br>\nThe feature to xgb model are </p>\n<ul>\n<li>The ensemble probability from the 30 neighboring steps {prob(-15), prob(-14), …, prob(0), prob(1), …, prob(14)},  </li>\n<li>The pre_xgb_prob and cnn_prob from the 20 neighboring steps.<br>\nThis postprocessing method improved my PG CV score by approximately 0.04.</li>\n</ul>\n<p>P/S. Thanks chatGPT for making my explanation better!!</p>",
  "messages": [
    {
      "id": 2165235,
      "postDate": "2023-03-02T04:17:06.820Z",
      "content": "<p>Thanks to NFL and Kaggle for hosting this interesting competition.<br>\nMy approach comprises three main components</p>\n<ul>\n<li>A weak xgb model to remove easy negative samples</li>\n<li>A CNN to classify contact</li>\n<li>A xgb model to post-process the output.</li>\n</ul>\n<p>Since my xgb preprocessing was not really good compare to other teams (CV ~ 0.72),I will only elaborate on my CNN and post-processing method in this write-up.<br>\n<strong>1. 3D CNN for Video Classification</strong><br>\n<strong><em>1.1 Input generator</em></strong></p>\n<p>I separate the modeling and training of player-player (PP) and player-ground (PG) contacts.<br>\nThe PP model is trained using input from three sources, namely endzone video, sideline video, and tracking data. On the other hand, the PG model is trained using input from only two sources, namely endzone video and sideline video. Notably, including tracking data does not result in improved performance for the PG model.</p>\n<p><strong><em>1.1.1 Input generator for PP model</em></strong></p>\n<p>The endzone and sideline videos are processed similarly. Firstly, I extract 18 images from neighboring frames, namely {frame[-44], -37, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, frame[37]}. The frame[-44] represents 44 frames prior to the current sample's estimated frame. This sampling technique enables the model to observe more frames close to the estimated frame. </p>\n<p>Next, I mask the players' heads in contact with a black or white circle to guide the model's attention to the relevant players. Rather than using an additional channel, I mark the players' heads directly into the image. I made this decision to maintain the input's 3-channel format, which maximizes the utilization of the pretrained weight file. Finally, I crop each image around the players' contact area using a crop size of 10 times the mean helmet box size within the specified frame range.</p>\n<p>To enable the tracking data to be stacked with images from the endzone and sideline, I simulate the tracking data as images. To accomplish this, I use the OpenCV cv2.circle function to plot each player's position in a specific step on a black background. I assign two different colors to represent the two teams, and players in contact are depicted with bigger and brighter circles (radius is 5, and pixel value is 255), while background players are depicted with smaller and darker circles (radius is 3, and pixel value is 127). By integrating this information into the input, the model can learn the interaction of all players from a bird's eye view. The input to the PP model is displayed in the GIF below.</p>\n<p><img src=\"https://i.ibb.co/sKJ5zHP/output.gif\" alt=\"\"></p>\n<p><strong><em>1.1.2 Input generator for PG model</em></strong><br>\nThe endzone and sideline videos are processed similarly to the PP model, with the exception that the PG model uses a longer input sequence of 23 neighboring frames, ranging from [-54, -48, -42, -36, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, 36, 42, 48, 54]. </p>\n<p>The PG model does not include simulated tracking images as they do not improve the PG CV score. </p>\n<p>Unlike the PP model, I can use a longer sequence of images in the PG model because the tracking images are not included. In the PP model, the maximum sequence length that can fit into my GPU is 18 images.</p>\n<p><strong><em>1.2 Model</em></strong><br>\nGiven that the input appears to resemble an action classification task rather than a standard 3D classification, I opted to use an action recognition model to address this problem. After reviewing the <a href=\"https://github.com/open-mmlab/mmaction2\" target=\"_blank\">mmaction2 repository</a>, it became clear that the CSN series delivered the most impressive results in the Kinetics-400 dataset. As a result, I selected resnet50-irCSN and fine-tuned it for this particular task.</p>\n<p><strong><em>1.3 Training</em></strong></p>\n<p>During training, I apply the following augmentations to the endzone and sideline images and randomly swap them. As for the tracking images, I only use horizontal and vertical flips as augmentations.</p>\n<pre><code>base_aug = [\n        A.RandomResizedCrop(always_apply=False, p=1.0, height=cfg.img_size, width=cfg.img_size, scale=(0.7, 1.2), ratio=(0.75, 1.3), interpolation=1),\n        A.OneOf([\n            A.RandomGamma(gamma_limit=(30, 150), p=1),\n            A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.3, p=1),\n            A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.2, p=1),\n            A.HueSaturationValue(hue_shift_limit=20, sat_shift_limit=30, val_shift_limit=20, p=1),\n            A.CLAHE(clip_limit=5.0, tile_grid_size=(5, 5), p=1),\n        ], p=0.6),\n        A.HorizontalFlip(p=0.5), \n        A.ShiftScaleRotate(shift_limit=0.0, scale_limit=0.1, rotate_limit=15,\n                                        interpolation=cv2.INTER_LINEAR, border_mode=cv2.BORDER_CONSTANT, p=0.8),\n        A.Cutout(max_h_size=int(50), max_w_size=int(50), num_holes=2, p=0.5),\n    ]\n\ncfg.train_transform = A.ReplayCompose(base_aug)\n</code></pre>\n<p>I used a linear scheduler for the learning rate and trained the model for one epoch. In the final submission, I trained the model using all available data with 4 seeds.</p>\n<p><strong>2. XGB Postprocessing</strong><br>\nI employed a simple xgb model to combine the predictions of pre-xgb and cnn. Through experimentation, I discovered that the optimal feature for post-processing in PP and PG models slightly differs.</p>\n<p><strong><em>2.1 PP postprocessing</em></strong><br>\nFirst, I calculated an ensemble probability from the CNN and preprocessing xgb model as follows: prob = 0.2pre_xgb_prob + 0.8cnn_prob. <br>\nThen, I used the probability from the 20 neighboring steps as features for the xgb model, i.e., {prob(-10), prob(-9), …, prob(0), prob(1), …, prob(9)}, where prob(-10) represents the probability of the same pair of players in the prior 10 steps.<br>\nThis postprocessing method improved my PP CV score by approximately 0.005.</p>\n<p><strong><em>2.2 PG postprocessing</em></strong><br>\n I calculated an ensemble probability from the CNN and preprocessing xgb model as follows: prob = 0.15pre_xgb_prob + 0.85cnn_prob. <br>\nThe feature to xgb model are </p>\n<ul>\n<li>The ensemble probability from the 30 neighboring steps {prob(-15), prob(-14), …, prob(0), prob(1), …, prob(14)},  </li>\n<li>The pre_xgb_prob and cnn_prob from the 20 neighboring steps.<br>\nThis postprocessing method improved my PG CV score by approximately 0.04.</li>\n</ul>\n<p>P/S. Thanks chatGPT for making my explanation better!!</p>",
      "rawMarkdown": "Thanks to NFL and Kaggle for hosting this interesting competition.\nMy approach comprises three main components\n- A weak xgb model to remove easy negative samples\n- A CNN to classify contact\n- A xgb model to post-process the output.\n\nSince my xgb preprocessing was not really good compare to other teams (CV ~ 0.72),I will only elaborate on my CNN and post-processing method in this write-up.\n**1. 3D CNN for Video Classification**\n***1.1 Input generator***\n\nI separate the modeling and training of player-player (PP) and player-ground (PG) contacts.\nThe PP model is trained using input from three sources, namely endzone video, sideline video, and tracking data. On the other hand, the PG model is trained using input from only two sources, namely endzone video and sideline video. Notably, including tracking data does not result in improved performance for the PG model.\n\n***1.1.1 Input generator for PP model***\n\nThe endzone and sideline videos are processed similarly. Firstly, I extract 18 images from neighboring frames, namely {frame[-44], -37, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, frame[37]}. The frame[-44] represents 44 frames prior to the current sample's estimated frame. This sampling technique enables the model to observe more frames close to the estimated frame. \n\nNext, I mask the players' heads in contact with a black or white circle to guide the model's attention to the relevant players. Rather than using an additional channel, I mark the players' heads directly into the image. I made this decision to maintain the input's 3-channel format, which maximizes the utilization of the pretrained weight file. Finally, I crop each image around the players' contact area using a crop size of 10 times the mean helmet box size within the specified frame range.\n\nTo enable the tracking data to be stacked with images from the endzone and sideline, I simulate the tracking data as images. To accomplish this, I use the OpenCV cv2.circle function to plot each player's position in a specific step on a black background. I assign two different colors to represent the two teams, and players in contact are depicted with bigger and brighter circles (radius is 5, and pixel value is 255), while background players are depicted with smaller and darker circles (radius is 3, and pixel value is 127). By integrating this information into the input, the model can learn the interaction of all players from a bird's eye view. The input to the PP model is displayed in the GIF below.\n\n![](https://i.ibb.co/sKJ5zHP/output.gif)\n\n***1.1.2 Input generator for PG model***\nThe endzone and sideline videos are processed similarly to the PP model, with the exception that the PG model uses a longer input sequence of 23 neighboring frames, ranging from [-54, -48, -42, -36, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, 36, 42, 48, 54]. \n\nThe PG model does not include simulated tracking images as they do not improve the PG CV score. \n\nUnlike the PP model, I can use a longer sequence of images in the PG model because the tracking images are not included. In the PP model, the maximum sequence length that can fit into my GPU is 18 images.\n\n***1.2 Model***\nGiven that the input appears to resemble an action classification task rather than a standard 3D classification, I opted to use an action recognition model to address this problem. After reviewing the [mmaction2 repository](https://github.com/open-mmlab/mmaction2), it became clear that the CSN series delivered the most impressive results in the Kinetics-400 dataset. As a result, I selected resnet50-irCSN and fine-tuned it for this particular task.\n\n\n***1.3 Training***\n\nDuring training, I apply the following augmentations to the endzone and sideline images and randomly swap them. As for the tracking images, I only use horizontal and vertical flips as augmentations.\n```\nbase_aug = [\n        A.RandomResizedCrop(always_apply=False, p=1.0, height=cfg.img_size, width=cfg.img_size, scale=(0.7, 1.2), ratio=(0.75, 1.3), interpolation=1),\n        A.OneOf([\n            A.RandomGamma(gamma_limit=(30, 150), p=1),\n            A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.3, p=1),\n            A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.2, p=1),\n            A.HueSaturationValue(hue_shift_limit=20, sat_shift_limit=30, val_shift_limit=20, p=1),\n            A.CLAHE(clip_limit=5.0, tile_grid_size=(5, 5), p=1),\n        ], p=0.6),\n        A.HorizontalFlip(p=0.5), \n        A.ShiftScaleRotate(shift_limit=0.0, scale_limit=0.1, rotate_limit=15,\n                                        interpolation=cv2.INTER_LINEAR, border_mode=cv2.BORDER_CONSTANT, p=0.8),\n        A.Cutout(max_h_size=int(50), max_w_size=int(50), num_holes=2, p=0.5),\n    ]\n\ncfg.train_transform = A.ReplayCompose(base_aug)\n```\n\nI used a linear scheduler for the learning rate and trained the model for one epoch. In the final submission, I trained the model using all available data with 4 seeds.\n\n\n**2. XGB Postprocessing**\nI employed a simple xgb model to combine the predictions of pre-xgb and cnn. Through experimentation, I discovered that the optimal feature for post-processing in PP and PG models slightly differs.\n\n***2.1 PP postprocessing***\nFirst, I calculated an ensemble probability from the CNN and preprocessing xgb model as follows: prob = 0.2pre_xgb_prob + 0.8cnn_prob. \nThen, I used the probability from the 20 neighboring steps as features for the xgb model, i.e., {prob(-10), prob(-9), ..., prob(0), prob(1), ..., prob(9)}, where prob(-10) represents the probability of the same pair of players in the prior 10 steps.\nThis postprocessing method improved my PP CV score by approximately 0.005.\n\n***2.2 PG postprocessing***\n I calculated an ensemble probability from the CNN and preprocessing xgb model as follows: prob = 0.15pre_xgb_prob + 0.85cnn_prob. \nThe feature to xgb model are \n- The ensemble probability from the 30 neighboring steps {prob(-15), prob(-14), ..., prob(0), prob(1), ..., prob(14)},  \n- The pre_xgb_prob and cnn_prob from the 20 neighboring steps.\nThis postprocessing method improved my PG CV score by approximately 0.04.\n\nP/S. Thanks chatGPT for making my explanation better!!\n",
      "votes": 138
    },
    {
      "id": 2168471,
      "postDate": "2023-03-04T09:19:09.280Z",
      "content": "<p>Congratulations on a strong finish and solo winning this hard competition! Different interval frame sampling and concatenating rgb image and tracking image are beyond my imagination, but seems surprisingly works well. Awesome!!</p>",
      "rawMarkdown": "Congratulations on a strong finish and solo winning this hard competition! Different interval frame sampling and concatenating rgb image and tracking image are beyond my imagination, but seems surprisingly works well. Awesome!!\n",
      "votes": 3,
      "replies": [
        {
          "id": 2168498,
          "postDate": "2023-03-04T09:43:08.433Z",
          "content": "<p>Thank you. Congratulations on your strong finish and becoming GM. well done</p>",
          "rawMarkdown": "Thank you. Congratulations on your strong finish and becoming GM. well done",
          "votes": 1,
          "replies": [
            {
              "id": 2172496,
              "postDate": "2023-03-07T15:01:00.023Z",
              "content": "<p><a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> Thanks for sharing code too, that's definitely a masterpiece!!<br>\nQuick question, when I look through your code, I found that the dropout rate is set to 0.5, which seems too large for me. Is it natural for you? Have you experienced it working for other tasks too or did it specifically work for this task?<br>\nThanks,</p>",
              "rawMarkdown": "@nvnnghia Thanks for sharing code too, that's definitely a masterpiece!!\nQuick question, when I look through your code, I found that the dropout rate is set to 0.5, which seems too large for me. Is it natural for you? Have you experienced it working for other tasks too or did it specifically work for this task?\nThanks,\n\n"
            },
            {
              "id": 2172532,
              "postDate": "2023-03-07T15:35:48.867Z",
              "content": "<ul>\n<li>dropout 0.5 is natural for me.</li>\n<li>At times, I utilize a larger dropout rate, such as 0.6 or 0.7. If my model appears to overfit easily, one of the initial experiments I aim to conduct is to increase the dropout rate and adjust the intensity of data augmentation.</li>\n</ul>",
              "rawMarkdown": "- dropout 0.5 is natural for me.\n- At times, I utilize a larger dropout rate, such as 0.6 or 0.7. If my model appears to overfit easily, one of the initial experiments I aim to conduct is to increase the dropout rate and adjust the intensity of data augmentation.",
              "votes": 4
            },
            {
              "id": 2191343,
              "postDate": "2023-03-21T22:29:36.627Z",
              "content": "<p>What do you mean by adjusting the intensity of data augmentation? Thanks in advance!!</p>",
              "rawMarkdown": "What do you mean by adjusting the intensity of data augmentation? Thanks in advance!!"
            }
          ]
        }
      ]
    },
    {
      "id": 2187343,
      "postDate": "2023-03-18T16:50:13.460Z",
      "content": "<p>Congratulations.</p>\n<p>Very interesting way of solving the tournament, congratulations. I have a question about how to train the net.</p>\n<p>· <em>Have you used a custom loss function to train the resnet?</em></p>\n<p>Thank you very much</p>",
      "rawMarkdown": "Congratulations.\n\nVery interesting way of solving the tournament, congratulations. I have a question about how to train the net.\n\n  · *Have you used a custom loss function to train the resnet?*\n\nThank you very much",
      "votes": 1
    },
    {
      "id": 2175613,
      "postDate": "2023-03-10T02:25:21.300Z",
      "content": "<p>Congratulations on your achievement on Kaggle! I'm really impressed with your work and wanted to let you know. By the way, if you have a moment, I would really appreciate it if you could take a look at my profile and give it an upvote if you find my work interesting as well.</p>",
      "rawMarkdown": "Congratulations on your achievement on Kaggle! I'm really impressed with your work and wanted to let you know. By the way, if you have a moment, I would really appreciate it if you could take a look at my profile and give it an upvote if you find my work interesting as well.",
      "votes": 1
    },
    {
      "id": 2173673,
      "postDate": "2023-03-08T14:49:45.820Z",
      "content": "<p>Congrats on winning  <a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> ! And thanks for sharing your method wouldn't have though of it…</p>",
      "rawMarkdown": "Congrats on winning  @nvnnghia ! And thanks for sharing your method wouldn't have though of it...",
      "votes": 1
    },
    {
      "id": 2170097,
      "postDate": "2023-03-05T17:20:36.487Z",
      "content": "<p>Congratulations on winning and also thanks for sharing the approach</p>",
      "rawMarkdown": "Congratulations on winning and also thanks for sharing the approach",
      "votes": 1
    },
    {
      "id": 2169076,
      "postDate": "2023-03-04T18:58:49.167Z",
      "content": "<p>Congrats on winning <a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a>! Thanks for sharing this write up!</p>",
      "rawMarkdown": "Congrats on winning @nvnnghia! Thanks for sharing this write up!",
      "votes": 1
    },
    {
      "id": 2169068,
      "postDate": "2023-03-04T18:55:54.517Z",
      "content": "<p>Awesome work Nvnn. Congratulations on first place solo cash gold finish!</p>",
      "rawMarkdown": "Awesome work Nvnn. Congratulations on first place solo cash gold finish!",
      "votes": 1
    },
    {
      "id": 2167532,
      "postDate": "2023-03-03T14:47:32.573Z",
      "content": "<p><a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> <br>\nCongratulation.</p>\n<p>About 1st stage, what is the performance of negative sampling?<br>\nCan I ask the recall and sample reduction ratio?</p>\n<p>e.g) For my case, </p>\n<ul>\n<li>player-player contact: keeping recall 0.992, reduced ~50% of samples</li>\n<li>player-ground contact: keeping recall 0.992, reduced ~75% of samples</li>\n</ul>",
      "rawMarkdown": "@nvnnghia \nCongratulation.\n\nAbout 1st stage, what is the performance of negative sampling?\nCan I ask the recall and sample reduction ratio?\n\ne.g) For my case, \n\n- player-player contact: keeping recall 0.992, reduced ~50% of samples\n- player-ground contact: keeping recall 0.992, reduced ~75% of samples",
      "votes": 1,
      "replies": [
        {
          "id": 2168200,
          "postDate": "2023-03-04T01:58:05.530Z",
          "content": "<p>thanks. After filtering, around 1.4 million samples remained for the PP model, with a recall rate of 99.3%. For the PG model, around 130k samples remained with a recall rate of over 97%.</p>",
          "rawMarkdown": "thanks. After filtering, around 1.4 million samples remained for the PP model, with a recall rate of 99.3%. For the PG model, around 130k samples remained with a recall rate of over 97%.",
          "votes": 1
        }
      ]
    },
    {
      "id": 2167039,
      "postDate": "2023-03-03T08:16:21.947Z",
      "content": "<p>Congratulation! </p>",
      "rawMarkdown": "Congratulation! ",
      "votes": 1
    },
    {
      "id": 2165806,
      "postDate": "2023-03-02T13:19:39.510Z",
      "content": "<p>Really brilliant! Congrats on getting the 1st position 🙌</p>",
      "rawMarkdown": "Really brilliant! Congrats on getting the 1st position 🙌",
      "votes": 1
    },
    {
      "id": 2165479,
      "postDate": "2023-03-02T08:32:00.143Z",
      "content": "<p>Congrats and thanks for sharing your greate solution! How much does post-processing improve your cv score?</p>",
      "rawMarkdown": "Congrats and thanks for sharing your greate solution! How much does post-processing improve your cv score?",
      "votes": 1,
      "replies": [
        {
          "id": 2165502,
          "postDate": "2023-03-02T08:44:27.720Z",
          "content": "<p>thanks. pp boost my cv around +0.015. I didn't check LB </p>",
          "rawMarkdown": "thanks. pp boost my cv around +0.015. I didn't check LB ",
          "votes": 1
        }
      ]
    },
    {
      "id": 2165474,
      "postDate": "2023-03-02T08:30:08.160Z",
      "content": "<p>congratulations!, you idea is amazing. may i know which algorithm did you used to find the bbox to crop the area. are you used YOLO or something else?</p>",
      "rawMarkdown": "congratulations!, you idea is amazing. may i know which algorithm did you used to find the bbox to crop the area. are you used YOLO or something else?",
      "votes": 1,
      "replies": [
        {
          "id": 2165501,
          "postDate": "2023-03-02T08:43:33.647Z",
          "content": "<p>thanks. I used provided baseline helmet boxes</p>",
          "rawMarkdown": "thanks. I used provided baseline helmet boxes"
        }
      ]
    },
    {
      "id": 2165446,
      "postDate": "2023-03-02T08:09:34.927Z",
      "content": "<p>Congrats! Could you please tell us your Hardware device for training? and how much GPU RAM size for your model?</p>",
      "rawMarkdown": "Congrats! Could you please tell us your Hardware device for training? and how much GPU RAM size for your model?",
      "votes": 1,
      "replies": [
        {
          "id": 2165452,
          "postDate": "2023-03-02T08:14:00.817Z",
          "content": "<p>1x RTX 3090 24Gb VRAM</p>",
          "rawMarkdown": "1x RTX 3090 24Gb VRAM",
          "votes": 3
        }
      ]
    },
    {
      "id": 2165441,
      "postDate": "2023-03-02T08:04:22.587Z",
      "content": "<p>wow congrats </p>",
      "rawMarkdown": "wow congrats ",
      "votes": 1
    },
    {
      "id": 2165316,
      "postDate": "2023-03-02T05:38:50.210Z",
      "content": "<p>Congrats bro !!! Waiting for more detail from your solution.</p>",
      "rawMarkdown": "Congrats bro !!! Waiting for more detail from your solution.",
      "votes": 1
    },
    {
      "id": 2165302,
      "postDate": "2023-03-02T05:15:57.263Z",
      "content": "<p>Awesome pipeline, thanks for sharing!<br>\nDo you have any takes on the shake up? I think you were the only gold medal player who got PB&gt;LB</p>",
      "rawMarkdown": "Awesome pipeline, thanks for sharing!\nDo you have any takes on the shake up? I think you were the only gold medal player who got PB>LB",
      "votes": 1,
      "replies": [
        {
          "id": 2165321,
          "postDate": "2023-03-02T05:45:04.807Z",
          "content": "<p>To be honest, I'm unsure. From what I've observed, several teams have achieved a high public score within a short inference time, so I guess that that they might be unintentionally filtering out too many true positives from their private test data based on their CV score and public leaderboard feedback. In contrast, I used a filtering threshold that was five times lower than in my CV score to ensure that I didn't miss out on too many true positives in my submission.</p>",
          "rawMarkdown": "To be honest, I'm unsure. From what I've observed, several teams have achieved a high public score within a short inference time, so I guess that that they might be unintentionally filtering out too many true positives from their private test data based on their CV score and public leaderboard feedback. In contrast, I used a filtering threshold that was five times lower than in my CV score to ensure that I didn't miss out on too many true positives in my submission.",
          "votes": 2,
          "replies": [
            {
              "id": 2165506,
              "postDate": "2023-03-02T08:46:56.593Z",
              "content": "<p>I am quite confident that threshold filtering is not the reason. We tried a few different thresholds and both public and private behaves as expected for them for us.</p>",
              "rawMarkdown": "I am quite confident that threshold filtering is not the reason. We tried a few different thresholds and both public and private behaves as expected for them for us.",
              "votes": 2
            }
          ]
        }
      ]
    },
    {
      "id": 2165273,
      "postDate": "2023-03-02T04:49:07.257Z",
      "content": "<p>Congratulation! waiting for more sharing</p>",
      "rawMarkdown": "Congratulation! waiting for more sharing",
      "votes": 1
    },
    {
      "id": 2168352,
      "postDate": "2023-03-04T06:39:58.410Z",
      "content": "<p>Congrats on winning the competition!</p>",
      "rawMarkdown": "Congrats on winning the competition!",
      "votes": 2
    },
    {
      "id": 2167871,
      "postDate": "2023-03-03T18:32:00.993Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> on your winning solution! I look forward to learning more about it. The idea of including the NGS data as part of the input image to your CNN is really clever.</p>\n<p>I have a few initial questions:</p>\n<ul>\n<li>How did you determine the frames you used <code>{frame[-44], -37, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, frame[37]}</code> - was this decided through experimentation or intution?</li>\n<li>What made you select the <code>resnet50-irCSN</code> as your backbone? Did you have any succsess with other architectures?</li>\n<li>How did you handle cases where helmet boxes are not be seen for both players in sideline/endzone views? Did you only predict if both players were seen in both views?</li>\n<li>In your postprocessing step, you say you combined the 1st stage XGB and CNN outputs like this: <code>prob = 0.2pre_xgb_prob + 0.8cnn_prob</code>. Is there any reason you did not use <code>pre_xgb_prob</code> and <code>cnn_prob</code> directly as features to the postprocessing XGB model?</li>\n</ul>\n<p>Thanks again for your solution write up!</p>",
      "rawMarkdown": "Congrats @nvnnghia on your winning solution! I look forward to learning more about it. The idea of including the NGS data as part of the input image to your CNN is really clever.\n\nI have a few initial questions:\n- How did you determine the frames you used `{frame[-44], -37, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, frame[37]}` - was this decided through experimentation or intution?\n- What made you select the `resnet50-irCSN` as your backbone? Did you have any succsess with other architectures?\n- How did you handle cases where helmet boxes are not be seen for both players in sideline/endzone views? Did you only predict if both players were seen in both views?\n- In your postprocessing step, you say you combined the 1st stage XGB and CNN outputs like this: `prob = 0.2pre_xgb_prob + 0.8cnn_prob`. Is there any reason you did not use `pre_xgb_prob` and `cnn_prob` directly as features to the postprocessing XGB model?\n\nThanks again for your solution write up!",
      "votes": 2,
      "replies": [
        {
          "id": 2168209,
          "postDate": "2023-03-04T02:21:21.330Z",
          "content": "<p>Thanks Rob.<br>\nI have just added more detail to my writeup to make it more clear based on your questions. </p>\n<ul>\n<li><em>How did you determine the frames you used {frame[-44], -37, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, frame[37]} - was this decided through experimentation or intution?</em><br>\nThe decision on the frame sampling was based on both intuition and experiments. Initially, I used an equal gap between frames such as […, 8, 4, 0, 4, 8, …]. However, I realized that the model should see more images near the estimated frame to improve performance, so I changed the sampling frames accordingly. It may seem strange that there is no frame[44], but this is because I pre-generated all inputs and saved them to disk for faster data loading (frame[44] is in my pre-generated data). However, a sequence of 19 images caused my GPU to run OOM, so I simply removed the last image (frame[44]) to avoid this issue.</li>\n<li><em>What made you select the resnet50-irCSN as your backbone? Did you have any succsess with other architectures?</em><br>\nGiven that the input appears to resemble an action classification task rather than a standard 3D classification, I opted to use an action recognition model to address this problem. After reviewing the mmaction2 repository, it became clear that the CSN series delivered the most impressive results in the Kinetics-400 dataset. As a result, I selected resnet50-irCSN and fine-tuned it for this particular task. I did tried 2.5D model, 3D model and other action recognition model such as slowfast, but CSN give me best CV score.</li>\n<li><em>How did you handle cases where helmet boxes are not be seen for both players in sideline/endzone views? Did you only predict if both players were seen in both views?</em><br>\nI use a black image for those frames.</li>\n<li><em>In your postprocessing step, you say you combined the 1st stage XGB and CNN outputs like this: prob = 0.2pre_xgb_prob + 0.8cnn_prob. Is there any reason you did not use pre_xgb_prob and cnn_prob directly as features to the postprocessing XGB model?</em><br>\nThank you for the question. I have updated my post-processing part in the write up to explain this.</li>\n</ul>\n<p>Thank you once again for organizing this fascinating NFL competition series. I had the opportunity to participate in all three challenges, and I thoroughly enjoyed the experience.</p>",
          "rawMarkdown": "Thanks Rob.\nI have just added more detail to my writeup to make it more clear based on your questions. \n- *How did you determine the frames you used {frame[-44], -37, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, frame[37]} - was this decided through experimentation or intution?*\nThe decision on the frame sampling was based on both intuition and experiments. Initially, I used an equal gap between frames such as [..., 8, 4, 0, 4, 8, ...]. However, I realized that the model should see more images near the estimated frame to improve performance, so I changed the sampling frames accordingly. It may seem strange that there is no frame[44], but this is because I pre-generated all inputs and saved them to disk for faster data loading (frame[44] is in my pre-generated data). However, a sequence of 19 images caused my GPU to run OOM, so I simply removed the last image (frame[44]) to avoid this issue.\n- *What made you select the resnet50-irCSN as your backbone? Did you have any succsess with other architectures?*\nGiven that the input appears to resemble an action classification task rather than a standard 3D classification, I opted to use an action recognition model to address this problem. After reviewing the mmaction2 repository, it became clear that the CSN series delivered the most impressive results in the Kinetics-400 dataset. As a result, I selected resnet50-irCSN and fine-tuned it for this particular task. I did tried 2.5D model, 3D model and other action recognition model such as slowfast, but CSN give me best CV score.\n- *How did you handle cases where helmet boxes are not be seen for both players in sideline/endzone views? Did you only predict if both players were seen in both views?*\nI use a black image for those frames.\n- *In your postprocessing step, you say you combined the 1st stage XGB and CNN outputs like this: prob = 0.2pre_xgb_prob + 0.8cnn_prob. Is there any reason you did not use pre_xgb_prob and cnn_prob directly as features to the postprocessing XGB model?*\nThank you for the question. I have updated my post-processing part in the write up to explain this.\n\nThank you once again for organizing this fascinating NFL competition series. I had the opportunity to participate in all three challenges, and I thoroughly enjoyed the experience.",
          "votes": 1,
          "replies": [
            {
              "id": 2168903,
              "postDate": "2023-03-04T16:11:25.427Z",
              "content": "<p>Thanks for the answers. That really helps. Congrats again.</p>",
              "rawMarkdown": "Thanks for the answers. That really helps. Congrats again."
            }
          ]
        }
      ]
    },
    {
      "id": 2167252,
      "postDate": "2023-03-03T11:13:14.873Z",
      "content": "<p>Wow, Congrats on solo 1st place! It's a really cool, great job.</p>",
      "rawMarkdown": "Wow, Congrats on solo 1st place! It's a really cool, great job.",
      "votes": 2
    },
    {
      "id": 2165286,
      "postDate": "2023-03-02T04:55:42.010Z",
      "content": "<p>Congrats! Great idea to put tracking data into CNNs. How much will performance drop if you don't add it?</p>",
      "rawMarkdown": "Congrats! Great idea to put tracking data into CNNs. How much will performance drop if you don't add it?",
      "votes": 2,
      "replies": [
        {
          "id": 2165292,
          "postDate": "2023-03-02T05:02:16.070Z",
          "content": "<p>I added it when my cv were still low (~0.73) and it boosted my cv to 0.76. I don't know how much it contributed to my final model (cv 0.79+).</p>",
          "rawMarkdown": "I added it when my cv were still low (~0.73) and it boosted my cv to 0.76. I don't know how much it contributed to my final model (cv 0.79+).",
          "votes": 2,
          "replies": [
            {
              "id": 2165497,
              "postDate": "2023-03-02T08:37:59.857Z",
              "content": "<p>Is your 0.79+ CV on a single fold or full oof?</p>",
              "rawMarkdown": "Is your 0.79+ CV on a single fold or full oof?"
            },
            {
              "id": 2165505,
              "postDate": "2023-03-02T08:46:20.597Z",
              "content": "<p>it is a full oof. ~0.788 for 1 seed, and 0.79+ if ensemble multiple seeds.</p>",
              "rawMarkdown": "it is a full oof. ~0.788 for 1 seed, and 0.79+ if ensemble multiple seeds.",
              "votes": 1
            },
            {
              "id": 2165512,
              "postDate": "2023-03-02T08:49:32.573Z",
              "content": "<p>Thanks for sharing. Interesting that you made this decent jump while others dropped. Our CV on full oof is well into 0.805+ territory.</p>",
              "rawMarkdown": "Thanks for sharing. Interesting that you made this decent jump while others dropped. Our CV on full oof is well into 0.805+ territory."
            },
            {
              "id": 2165515,
              "postDate": "2023-03-02T08:52:13.053Z",
              "content": "<p>wow. is that your final CV or only video base cv?? my CV with post processing also 805+</p>",
              "rawMarkdown": "wow. is that your final CV or only video base cv?? my CV with post processing also 805+"
            },
            {
              "id": 2165521,
              "postDate": "2023-03-02T08:53:38.860Z",
              "content": "<p>Final CV as scored on LB, so your 805+ after PP sounds more reasonable then I guess :)</p>",
              "rawMarkdown": "Final CV as scored on LB, so your 805+ after PP sounds more reasonable then I guess :)"
            }
          ]
        }
      ]
    },
    {
      "id": 2199615,
      "postDate": "2023-03-27T21:16:36.030Z",
      "content": "<p>Bro CV hain't izy …</p>",
      "rawMarkdown": "Bro CV hain't izy ..."
    },
    {
      "id": 2179077,
      "postDate": "2023-03-12T21:04:14.607Z",
      "content": "<p>Appreciate all the effort you took here! Thanks for sharing </p>",
      "rawMarkdown": "Appreciate all the effort you took here! Thanks for sharing "
    },
    {
      "id": 2179053,
      "postDate": "2023-03-12T20:43:23.377Z",
      "content": "<p>Congratulations on your 1st place solution in the NFL and Kaggle competition! Your approach is well-structured and appears to be very effective. Here are some potential improvements you could consider just for fun and experimentation:</p>\n<ul>\n<li><p>Provide more detail on your xgb preprocessing method. While you mention that it was not as effective as the other teams' approaches, it could still be helpful to understand your thought process and what you tried.</p></li>\n<li><p>Consider testing other CNN architectures to compare their performance against the resnet50-irCSN model you used. This could help to identify which models are more effective for this type of task.</p></li>\n<li><p>Experiment with different augmentation techniques during training. Although you included several augmentations, there may be others that could further improve your model's performance.</p></li>\n<li><p>Consider using an ensemble of models. Ensembling multiple models can help to reduce the risk of overfitting and improve the overall accuracy of the predictions.</p></li>\n</ul>\n<p>Overall, great job on your winning solution!🎉</p>",
      "rawMarkdown": "Congratulations on your 1st place solution in the NFL and Kaggle competition! Your approach is well-structured and appears to be very effective. Here are some potential improvements you could consider just for fun and experimentation:\n\n- Provide more detail on your xgb preprocessing method. While you mention that it was not as effective as the other teams' approaches, it could still be helpful to understand your thought process and what you tried.\n\n- Consider testing other CNN architectures to compare their performance against the resnet50-irCSN model you used. This could help to identify which models are more effective for this type of task.\n\n- Experiment with different augmentation techniques during training. Although you included several augmentations, there may be others that could further improve your model's performance.\n\n- Consider using an ensemble of models. Ensembling multiple models can help to reduce the risk of overfitting and improve the overall accuracy of the predictions.\n\nOverall, great job on your winning solution!🎉"
    },
    {
      "id": 2174921,
      "postDate": "2023-03-09T14:11:55.673Z",
      "content": "<p>Congratulations.<br>\nDo you run inference for endzone and sideline respectively? If so ,how do you combine they.</p>",
      "rawMarkdown": "Congratulations.\nDo you run inference for endzone and sideline respectively? If so ,how do you combine they."
    },
    {
      "id": 2174635,
      "postDate": "2023-03-09T09:38:33.323Z",
      "content": "<p>Congratulations for the win.</p>",
      "rawMarkdown": "Congratulations for the win."
    },
    {
      "id": 2171616,
      "postDate": "2023-03-06T23:58:30.003Z",
      "content": "<p><a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> that's awesome solution, you're well done!</p>",
      "rawMarkdown": "@nvnnghia that's awesome solution, you're well done!"
    },
    {
      "id": 2170815,
      "postDate": "2023-03-06T09:53:44.327Z",
      "content": "<p><a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> , many many Congratulations on winning this competition. I am new to Kaggle and aspiring to become a ML engineer.  I am done almost 3 months of learning and practicing python and ML now. </p>\n<p>Would love to get some guidance if possible.</p>",
      "rawMarkdown": "@nvnnghia , many many Congratulations on winning this competition. I am new to Kaggle and aspiring to become a ML engineer.  I am done almost 3 months of learning and practicing python and ML now. \n\nWould love to get some guidance if possible."
    },
    {
      "id": 2170704,
      "postDate": "2023-03-06T08:04:32.440Z",
      "content": "<p>Great to see that how machine learning reshaping the world.</p>",
      "rawMarkdown": "Great to see that how machine learning reshaping the world."
    },
    {
      "id": 2170356,
      "postDate": "2023-03-05T23:00:52.417Z",
      "content": "<p>Thanks for sharing and congratulations on winning. </p>",
      "rawMarkdown": "Thanks for sharing and congratulations on winning. "
    },
    {
      "id": 2195535,
      "postDate": "2023-03-24T17:45:44.720Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 2291975,
      "postDate": "2023-06-08T02:36:36.810Z",
      "content": "<p>Thanks for sharing the approach.</p>",
      "rawMarkdown": "Thanks for sharing the approach."
    },
    {
      "id": 2179127,
      "postDate": "2023-03-12T22:24:26.680Z",
      "content": "<p>Thank you so much and Congratulations!! </p>",
      "rawMarkdown": "Thank you so much and Congratulations!! "
    },
    {
      "id": 2174899,
      "postDate": "2023-03-09T13:50:34.327Z",
      "content": "<p>Thank you for sharing!</p>",
      "rawMarkdown": "Thank you for sharing!"
    },
    {
      "id": 2173147,
      "postDate": "2023-03-08T06:13:34.970Z",
      "content": "<p>really good…thank you for sharing..</p>",
      "rawMarkdown": "really good...thank you for sharing.."
    }
  ],
  "comments": [
    {
      "id": 2168471,
      "author_name": "Camaro",
      "author_url": "",
      "post_date": "2023-03-04T09:19:09.280000",
      "content": "<p>Congratulations on a strong finish and solo winning this hard competition! Different interval frame sampling and concatenating rgb image and tracking image are beyond my imagination, but seems surprisingly works well. Awesome!!</p>",
      "votes": 3,
      "replies": [
        {
          "id": 2168498,
          "author_name": "nvnn",
          "author_url": "",
          "post_date": "2023-03-04T09:43:08.433000",
          "content": "<p>Thank you. Congratulations on your strong finish and becoming GM. well done</p>",
          "votes": 1,
          "replies": [
            {
              "id": 2172496,
              "author_name": "Camaro",
              "author_url": "",
              "post_date": "2023-03-07T15:01:00.023000",
              "content": "<p><a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> Thanks for sharing code too, that's definitely a masterpiece!!<br>\nQuick question, when I look through your code, I found that the dropout rate is set to 0.5, which seems too large for me. Is it natural for you? Have you experienced it working for other tasks too or did it specifically work for this task?<br>\nThanks,</p>",
              "votes": 0,
              "replies": []
            },
            {
              "id": 2172532,
              "author_name": "nvnn",
              "author_url": "",
              "post_date": "2023-03-07T15:35:48.867000",
              "content": "<ul>\n<li>dropout 0.5 is natural for me.</li>\n<li>At times, I utilize a larger dropout rate, such as 0.6 or 0.7. If my model appears to overfit easily, one of the initial experiments I aim to conduct is to increase the dropout rate and adjust the intensity of data augmentation.</li>\n</ul>",
              "votes": 4,
              "replies": []
            },
            {
              "id": 2191343,
              "author_name": "David Del Río",
              "author_url": "",
              "post_date": "2023-03-21T22:29:36.627000",
              "content": "<p>What do you mean by adjusting the intensity of data augmentation? Thanks in advance!!</p>",
              "votes": 0,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 2187343,
      "author_name": "DanielPuente",
      "author_url": "",
      "post_date": "2023-03-18T16:50:13.460000",
      "content": "<p>Congratulations.</p>\n<p>Very interesting way of solving the tournament, congratulations. I have a question about how to train the net.</p>\n<p>· <em>Have you used a custom loss function to train the resnet?</em></p>\n<p>Thank you very much</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2175613,
      "author_name": "Majid Ahmad Khan",
      "author_url": "",
      "post_date": "2023-03-10T02:25:21.300000",
      "content": "<p>Congratulations on your achievement on Kaggle! I'm really impressed with your work and wanted to let you know. By the way, if you have a moment, I would really appreciate it if you could take a look at my profile and give it an upvote if you find my work interesting as well.</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2173673,
      "author_name": "Sitraka_Forler",
      "author_url": "",
      "post_date": "2023-03-08T14:49:45.820000",
      "content": "<p>Congrats on winning  <a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> ! And thanks for sharing your method wouldn't have though of it…</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2170097,
      "author_name": "ayushsingh05",
      "author_url": "",
      "post_date": "2023-03-05T17:20:36.487000",
      "content": "<p>Congratulations on winning and also thanks for sharing the approach</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2169076,
      "author_name": "Ravi Shah",
      "author_url": "",
      "post_date": "2023-03-04T18:58:49.167000",
      "content": "<p>Congrats on winning <a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a>! Thanks for sharing this write up!</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2169068,
      "author_name": "Chris Deotte",
      "author_url": "",
      "post_date": "2023-03-04T18:55:54.517000",
      "content": "<p>Awesome work Nvnn. Congratulations on first place solo cash gold finish!</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2167532,
      "author_name": "Bilzard",
      "author_url": "",
      "post_date": "2023-03-03T14:47:32.573000",
      "content": "<p><a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> <br>\nCongratulation.</p>\n<p>About 1st stage, what is the performance of negative sampling?<br>\nCan I ask the recall and sample reduction ratio?</p>\n<p>e.g) For my case, </p>\n<ul>\n<li>player-player contact: keeping recall 0.992, reduced ~50% of samples</li>\n<li>player-ground contact: keeping recall 0.992, reduced ~75% of samples</li>\n</ul>",
      "votes": 1,
      "replies": [
        {
          "id": 2168200,
          "author_name": "nvnn",
          "author_url": "",
          "post_date": "2023-03-04T01:58:05.530000",
          "content": "<p>thanks. After filtering, around 1.4 million samples remained for the PP model, with a recall rate of 99.3%. For the PG model, around 130k samples remained with a recall rate of over 97%.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 2167039,
      "author_name": "E-Max AI",
      "author_url": "",
      "post_date": "2023-03-03T08:16:21.947000",
      "content": "<p>Congratulation! </p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2165806,
      "author_name": "Ahmed Samir",
      "author_url": "",
      "post_date": "2023-03-02T13:19:39.510000",
      "content": "<p>Really brilliant! Congrats on getting the 1st position 🙌</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2165479,
      "author_name": "Ethan",
      "author_url": "",
      "post_date": "2023-03-02T08:32:00.143000",
      "content": "<p>Congrats and thanks for sharing your greate solution! How much does post-processing improve your cv score?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 2165502,
          "author_name": "nvnn",
          "author_url": "",
          "post_date": "2023-03-02T08:44:27.720000",
          "content": "<p>thanks. pp boost my cv around +0.015. I didn't check LB </p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 2165474,
      "author_name": "nadhir hasan",
      "author_url": "",
      "post_date": "2023-03-02T08:30:08.160000",
      "content": "<p>congratulations!, you idea is amazing. may i know which algorithm did you used to find the bbox to crop the area. are you used YOLO or something else?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 2165501,
          "author_name": "nvnn",
          "author_url": "",
          "post_date": "2023-03-02T08:43:33.647000",
          "content": "<p>thanks. I used provided baseline helmet boxes</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 2165446,
      "author_name": "Dewei Chen",
      "author_url": "",
      "post_date": "2023-03-02T08:09:34.927000",
      "content": "<p>Congrats! Could you please tell us your Hardware device for training? and how much GPU RAM size for your model?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 2165452,
          "author_name": "nvnn",
          "author_url": "",
          "post_date": "2023-03-02T08:14:00.817000",
          "content": "<p>1x RTX 3090 24Gb VRAM</p>",
          "votes": 3,
          "replies": []
        }
      ]
    },
    {
      "id": 2165441,
      "author_name": "( ͡° ͜ʖ ͡°)",
      "author_url": "",
      "post_date": "2023-03-02T08:04:22.587000",
      "content": "<p>wow congrats </p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2165316,
      "author_name": "KhanhVD",
      "author_url": "",
      "post_date": "2023-03-02T05:38:50.210000",
      "content": "<p>Congrats bro !!! Waiting for more detail from your solution.</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2165302,
      "author_name": "arutema47",
      "author_url": "",
      "post_date": "2023-03-02T05:15:57.263000",
      "content": "<p>Awesome pipeline, thanks for sharing!<br>\nDo you have any takes on the shake up? I think you were the only gold medal player who got PB&gt;LB</p>",
      "votes": 1,
      "replies": [
        {
          "id": 2165321,
          "author_name": "nvnn",
          "author_url": "",
          "post_date": "2023-03-02T05:45:04.807000",
          "content": "<p>To be honest, I'm unsure. From what I've observed, several teams have achieved a high public score within a short inference time, so I guess that that they might be unintentionally filtering out too many true positives from their private test data based on their CV score and public leaderboard feedback. In contrast, I used a filtering threshold that was five times lower than in my CV score to ensure that I didn't miss out on too many true positives in my submission.</p>",
          "votes": 2,
          "replies": [
            {
              "id": 2165506,
              "author_name": "Psi",
              "author_url": "",
              "post_date": "2023-03-02T08:46:56.593000",
              "content": "<p>I am quite confident that threshold filtering is not the reason. We tried a few different thresholds and both public and private behaves as expected for them for us.</p>",
              "votes": 2,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 2165273,
      "author_name": "HongCheng",
      "author_url": "",
      "post_date": "2023-03-02T04:49:07.257000",
      "content": "<p>Congratulation! waiting for more sharing</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2168352,
      "author_name": "Dmytro Poplavskiy",
      "author_url": "",
      "post_date": "2023-03-04T06:39:58.410000",
      "content": "<p>Congrats on winning the competition!</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 2167871,
      "author_name": "Rob Mulla",
      "author_url": "",
      "post_date": "2023-03-03T18:32:00.993000",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> on your winning solution! I look forward to learning more about it. The idea of including the NGS data as part of the input image to your CNN is really clever.</p>\n<p>I have a few initial questions:</p>\n<ul>\n<li>How did you determine the frames you used <code>{frame[-44], -37, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, frame[37]}</code> - was this decided through experimentation or intution?</li>\n<li>What made you select the <code>resnet50-irCSN</code> as your backbone? Did you have any succsess with other architectures?</li>\n<li>How did you handle cases where helmet boxes are not be seen for both players in sideline/endzone views? Did you only predict if both players were seen in both views?</li>\n<li>In your postprocessing step, you say you combined the 1st stage XGB and CNN outputs like this: <code>prob = 0.2pre_xgb_prob + 0.8cnn_prob</code>. Is there any reason you did not use <code>pre_xgb_prob</code> and <code>cnn_prob</code> directly as features to the postprocessing XGB model?</li>\n</ul>\n<p>Thanks again for your solution write up!</p>",
      "votes": 2,
      "replies": [
        {
          "id": 2168209,
          "author_name": "nvnn",
          "author_url": "",
          "post_date": "2023-03-04T02:21:21.330000",
          "content": "<p>Thanks Rob.<br>\nI have just added more detail to my writeup to make it more clear based on your questions. </p>\n<ul>\n<li><em>How did you determine the frames you used {frame[-44], -37, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, frame[37]} - was this decided through experimentation or intution?</em><br>\nThe decision on the frame sampling was based on both intuition and experiments. Initially, I used an equal gap between frames such as […, 8, 4, 0, 4, 8, …]. However, I realized that the model should see more images near the estimated frame to improve performance, so I changed the sampling frames accordingly. It may seem strange that there is no frame[44], but this is because I pre-generated all inputs and saved them to disk for faster data loading (frame[44] is in my pre-generated data). However, a sequence of 19 images caused my GPU to run OOM, so I simply removed the last image (frame[44]) to avoid this issue.</li>\n<li><em>What made you select the resnet50-irCSN as your backbone? Did you have any succsess with other architectures?</em><br>\nGiven that the input appears to resemble an action classification task rather than a standard 3D classification, I opted to use an action recognition model to address this problem. After reviewing the mmaction2 repository, it became clear that the CSN series delivered the most impressive results in the Kinetics-400 dataset. As a result, I selected resnet50-irCSN and fine-tuned it for this particular task. I did tried 2.5D model, 3D model and other action recognition model such as slowfast, but CSN give me best CV score.</li>\n<li><em>How did you handle cases where helmet boxes are not be seen for both players in sideline/endzone views? Did you only predict if both players were seen in both views?</em><br>\nI use a black image for those frames.</li>\n<li><em>In your postprocessing step, you say you combined the 1st stage XGB and CNN outputs like this: prob = 0.2pre_xgb_prob + 0.8cnn_prob. Is there any reason you did not use pre_xgb_prob and cnn_prob directly as features to the postprocessing XGB model?</em><br>\nThank you for the question. I have updated my post-processing part in the write up to explain this.</li>\n</ul>\n<p>Thank you once again for organizing this fascinating NFL competition series. I had the opportunity to participate in all three challenges, and I thoroughly enjoyed the experience.</p>",
          "votes": 1,
          "replies": [
            {
              "id": 2168903,
              "author_name": "Rob Mulla",
              "author_url": "",
              "post_date": "2023-03-04T16:11:25.427000",
              "content": "<p>Thanks for the answers. That really helps. Congrats again.</p>",
              "votes": 0,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 2167252,
      "author_name": "Heroseo",
      "author_url": "",
      "post_date": "2023-03-03T11:13:14.873000",
      "content": "<p>Wow, Congrats on solo 1st place! It's a really cool, great job.</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 2165286,
      "author_name": "Leon",
      "author_url": "",
      "post_date": "2023-03-02T04:55:42.010000",
      "content": "<p>Congrats! Great idea to put tracking data into CNNs. How much will performance drop if you don't add it?</p>",
      "votes": 2,
      "replies": [
        {
          "id": 2165292,
          "author_name": "nvnn",
          "author_url": "",
          "post_date": "2023-03-02T05:02:16.070000",
          "content": "<p>I added it when my cv were still low (~0.73) and it boosted my cv to 0.76. I don't know how much it contributed to my final model (cv 0.79+).</p>",
          "votes": 2,
          "replies": [
            {
              "id": 2165497,
              "author_name": "Psi",
              "author_url": "",
              "post_date": "2023-03-02T08:37:59.857000",
              "content": "<p>Is your 0.79+ CV on a single fold or full oof?</p>",
              "votes": 0,
              "replies": []
            },
            {
              "id": 2165505,
              "author_name": "nvnn",
              "author_url": "",
              "post_date": "2023-03-02T08:46:20.597000",
              "content": "<p>it is a full oof. ~0.788 for 1 seed, and 0.79+ if ensemble multiple seeds.</p>",
              "votes": 1,
              "replies": []
            },
            {
              "id": 2165512,
              "author_name": "Psi",
              "author_url": "",
              "post_date": "2023-03-02T08:49:32.573000",
              "content": "<p>Thanks for sharing. Interesting that you made this decent jump while others dropped. Our CV on full oof is well into 0.805+ territory.</p>",
              "votes": 0,
              "replies": []
            },
            {
              "id": 2165515,
              "author_name": "nvnn",
              "author_url": "",
              "post_date": "2023-03-02T08:52:13.053000",
              "content": "<p>wow. is that your final CV or only video base cv?? my CV with post processing also 805+</p>",
              "votes": 0,
              "replies": []
            },
            {
              "id": 2165521,
              "author_name": "Psi",
              "author_url": "",
              "post_date": "2023-03-02T08:53:38.860000",
              "content": "<p>Final CV as scored on LB, so your 805+ after PP sounds more reasonable then I guess :)</p>",
              "votes": 0,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 2199615,
      "author_name": "SFR.LUX",
      "author_url": "",
      "post_date": "2023-03-27T21:16:36.030000",
      "content": "<p>Bro CV hain't izy …</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2179077,
      "author_name": "mLiammm",
      "author_url": "",
      "post_date": "2023-03-12T21:04:14.607000",
      "content": "<p>Appreciate all the effort you took here! Thanks for sharing </p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2179053,
      "author_name": "Krishna",
      "author_url": "",
      "post_date": "2023-03-12T20:43:23.377000",
      "content": "<p>Congratulations on your 1st place solution in the NFL and Kaggle competition! Your approach is well-structured and appears to be very effective. Here are some potential improvements you could consider just for fun and experimentation:</p>\n<ul>\n<li><p>Provide more detail on your xgb preprocessing method. While you mention that it was not as effective as the other teams' approaches, it could still be helpful to understand your thought process and what you tried.</p></li>\n<li><p>Consider testing other CNN architectures to compare their performance against the resnet50-irCSN model you used. This could help to identify which models are more effective for this type of task.</p></li>\n<li><p>Experiment with different augmentation techniques during training. Although you included several augmentations, there may be others that could further improve your model's performance.</p></li>\n<li><p>Consider using an ensemble of models. Ensembling multiple models can help to reduce the risk of overfitting and improve the overall accuracy of the predictions.</p></li>\n</ul>\n<p>Overall, great job on your winning solution!🎉</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2174921,
      "author_name": "Tony",
      "author_url": "",
      "post_date": "2023-03-09T14:11:55.673000",
      "content": "<p>Congratulations.<br>\nDo you run inference for endzone and sideline respectively? If so ,how do you combine they.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2174635,
      "author_name": "Venkata Hemanth Gubbala",
      "author_url": "",
      "post_date": "2023-03-09T09:38:33.323000",
      "content": "<p>Congratulations for the win.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2171616,
      "author_name": "Revy Hono",
      "author_url": "",
      "post_date": "2023-03-06T23:58:30.003000",
      "content": "<p><a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> that's awesome solution, you're well done!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2170815,
      "author_name": "Ranjan Rashmi Sahoo",
      "author_url": "",
      "post_date": "2023-03-06T09:53:44.327000",
      "content": "<p><a href=\"https://www.kaggle.com/nvnnghia\" target=\"_blank\">@nvnnghia</a> , many many Congratulations on winning this competition. I am new to Kaggle and aspiring to become a ML engineer.  I am done almost 3 months of learning and practicing python and ML now. </p>\n<p>Would love to get some guidance if possible.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2170704,
      "author_name": "Muhammad Rehan Rao",
      "author_url": "",
      "post_date": "2023-03-06T08:04:32.440000",
      "content": "<p>Great to see that how machine learning reshaping the world.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2170356,
      "author_name": "",
      "author_url": "",
      "post_date": "2023-03-05T23:00:52.417000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2195535,
      "author_name": "",
      "author_url": "",
      "post_date": "2023-03-24T17:45:44.720000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2291975,
      "author_name": "",
      "author_url": "",
      "post_date": "2023-06-08T02:36:36.810000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2179127,
      "author_name": "",
      "author_url": "",
      "post_date": "2023-03-12T22:24:26.680000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2174899,
      "author_name": "",
      "author_url": "",
      "post_date": "2023-03-09T13:50:34.327000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2173147,
      "author_name": "",
      "author_url": "",
      "post_date": "2023-03-08T06:13:34.970000",
      "content": "",
      "votes": 0,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "2165235": "Thanks to NFL and Kaggle for hosting this interesting competition.\nMy approach comprises three main components\n- A weak xgb model to remove easy negative samples\n- A CNN to classify contact\n- A xgb model to post-process the output.\n\nSince my xgb preprocessing was not really good compare to other teams (CV ~ 0.72),I will only elaborate on my CNN and post-processing method in this write-up.\n**1. 3D CNN for Video Classification**\n***1.1 Input generator***\n\nI separate the modeling and training of player-player (PP) and player-ground (PG) contacts.\nThe PP model is trained using input from three sources, namely endzone video, sideline video, and tracking data. On the other hand, the PG model is trained using input from only two sources, namely endzone video and sideline video. Notably, including tracking data does not result in improved performance for the PG model.\n\n***1.1.1 Input generator for PP model***\n\nThe endzone and sideline videos are processed similarly. Firstly, I extract 18 images from neighboring frames, namely {frame[-44], -37, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, frame[37]}. The frame[-44] represents 44 frames prior to the current sample's estimated frame. This sampling technique enables the model to observe more frames close to the estimated frame. \n\nNext, I mask the players' heads in contact with a black or white circle to guide the model's attention to the relevant players. Rather than using an additional channel, I mark the players' heads directly into the image. I made this decision to maintain the input's 3-channel format, which maximizes the utilization of the pretrained weight file. Finally, I crop each image around the players' contact area using a crop size of 10 times the mean helmet box size within the specified frame range.\n\nTo enable the tracking data to be stacked with images from the endzone and sideline, I simulate the tracking data as images. To accomplish this, I use the OpenCV cv2.circle function to plot each player's position in a specific step on a black background. I assign two different colors to represent the two teams, and players in contact are depicted with bigger and brighter circles (radius is 5, and pixel value is 255), while background players are depicted with smaller and darker circles (radius is 3, and pixel value is 127). By integrating this information into the input, the model can learn the interaction of all players from a bird's eye view. The input to the PP model is displayed in the GIF below.\n\n![](https://i.ibb.co/sKJ5zHP/output.gif)\n\n***1.1.2 Input generator for PG model***\nThe endzone and sideline videos are processed similarly to the PP model, with the exception that the PG model uses a longer input sequence of 23 neighboring frames, ranging from [-54, -48, -42, -36, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, 36, 42, 48, 54]. \n\nThe PG model does not include simulated tracking images as they do not improve the PG CV score. \n\nUnlike the PP model, I can use a longer sequence of images in the PG model because the tracking images are not included. In the PP model, the maximum sequence length that can fit into my GPU is 18 images.\n\n***1.2 Model***\nGiven that the input appears to resemble an action classification task rather than a standard 3D classification, I opted to use an action recognition model to address this problem. After reviewing the [mmaction2 repository](https://github.com/open-mmlab/mmaction2), it became clear that the CSN series delivered the most impressive results in the Kinetics-400 dataset. As a result, I selected resnet50-irCSN and fine-tuned it for this particular task.\n\n\n***1.3 Training***\n\nDuring training, I apply the following augmentations to the endzone and sideline images and randomly swap them. As for the tracking images, I only use horizontal and vertical flips as augmentations.\n```\nbase_aug = [\n        A.RandomResizedCrop(always_apply=False, p=1.0, height=cfg.img_size, width=cfg.img_size, scale=(0.7, 1.2), ratio=(0.75, 1.3), interpolation=1),\n        A.OneOf([\n            A.RandomGamma(gamma_limit=(30, 150), p=1),\n            A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.3, p=1),\n            A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.2, p=1),\n            A.HueSaturationValue(hue_shift_limit=20, sat_shift_limit=30, val_shift_limit=20, p=1),\n            A.CLAHE(clip_limit=5.0, tile_grid_size=(5, 5), p=1),\n        ], p=0.6),\n        A.HorizontalFlip(p=0.5), \n        A.ShiftScaleRotate(shift_limit=0.0, scale_limit=0.1, rotate_limit=15,\n                                        interpolation=cv2.INTER_LINEAR, border_mode=cv2.BORDER_CONSTANT, p=0.8),\n        A.Cutout(max_h_size=int(50), max_w_size=int(50), num_holes=2, p=0.5),\n    ]\n\ncfg.train_transform = A.ReplayCompose(base_aug)\n```\n\nI used a linear scheduler for the learning rate and trained the model for one epoch. In the final submission, I trained the model using all available data with 4 seeds.\n\n\n**2. XGB Postprocessing**\nI employed a simple xgb model to combine the predictions of pre-xgb and cnn. Through experimentation, I discovered that the optimal feature for post-processing in PP and PG models slightly differs.\n\n***2.1 PP postprocessing***\nFirst, I calculated an ensemble probability from the CNN and preprocessing xgb model as follows: prob = 0.2pre_xgb_prob + 0.8cnn_prob. \nThen, I used the probability from the 20 neighboring steps as features for the xgb model, i.e., {prob(-10), prob(-9), ..., prob(0), prob(1), ..., prob(9)}, where prob(-10) represents the probability of the same pair of players in the prior 10 steps.\nThis postprocessing method improved my PP CV score by approximately 0.005.\n\n***2.2 PG postprocessing***\n I calculated an ensemble probability from the CNN and preprocessing xgb model as follows: prob = 0.15pre_xgb_prob + 0.85cnn_prob. \nThe feature to xgb model are \n- The ensemble probability from the 30 neighboring steps {prob(-15), prob(-14), ..., prob(0), prob(1), ..., prob(14)},  \n- The pre_xgb_prob and cnn_prob from the 20 neighboring steps.\nThis postprocessing method improved my PG CV score by approximately 0.04.\n\nP/S. Thanks chatGPT for making my explanation better!!\n",
    "2168471": "Congratulations on a strong finish and solo winning this hard competition! Different interval frame sampling and concatenating rgb image and tracking image are beyond my imagination, but seems surprisingly works well. Awesome!!\n",
    "2187343": "Congratulations.\n\nVery interesting way of solving the tournament, congratulations. I have a question about how to train the net.\n\n  · *Have you used a custom loss function to train the resnet?*\n\nThank you very much",
    "2175613": "Congratulations on your achievement on Kaggle! I'm really impressed with your work and wanted to let you know. By the way, if you have a moment, I would really appreciate it if you could take a look at my profile and give it an upvote if you find my work interesting as well.",
    "2173673": "Congrats on winning  @nvnnghia ! And thanks for sharing your method wouldn't have though of it...",
    "2170097": "Congratulations on winning and also thanks for sharing the approach",
    "2169076": "Congrats on winning @nvnnghia! Thanks for sharing this write up!",
    "2169068": "Awesome work Nvnn. Congratulations on first place solo cash gold finish!",
    "2167532": "@nvnnghia \nCongratulation.\n\nAbout 1st stage, what is the performance of negative sampling?\nCan I ask the recall and sample reduction ratio?\n\ne.g) For my case, \n\n- player-player contact: keeping recall 0.992, reduced ~50% of samples\n- player-ground contact: keeping recall 0.992, reduced ~75% of samples",
    "2167039": "Congratulation! ",
    "2165806": "Really brilliant! Congrats on getting the 1st position 🙌",
    "2165479": "Congrats and thanks for sharing your greate solution! How much does post-processing improve your cv score?",
    "2165474": "congratulations!, you idea is amazing. may i know which algorithm did you used to find the bbox to crop the area. are you used YOLO or something else?",
    "2165446": "Congrats! Could you please tell us your Hardware device for training? and how much GPU RAM size for your model?",
    "2165441": "wow congrats ",
    "2165316": "Congrats bro !!! Waiting for more detail from your solution.",
    "2165302": "Awesome pipeline, thanks for sharing!\nDo you have any takes on the shake up? I think you were the only gold medal player who got PB>LB",
    "2165273": "Congratulation! waiting for more sharing",
    "2168352": "Congrats on winning the competition!",
    "2167871": "Congrats @nvnnghia on your winning solution! I look forward to learning more about it. The idea of including the NGS data as part of the input image to your CNN is really clever.\n\nI have a few initial questions:\n- How did you determine the frames you used `{frame[-44], -37, -30, -24, -18, -13, -8, -4, -2, 0, 2, 4, 8, 13, 18, 24, 30, frame[37]}` - was this decided through experimentation or intution?\n- What made you select the `resnet50-irCSN` as your backbone? Did you have any succsess with other architectures?\n- How did you handle cases where helmet boxes are not be seen for both players in sideline/endzone views? Did you only predict if both players were seen in both views?\n- In your postprocessing step, you say you combined the 1st stage XGB and CNN outputs like this: `prob = 0.2pre_xgb_prob + 0.8cnn_prob`. Is there any reason you did not use `pre_xgb_prob` and `cnn_prob` directly as features to the postprocessing XGB model?\n\nThanks again for your solution write up!",
    "2167252": "Wow, Congrats on solo 1st place! It's a really cool, great job.",
    "2165286": "Congrats! Great idea to put tracking data into CNNs. How much will performance drop if you don't add it?",
    "2199615": "Bro CV hain't izy ...",
    "2179077": "Appreciate all the effort you took here! Thanks for sharing ",
    "2179053": "Congratulations on your 1st place solution in the NFL and Kaggle competition! Your approach is well-structured and appears to be very effective. Here are some potential improvements you could consider just for fun and experimentation:\n\n- Provide more detail on your xgb preprocessing method. While you mention that it was not as effective as the other teams' approaches, it could still be helpful to understand your thought process and what you tried.\n\n- Consider testing other CNN architectures to compare their performance against the resnet50-irCSN model you used. This could help to identify which models are more effective for this type of task.\n\n- Experiment with different augmentation techniques during training. Although you included several augmentations, there may be others that could further improve your model's performance.\n\n- Consider using an ensemble of models. Ensembling multiple models can help to reduce the risk of overfitting and improve the overall accuracy of the predictions.\n\nOverall, great job on your winning solution!🎉",
    "2174921": "Congratulations.\nDo you run inference for endzone and sideline respectively? If so ,how do you combine they.",
    "2174635": "Congratulations for the win.",
    "2171616": "@nvnnghia that's awesome solution, you're well done!",
    "2170815": "@nvnnghia , many many Congratulations on winning this competition. I am new to Kaggle and aspiring to become a ML engineer.  I am done almost 3 months of learning and practicing python and ML now. \n\nWould love to get some guidance if possible.",
    "2170704": "Great to see that how machine learning reshaping the world.",
    "2170356": "Thanks for sharing and congratulations on winning. ",
    "2195535": "",
    "2291975": "Thanks for sharing the approach.",
    "2179127": "Thank you so much and Congratulations!! ",
    "2174899": "Thank you for sharing!",
    "2173147": "really good...thank you for sharing.."
  }
}