{
  "id": 359932,
  "title": "Team Hydrogen: 1st place solution",
  "content": "<p>Thanks a lot to Kaggle and the hosts for this very, very interesting competition. A 2-stage competition is always a thrilling experience, but then seeing your models generalizing so well to completely unseen data is really exciting.</p>\n<p>Our solution is based on a single-stage model combining 2.5D and 3D data to properly extract temporal information from the video data. This solution ranks first in both public and private leaderboards. Next, we want to give a high-level overview of this solution.</p>\n<h3>Validation setup</h3>\n<p>In this competition, we used a fixed train/validation split to tune our models: the validation videos used for this included 4ffd5986_0, 407c5a9e_1, 9a97dae4_1, and ecf251d4_0. Our best local score was 0.857, and we observed strong correlation between local validation and public leaderboard (LB). For our final submission, we retrained our best models on the full data that was available to us, this is a general procedure we always try to take in the end.</p>\n<h3>Model setup</h3>\n<p>As mentioned, we solely rely on a single-stage model architecture. The input for our models was a 1024x1024 grayscale image, with the channels stacked in the time dimension over three neighboring frames. We chose to use grayscale images rather than full color due to the improved generalization and runtime capabilities it offered - and it also seems to generalize extremely well to the unseen private data.</p>\n<p>The single-stage architecture combined 2.5D and 3D techniques. The backbone of the model was either efficientnetv2_b0 or efficientnetv2_b1, as we found that larger backbones tended to overfit quickly on the small dataset. 3D convolution layers were only used in the last block and final convolution before pooling, which allowed us to stay in 2.5D for most of the backbone and achieve fast inference times with caching.</p>\n<p>In a bit more detail, if our current frame is <code>t=15</code>, we first stack three neighboring frames <code>{14,15,16}</code> as the channels of the input, and separately pass five different time steps (2 in each direction), each again stacked with three channels. If our time step would be 3, this would mean we pass <code>{8,9,10},{11,12,13},{14,15,16},{17,18,19},{20,21,22}</code> through the backbone, and the final 3D layer aggregates these 5 individual time steps with additional pooling.</p>\n<p>We also experimented with different stacks over the time domain and found that 15 frames (combined over 2.5D and 3D) worked best for our final submission.</p>\n<p>We applied the usual set of augmentations and used Mixup as well. The loss function was binary cross-entropy with three target columns. One area where we had room for experimentation and improvement was in how to set the hard or soft labels for training. In the end, our best solution used hard labels in a small window around the actual event.</p>\n<p>Most of our time during this competition was spent training on only the labeled regions of the competition data. Pre-training on some Soccernet labels improved the score by around 0.02, but we had no success with pseudo label pre-training on unlabeled regions and clips.</p>\n<h3>Inference</h3>\n<p>Increasing the inference resolution by 128 also slightly improved our cross-validation (CV) and LB scores. We spent a significant amount of time optimizing the inference kernel to run as efficiently as possible, utilizing both CPU cores with threading. We predicted only every second frame for a single model, and our final solution blended the results of two models, alternating between them frame by frame. We then applied post-processing to reduce the number of false positives.</p>\n<p>A single model had a runtime of 2.5 hours in the kernel, and processing a single video took 25 minutes. Our final solution with two models had a runtime of around 5 hours. There was potential for using even more models, but we opted to keep things as simple as possible.</p>\n<p>Big shoutout to my teammates <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> and <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a>!</p>",
  "comments": [
    {
      "id": 1986851,
      "author_name": "Camaro",
      "author_url": "",
      "post_date": "2022-10-14T10:47:01.557000",
      "content": "<p>Big congrats <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a>, <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> and <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a>!</p>\n<p>I couldn’t imagine +0.80 can be achieved by such a simple pipeline.<br>\nActually my solution is also single stage one and has many common parts with yours, but when I see you break 0.85, I thought it would be a more complicated pipeline.<br>\nOf course there would be many tricks to reach the score, really looking for the detailed writeup!</p>\n<p>Thanks for sharing!</p>",
      "votes": 11,
      "replies": [
        {
          "id": 1986858,
          "author_name": "Psi",
          "author_url": "",
          "post_date": "2022-10-14T10:53:35.970000",
          "content": "<p>We also experimented quite a bit with TSM/GSM &amp; GRU etc., but in the end a more simple setup was more effective. The main benefit was that training time was much faster, so we could experiment more, specifically given that we started quite late into this competition and had to play catchup. I think there is a lot of overfit potential in this competition - insample scores of 0.99 are very quick to reach, and some easy gains can be made by playing with label and regularization setups, regardless of your whole architecture and approach.</p>",
          "votes": 6,
          "replies": []
        },
        {
          "id": 2984031,
          "author_name": "AngadY",
          "author_url": "",
          "post_date": "2024-09-09T10:11:02.530000",
          "content": "<p>can you share notebook to test?</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1986804,
      "author_name": "Pascal Pfeiffer",
      "author_url": "",
      "post_date": "2022-10-14T09:41:09.787000",
      "content": "<p>Thanks a lot <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> for the great team-up!</p>\n<p>Thanks to the hosts for this very interesting and intense competition with many approaches to try. I can imagine a broad range of diverse solutions in the gold zone. Looking forward to other write-ups and to the final rescoring.</p>",
      "votes": 8,
      "replies": []
    },
    {
      "id": 1993424,
      "author_name": "Guillermo García Cobo",
      "author_url": "",
      "post_date": "2022-10-18T11:21:04.823000",
      "content": "<p>First of all, congrats on the great and \"simple\" solution <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a>! Although you plan to share more details of your solution in December, I couldn't wait to ask you a few questions about your approach. Feel free to answer any of the questions or refer me to the December's write-up for some of them.</p>\n<p>I am still trying to understand why our multiple approaches (preprocessing aside) did not work. A few questions related to this:</p>\n<ul>\n<li>You mention that you experimented with different stacks over time. Your final size is t=5, which is relatively small. Did larger stack sizes perform considerably worse? We thought that more context was needed, so the smallest size that we tested was t=20 frames (12.5 FPS).</li>\n<li>You used BCE with 3 target columns. Did you do anything to account for class imbalance, such as weighted loss? Most of our models tended to converge to constantly predicting plays (or background), even with the weighted loss.</li>\n<li>You say: \"we predict only each second frame for a single model\". Did you train the model with 12.5 FPS or just output predictions for every 2 frames of the input window? From the beginning, we processed videos at 12.5 FPS, considering that it was enough both for the model and for the final score (the metric allows for 4 frames of margin for each tolerance). Nonetheless, two days before the competition ended, we checked that performance of the best public model was degraded more than expected (-0.03) when reducing the inference FPS to 12.5.</li>\n</ul>\n<p>In terms of the inference, I am very curious about:</p>\n<ul>\n<li>Did you try any sliding window approach? Since you are providing temporal context, frames on the edges do not receive equal context. If everything should have gone as it should for us, we had our code ready for this and expected a nice boost.</li>\n<li>You mention that you managed to speed up the data loading for inference. Did you manage to efficiently load the frames directly from the videos? If so, how? For us, this was equal to storing them in disk and loading the frames with torch Dataloader. We did manage to optimize the storage in disk.</li>\n<li>I am curious about how to do the blending of both models, but I guess this would be included in December's write-up.</li>\n</ul>\n<p>Thanks a lot for your time in advance!</p>\n<p>PS: looking forward to meeting you in Barcelona for the Kaggle Days' final in a few weeks! You have been a great source of inspiration since I started my Kaggle and AI journey.</p>",
      "votes": 3,
      "replies": [
        {
          "id": 2005805,
          "author_name": "Leo Black",
          "author_url": "",
          "post_date": "2022-10-27T08:51:04.370000",
          "content": "<p>Why do you say  \"Your final size is t=5, which is relatively small. Did larger stack sizes perform considerably worse? We thought that more context was needed, so the smaller size that we tested was t=20 frames (12.5 FPS).\"  ?</p>\n<p>The author:<br>\n\"We also experimented with different stacks over the time domain  <br>\n and ended up with 15 frames (combined over 2.5 &amp; 3D) for our final submissions\"</p>\n<p>So, t = 15 frames ? ( One input for the network is an \"image\" with 15 channels, and each channel is a grayscale image got by cv2.BGR2GRAYSCALE ?) </p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 2011654,
          "author_name": "Guillermo García Cobo",
          "author_url": "",
          "post_date": "2022-10-31T17:34:27.160000",
          "content": "<p>Thank you for your question <a href=\"https://www.kaggle.com/deepervision\" target=\"_blank\">@deepervision</a>, the author said in another comment:</p>\n<blockquote>\n  <p>So actually it is t=5 (3d) and c=3 (2.5d) making it overall 15.</p>\n</blockquote>",
          "votes": 2,
          "replies": []
        }
      ]
    },
    {
      "id": 2087148,
      "author_name": "Psi",
      "author_url": "",
      "post_date": "2023-01-05T11:13:13.480000",
      "content": "<p>Added a few more details to the solution! If there are any more questions, please shoot (but don't score!).</p>\n<p>We are obviously very happy with our result and really impressed by the great generalization capabilities of our solution and the gap on the leaderboard.</p>",
      "votes": 2,
      "replies": [
        {
          "id": 2087159,
          "author_name": "Camaro",
          "author_url": "",
          "post_date": "2023-01-05T11:25:21.283000",
          "content": "<p>Thanks for the update! I was really about to ask a question about how you feed sequence of images both for channel dim and temporal dim, but now I'm satisfied🤗<br>\nDon't ask why I'm still caring about 3d cnn modeling…</p>",
          "votes": 1,
          "replies": [
            {
              "id": 2087463,
              "author_name": "Psi",
              "author_url": "",
              "post_date": "2023-01-05T15:59:05.667000",
              "content": "<p>I wonder why :)</p>",
              "votes": 1,
              "replies": []
            }
          ]
        },
        {
          "id": 2104134,
          "author_name": "",
          "author_url": "",
          "post_date": "2023-01-17T16:26:02.383000",
          "content": "",
          "votes": 0,
          "replies": []
        },
        {
          "id": 2107132,
          "author_name": "Joga",
          "author_url": "",
          "post_date": "2023-01-19T15:33:00.290000",
          "content": "<p>Thanks so much for sharing and congratulations to the 1st place! I am rather new to DL and computer vision and have some basic questions:</p>\n<ul>\n<li>Did you use the pre-trained weights for ImageNet for the efficientnetv2 architecture? Which layers did you freeze in, which did you leave open?</li>\n<li>Did you pass the 5 different time steps (each 3 grayscale images) through the same efficientnetv2-block, i.e. same weights? I am also wondering whether you used PyTorch or if this can be set up with TF/Keras as well. :) </li>\n<li>What usual augmentations did you apply to the input?</li>\n</ul>\n<p>Any short answer is greatly appreciated. Thank you! :)</p>",
          "votes": 0,
          "replies": [
            {
              "id": 2136517,
              "author_name": "Psi",
              "author_url": "",
              "post_date": "2023-02-09T11:33:31.447000",
              "content": "<ul>\n<li>Yes ImageNet pretrained, and no freezing.</li>\n<li>All through the same backbone</li>\n<li>Pytorch all the time</li>\n<li>Mixup, apart from that nothing specific, random flip, bit of resizing</li>\n</ul>",
              "votes": 2,
              "replies": []
            },
            {
              "id": 2149059,
              "author_name": "happymentee",
              "author_url": "",
              "post_date": "2023-02-17T22:30:19.740000",
              "content": "<p>Do you use any Trainer built on pytorch, such as pytorch lightning? </p>",
              "votes": 0,
              "replies": []
            },
            {
              "id": 2150627,
              "author_name": "Joga",
              "author_url": "",
              "post_date": "2023-02-19T13:02:46.967000",
              "content": "<p>Awesome -- thanks so much! :) </p>",
              "votes": 0,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 1987155,
      "author_name": "Vladislav Ostankovich",
      "author_url": "",
      "post_date": "2022-10-14T14:36:46.803000",
      "content": "<p>Can't believe this solution worked so good) Impressive! Will be waiting for the complete solution.</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 1987019,
      "author_name": "Darragh",
      "author_url": "",
      "post_date": "2022-10-14T12:52:58.257000",
      "content": "<p>Impressive, great work Team Hydrogen 🚀🚀 </p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 1991397,
      "author_name": "Leon",
      "author_url": "",
      "post_date": "2022-10-17T06:10:41.863000",
      "content": "<p>Congratulations on your 1st place! <br>\nI am confused by the channel and time domain you described. Does it mean <code>(batch,t=15,c=3,h,w) -&gt; (batch*t,c,h,w) -&gt; 2.5d+3d -&gt; (batch,t,classes=3)</code>?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1991843,
          "author_name": "Psi",
          "author_url": "",
          "post_date": "2022-10-17T12:17:26.083000",
          "content": "<p>So actually it is <code>t=5</code> (3d) and <code>c=3</code> (2.5d) making it overall <code>15</code>.</p>",
          "votes": 3,
          "replies": []
        },
        {
          "id": 1991904,
          "author_name": "Leon",
          "author_url": "",
          "post_date": "2022-10-17T12:46:06.503000",
          "content": "<p>I see, thank you.</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1992893,
          "author_name": "notinvitedloki",
          "author_url": "",
          "post_date": "2022-10-18T02:19:39.710000",
          "content": "<p>thanks a lot!</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 2005814,
          "author_name": "Leo Black",
          "author_url": "",
          "post_date": "2022-10-27T09:00:11.697000",
          "content": "<p>is it <code>(batch,t=5,c=3,h,w) -&gt; (batch*t,c=3,h,w) -&gt; 2.5d+3d -&gt; (batch,t,classes=3)</code>  ?</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1990911,
      "author_name": "ledifof",
      "author_url": "",
      "post_date": "2022-10-16T20:15:19.457000",
      "content": "<p>This tutorial was really useful and beneficial for beginners. I will like to learn more on machine learning, and I am very excited about it.</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1987436,
      "author_name": "Fnoa",
      "author_url": "",
      "post_date": "2022-10-14T17:38:31.977000",
      "content": "<p>Congratulations! Always a pleasure to read your solutions</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1987127,
      "author_name": "VIGNESHWAR REDDY M",
      "author_url": "",
      "post_date": "2022-10-14T14:18:36.787000",
      "content": "<p>Impressive, great work Team Hydrogen 🚀🚀</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 2442073,
      "author_name": "Shravan Jindal",
      "author_url": "",
      "post_date": "2023-09-16T17:22:20.640000",
      "content": "<p>Real nice way, simple and effective. Congratulations :)</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2366533,
      "author_name": "sabarita venkat",
      "author_url": "",
      "post_date": "2023-07-31T04:18:16.217000",
      "content": "<p>Hi can you please tell about what is the post processing that is used to reduce the false positives.<br>\nAlso, I would like know about the class wise precision or accuracy on the public leader board test data </p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2163406,
      "author_name": "Sain",
      "author_url": "",
      "post_date": "2023-02-28T19:30:42.187000",
      "content": "<p>I am new to this type of problems, thanks for sharing this will help a lot! And also Congrats for securing 1st place!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2113877,
      "author_name": "ivanovas",
      "author_url": "",
      "post_date": "2023-01-24T15:01:18.047000",
      "content": "<p>Congratulations on your 1st place solution!</p>\n<p>I was reading through the solution and I was thinking about how I would tackle this problem the first thing that popped into my mind is to use a proposal model (eg. BMN) and then a recognizer. Did you try something similar? Do you think it can work better but take more time for inference? I am not very experienced in working with videos, but this seems logical to me.</p>\n<p>Thank you in advance.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1998646,
      "author_name": "ZEROUAL  SLIMANE",
      "author_url": "",
      "post_date": "2022-10-21T18:34:05.310000",
      "content": "<p>Congratulations! and thank you for sharing.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1993473,
      "author_name": "Sinu Sheoran",
      "author_url": "",
      "post_date": "2022-10-18T12:09:57.940000",
      "content": "<p>This tutorial was really useful and beneficial for beginners.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1993456,
      "author_name": "Pranay Joshi",
      "author_url": "",
      "post_date": "2022-10-18T11:53:28.307000",
      "content": "<p>congratulations team Hydrogen</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1993371,
      "author_name": "Mushtaq Ahmad",
      "author_url": "",
      "post_date": "2022-10-18T10:17:34.083000",
      "content": "<p>it was really helpful.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1993248,
      "author_name": "Max Wei",
      "author_url": "",
      "post_date": "2022-10-18T08:10:27.440000",
      "content": "<p>Great work!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1993187,
      "author_name": "Rahul Pandey",
      "author_url": "",
      "post_date": "2022-10-18T07:06:40.663000",
      "content": "<p>That really amazing to see your work <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> and <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a>!. I like to try it with some other real video classification. If possible, can your notebook as per your agreement.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1993039,
      "author_name": "Y-Haneji",
      "author_url": "",
      "post_date": "2022-10-18T04:55:25.093000",
      "content": "<p><a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> <br>\nCcngratulations!<br>\nHow did you convert RGB pretrained weight to grayscale one? You used 3channels input but it was 3 stacked grayscale images not RGB channels.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1991812,
      "author_name": "AndrewTao",
      "author_url": "",
      "post_date": "2022-10-17T11:58:22.933000",
      "content": "<p>Can you say a bit about how much you gain from going 3 to 15 frames? Did you pose this as 3 image channels + 5 time dimension so that you could use imagenet pretrained models? I mean as opposed to using 15 image channels as input. </p>",
      "votes": 0,
      "replies": [
        {
          "id": 2005807,
          "author_name": "Leo Black",
          "author_url": "",
          "post_date": "2022-10-27T08:53:54.143000",
          "content": "<p>Do you mean that <br>\none input with 15 channels <br>\nis got by 5  images  (with BGR 3 channels) ?</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1991682,
      "author_name": "Theo Viel",
      "author_url": "",
      "post_date": "2022-10-17T10:47:24.523000",
      "content": "<p>Congratz on the great performance <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a> !</p>\n<p>How do you handle the 2D -&gt; 3D transition ?</p>\n<p>This is how I am considering doing it :</p>\n<ul>\n<li>Replace the Conv2Ds to Conv3Ds (and BNs in a similar fashion) using the same in_channels, out_channels, k (, …)</li>\n<li>Reshape <code>nb_ft x C x H x W</code> to <code>nb_ft x 1 x C x H x W</code> before entering the first 3D conv</li>\n<li>First 3d conv therefore has 1 channel.</li>\n</ul>\n<p>However this results in a quite big model, do you reduce the number of channels somewhere or are you doing it a different way ?<br>\nThanks !</p>",
      "votes": 0,
      "replies": [
        {
          "id": 1991700,
          "author_name": "Psi",
          "author_url": "",
          "post_date": "2022-10-17T11:00:14.950000",
          "content": "<p>There are quite a few different ways of doing it and what works for a specific problem is experimental. In general you can reshape from 2D to 3D and back quite easily, so if you start with <code>bs x frames x channels x H x W</code> you can reshape to <code>bs*frames x channels x H x W</code> for the 2D part and then reshape back to 5 dimensions for the 3D part.</p>",
          "votes": 2,
          "replies": []
        },
        {
          "id": 1991750,
          "author_name": "Theo Viel",
          "author_url": "",
          "post_date": "2022-10-17T11:31:44.483000",
          "content": "<p>I see, that makes more sense, thanks !</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1997834,
          "author_name": "Fnoa",
          "author_url": "",
          "post_date": "2022-10-21T07:32:10.880000",
          "content": "<p>I guess this way you can use pre-trained 2D encoders right?<br>\nDo you know of any useful documentation for this?</p>\n<p>Thanks in advance!</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1991009,
      "author_name": "Shanni786",
      "author_url": "",
      "post_date": "2022-10-16T22:08:49.447000",
      "content": "<p>Big congrats <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a>, <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> and <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a>!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1990577,
      "author_name": "Felix nediv",
      "author_url": "",
      "post_date": "2022-10-16T16:36:38.450000",
      "content": "<p>Impressive, great work Team Hydrogen 🚀🚀</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1988653,
      "author_name": "Zutarich",
      "author_url": "",
      "post_date": "2022-10-15T13:07:05.970000",
      "content": "<p>I tried to understand the article, but couldn't get many of its technical aspects it's my first day on Kaggle hope to learn and come back some day and understand it thoroughly! Any piece of advice is welcomed .</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1988011,
      "author_name": "datadote",
      "author_url": "",
      "post_date": "2022-10-15T02:14:20.123000",
      "content": "<p>Nice work! Are you able to describe how the training dataset was made? For example, what distribution of labels, types of image saved, any compression/interpolation, skipping frames? Thank you</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1987914,
      "author_name": "Rafi Hai",
      "author_url": "",
      "post_date": "2022-10-14T22:29:47.157000",
      "content": "<p>Impressive work with one stage-model. team Hydrogen - you really scored here! ⚽<br>\nI cannot wait extra two months for detailed write-up, so hope you can answer below :) </p>\n<blockquote>\n  <p>Input is 1024x1024 grayscale image, channels is stacked time dimension over three neighboring frames</p>\n</blockquote>\n<p>Can you elaborate on this? What is meant by three neighboring frames, as you mentioned that 15 frames are used in sequence?</p>\n<blockquote>\n  <p>Loss is BCE with 3 target columns</p>\n</blockquote>\n<p>No training on background images at all?</p>\n<p>Thanks for sharing!</p>",
      "votes": 0,
      "replies": [
        {
          "id": 1988406,
          "author_name": "Psi",
          "author_url": "",
          "post_date": "2022-10-15T09:55:16.187000",
          "content": "<p>The stacking means that you concat e.g. frame 14,15,16 to 3 channels when looking at frame 15.</p>\n<p>We add lots of BG images, but dont add a separate 4th class, with BCE you can have all label columns zero to indicate BG.</p>",
          "votes": 2,
          "replies": []
        },
        {
          "id": 2005831,
          "author_name": "Leo Black",
          "author_url": "",
          "post_date": "2022-10-27T09:10:12.810000",
          "content": "<p>Hi, I think it may be more clear to modify the example here to   <code>concat frame 18,19,20 to 3 channels when looking at frame 19</code>, because people like me are already confused with the meaning of \"15 frames\" in this discussion. (Try pressing \"ctrl f\" and typing in \"15\" )</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1987404,
      "author_name": "Mohammad Ateeq",
      "author_url": "",
      "post_date": "2022-10-14T17:24:33.007000",
      "content": "<p>If you used 3 target classes, how did you recognize background frames</p>",
      "votes": 0,
      "replies": [
        {
          "id": 1987527,
          "author_name": "Psi",
          "author_url": "",
          "post_date": "2022-10-14T18:16:47.603000",
          "content": "<p>I don't need to recognize them specifically, you only really need another BG class if you use softmax.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1987308,
      "author_name": "",
      "author_url": "",
      "post_date": "2022-10-14T16:24:39.860000",
      "content": "",
      "votes": 0,
      "replies": [
        {
          "id": 1987525,
          "author_name": "",
          "author_url": "",
          "post_date": "2022-10-14T18:16:08.533000",
          "content": "",
          "votes": 1,
          "replies": []
        },
        {
          "id": 1987585,
          "author_name": "",
          "author_url": "",
          "post_date": "2022-10-14T18:47:12.330000",
          "content": "",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1987631,
          "author_name": "",
          "author_url": "",
          "post_date": "2022-10-14T19:10:42.083000",
          "content": "",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1987061,
      "author_name": "",
      "author_url": "",
      "post_date": "2022-10-14T13:29:35.903000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1986934,
      "author_name": "",
      "author_url": "",
      "post_date": "2022-10-14T12:03:23.937000",
      "content": "",
      "votes": 0,
      "replies": [
        {
          "id": 1987062,
          "author_name": "",
          "author_url": "",
          "post_date": "2022-10-14T13:29:39.940000",
          "content": "",
          "votes": 2,
          "replies": []
        },
        {
          "id": 1993330,
          "author_name": "",
          "author_url": "",
          "post_date": "2022-10-18T09:37:33.973000",
          "content": "",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1993041,
      "author_name": "",
      "author_url": "",
      "post_date": "2022-10-18T04:57:08.980000",
      "content": "",
      "votes": 2,
      "replies": []
    },
    {
      "id": 1992546,
      "author_name": "",
      "author_url": "",
      "post_date": "2022-10-17T18:22:02.100000",
      "content": "",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1993717,
      "author_name": "",
      "author_url": "",
      "post_date": "2022-10-18T15:12:56.693000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1991841,
      "author_name": "",
      "author_url": "",
      "post_date": "2022-10-17T12:15:51.720000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1987152,
      "author_name": "",
      "author_url": "",
      "post_date": "2022-10-14T14:33:14.403000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1986982,
      "author_name": "",
      "author_url": "",
      "post_date": "2022-10-14T12:29:49.060000",
      "content": "",
      "votes": 0,
      "replies": []
    }
  ],
  "comment_count": 65,
  "messages": [
    {
      "id": 1986800,
      "postDate": "2022-10-14T09:38:42.117Z",
      "content": "<p>Thanks a lot to Kaggle and the hosts for this very, very interesting competition. A 2-stage competition is always a thrilling experience, but then seeing your models generalizing so well to completely unseen data is really exciting.</p>\n<p>Our solution is based on a single-stage model combining 2.5D and 3D data to properly extract temporal information from the video data. This solution ranks first in both public and private leaderboards. Next, we want to give a high-level overview of this solution.</p>\n<h3>Validation setup</h3>\n<p>In this competition, we used a fixed train/validation split to tune our models: the validation videos used for this included 4ffd5986_0, 407c5a9e_1, 9a97dae4_1, and ecf251d4_0. Our best local score was 0.857, and we observed strong correlation between local validation and public leaderboard (LB). For our final submission, we retrained our best models on the full data that was available to us, this is a general procedure we always try to take in the end.</p>\n<h3>Model setup</h3>\n<p>As mentioned, we solely rely on a single-stage model architecture. The input for our models was a 1024x1024 grayscale image, with the channels stacked in the time dimension over three neighboring frames. We chose to use grayscale images rather than full color due to the improved generalization and runtime capabilities it offered - and it also seems to generalize extremely well to the unseen private data.</p>\n<p>The single-stage architecture combined 2.5D and 3D techniques. The backbone of the model was either efficientnetv2_b0 or efficientnetv2_b1, as we found that larger backbones tended to overfit quickly on the small dataset. 3D convolution layers were only used in the last block and final convolution before pooling, which allowed us to stay in 2.5D for most of the backbone and achieve fast inference times with caching.</p>\n<p>In a bit more detail, if our current frame is <code>t=15</code>, we first stack three neighboring frames <code>{14,15,16}</code> as the channels of the input, and separately pass five different time steps (2 in each direction), each again stacked with three channels. If our time step would be 3, this would mean we pass <code>{8,9,10},{11,12,13},{14,15,16},{17,18,19},{20,21,22}</code> through the backbone, and the final 3D layer aggregates these 5 individual time steps with additional pooling.</p>\n<p>We also experimented with different stacks over the time domain and found that 15 frames (combined over 2.5D and 3D) worked best for our final submission.</p>\n<p>We applied the usual set of augmentations and used Mixup as well. The loss function was binary cross-entropy with three target columns. One area where we had room for experimentation and improvement was in how to set the hard or soft labels for training. In the end, our best solution used hard labels in a small window around the actual event.</p>\n<p>Most of our time during this competition was spent training on only the labeled regions of the competition data. Pre-training on some Soccernet labels improved the score by around 0.02, but we had no success with pseudo label pre-training on unlabeled regions and clips.</p>\n<h3>Inference</h3>\n<p>Increasing the inference resolution by 128 also slightly improved our cross-validation (CV) and LB scores. We spent a significant amount of time optimizing the inference kernel to run as efficiently as possible, utilizing both CPU cores with threading. We predicted only every second frame for a single model, and our final solution blended the results of two models, alternating between them frame by frame. We then applied post-processing to reduce the number of false positives.</p>\n<p>A single model had a runtime of 2.5 hours in the kernel, and processing a single video took 25 minutes. Our final solution with two models had a runtime of around 5 hours. There was potential for using even more models, but we opted to keep things as simple as possible.</p>\n<p>Big shoutout to my teammates <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> and <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a>!</p>",
      "rawMarkdown": "Thanks a lot to Kaggle and the hosts for this very, very interesting competition. A 2-stage competition is always a thrilling experience, but then seeing your models generalizing so well to completely unseen data is really exciting.\n\nOur solution is based on a single-stage model combining 2.5D and 3D data to properly extract temporal information from the video data. This solution ranks first in both public and private leaderboards. Next, we want to give a high-level overview of this solution.\n\n### Validation setup\n\nIn this competition, we used a fixed train/validation split to tune our models: the validation videos used for this included 4ffd5986_0, 407c5a9e_1, 9a97dae4_1, and ecf251d4_0. Our best local score was 0.857, and we observed strong correlation between local validation and public leaderboard (LB). For our final submission, we retrained our best models on the full data that was available to us, this is a general procedure we always try to take in the end.\n\n### Model setup\n\nAs mentioned, we solely rely on a single-stage model architecture. The input for our models was a 1024x1024 grayscale image, with the channels stacked in the time dimension over three neighboring frames. We chose to use grayscale images rather than full color due to the improved generalization and runtime capabilities it offered - and it also seems to generalize extremely well to the unseen private data.\n\nThe single-stage architecture combined 2.5D and 3D techniques. The backbone of the model was either efficientnetv2_b0 or efficientnetv2_b1, as we found that larger backbones tended to overfit quickly on the small dataset. 3D convolution layers were only used in the last block and final convolution before pooling, which allowed us to stay in 2.5D for most of the backbone and achieve fast inference times with caching.\n\nIn a bit more detail, if our current frame is `t=15`, we first stack three neighboring frames `{14,15,16}` as the channels of the input, and separately pass five different time steps (2 in each direction), each again stacked with three channels. If our time step would be 3, this would mean we pass `{8,9,10},{11,12,13},{14,15,16},{17,18,19},{20,21,22}` through the backbone, and the final 3D layer aggregates these 5 individual time steps with additional pooling.\n\nWe also experimented with different stacks over the time domain and found that 15 frames (combined over 2.5D and 3D) worked best for our final submission.\n\nWe applied the usual set of augmentations and used Mixup as well. The loss function was binary cross-entropy with three target columns. One area where we had room for experimentation and improvement was in how to set the hard or soft labels for training. In the end, our best solution used hard labels in a small window around the actual event.\n\nMost of our time during this competition was spent training on only the labeled regions of the competition data. Pre-training on some Soccernet labels improved the score by around 0.02, but we had no success with pseudo label pre-training on unlabeled regions and clips.\n\n### Inference\n\nIncreasing the inference resolution by 128 also slightly improved our cross-validation (CV) and LB scores. We spent a significant amount of time optimizing the inference kernel to run as efficiently as possible, utilizing both CPU cores with threading. We predicted only every second frame for a single model, and our final solution blended the results of two models, alternating between them frame by frame. We then applied post-processing to reduce the number of false positives.\n\nA single model had a runtime of 2.5 hours in the kernel, and processing a single video took 25 minutes. Our final solution with two models had a runtime of around 5 hours. There was potential for using even more models, but we opted to keep things as simple as possible.\n\nBig shoutout to my teammates @ybabakhin and @ilu000!",
      "votes": 139
    },
    {
      "id": 1986851,
      "postDate": "2022-10-14T10:47:01.557Z",
      "content": "<p>Big congrats <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a>, <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> and <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a>!</p>\n<p>I couldn’t imagine +0.80 can be achieved by such a simple pipeline.<br>\nActually my solution is also single stage one and has many common parts with yours, but when I see you break 0.85, I thought it would be a more complicated pipeline.<br>\nOf course there would be many tricks to reach the score, really looking for the detailed writeup!</p>\n<p>Thanks for sharing!</p>",
      "rawMarkdown": "Big congrats @philippsinger, @ybabakhin and @ilu000!\n\nI couldn’t imagine +0.80 can be achieved by such a simple pipeline.\nActually my solution is also single stage one and has many common parts with yours, but when I see you break 0.85, I thought it would be a more complicated pipeline.\nOf course there would be many tricks to reach the score, really looking for the detailed writeup!\n\nThanks for sharing!\n\n\n",
      "votes": 11,
      "replies": [
        {
          "id": 1986858,
          "postDate": "2022-10-14T10:53:35.970Z",
          "content": "<p>We also experimented quite a bit with TSM/GSM &amp; GRU etc., but in the end a more simple setup was more effective. The main benefit was that training time was much faster, so we could experiment more, specifically given that we started quite late into this competition and had to play catchup. I think there is a lot of overfit potential in this competition - insample scores of 0.99 are very quick to reach, and some easy gains can be made by playing with label and regularization setups, regardless of your whole architecture and approach.</p>",
          "rawMarkdown": "We also experimented quite a bit with TSM/GSM & GRU etc., but in the end a more simple setup was more effective. The main benefit was that training time was much faster, so we could experiment more, specifically given that we started quite late into this competition and had to play catchup. I think there is a lot of overfit potential in this competition - insample scores of 0.99 are very quick to reach, and some easy gains can be made by playing with label and regularization setups, regardless of your whole architecture and approach.",
          "votes": 6
        },
        {
          "id": 2984031,
          "postDate": "2024-09-09T10:11:02.530Z",
          "content": "<p>can you share notebook to test?</p>",
          "rawMarkdown": "can you share notebook to test?",
          "votes": 1
        }
      ]
    },
    {
      "id": 1986804,
      "postDate": "2022-10-14T09:41:09.787Z",
      "content": "<p>Thanks a lot <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> for the great team-up!</p>\n<p>Thanks to the hosts for this very interesting and intense competition with many approaches to try. I can imagine a broad range of diverse solutions in the gold zone. Looking forward to other write-ups and to the final rescoring.</p>",
      "rawMarkdown": "Thanks a lot @philippsinger @ybabakhin for the great team-up!\n\nThanks to the hosts for this very interesting and intense competition with many approaches to try. I can imagine a broad range of diverse solutions in the gold zone. Looking forward to other write-ups and to the final rescoring.",
      "votes": 8
    },
    {
      "id": 1993424,
      "postDate": "2022-10-18T11:21:04.823Z",
      "content": "<p>First of all, congrats on the great and \"simple\" solution <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a>! Although you plan to share more details of your solution in December, I couldn't wait to ask you a few questions about your approach. Feel free to answer any of the questions or refer me to the December's write-up for some of them.</p>\n<p>I am still trying to understand why our multiple approaches (preprocessing aside) did not work. A few questions related to this:</p>\n<ul>\n<li>You mention that you experimented with different stacks over time. Your final size is t=5, which is relatively small. Did larger stack sizes perform considerably worse? We thought that more context was needed, so the smallest size that we tested was t=20 frames (12.5 FPS).</li>\n<li>You used BCE with 3 target columns. Did you do anything to account for class imbalance, such as weighted loss? Most of our models tended to converge to constantly predicting plays (or background), even with the weighted loss.</li>\n<li>You say: \"we predict only each second frame for a single model\". Did you train the model with 12.5 FPS or just output predictions for every 2 frames of the input window? From the beginning, we processed videos at 12.5 FPS, considering that it was enough both for the model and for the final score (the metric allows for 4 frames of margin for each tolerance). Nonetheless, two days before the competition ended, we checked that performance of the best public model was degraded more than expected (-0.03) when reducing the inference FPS to 12.5.</li>\n</ul>\n<p>In terms of the inference, I am very curious about:</p>\n<ul>\n<li>Did you try any sliding window approach? Since you are providing temporal context, frames on the edges do not receive equal context. If everything should have gone as it should for us, we had our code ready for this and expected a nice boost.</li>\n<li>You mention that you managed to speed up the data loading for inference. Did you manage to efficiently load the frames directly from the videos? If so, how? For us, this was equal to storing them in disk and loading the frames with torch Dataloader. We did manage to optimize the storage in disk.</li>\n<li>I am curious about how to do the blending of both models, but I guess this would be included in December's write-up.</li>\n</ul>\n<p>Thanks a lot for your time in advance!</p>\n<p>PS: looking forward to meeting you in Barcelona for the Kaggle Days' final in a few weeks! You have been a great source of inspiration since I started my Kaggle and AI journey.</p>",
      "rawMarkdown": "First of all, congrats on the great and \"simple\" solution @philippsinger @ybabakhin @ilu000! Although you plan to share more details of your solution in December, I couldn't wait to ask you a few questions about your approach. Feel free to answer any of the questions or refer me to the December's write-up for some of them.\n\nI am still trying to understand why our multiple approaches (preprocessing aside) did not work. A few questions related to this:\n* You mention that you experimented with different stacks over time. Your final size is t=5, which is relatively small. Did larger stack sizes perform considerably worse? We thought that more context was needed, so the smallest size that we tested was t=20 frames (12.5 FPS).\n* You used BCE with 3 target columns. Did you do anything to account for class imbalance, such as weighted loss? Most of our models tended to converge to constantly predicting plays (or background), even with the weighted loss.\n* You say: \"we predict only each second frame for a single model\". Did you train the model with 12.5 FPS or just output predictions for every 2 frames of the input window? From the beginning, we processed videos at 12.5 FPS, considering that it was enough both for the model and for the final score (the metric allows for 4 frames of margin for each tolerance). Nonetheless, two days before the competition ended, we checked that performance of the best public model was degraded more than expected (-0.03) when reducing the inference FPS to 12.5.\n\nIn terms of the inference, I am very curious about:\n* Did you try any sliding window approach? Since you are providing temporal context, frames on the edges do not receive equal context. If everything should have gone as it should for us, we had our code ready for this and expected a nice boost.\n* You mention that you managed to speed up the data loading for inference. Did you manage to efficiently load the frames directly from the videos? If so, how? For us, this was equal to storing them in disk and loading the frames with torch Dataloader. We did manage to optimize the storage in disk.\n* I am curious about how to do the blending of both models, but I guess this would be included in December's write-up.\n\nThanks a lot for your time in advance!\n\nPS: looking forward to meeting you in Barcelona for the Kaggle Days' final in a few weeks! You have been a great source of inspiration since I started my Kaggle and AI journey.",
      "votes": 3,
      "replies": [
        {
          "id": 2005805,
          "postDate": "2022-10-27T08:51:04.370Z",
          "content": "<p>Why do you say  \"Your final size is t=5, which is relatively small. Did larger stack sizes perform considerably worse? We thought that more context was needed, so the smaller size that we tested was t=20 frames (12.5 FPS).\"  ?</p>\n<p>The author:<br>\n\"We also experimented with different stacks over the time domain  <br>\n and ended up with 15 frames (combined over 2.5 &amp; 3D) for our final submissions\"</p>\n<p>So, t = 15 frames ? ( One input for the network is an \"image\" with 15 channels, and each channel is a grayscale image got by cv2.BGR2GRAYSCALE ?) </p>",
          "rawMarkdown": "Why do you say  \"Your final size is t=5, which is relatively small. Did larger stack sizes perform considerably worse? We thought that more context was needed, so the smaller size that we tested was t=20 frames (12.5 FPS).\"  ?\n\nThe author:\n\"We also experimented with different stacks over the time domain  \n and ended up with 15 frames (combined over 2.5 & 3D) for our final submissions\"\n\nSo, t = 15 frames ? ( One input for the network is an \"image\" with 15 channels, and each channel is a grayscale image got by cv2.BGR2GRAYSCALE ?) \n"
        },
        {
          "id": 2011654,
          "postDate": "2022-10-31T17:34:27.160Z",
          "content": "<p>Thank you for your question <a href=\"https://www.kaggle.com/deepervision\" target=\"_blank\">@deepervision</a>, the author said in another comment:</p>\n<blockquote>\n  <p>So actually it is t=5 (3d) and c=3 (2.5d) making it overall 15.</p>\n</blockquote>",
          "rawMarkdown": "Thank you for your question @deepervision, the author said in another comment:\n\n> So actually it is t=5 (3d) and c=3 (2.5d) making it overall 15.",
          "votes": 2
        }
      ]
    },
    {
      "id": 2087148,
      "postDate": "2023-01-05T11:13:13.480Z",
      "content": "<p>Added a few more details to the solution! If there are any more questions, please shoot (but don't score!).</p>\n<p>We are obviously very happy with our result and really impressed by the great generalization capabilities of our solution and the gap on the leaderboard.</p>",
      "rawMarkdown": "Added a few more details to the solution! If there are any more questions, please shoot (but don't score!).\n\nWe are obviously very happy with our result and really impressed by the great generalization capabilities of our solution and the gap on the leaderboard.",
      "votes": 2,
      "replies": [
        {
          "id": 2087159,
          "postDate": "2023-01-05T11:25:21.283Z",
          "content": "<p>Thanks for the update! I was really about to ask a question about how you feed sequence of images both for channel dim and temporal dim, but now I'm satisfied🤗<br>\nDon't ask why I'm still caring about 3d cnn modeling…</p>",
          "rawMarkdown": "Thanks for the update! I was really about to ask a question about how you feed sequence of images both for channel dim and temporal dim, but now I'm satisfied🤗\nDon't ask why I'm still caring about 3d cnn modeling...",
          "votes": 1,
          "replies": [
            {
              "id": 2087463,
              "postDate": "2023-01-05T15:59:05.667Z",
              "content": "<p>I wonder why :)</p>",
              "rawMarkdown": "I wonder why :)",
              "votes": 1
            }
          ]
        },
        {
          "id": 2104134,
          "postDate": "2023-01-17T16:26:02.383Z",
          "rawMarkdown": "",
          "isDeleted": true
        },
        {
          "id": 2107132,
          "postDate": "2023-01-19T15:33:00.290Z",
          "content": "<p>Thanks so much for sharing and congratulations to the 1st place! I am rather new to DL and computer vision and have some basic questions:</p>\n<ul>\n<li>Did you use the pre-trained weights for ImageNet for the efficientnetv2 architecture? Which layers did you freeze in, which did you leave open?</li>\n<li>Did you pass the 5 different time steps (each 3 grayscale images) through the same efficientnetv2-block, i.e. same weights? I am also wondering whether you used PyTorch or if this can be set up with TF/Keras as well. :) </li>\n<li>What usual augmentations did you apply to the input?</li>\n</ul>\n<p>Any short answer is greatly appreciated. Thank you! :)</p>",
          "rawMarkdown": "Thanks so much for sharing and congratulations to the 1st place! I am rather new to DL and computer vision and have some basic questions:\n\n- Did you use the pre-trained weights for ImageNet for the efficientnetv2 architecture? Which layers did you freeze in, which did you leave open?\n- Did you pass the 5 different time steps (each 3 grayscale images) through the same efficientnetv2-block, i.e. same weights? I am also wondering whether you used PyTorch or if this can be set up with TF/Keras as well. :) \n- What usual augmentations did you apply to the input?\n\nAny short answer is greatly appreciated. Thank you! :)",
          "replies": [
            {
              "id": 2136517,
              "postDate": "2023-02-09T11:33:31.447Z",
              "content": "<ul>\n<li>Yes ImageNet pretrained, and no freezing.</li>\n<li>All through the same backbone</li>\n<li>Pytorch all the time</li>\n<li>Mixup, apart from that nothing specific, random flip, bit of resizing</li>\n</ul>",
              "rawMarkdown": "- Yes ImageNet pretrained, and no freezing.\n- All through the same backbone\n- Pytorch all the time\n- Mixup, apart from that nothing specific, random flip, bit of resizing",
              "votes": 2
            },
            {
              "id": 2149059,
              "postDate": "2023-02-17T22:30:19.740Z",
              "content": "<p>Do you use any Trainer built on pytorch, such as pytorch lightning? </p>",
              "rawMarkdown": "Do you use any Trainer built on pytorch, such as pytorch lightning? "
            },
            {
              "id": 2150627,
              "postDate": "2023-02-19T13:02:46.967Z",
              "content": "<p>Awesome -- thanks so much! :) </p>",
              "rawMarkdown": "Awesome -- thanks so much! :) "
            }
          ]
        }
      ]
    },
    {
      "id": 1987155,
      "postDate": "2022-10-14T14:36:46.803Z",
      "content": "<p>Can't believe this solution worked so good) Impressive! Will be waiting for the complete solution.</p>",
      "rawMarkdown": "Can't believe this solution worked so good) Impressive! Will be waiting for the complete solution.",
      "votes": 2
    },
    {
      "id": 1987019,
      "postDate": "2022-10-14T12:52:58.257Z",
      "content": "<p>Impressive, great work Team Hydrogen 🚀🚀 </p>",
      "rawMarkdown": "Impressive, great work Team Hydrogen 🚀🚀 ",
      "votes": 2
    },
    {
      "id": 1991397,
      "postDate": "2022-10-17T06:10:41.863Z",
      "content": "<p>Congratulations on your 1st place! <br>\nI am confused by the channel and time domain you described. Does it mean <code>(batch,t=15,c=3,h,w) -&gt; (batch*t,c,h,w) -&gt; 2.5d+3d -&gt; (batch,t,classes=3)</code>?</p>",
      "rawMarkdown": "Congratulations on your 1st place! \nI am confused by the channel and time domain you described. Does it mean `(batch,t=15,c=3,h,w) -> (batch*t,c,h,w) -> 2.5d+3d -> (batch,t,classes=3) `?",
      "votes": 1,
      "replies": [
        {
          "id": 1991843,
          "postDate": "2022-10-17T12:17:26.083Z",
          "content": "<p>So actually it is <code>t=5</code> (3d) and <code>c=3</code> (2.5d) making it overall <code>15</code>.</p>",
          "rawMarkdown": "So actually it is `t=5` (3d) and `c=3` (2.5d) making it overall `15`.",
          "votes": 3
        },
        {
          "id": 1991904,
          "postDate": "2022-10-17T12:46:06.503Z",
          "content": "<p>I see, thank you.</p>",
          "rawMarkdown": "I see, thank you."
        },
        {
          "id": 1992893,
          "postDate": "2022-10-18T02:19:39.710Z",
          "content": "<p>thanks a lot!</p>",
          "rawMarkdown": "thanks a lot!"
        },
        {
          "id": 2005814,
          "postDate": "2022-10-27T09:00:11.697Z",
          "content": "<p>is it <code>(batch,t=5,c=3,h,w) -&gt; (batch*t,c=3,h,w) -&gt; 2.5d+3d -&gt; (batch,t,classes=3)</code>  ?</p>",
          "rawMarkdown": " is it `(batch,t=5,c=3,h,w) -> (batch*t,c=3,h,w) -> 2.5d+3d -> (batch,t,classes=3)`  ?"
        }
      ]
    },
    {
      "id": 1990911,
      "postDate": "2022-10-16T20:15:19.457Z",
      "content": "<p>This tutorial was really useful and beneficial for beginners. I will like to learn more on machine learning, and I am very excited about it.</p>",
      "rawMarkdown": "This tutorial was really useful and beneficial for beginners. I will like to learn more on machine learning, and I am very excited about it.",
      "votes": 1
    },
    {
      "id": 1987436,
      "postDate": "2022-10-14T17:38:31.977Z",
      "content": "<p>Congratulations! Always a pleasure to read your solutions</p>",
      "rawMarkdown": "Congratulations! Always a pleasure to read your solutions",
      "votes": 1
    },
    {
      "id": 1987127,
      "postDate": "2022-10-14T14:18:36.787Z",
      "content": "<p>Impressive, great work Team Hydrogen 🚀🚀</p>",
      "rawMarkdown": "Impressive, great work Team Hydrogen 🚀🚀",
      "votes": 1
    },
    {
      "id": 2442073,
      "postDate": "2023-09-16T17:22:20.640Z",
      "content": "<p>Real nice way, simple and effective. Congratulations :)</p>",
      "rawMarkdown": "Real nice way, simple and effective. Congratulations :)"
    },
    {
      "id": 2366533,
      "postDate": "2023-07-31T04:18:16.217Z",
      "content": "<p>Hi can you please tell about what is the post processing that is used to reduce the false positives.<br>\nAlso, I would like know about the class wise precision or accuracy on the public leader board test data </p>",
      "rawMarkdown": "Hi can you please tell about what is the post processing that is used to reduce the false positives.\nAlso, I would like know about the class wise precision or accuracy on the public leader board test data "
    },
    {
      "id": 2163406,
      "postDate": "2023-02-28T19:30:42.187Z",
      "content": "<p>I am new to this type of problems, thanks for sharing this will help a lot! And also Congrats for securing 1st place!</p>",
      "rawMarkdown": "I am new to this type of problems, thanks for sharing this will help a lot! And also Congrats for securing 1st place!"
    },
    {
      "id": 2113877,
      "postDate": "2023-01-24T15:01:18.047Z",
      "content": "<p>Congratulations on your 1st place solution!</p>\n<p>I was reading through the solution and I was thinking about how I would tackle this problem the first thing that popped into my mind is to use a proposal model (eg. BMN) and then a recognizer. Did you try something similar? Do you think it can work better but take more time for inference? I am not very experienced in working with videos, but this seems logical to me.</p>\n<p>Thank you in advance.</p>",
      "rawMarkdown": "Congratulations on your 1st place solution!\n\nI was reading through the solution and I was thinking about how I would tackle this problem the first thing that popped into my mind is to use a proposal model (eg. BMN) and then a recognizer. Did you try something similar? Do you think it can work better but take more time for inference? I am not very experienced in working with videos, but this seems logical to me.\n\nThank you in advance."
    },
    {
      "id": 1998646,
      "postDate": "2022-10-21T18:34:05.310Z",
      "content": "<p>Congratulations! and thank you for sharing.</p>",
      "rawMarkdown": "Congratulations! and thank you for sharing."
    },
    {
      "id": 1993473,
      "postDate": "2022-10-18T12:09:57.940Z",
      "content": "<p>This tutorial was really useful and beneficial for beginners.</p>",
      "rawMarkdown": "This tutorial was really useful and beneficial for beginners."
    },
    {
      "id": 1993456,
      "postDate": "2022-10-18T11:53:28.307Z",
      "content": "<p>congratulations team Hydrogen</p>",
      "rawMarkdown": "congratulations team Hydrogen"
    },
    {
      "id": 1993371,
      "postDate": "2022-10-18T10:17:34.083Z",
      "content": "<p>it was really helpful.</p>",
      "rawMarkdown": "it was really helpful."
    },
    {
      "id": 1993248,
      "postDate": "2022-10-18T08:10:27.440Z",
      "content": "<p>Great work!</p>",
      "rawMarkdown": "Great work!"
    },
    {
      "id": 1993187,
      "postDate": "2022-10-18T07:06:40.663Z",
      "content": "<p>That really amazing to see your work <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> and <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a>!. I like to try it with some other real video classification. If possible, can your notebook as per your agreement.</p>",
      "rawMarkdown": "That really amazing to see your work @philippsinger @ybabakhin and @ilu000!. I like to try it with some other real video classification. If possible, can your notebook as per your agreement."
    },
    {
      "id": 1993039,
      "postDate": "2022-10-18T04:55:25.093Z",
      "content": "<p><a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> <br>\nCcngratulations!<br>\nHow did you convert RGB pretrained weight to grayscale one? You used 3channels input but it was 3 stacked grayscale images not RGB channels.</p>",
      "rawMarkdown": "@philippsinger \nCcngratulations!\nHow did you convert RGB pretrained weight to grayscale one? You used 3channels input but it was 3 stacked grayscale images not RGB channels."
    },
    {
      "id": 1991812,
      "postDate": "2022-10-17T11:58:22.933Z",
      "content": "<p>Can you say a bit about how much you gain from going 3 to 15 frames? Did you pose this as 3 image channels + 5 time dimension so that you could use imagenet pretrained models? I mean as opposed to using 15 image channels as input. </p>",
      "rawMarkdown": "Can you say a bit about how much you gain from going 3 to 15 frames? Did you pose this as 3 image channels + 5 time dimension so that you could use imagenet pretrained models? I mean as opposed to using 15 image channels as input. ",
      "replies": [
        {
          "id": 2005807,
          "postDate": "2022-10-27T08:53:54.143Z",
          "content": "<p>Do you mean that <br>\none input with 15 channels <br>\nis got by 5  images  (with BGR 3 channels) ?</p>",
          "rawMarkdown": "Do you mean that \none input with 15 channels \nis got by 5  images  (with BGR 3 channels) ?"
        }
      ]
    },
    {
      "id": 1991682,
      "postDate": "2022-10-17T10:47:24.523Z",
      "content": "<p>Congratz on the great performance <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a> !</p>\n<p>How do you handle the 2D -&gt; 3D transition ?</p>\n<p>This is how I am considering doing it :</p>\n<ul>\n<li>Replace the Conv2Ds to Conv3Ds (and BNs in a similar fashion) using the same in_channels, out_channels, k (, …)</li>\n<li>Reshape <code>nb_ft x C x H x W</code> to <code>nb_ft x 1 x C x H x W</code> before entering the first 3D conv</li>\n<li>First 3d conv therefore has 1 channel.</li>\n</ul>\n<p>However this results in a quite big model, do you reduce the number of channels somewhere or are you doing it a different way ?<br>\nThanks !</p>",
      "rawMarkdown": "Congratz on the great performance @philippsinger @ybabakhin @ilu000 !\n\nHow do you handle the 2D -> 3D transition ?\n\nThis is how I am considering doing it :\n- Replace the Conv2Ds to Conv3Ds (and BNs in a similar fashion) using the same in_channels, out_channels, k (, ...)\n- Reshape `nb_ft x C x H x W` to `nb_ft x 1 x C x H x W` before entering the first 3D conv\n- First 3d conv therefore has 1 channel.\n\nHowever this results in a quite big model, do you reduce the number of channels somewhere or are you doing it a different way ?\nThanks !",
      "replies": [
        {
          "id": 1991700,
          "postDate": "2022-10-17T11:00:14.950Z",
          "content": "<p>There are quite a few different ways of doing it and what works for a specific problem is experimental. In general you can reshape from 2D to 3D and back quite easily, so if you start with <code>bs x frames x channels x H x W</code> you can reshape to <code>bs*frames x channels x H x W</code> for the 2D part and then reshape back to 5 dimensions for the 3D part.</p>",
          "rawMarkdown": "There are quite a few different ways of doing it and what works for a specific problem is experimental. In general you can reshape from 2D to 3D and back quite easily, so if you start with `bs x frames x channels x H x W` you can reshape to `bs*frames x channels x H x W` for the 2D part and then reshape back to 5 dimensions for the 3D part.",
          "votes": 2
        },
        {
          "id": 1991750,
          "postDate": "2022-10-17T11:31:44.483Z",
          "content": "<p>I see, that makes more sense, thanks !</p>",
          "rawMarkdown": "I see, that makes more sense, thanks !"
        },
        {
          "id": 1997834,
          "postDate": "2022-10-21T07:32:10.880Z",
          "content": "<p>I guess this way you can use pre-trained 2D encoders right?<br>\nDo you know of any useful documentation for this?</p>\n<p>Thanks in advance!</p>",
          "rawMarkdown": "I guess this way you can use pre-trained 2D encoders right?\nDo you know of any useful documentation for this?\n\nThanks in advance!"
        }
      ]
    },
    {
      "id": 1991009,
      "postDate": "2022-10-16T22:08:49.447Z",
      "content": "<p>Big congrats <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a>, <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> and <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a>!</p>",
      "rawMarkdown": "Big congrats @philippsinger, @ybabakhin and @ilu000!"
    },
    {
      "id": 1990577,
      "postDate": "2022-10-16T16:36:38.450Z",
      "content": "<p>Impressive, great work Team Hydrogen 🚀🚀</p>",
      "rawMarkdown": "Impressive, great work Team Hydrogen 🚀🚀"
    },
    {
      "id": 1988653,
      "postDate": "2022-10-15T13:07:05.970Z",
      "content": "<p>I tried to understand the article, but couldn't get many of its technical aspects it's my first day on Kaggle hope to learn and come back some day and understand it thoroughly! Any piece of advice is welcomed .</p>",
      "rawMarkdown": "I tried to understand the article, but couldn't get many of its technical aspects it's my first day on Kaggle hope to learn and come back some day and understand it thoroughly! Any piece of advice is welcomed ."
    },
    {
      "id": 1988011,
      "postDate": "2022-10-15T02:14:20.123Z",
      "content": "<p>Nice work! Are you able to describe how the training dataset was made? For example, what distribution of labels, types of image saved, any compression/interpolation, skipping frames? Thank you</p>",
      "rawMarkdown": "Nice work! Are you able to describe how the training dataset was made? For example, what distribution of labels, types of image saved, any compression/interpolation, skipping frames? Thank you"
    },
    {
      "id": 1987914,
      "postDate": "2022-10-14T22:29:47.157Z",
      "content": "<p>Impressive work with one stage-model. team Hydrogen - you really scored here! ⚽<br>\nI cannot wait extra two months for detailed write-up, so hope you can answer below :) </p>\n<blockquote>\n  <p>Input is 1024x1024 grayscale image, channels is stacked time dimension over three neighboring frames</p>\n</blockquote>\n<p>Can you elaborate on this? What is meant by three neighboring frames, as you mentioned that 15 frames are used in sequence?</p>\n<blockquote>\n  <p>Loss is BCE with 3 target columns</p>\n</blockquote>\n<p>No training on background images at all?</p>\n<p>Thanks for sharing!</p>",
      "rawMarkdown": "Impressive work with one stage-model. team Hydrogen - you really scored here! ⚽\nI cannot wait extra two months for detailed write-up, so hope you can answer below :) \n\n> Input is 1024x1024 grayscale image, channels is stacked time dimension over three neighboring frames\n\nCan you elaborate on this? What is meant by three neighboring frames, as you mentioned that 15 frames are used in sequence?\n\n\n> Loss is BCE with 3 target columns\n\nNo training on background images at all?\n\nThanks for sharing!",
      "replies": [
        {
          "id": 1988406,
          "postDate": "2022-10-15T09:55:16.187Z",
          "content": "<p>The stacking means that you concat e.g. frame 14,15,16 to 3 channels when looking at frame 15.</p>\n<p>We add lots of BG images, but dont add a separate 4th class, with BCE you can have all label columns zero to indicate BG.</p>",
          "rawMarkdown": "The stacking means that you concat e.g. frame 14,15,16 to 3 channels when looking at frame 15.\n\nWe add lots of BG images, but dont add a separate 4th class, with BCE you can have all label columns zero to indicate BG.",
          "votes": 2
        },
        {
          "id": 2005831,
          "postDate": "2022-10-27T09:10:12.810Z",
          "content": "<p>Hi, I think it may be more clear to modify the example here to   <code>concat frame 18,19,20 to 3 channels when looking at frame 19</code>, because people like me are already confused with the meaning of \"15 frames\" in this discussion. (Try pressing \"ctrl f\" and typing in \"15\" )</p>",
          "rawMarkdown": "Hi, I think it may be more clear to modify the example here to   `concat frame 18,19,20 to 3 channels when looking at frame 19`, because people like me are already confused with the meaning of \"15 frames\" in this discussion. (Try pressing \"ctrl f\" and typing in \"15\" )"
        }
      ]
    },
    {
      "id": 1987404,
      "postDate": "2022-10-14T17:24:33.007Z",
      "content": "<p>If you used 3 target classes, how did you recognize background frames</p>",
      "rawMarkdown": "If you used 3 target classes, how did you recognize background frames",
      "replies": [
        {
          "id": 1987527,
          "postDate": "2022-10-14T18:16:47.603Z",
          "content": "<p>I don't need to recognize them specifically, you only really need another BG class if you use softmax.</p>",
          "rawMarkdown": "I don't need to recognize them specifically, you only really need another BG class if you use softmax.",
          "votes": 1
        }
      ]
    },
    {
      "id": 1987308,
      "postDate": "2022-10-14T16:24:39.860Z",
      "content": "<p>Amazing score, great work!!<br>\nI might overfitted, used a tf_efficientnetv2_xl_in21ft1k 😉 but with lots of augmentation in training, random crop/size/scale, colorjitter etc, maybe will help some I hope 🙂 croped the final inference as well. Tested with even more like random perspective  etc.</p>",
      "rawMarkdown": "Amazing score, great work!!\nI might overfitted, used a tf_efficientnetv2_xl_in21ft1k 😉 but with lots of augmentation in training, random crop/size/scale, colorjitter etc, maybe will help some I hope 🙂 croped the final inference as well. Tested with even more like random perspective  etc.",
      "replies": [
        {
          "id": 1987525,
          "postDate": "2022-10-14T18:16:08.533Z",
          "content": "<p>Oh my god haha, even B0 was too large I feel like. But it depends on the architecture.</p>",
          "rawMarkdown": "Oh my god haha, even B0 was too large I feel like. But it depends on the architecture.",
          "votes": 1
        },
        {
          "id": 1987585,
          "postDate": "2022-10-14T18:47:12.330Z",
          "content": "<p>Also optimized optimized and optimized the test time video stream, so was able to run a e.g. B0 inference/1024 dim end-to-end kernel in only ~18min/video :) with stable GPU/CPU memory.</p>",
          "rawMarkdown": "Also optimized optimized and optimized the test time video stream, so was able to run a e.g. B0 inference/1024 dim end-to-end kernel in only ~18min/video :) with stable GPU/CPU memory."
        },
        {
          "id": 1987631,
          "postDate": "2022-10-14T19:10:42.083Z",
          "content": "<p>We also optimized it quite a bit, it is fun :)</p>",
          "rawMarkdown": "We also optimized it quite a bit, it is fun :)"
        }
      ]
    },
    {
      "id": 1987061,
      "postDate": "2022-10-14T13:29:35.903Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> , <a href=\"https://www.kaggle.com/ybabakhin\" target=\"_blank\">@ybabakhin</a> and <a href=\"https://www.kaggle.com/ilu000\" target=\"_blank\">@ilu000</a>. I have a couple questions:</p>\n<blockquote>\n  <p>Loss is BCE with 3 target columns</p>\n</blockquote>\n<p>Isn't BCE intended for binary classification? How can you pass 3 columns?</p>\n<blockquote>\n  <p>Input is 1024x1024 grayscale image, channels is stacked time dimension over three neighboring frames</p>\n</blockquote>\n<p>Does this mean your batch has size <code>(3, 1024, 1024, batch_size)</code>?</p>\n<p>Finally, how did you set the threshold to decide the predicted label? E.g: prediction <code>y_pred = 0.55</code>, <code>threshold = 0.5</code> then <code>label = 1</code>.</p>\n<p>Thanks in advance</p>",
      "rawMarkdown": "Congrats @philippsinger , @ybabakhin and @ilu000. I have a couple questions:\n\n> Loss is BCE with 3 target columns\n\nIsn't BCE intended for binary classification? How can you pass 3 columns?\n\n> Input is 1024x1024 grayscale image, channels is stacked time dimension over three neighboring frames\n\nDoes this mean your batch has size `(3, 1024, 1024, batch_size)`?\n\nFinally, how did you set the threshold to decide the predicted label? E.g: prediction `y_pred = 0.55`, `threshold = 0.5` then `label = 1`.\n\nThanks in advance\n"
    },
    {
      "id": 1986934,
      "postDate": "2022-10-14T12:03:23.937Z",
      "content": "<blockquote>\n  <p>Subsequently, we apply post processing to reduce number of FP</p>\n</blockquote>\n<p>Can you give me more ideas on this part?<br>\nRight after the start of the competition, I tried to find the idea of removing the FPs that exist in the adjacent time, but to no avail.<br>\nI would like to know if there are other options than an algorithm that removes m adjacent elements in turn while selecting elements in the order in which the mean of k adjacent elements is greater.<br>\ncode (function name = make_sub) : <a href=\"https://www.kaggle.com/code/assign/dfl-tito-tta?scriptVersionId=103548122&amp;cellId=12\" target=\"_blank\">https://www.kaggle.com/code/assign/dfl-tito-tta?scriptVersionId=103548122&amp;cellId=12</a> </p>\n<p>Can you tell me how much score (or loss) you've improved when using 3 adjacent grayscale frames instead of RGB?<br>\nIf you don't mind, I'd like to know how much time and equipment the training took. I'd like to try to reproduce the performance before the final leaderboard is finalized.</p>\n<p>Thank you</p>",
      "rawMarkdown": "> Subsequently, we apply post processing to reduce number of FP\n\nCan you give me more ideas on this part?\nRight after the start of the competition, I tried to find the idea of removing the FPs that exist in the adjacent time, but to no avail.\nI would like to know if there are other options than an algorithm that removes m adjacent elements in turn while selecting elements in the order in which the mean of k adjacent elements is greater.\ncode (function name = make_sub) : https://www.kaggle.com/code/assign/dfl-tito-tta?scriptVersionId=103548122&cellId=12 \n\nCan you tell me how much score (or loss) you've improved when using 3 adjacent grayscale frames instead of RGB?\nIf you don't mind, I'd like to know how much time and equipment the training took. I'd like to try to reproduce the performance before the final leaderboard is finalized.\n\nThank you",
      "replies": [
        {
          "id": 1987062,
          "postDate": "2022-10-14T13:29:39.940Z",
          "content": "<p>We are basically just using the PP from that kernel you linked with different optimized parameters.</p>\n<p>I would say 3 adjacent grayscale improved ~20pts, but we switched around 2 weeks before deadline to it and did not manage to try RGB again towards the end (we wanted to try stacking 3 RGB images) so it is hard to say.</p>\n<p>We trained most of the models on 3xA6000 - training on 512x512 is fairly fast and already gives very good results, it was around 2hours for 5 epochs. We did most tuning on 512 and then just scaled up. With larger resolution the runtime increases obviously.</p>",
          "rawMarkdown": "We are basically just using the PP from that kernel you linked with different optimized parameters.\n\nI would say 3 adjacent grayscale improved ~20pts, but we switched around 2 weeks before deadline to it and did not manage to try RGB again towards the end (we wanted to try stacking 3 RGB images) so it is hard to say.\n\nWe trained most of the models on 3xA6000 - training on 512x512 is fairly fast and already gives very good results, it was around 2hours for 5 epochs. We did most tuning on 512 and then just scaled up. With larger resolution the runtime increases obviously.",
          "votes": 2
        },
        {
          "id": 1993330,
          "postDate": "2022-10-18T09:37:33.973Z",
          "content": "<p>thanks a lot</p>",
          "rawMarkdown": "thanks a lot"
        }
      ]
    },
    {
      "id": 1993041,
      "postDate": "2022-10-18T04:57:08.980Z",
      "content": "<p>Thanks for the info.</p>",
      "rawMarkdown": "Thanks for the info.",
      "votes": 2
    },
    {
      "id": 1992546,
      "postDate": "2022-10-17T18:22:02.100Z",
      "content": "<p>Thanks for sharing useful!!</p>",
      "rawMarkdown": "Thanks for sharing useful!!",
      "votes": 1
    },
    {
      "id": 1993717,
      "postDate": "2022-10-18T15:12:56.693Z",
      "content": "<p>Really helpful tutorial! Thank you!</p>",
      "rawMarkdown": "Really helpful tutorial! Thank you!"
    },
    {
      "id": 1991841,
      "postDate": "2022-10-17T12:15:51.720Z",
      "content": "<p>thanks for the explanation, upvote !</p>",
      "rawMarkdown": "thanks for the explanation, upvote !"
    },
    {
      "id": 1987152,
      "postDate": "2022-10-14T14:33:14.403Z",
      "content": "<p>impressive, thanks for your work !</p>",
      "rawMarkdown": "impressive, thanks for your work !\n"
    },
    {
      "id": 1986982,
      "postDate": "2022-10-14T12:29:49.060Z",
      "content": "<p>Thanks for sharing <a href=\"https://www.kaggle.com/philippsinger\" target=\"_blank\">@philippsinger</a> !</p>",
      "rawMarkdown": "Thanks for sharing @philippsinger !"
    }
  ],
  "complete": true,
  "source": "live",
  "fetched_at": "2026-10-24T13:29:21Z",
  "competition_id": 37244,
  "competition_slug": "dfl-bundesliga-data-shootout",
  "team_id": 8959770,
  "solution_url": "/competitions/dfl-bundesliga-data-shootout/writeups/team-hydrogen-scores-team-hydrogen-1st-place-solut"
}