{
  "id": 360331,
  "title": "Public 5th place solution",
  "content": "<p>Thank you for organizing very exciting competition.<br>\nAnd also the following codes helped me a lot, thank you very much! <a href=\"https://www.kaggle.com/its7171\" target=\"_blank\">@its7171</a><br>\n<a href=\"https://www.kaggle.com/code/its7171/dfl-benchmark-training\" target=\"_blank\">https://www.kaggle.com/code/its7171/dfl-benchmark-training</a>  <br>\n<a href=\"https://www.kaggle.com/code/its7171/dfl-benchmark-inference\" target=\"_blank\">https://www.kaggle.com/code/its7171/dfl-benchmark-inference</a></p>\n<h1>Overview</h1>\n<ul>\n<li>Image grayscaling, resizing (1024x576), center crop (960x512)</li>\n<li>Difference from previous frame and apply absolute<ul>\n<li>Due to the small amount of training data, I thought it would be useful to explicitly extract video features.</li></ul></li>\n<li>3 class classification (binary cross entropy) by efficientnet_b1 with input of 11 channels in total (±5 frames before and after)</li>\n<li>5-models ensemble</li>\n</ul>\n<h1>Augumentation</h1>\n<ul>\n<li>Fliplr and random crop from 1024x576 to 960x512</li>\n<li>Affine transformation with parameters varying linearly with time<ul>\n<li>I wanted to synthesize camera zoom, pan, etc. and use them for model training.</li>\n<li>Assuming that the camera parameters vary linearly within a small range, I created the following function</li></ul></li>\n</ul>\n<pre><code>  def hoge(src_imgs):\n    # len(src_imgs)==11+1 frames\n\n    # sampling parametors\n    angle = random.uniform(-0.1, 0.1)\n    translate_x = random.uniform(-1, 1)\n    translate_y = random.uniform(-1, 1)\n    scale = random.uniform(-0.0005, 0.0005)\n\n    dst_imgs = torch.zeros_like(src_imgs)\n    for i,t in enumerate(-6,6):\n        dst_imgs[i] = torchvision.transforms.functional.affine(src_imgs[i],\n                                                angle=float(t*angle),\n                                                translate=(t*translate_y, t*translate_x),\n                                                scale=1.0 + t*scale,\n                                                interpolation = torchvision.transforms.InterpolationMode.BILINEAR)\n    return dst_imgs\n</code></pre>\n<p>The left column in the figure below shows 11 frames of video before augment, <br>\n  and the center and right columns are examples of the augment applied.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F33870c3bcd56543625c2009f2e27af43%2Faugument100000.gif?generation=1665905790619453&amp;alt=media\" alt=\"\"></p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2Fb292f8832e026f08f0eb4d655baef581%2Faugument175000.gif?generation=1665906158387381&amp;alt=media\" alt=\"\"></p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F3b9a6d71b4729efab357078adb0471ff%2Faugument075000.gif?generation=1665906759837057&amp;alt=media\" alt=\"\"></p>\n<h1>Label design</h1>\n<p>For the labels, I used a Gaussian distribution (sigma=20 frames) as shown below. <br>\nThese soft label designs are same for the three events.<br>\nBinary cross-entropy was used for the loss function.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F38f26f2c7f32dff2713f658fdfdd189a%2Flabel_design.png?generation=1665906218833070&amp;alt=media\" alt=\"\"></p>\n<h1>Ensemble.</h1>\n<p>Ensemble of 5 efficientnet_b1 models with different CVs.</p>\n<h2>Additional annotations</h2>\n<p>It was the last four days and I was frazzled.<br>\nAs a last ditch effort, I tried to annotate all the unannotated time.<br>\nAfter annotating 5 videos (1606b0e6_0, 407c5a9e_1, 4ffd5986_0, 9a97dae4_1, ecf251d4_0) I ran out of steam and started training the model.</p>\n<h1>Speeding up inference</h1>\n<p>I spent quite a bit of time trying to parallelize cv2.VideoCapture with Dataloader, but it did not work.<br>\nI also tried decoders such as decord, dali, pyav, howevwer these did not work either.<br>\nFinally, I used cv2.VideoCapture for video encoding,<br>\nand grayscaling and resizing of the image were applied on CPU (np.array),  and then difference, absolute , creating input-batch  (rolling &amp; copy) were done on the GPU (nn.sensor).</p>\n<p>This speed up allowed us to infer on 6 models (efficientnet_b1 with 11x960x512 tensor) within the time limit.<br>\nDue to make margins, we submitted an ensemble of five models, finally.</p>\n<h1>Scores</h1>\n<table>\n<thead>\n<tr>\n<th>submit</th>\n<th>LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>①： my baseline    ( 512x288 )</td>\n<td>0.625</td>\n</tr>\n<tr>\n<td>②： ① + larger iamge ( 1024x576 )</td>\n<td>0.717</td>\n</tr>\n<tr>\n<td>③： ② + affine augument</td>\n<td>0.748</td>\n</tr>\n<tr>\n<td>④： ③ + 5-model ensemble</td>\n<td>0.768</td>\n</tr>\n<tr>\n<td>⑤： ④ +  extra annotation</td>\n<td>0.792</td>\n</tr>\n</tbody>\n</table>",
  "comments": [
    {
      "id": 1992805,
      "author_name": "ohkawa3",
      "author_url": "",
      "post_date": "2022-10-18T00:17:52.233000",
      "content": "<p>I modified the model in Scores ② above and added experimental results on inter-frame differences.</p>\n<p>I compared two models.<br>\nThe first model takes as input an absolute value image of the difference between current and previous.<br>\nThe second model takes as input a 2-channel image that concatenates the current and previous images.<br>\nThey are denoted as <strong>with_absdiff</strong> and <strong>without_absdiff</strong>, respectively.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F4e8f391116cea04ec030ba6f6a4aade9%2Fextra_exp.png?generation=1666051814016820&amp;alt=media\" alt=\"\"></p>\n<p>The metrics for each epoch are shown in the figure below.<br>\nFor most metrics, <strong>with_absdiff</strong> outperforms <strong>without_absdiff</strong>.<br>\nGenerally, CNNs are said to automatically extract features from images and videos, but that is the case when there is a large amount of data.<br>\nWhen data is limited, as in this case, it loses out to simple feature extraction, such as absolute value of differences.</p>\n<p>What is interesting is the relationship between <em>train_loss</em> and <em>valid_loss</em>.<br>\nSince epoch 3, <strong>without_absdiff</strong> has been smaller than <strong>with_absdiff</strong> on  <em>train_loss</em>.<br>\nOn the other hand, with regard to <em>valid_loss</em>, <strong>with_absdiff</strong> is always smaller than <strong>without_absdiff</strong>.<br>\nThis is because <strong>without_absdiff</strong> extracts poor features for the two channels of input (current and previous frames).</p>",
      "votes": 2,
      "replies": [
        {
          "id": 1993334,
          "author_name": "assign",
          "author_url": "",
          "post_date": "2022-10-18T09:46:49.490000",
          "content": "<p>Is it an experiment where only 2 adjacent frames are input instead of the above <code>input of 11 channels</code>?</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1993350,
          "author_name": "ohkawa3",
          "author_url": "",
          "post_date": "2022-10-18T10:05:48.043000",
          "content": "<p>Yes.<br>\nTo simplify problem, additional experiments are limited to only two frames.</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 1993359,
          "author_name": "assign",
          "author_url": "",
          "post_date": "2022-10-18T10:11:25.417000",
          "content": "<p>How many steps were used for each epoch (step axis of the graph)?<br>\nOr is it really an 8-step fine-tuning?</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1993382,
          "author_name": "ohkawa3",
          "author_url": "",
          "post_date": "2022-10-18T10:31:35.300000",
          "content": "<p>The x-axis indicates the number of epochs.<br>\nEach epoch has 13540 steps and mini-batch size is 16.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1991500,
      "author_name": "",
      "author_url": "",
      "post_date": "2022-10-17T07:55:45.733000",
      "content": "",
      "votes": -7,
      "replies": []
    },
    {
      "id": 2818254,
      "author_name": "AngadY",
      "author_url": "",
      "post_date": "2024-05-17T11:29:54.540000",
      "content": "<p>Hi <a href=\"https://www.kaggle.com/chack3\" target=\"_blank\">@chack3</a> , how to find ur original notebook 4th place training and inference, it is public then share link with me, i am building cutoom solution for my action classification use case?</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1993251,
      "author_name": "Rahul Pandey",
      "author_url": "",
      "post_date": "2022-10-18T08:11:53.960000",
      "content": "<p>What a wonderful achievement👍. I have learn something new from your post.</p>",
      "votes": 0,
      "replies": []
    }
  ],
  "comment_count": 8,
  "messages": [
    {
      "id": 1989867,
      "postDate": "2022-10-16T07:55:32.657Z",
      "content": "<p>Thank you for organizing very exciting competition.<br>\nAnd also the following codes helped me a lot, thank you very much! <a href=\"https://www.kaggle.com/its7171\" target=\"_blank\">@its7171</a><br>\n<a href=\"https://www.kaggle.com/code/its7171/dfl-benchmark-training\" target=\"_blank\">https://www.kaggle.com/code/its7171/dfl-benchmark-training</a>  <br>\n<a href=\"https://www.kaggle.com/code/its7171/dfl-benchmark-inference\" target=\"_blank\">https://www.kaggle.com/code/its7171/dfl-benchmark-inference</a></p>\n<h1>Overview</h1>\n<ul>\n<li>Image grayscaling, resizing (1024x576), center crop (960x512)</li>\n<li>Difference from previous frame and apply absolute<ul>\n<li>Due to the small amount of training data, I thought it would be useful to explicitly extract video features.</li></ul></li>\n<li>3 class classification (binary cross entropy) by efficientnet_b1 with input of 11 channels in total (±5 frames before and after)</li>\n<li>5-models ensemble</li>\n</ul>\n<h1>Augumentation</h1>\n<ul>\n<li>Fliplr and random crop from 1024x576 to 960x512</li>\n<li>Affine transformation with parameters varying linearly with time<ul>\n<li>I wanted to synthesize camera zoom, pan, etc. and use them for model training.</li>\n<li>Assuming that the camera parameters vary linearly within a small range, I created the following function</li></ul></li>\n</ul>\n<pre><code>  def hoge(src_imgs):\n    # len(src_imgs)==11+1 frames\n\n    # sampling parametors\n    angle = random.uniform(-0.1, 0.1)\n    translate_x = random.uniform(-1, 1)\n    translate_y = random.uniform(-1, 1)\n    scale = random.uniform(-0.0005, 0.0005)\n\n    dst_imgs = torch.zeros_like(src_imgs)\n    for i,t in enumerate(-6,6):\n        dst_imgs[i] = torchvision.transforms.functional.affine(src_imgs[i],\n                                                angle=float(t*angle),\n                                                translate=(t*translate_y, t*translate_x),\n                                                scale=1.0 + t*scale,\n                                                interpolation = torchvision.transforms.InterpolationMode.BILINEAR)\n    return dst_imgs\n</code></pre>\n<p>The left column in the figure below shows 11 frames of video before augment, <br>\n  and the center and right columns are examples of the augment applied.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F33870c3bcd56543625c2009f2e27af43%2Faugument100000.gif?generation=1665905790619453&amp;alt=media\" alt=\"\"></p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2Fb292f8832e026f08f0eb4d655baef581%2Faugument175000.gif?generation=1665906158387381&amp;alt=media\" alt=\"\"></p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F3b9a6d71b4729efab357078adb0471ff%2Faugument075000.gif?generation=1665906759837057&amp;alt=media\" alt=\"\"></p>\n<h1>Label design</h1>\n<p>For the labels, I used a Gaussian distribution (sigma=20 frames) as shown below. <br>\nThese soft label designs are same for the three events.<br>\nBinary cross-entropy was used for the loss function.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F38f26f2c7f32dff2713f658fdfdd189a%2Flabel_design.png?generation=1665906218833070&amp;alt=media\" alt=\"\"></p>\n<h1>Ensemble.</h1>\n<p>Ensemble of 5 efficientnet_b1 models with different CVs.</p>\n<h2>Additional annotations</h2>\n<p>It was the last four days and I was frazzled.<br>\nAs a last ditch effort, I tried to annotate all the unannotated time.<br>\nAfter annotating 5 videos (1606b0e6_0, 407c5a9e_1, 4ffd5986_0, 9a97dae4_1, ecf251d4_0) I ran out of steam and started training the model.</p>\n<h1>Speeding up inference</h1>\n<p>I spent quite a bit of time trying to parallelize cv2.VideoCapture with Dataloader, but it did not work.<br>\nI also tried decoders such as decord, dali, pyav, howevwer these did not work either.<br>\nFinally, I used cv2.VideoCapture for video encoding,<br>\nand grayscaling and resizing of the image were applied on CPU (np.array),  and then difference, absolute , creating input-batch  (rolling &amp; copy) were done on the GPU (nn.sensor).</p>\n<p>This speed up allowed us to infer on 6 models (efficientnet_b1 with 11x960x512 tensor) within the time limit.<br>\nDue to make margins, we submitted an ensemble of five models, finally.</p>\n<h1>Scores</h1>\n<table>\n<thead>\n<tr>\n<th>submit</th>\n<th>LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>①： my baseline    ( 512x288 )</td>\n<td>0.625</td>\n</tr>\n<tr>\n<td>②： ① + larger iamge ( 1024x576 )</td>\n<td>0.717</td>\n</tr>\n<tr>\n<td>③： ② + affine augument</td>\n<td>0.748</td>\n</tr>\n<tr>\n<td>④： ③ + 5-model ensemble</td>\n<td>0.768</td>\n</tr>\n<tr>\n<td>⑤： ④ +  extra annotation</td>\n<td>0.792</td>\n</tr>\n</tbody>\n</table>",
      "rawMarkdown": "Thank you for organizing very exciting competition.\nAnd also the following codes helped me a lot, thank you very much! @its7171\nhttps://www.kaggle.com/code/its7171/dfl-benchmark-training  \nhttps://www.kaggle.com/code/its7171/dfl-benchmark-inference\n\n# Overview\n+ Image grayscaling, resizing (1024x576), center crop (960x512)\n+ Difference from previous frame and apply absolute\n  + Due to the small amount of training data, I thought it would be useful to explicitly extract video features.\n+ 3 class classification (binary cross entropy) by efficientnet_b1 with input of 11 channels in total (±5 frames before and after)\n+ 5-models ensemble\n\n# Augumentation\n+ Fliplr and random crop from 1024x576 to 960x512\n+ Affine transformation with parameters varying linearly with time\n  + I wanted to synthesize camera zoom, pan, etc. and use them for model training.\n  + Assuming that the camera parameters vary linearly within a small range, I created the following function\n\n  ``` python\n  def hoge(src_imgs):\n    # len(src_imgs)==11+1 frames\n\n    # sampling parametors\n    angle = random.uniform(-0.1, 0.1)\n    translate_x = random.uniform(-1, 1)\n    translate_y = random.uniform(-1, 1)\n    scale = random.uniform(-0.0005, 0.0005)\n\n    dst_imgs = torch.zeros_like(src_imgs)\n    for i,t in enumerate(-6,6):\n        dst_imgs[i] = torchvision.transforms.functional.affine(src_imgs[i],\n                                                angle=float(t*angle),\n                                                translate=(t*translate_y, t*translate_x),\n                                                scale=1.0 + t*scale,\n                                                interpolation = torchvision.transforms.InterpolationMode.BILINEAR)\n    return dst_imgs\n  ```\n\n  The left column in the figure below shows 11 frames of video before augment, \n  and the center and right columns are examples of the augment applied.\n \n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F33870c3bcd56543625c2009f2e27af43%2Faugument100000.gif?generation=1665905790619453&alt=media)\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2Fb292f8832e026f08f0eb4d655baef581%2Faugument175000.gif?generation=1665906158387381&alt=media)\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F3b9a6d71b4729efab357078adb0471ff%2Faugument075000.gif?generation=1665906759837057&alt=media)\n\n# Label design\nFor the labels, I used a Gaussian distribution (sigma=20 frames) as shown below. \nThese soft label designs are same for the three events.\nBinary cross-entropy was used for the loss function.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F38f26f2c7f32dff2713f658fdfdd189a%2Flabel_design.png?generation=1665906218833070&alt=media)\n\n# Ensemble.\nEnsemble of 5 efficientnet_b1 models with different CVs.\n\n## Additional annotations\nIt was the last four days and I was frazzled.\nAs a last ditch effort, I tried to annotate all the unannotated time.\nAfter annotating 5 videos (1606b0e6_0, 407c5a9e_1, 4ffd5986_0, 9a97dae4_1, ecf251d4_0) I ran out of steam and started training the model.\n\n# Speeding up inference\nI spent quite a bit of time trying to parallelize cv2.VideoCapture with Dataloader, but it did not work.\nI also tried decoders such as decord, dali, pyav, howevwer these did not work either.\nFinally, I used cv2.VideoCapture for video encoding,\nand grayscaling and resizing of the image were applied on CPU (np.array),  and then difference, absolute , creating input-batch  (rolling & copy) were done on the GPU (nn.sensor).\n\nThis speed up allowed us to infer on 6 models (efficientnet_b1 with 11x960x512 tensor) within the time limit.\nDue to make margins, we submitted an ensemble of five models, finally.\n\n# Scores\n|  submit         |  LB  |\n| ----            | ---- |\n|  ①： my baseline    ( 512x288 )    |  0.625  |\n|  ②： ① + larger iamge ( 1024x576 )   |  0.717  |\n|  ③： ② + affine augument   |  0.748  |\n|  ④： ③ + 5-model ensemble  |  0.768  |\n|  ⑤： ④ +  extra annotation  |  0.792  |\n",
      "votes": 41
    },
    {
      "id": 1992805,
      "postDate": "2022-10-18T00:17:52.233Z",
      "content": "<p>I modified the model in Scores ② above and added experimental results on inter-frame differences.</p>\n<p>I compared two models.<br>\nThe first model takes as input an absolute value image of the difference between current and previous.<br>\nThe second model takes as input a 2-channel image that concatenates the current and previous images.<br>\nThey are denoted as <strong>with_absdiff</strong> and <strong>without_absdiff</strong>, respectively.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F4e8f391116cea04ec030ba6f6a4aade9%2Fextra_exp.png?generation=1666051814016820&amp;alt=media\" alt=\"\"></p>\n<p>The metrics for each epoch are shown in the figure below.<br>\nFor most metrics, <strong>with_absdiff</strong> outperforms <strong>without_absdiff</strong>.<br>\nGenerally, CNNs are said to automatically extract features from images and videos, but that is the case when there is a large amount of data.<br>\nWhen data is limited, as in this case, it loses out to simple feature extraction, such as absolute value of differences.</p>\n<p>What is interesting is the relationship between <em>train_loss</em> and <em>valid_loss</em>.<br>\nSince epoch 3, <strong>without_absdiff</strong> has been smaller than <strong>with_absdiff</strong> on  <em>train_loss</em>.<br>\nOn the other hand, with regard to <em>valid_loss</em>, <strong>with_absdiff</strong> is always smaller than <strong>without_absdiff</strong>.<br>\nThis is because <strong>without_absdiff</strong> extracts poor features for the two channels of input (current and previous frames).</p>",
      "rawMarkdown": "I modified the model in Scores ② above and added experimental results on inter-frame differences.\n\nI compared two models.\nThe first model takes as input an absolute value image of the difference between current and previous.\nThe second model takes as input a 2-channel image that concatenates the current and previous images.\nThey are denoted as **with_absdiff** and **without_absdiff**, respectively.\n\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1630583%2F4e8f391116cea04ec030ba6f6a4aade9%2Fextra_exp.png?generation=1666051814016820&alt=media)\n\nThe metrics for each epoch are shown in the figure below.\nFor most metrics, **with_absdiff** outperforms **without_absdiff**.\nGenerally, CNNs are said to automatically extract features from images and videos, but that is the case when there is a large amount of data.\nWhen data is limited, as in this case, it loses out to simple feature extraction, such as absolute value of differences.\n\nWhat is interesting is the relationship between *train_loss* and *valid_loss*.\nSince epoch 3, **without_absdiff** has been smaller than **with_absdiff** on  *train_loss*.\nOn the other hand, with regard to *valid_loss*, **with_absdiff** is always smaller than **without_absdiff**.\nThis is because **without_absdiff** extracts poor features for the two channels of input (current and previous frames).\n\n\n",
      "votes": 2,
      "replies": [
        {
          "id": 1993334,
          "postDate": "2022-10-18T09:46:49.490Z",
          "content": "<p>Is it an experiment where only 2 adjacent frames are input instead of the above <code>input of 11 channels</code>?</p>",
          "rawMarkdown": "Is it an experiment where only 2 adjacent frames are input instead of the above `input of 11 channels`?"
        },
        {
          "id": 1993350,
          "postDate": "2022-10-18T10:05:48.043Z",
          "content": "<p>Yes.<br>\nTo simplify problem, additional experiments are limited to only two frames.</p>",
          "rawMarkdown": "Yes.\nTo simplify problem, additional experiments are limited to only two frames.",
          "votes": 1
        },
        {
          "id": 1993359,
          "postDate": "2022-10-18T10:11:25.417Z",
          "content": "<p>How many steps were used for each epoch (step axis of the graph)?<br>\nOr is it really an 8-step fine-tuning?</p>",
          "rawMarkdown": "How many steps were used for each epoch (step axis of the graph)?\nOr is it really an 8-step fine-tuning?"
        },
        {
          "id": 1993382,
          "postDate": "2022-10-18T10:31:35.300Z",
          "content": "<p>The x-axis indicates the number of epochs.<br>\nEach epoch has 13540 steps and mini-batch size is 16.</p>",
          "rawMarkdown": "The x-axis indicates the number of epochs.\nEach epoch has 13540 steps and mini-batch size is 16.",
          "votes": 1
        }
      ]
    },
    {
      "id": 1991500,
      "postDate": "2022-10-17T07:55:45.733Z",
      "rawMarkdown": "",
      "votes": -7
    },
    {
      "id": 2818254,
      "postDate": "2024-05-17T11:29:54.540Z",
      "content": "<p>Hi <a href=\"https://www.kaggle.com/chack3\" target=\"_blank\">@chack3</a> , how to find ur original notebook 4th place training and inference, it is public then share link with me, i am building cutoom solution for my action classification use case?</p>",
      "rawMarkdown": "Hi @chack3 , how to find ur original notebook 4th place training and inference, it is public then share link with me, i am building cutoom solution for my action classification use case?"
    },
    {
      "id": 1993251,
      "postDate": "2022-10-18T08:11:53.960Z",
      "content": "<p>What a wonderful achievement👍. I have learn something new from your post.</p>",
      "rawMarkdown": "What a wonderful achievement👍. I have learn something new from your post."
    }
  ],
  "complete": true,
  "source": "live",
  "fetched_at": "2026-10-22T08:53:48Z",
  "competition_id": 37244,
  "competition_slug": "dfl-bundesliga-data-shootout",
  "team_id": 8957311,
  "solution_url": "/competitions/dfl-bundesliga-data-shootout/writeups/ohkawa3-public-5th-place-solution"
}