{
  "id": 307760,
  "title": "2nd Solution - YOLOv5",
  "url": "/competitions/tensorflow-great-barrier-reef/discussion/307760",
  "author_name": "Chenglu",
  "post_date": "2022-02-15T14:28:53.860000",
  "votes": 116,
  "comment_count": 35,
  "views": 0,
  "content": "<p>Thanks Kaggle for hosting this interesting competition, and thanks my teammates for all of the efforts. Also it's my first detection competition so thanks the community for all the knowledge. </p>\n<p>Like the solution title, there are nothing fancy in our solution : )</p>\n<p>Training code: <a href=\"https://github.com/louis-she/reef-solution\" target=\"_blank\">https://github.com/louis-she/reef-solution</a><br>\nInference: <a href=\"https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527\" target=\"_blank\">https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527</a></p>\n<p><strong>summary</strong></p>\n<p>Our solution is totally based on YOLOv5, I think there are three keys of this competition, <strong>train/val split</strong>, <strong>resolution</strong> and <strong>luck</strong>.</p>\n<p><strong>split - by video_id</strong></p>\n<p>In the early of this competition, we saw that there is a very solid way to split the dataset called \"subsequence\". After some submissions, the LB is not stable enough, so in the end we use video_id 3 fold split, because in that time, we guess that the LB and private maybe totally different video sequences, besides, score of the CV is now almost positive correlation with the LB.</p>\n<p><strong>preprocessing - rotation is the key</strong></p>\n<p>augmentations that works, inherited from YOLOv5 default augmentation, we added:</p>\n<ul>\n<li>mosaic prob@0.25</li>\n<li>mixup prob@0.25</li>\n<li>random rotate90</li>\n</ul>\n<p>the random rotate90 will boost ~0.02 with both CV and LB, and it also benefits ensembling with different rotation.</p>\n<p><strong>training</strong></p>\n<ul>\n<li>larger model works better</li>\n</ul>\n<p>the diversity of YOLOv5 s/m/l/x is not very large, so we only use YOLOv5l6 model, for speed and performance balancing.</p>\n<ul>\n<li>training with images that has ground truth only</li>\n</ul>\n<p>From YOLOv5 documentation, training with 10% background will produce the best results, but from our experiments, 0% background produce the best results.</p>\n<ul>\n<li>multiscaling +- 50%</li>\n</ul>\n<p>The YOLOv5 has builtin multiscaling switch, from what i know, scaling matters a lot in detection especially for anchor based detection methods, so we just enable it.</p>\n<p><strong>postprocessing/tracking</strong></p>\n<p>postprocessing is focusing on tracking. Instead of using existing tracking methods (which is not working), we use a more simple method, which I called \"attention area\". It is working as follows:</p>\n<ol>\n<li>the model has predicted some boxes B at N frame</li>\n<li>select the boxes from B which has a high confidence( larger than a threshold T ), these boxes are marked as \"attention area\"</li>\n<li>in the N + 1 frame, all the predicted boxes (not actually all, but confidence threshold &gt; 0.01), if it has an IoU with the \"attention area\" larger than 0.5, boost the score of these boxes with S, then do the confidence filtering.<br>\nThe T=0.15 and S=0.1 is a solid choice, this method boost both CV and LB by ~ 0.01.</li>\n</ol>\n<p><strong>ensembling</strong></p>\n<p>after <a href=\"https://www.kaggle.com/sheep\" target=\"_blank\">@sheep</a> release the high resolution trick, we know that one model inference with different resolution will have a huge difference, from our experiments, single model trained with 2400 resolution and inference with 4800 resolution will get the highest LB ~ 0.73, we should be careful here, cause the CV is not true.</p>\n<table>\n<thead>\n<tr>\n<th>training resolution</th>\n<th>inference resolution</th>\n<th>mean OOF F2</th>\n<th>LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>2400</td>\n<td>1280</td>\n<td>0.4384</td>\n<td>-</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>1800</td>\n<td>0.6342</td>\n<td>-</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>2400</td>\n<td>0.6865</td>\n<td>~0.6</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>3200</td>\n<td>0.6597</td>\n<td>-</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>4000</td>\n<td>0.5402</td>\n<td>-</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>4800</td>\n<td>0.3925</td>\n<td>0.730</td>\n</tr>\n</tbody>\n</table>\n<p>And also, train with different resolution will also give different results.</p>\n<table>\n<thead>\n<tr>\n<th>training resolution</th>\n<th>inference resolution</th>\n<th>mean OOF F2</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1280</td>\n<td>1280</td>\n<td>0.62</td>\n</tr>\n<tr>\n<td>1800</td>\n<td>1800</td>\n<td>0.6685</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>2400</td>\n<td>0.6865</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>3200</td>\n<td>0.6976</td>\n</tr>\n</tbody>\n</table>\n<p>all the evidences show that resolution matters a lot, high resolution benefit LB, but not CV, we are not sure if the private dataset has the same distribution as the LB, or just part of it, so chosing the selections is hard, luckly this time we got 4 chances. Another observation is that ensembling model numbers will benefit WBF, so we decide to take the total 9 hours inference quota as much as we can.  Our winner solution, private 0.737 public 0.648,  is ensembled of the following models/resolutions, 4 models inference with 11 resolutions: </p>\n<table>\n<thead>\n<tr>\n<th>train resolution</th>\n<th>inference resolution</th>\n<th>transform</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1280</td>\n<td>1800</td>\n<td>-</td>\n</tr>\n<tr>\n<td>1800</td>\n<td>1800</td>\n<td>-</td>\n</tr>\n<tr>\n<td>1800</td>\n<td>2000</td>\n<td>rotate 90</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>2400</td>\n<td>-</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>2600</td>\n<td>rotate 180</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>2800</td>\n<td>rotate 90</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>3200</td>\n<td>-</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>3200</td>\n<td>rotate 270</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>3400</td>\n<td>-</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>3600</td>\n<td>rotate 180</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>4000</td>\n<td>rotate 90</td>\n</tr>\n</tbody>\n</table>\n<p>Thanks for reading, 元宵节快乐。</p>",
  "messages": [
    {
      "id": 1691642,
      "postDate": "2022-02-15T14:28:53.860Z",
      "content": "<p>Thanks Kaggle for hosting this interesting competition, and thanks my teammates for all of the efforts. Also it's my first detection competition so thanks the community for all the knowledge. </p>\n<p>Like the solution title, there are nothing fancy in our solution : )</p>\n<p>Training code: <a href=\"https://github.com/louis-she/reef-solution\" target=\"_blank\">https://github.com/louis-she/reef-solution</a><br>\nInference: <a href=\"https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527\" target=\"_blank\">https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527</a></p>\n<p><strong>summary</strong></p>\n<p>Our solution is totally based on YOLOv5, I think there are three keys of this competition, <strong>train/val split</strong>, <strong>resolution</strong> and <strong>luck</strong>.</p>\n<p><strong>split - by video_id</strong></p>\n<p>In the early of this competition, we saw that there is a very solid way to split the dataset called \"subsequence\". After some submissions, the LB is not stable enough, so in the end we use video_id 3 fold split, because in that time, we guess that the LB and private maybe totally different video sequences, besides, score of the CV is now almost positive correlation with the LB.</p>\n<p><strong>preprocessing - rotation is the key</strong></p>\n<p>augmentations that works, inherited from YOLOv5 default augmentation, we added:</p>\n<ul>\n<li>mosaic prob@0.25</li>\n<li>mixup prob@0.25</li>\n<li>random rotate90</li>\n</ul>\n<p>the random rotate90 will boost ~0.02 with both CV and LB, and it also benefits ensembling with different rotation.</p>\n<p><strong>training</strong></p>\n<ul>\n<li>larger model works better</li>\n</ul>\n<p>the diversity of YOLOv5 s/m/l/x is not very large, so we only use YOLOv5l6 model, for speed and performance balancing.</p>\n<ul>\n<li>training with images that has ground truth only</li>\n</ul>\n<p>From YOLOv5 documentation, training with 10% background will produce the best results, but from our experiments, 0% background produce the best results.</p>\n<ul>\n<li>multiscaling +- 50%</li>\n</ul>\n<p>The YOLOv5 has builtin multiscaling switch, from what i know, scaling matters a lot in detection especially for anchor based detection methods, so we just enable it.</p>\n<p><strong>postprocessing/tracking</strong></p>\n<p>postprocessing is focusing on tracking. Instead of using existing tracking methods (which is not working), we use a more simple method, which I called \"attention area\". It is working as follows:</p>\n<ol>\n<li>the model has predicted some boxes B at N frame</li>\n<li>select the boxes from B which has a high confidence( larger than a threshold T ), these boxes are marked as \"attention area\"</li>\n<li>in the N + 1 frame, all the predicted boxes (not actually all, but confidence threshold &gt; 0.01), if it has an IoU with the \"attention area\" larger than 0.5, boost the score of these boxes with S, then do the confidence filtering.<br>\nThe T=0.15 and S=0.1 is a solid choice, this method boost both CV and LB by ~ 0.01.</li>\n</ol>\n<p><strong>ensembling</strong></p>\n<p>after <a href=\"https://www.kaggle.com/sheep\" target=\"_blank\">@sheep</a> release the high resolution trick, we know that one model inference with different resolution will have a huge difference, from our experiments, single model trained with 2400 resolution and inference with 4800 resolution will get the highest LB ~ 0.73, we should be careful here, cause the CV is not true.</p>\n<table>\n<thead>\n<tr>\n<th>training resolution</th>\n<th>inference resolution</th>\n<th>mean OOF F2</th>\n<th>LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>2400</td>\n<td>1280</td>\n<td>0.4384</td>\n<td>-</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>1800</td>\n<td>0.6342</td>\n<td>-</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>2400</td>\n<td>0.6865</td>\n<td>~0.6</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>3200</td>\n<td>0.6597</td>\n<td>-</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>4000</td>\n<td>0.5402</td>\n<td>-</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>4800</td>\n<td>0.3925</td>\n<td>0.730</td>\n</tr>\n</tbody>\n</table>\n<p>And also, train with different resolution will also give different results.</p>\n<table>\n<thead>\n<tr>\n<th>training resolution</th>\n<th>inference resolution</th>\n<th>mean OOF F2</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1280</td>\n<td>1280</td>\n<td>0.62</td>\n</tr>\n<tr>\n<td>1800</td>\n<td>1800</td>\n<td>0.6685</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>2400</td>\n<td>0.6865</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>3200</td>\n<td>0.6976</td>\n</tr>\n</tbody>\n</table>\n<p>all the evidences show that resolution matters a lot, high resolution benefit LB, but not CV, we are not sure if the private dataset has the same distribution as the LB, or just part of it, so chosing the selections is hard, luckly this time we got 4 chances. Another observation is that ensembling model numbers will benefit WBF, so we decide to take the total 9 hours inference quota as much as we can.  Our winner solution, private 0.737 public 0.648,  is ensembled of the following models/resolutions, 4 models inference with 11 resolutions: </p>\n<table>\n<thead>\n<tr>\n<th>train resolution</th>\n<th>inference resolution</th>\n<th>transform</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1280</td>\n<td>1800</td>\n<td>-</td>\n</tr>\n<tr>\n<td>1800</td>\n<td>1800</td>\n<td>-</td>\n</tr>\n<tr>\n<td>1800</td>\n<td>2000</td>\n<td>rotate 90</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>2400</td>\n<td>-</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>2600</td>\n<td>rotate 180</td>\n</tr>\n<tr>\n<td>2400</td>\n<td>2800</td>\n<td>rotate 90</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>3200</td>\n<td>-</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>3200</td>\n<td>rotate 270</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>3400</td>\n<td>-</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>3600</td>\n<td>rotate 180</td>\n</tr>\n<tr>\n<td>3200</td>\n<td>4000</td>\n<td>rotate 90</td>\n</tr>\n</tbody>\n</table>\n<p>Thanks for reading, 元宵节快乐。</p>",
      "rawMarkdown": "Thanks Kaggle for hosting this interesting competition, and thanks my teammates for all of the efforts. Also it's my first detection competition so thanks the community for all the knowledge. \n\nLike the solution title, there are nothing fancy in our solution : )\n\nTraining code: https://github.com/louis-she/reef-solution\nInference: https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527\n\n**summary**\n\nOur solution is totally based on YOLOv5, I think there are three keys of this competition, **train/val split**, **resolution** and **luck**.\n\n**split - by video_id**\n\nIn the early of this competition, we saw that there is a very solid way to split the dataset called \"subsequence\". After some submissions, the LB is not stable enough, so in the end we use video_id 3 fold split, because in that time, we guess that the LB and private maybe totally different video sequences, besides, score of the CV is now almost positive correlation with the LB.\n\n**preprocessing - rotation is the key**\n\naugmentations that works, inherited from YOLOv5 default augmentation, we added:\n\n* mosaic prob@0.25\n* mixup prob@0.25\n* random rotate90\n\nthe random rotate90 will boost ~0.02 with both CV and LB, and it also benefits ensembling with different rotation.\n\n**training**\n\n* larger model works better\n\nthe diversity of YOLOv5 s/m/l/x is not very large, so we only use YOLOv5l6 model, for speed and performance balancing.\n\n* training with images that has ground truth only\n\nFrom YOLOv5 documentation, training with 10% background will produce the best results, but from our experiments, 0% background produce the best results.\n\n* multiscaling +- 50%\n\nThe YOLOv5 has builtin multiscaling switch, from what i know, scaling matters a lot in detection especially for anchor based detection methods, so we just enable it.\n\n**postprocessing/tracking**\n\npostprocessing is focusing on tracking. Instead of using existing tracking methods (which is not working), we use a more simple method, which I called \"attention area\". It is working as follows:\n1. the model has predicted some boxes B at N frame\n2. select the boxes from B which has a high confidence( larger than a threshold T ), these boxes are marked as \"attention area\"\n3. in the N + 1 frame, all the predicted boxes (not actually all, but confidence threshold > 0.01), if it has an IoU with the \"attention area\" larger than 0.5, boost the score of these boxes with S, then do the confidence filtering.\nThe T=0.15 and S=0.1 is a solid choice, this method boost both CV and LB by ~ 0.01.\n\n**ensembling**\n\nafter @sheep release the high resolution trick, we know that one model inference with different resolution will have a huge difference, from our experiments, single model trained with 2400 resolution and inference with 4800 resolution will get the highest LB ~ 0.73, we should be careful here, cause the CV is not true.\n\n| training resolution | inference resolution | mean OOF F2 | LB |\n| --- | --- | ---- | ---- |\n| 2400 | 1280  | 0.4384 | - |\n| 2400 | 1800  | 0.6342 | - |\n| 2400 | 2400  | 0.6865 | ~0.6 |\n| 2400 | 3200  | 0.6597 | - |\n| 2400 | 4000  | 0.5402 | - |\n| 2400 | 4800  | 0.3925 | 0.730 |\n\nAnd also, train with different resolution will also give different results.\n\n|training resolution |\tinference resolution |\tmean OOF F2 |\n| ---- | ---- | ---- |\n| 1280 | 1280 | 0.62 |\n| 1800 | 1800 | 0.6685 |\n| 2400 | 2400 | 0.6865 |\n| 3200 | 3200 | 0.6976 |\n\nall the evidences show that resolution matters a lot, high resolution benefit LB, but not CV, we are not sure if the private dataset has the same distribution as the LB, or just part of it, so chosing the selections is hard, luckly this time we got 4 chances. Another observation is that ensembling model numbers will benefit WBF, so we decide to take the total 9 hours inference quota as much as we can.  Our winner solution, private 0.737 public 0.648,  is ensembled of the following models/resolutions, 4 models inference with 11 resolutions: \n\n| train resolution\t| inference resolution\t| transform |\n| ---- | ---- | ---- |\n|1280|\t1800|\t- |\n|1800|\t1800|\t- |\n|1800|\t2000|\trotate 90 |\n|2400|\t2400|\t- |\n|2400|\t2600|\trotate 180 |\n|2400|\t2800|\trotate 90 |\n|3200|\t3200|\t- |\n|3200|\t3200|\trotate 270 |\n|3200|\t3400|\t- |\n|3200|\t3600|\trotate 180 |\n|3200|\t4000|\trotate 90 |\n\nThanks for reading, 元宵节快乐。",
      "votes": 116
    },
    {
      "id": 1698223,
      "postDate": "2022-02-20T08:12:53.890Z",
      "content": "<p>FYI, I just released the training code.</p>\n<p>Train: <a href=\"https://github.com/louis-she/reef-solution\" target=\"_blank\">https://github.com/louis-she/reef-solution</a><br>\nInference: <a href=\"https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527\" target=\"_blank\">https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527</a></p>",
      "rawMarkdown": "FYI, I just released the training code.\n\nTrain: https://github.com/louis-she/reef-solution\nInference: https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527",
      "votes": 7,
      "replies": [
        {
          "id": 1708222,
          "postDate": "2022-03-01T08:49:55.540Z",
          "rawMarkdown": "",
          "isDeleted": true
        },
        {
          "id": 1711549,
          "postDate": "2022-03-04T05:19:30.877Z",
          "content": "<p>Thank you at first, and got a question here. I tried to reproduce your solution and find out the patric sequence splitor(efficient b0) is not included in the train repo. Would you mind showing more details about it? Sorry if it it a much too easy question for someone in this industry and thanks again.</p>",
          "rawMarkdown": "Thank you at first, and got a question here. I tried to reproduce your solution and find out the patric sequence splitor(efficient b0) is not included in the train repo. Would you mind showing more details about it? Sorry if it it a much too easy question for someone in this industry and thanks again."
        },
        {
          "id": 1717672,
          "postDate": "2022-03-10T05:51:01.013Z",
          "content": "<p>Sorry for the late reply, I have already made that dataset public.</p>\n<p>The splitor here is used to detect when it is a new sequence.</p>",
          "rawMarkdown": "Sorry for the late reply, I have already made that dataset public.\n\nThe splitor here is used to detect when it is a new sequence."
        }
      ]
    },
    {
      "id": 1696816,
      "postDate": "2022-02-19T06:02:46.247Z",
      "content": "<p>Congratulations!</p>",
      "rawMarkdown": "Congratulations!",
      "votes": 1
    },
    {
      "id": 1695434,
      "postDate": "2022-02-18T06:31:59.117Z",
      "content": "<p>Congratulations. <br>\nMay I ask that in <strong>postprocessing</strong> time, does boosting the score with S means boosting the confidence that is inferred by the model? Thanks in advance.</p>",
      "rawMarkdown": "Congratulations. \nMay I ask that in **postprocessing** time, does boosting the score with S means boosting the confidence that is inferred by the model? Thanks in advance.",
      "votes": 1,
      "replies": [
        {
          "id": 1695601,
          "postDate": "2022-02-18T08:45:17.330Z",
          "content": "<p>yes, just add S to the confidence of boxes that in the \"attention area\"</p>",
          "rawMarkdown": "yes, just add S to the confidence of boxes that in the \"attention area\""
        }
      ]
    },
    {
      "id": 1695216,
      "postDate": "2022-02-18T02:49:44.603Z",
      "content": "<p>Congratulations! </p>",
      "rawMarkdown": "Congratulations! ",
      "votes": 1
    },
    {
      "id": 1694406,
      "postDate": "2022-02-17T12:09:05.703Z",
      "content": "<p>I would like to know how many epochs did you train locally to converge</p>",
      "rawMarkdown": "I would like to know how many epochs did you train locally to converge",
      "votes": 1,
      "replies": [
        {
          "id": 1694436,
          "postDate": "2022-02-17T12:33:31.037Z",
          "content": "<p>13 epochs.</p>",
          "rawMarkdown": "13 epochs.",
          "votes": 1
        },
        {
          "id": 1695179,
          "postDate": "2022-02-18T02:10:40.873Z",
          "content": "<p>Ok, thanks</p>",
          "rawMarkdown": "Ok, thanks"
        }
      ]
    },
    {
      "id": 1693833,
      "postDate": "2022-02-17T01:45:33.300Z",
      "content": "<p>Thanks for the solution, and congratulation on the second rank. <br>\nI am just wondering whether you also used samples that only have bounding boxes for your oof evaluation or included images that have no BBs. I experienced way much higher CV scores (e.g., 3fold avg 0.79 at 1800 img sz, same 3fold video split) only with BBs but looking at your oof score, you have 0.6685. I think it's more making sense to add w/ and w/o BBs into the evaluation since we do care about not only TP but FN and FP? or maybe I missed something..</p>",
      "rawMarkdown": "Thanks for the solution, and congratulation on the second rank. \nI am just wondering whether you also used samples that only have bounding boxes for your oof evaluation or included images that have no BBs. I experienced way much higher CV scores (e.g., 3fold avg 0.79 at 1800 img sz, same 3fold video split) only with BBs but looking at your oof score, you have 0.6685. I think it's more making sense to add w/ and w/o BBs into the evaluation since we do care about not only TP but FN and FP? or maybe I missed something..",
      "votes": 1,
      "replies": [
        {
          "id": 1693962,
          "postDate": "2022-02-17T04:55:59.430Z",
          "content": "<p>The evaluation was always on all the dataset ( include the ones without boxes ). Do not only evaluate on samples with bounding box only, it is not correct.</p>",
          "rawMarkdown": "The evaluation was always on all the dataset ( include the ones without boxes ). Do not only evaluate on samples with bounding box only, it is not correct.",
          "votes": 1
        }
      ]
    },
    {
      "id": 1693046,
      "postDate": "2022-02-16T12:09:17.827Z",
      "content": "<p>Congrats on 2nd place! Your tracking method is very similar to sequential non max suppression right?</p>",
      "rawMarkdown": "Congrats on 2nd place! Your tracking method is very similar to sequential non max suppression right?",
      "votes": 1,
      "replies": [
        {
          "id": 1693961,
          "postDate": "2022-02-17T04:55:03.280Z",
          "content": "<p>I do not heard about sequential non max suppression. Understanding from the name, i do not think it's NMS. NMS is \"suppres\" score, drop box, this tracking method is boost score, and try to keep box.</p>",
          "rawMarkdown": "I do not heard about sequential non max suppression. Understanding from the name, i do not think it's NMS. NMS is \"suppres\" score, drop box, this tracking method is boost score, and try to keep box.",
          "votes": 2
        },
        {
          "id": 1694359,
          "postDate": "2022-02-17T11:20:40.030Z",
          "content": "<p>I was thinking more of the sequential part of sequential non max suppression since it matches bboxes across frames with a certain IOU threshold and boosts their score during the nms phase rather than after predicting. </p>",
          "rawMarkdown": "I was thinking more of the sequential part of sequential non max suppression since it matches bboxes across frames with a certain IOU threshold and boosts their score during the nms phase rather than after predicting. "
        }
      ]
    },
    {
      "id": 1692518,
      "postDate": "2022-02-16T05:00:02.563Z",
      "content": "<p>Hey <a href=\"https://www.kaggle.com/snaker\" target=\"_blank\">@snaker</a> , great work!</p>\n<p>Can I ask for what method you used to tune your hparams/augmentations? I'm pretty new to Kaggle, and I didn't have enough time to run yolov5's integrated wandb sweeps.</p>",
      "rawMarkdown": "Hey @snaker , great work!\n\nCan I ask for what method you used to tune your hparams/augmentations? I'm pretty new to Kaggle, and I didn't have enough time to run yolov5's integrated wandb sweeps.",
      "votes": 1,
      "replies": [
        {
          "id": 1692572,
          "postDate": "2022-02-16T05:51:25.733Z",
          "content": "<p>yolov5 integrated with wandb by default, you just need to install wandb and everything is out of box.<br>\nfor augmentations, i use albumentations.</p>",
          "rawMarkdown": "yolov5 integrated with wandb by default, you just need to install wandb and everything is out of box.\nfor augmentations, i use albumentations."
        },
        {
          "id": 1692925,
          "postDate": "2022-02-16T10:50:51.473Z",
          "content": "<p>yeah it will be great to know, how people from the top tune their hyperparams, did you folks used the <code>--evolve</code> of ultralytics yolov5, or manually or some other tool. </p>",
          "rawMarkdown": "yeah it will be great to know, how people from the top tune their hyperparams, did you folks used the `--evolve` of ultralytics yolov5, or manually or some other tool. "
        },
        {
          "id": 1693957,
          "postDate": "2022-02-17T04:50:39.587Z",
          "content": "<p>I do it manually.</p>",
          "rawMarkdown": "I do it manually.",
          "votes": 1
        }
      ]
    },
    {
      "id": 1691847,
      "postDate": "2022-02-15T16:41:08.953Z",
      "content": "<p>Congratulations! Your rigorous experiment impressed me! 元宵节快乐.</p>",
      "rawMarkdown": "Congratulations! Your rigorous experiment impressed me! 元宵节快乐.",
      "votes": 1
    },
    {
      "id": 1691814,
      "postDate": "2022-02-15T16:18:50.580Z",
      "content": "<p>Congratulations <a href=\"https://www.kaggle.com/snaker\" target=\"_blank\">@snaker</a> ! and thank you for sharing your solution.<br>\nCan you please explain <code>multiscaling +- 50%</code>, I did not understand that part. thank you</p>",
      "rawMarkdown": "Congratulations @snaker ! and thank you for sharing your solution.\nCan you please explain `multiscaling +- 50%`, I did not understand that part. thank you",
      "votes": 1,
      "replies": [
        {
          "id": 1692338,
          "postDate": "2022-02-16T01:30:26.660Z",
          "content": "<p><a href=\"https://github.com/ultralytics/yolov5/blob/master/train.py#L472\" target=\"_blank\">https://github.com/ultralytics/yolov5/blob/master/train.py#L472</a></p>",
          "rawMarkdown": "https://github.com/ultralytics/yolov5/blob/master/train.py#L472",
          "votes": 1
        },
        {
          "id": 1692416,
          "postDate": "2022-02-16T02:52:42.373Z",
          "rawMarkdown": "",
          "isDeleted": true
        }
      ]
    },
    {
      "id": 1691793,
      "postDate": "2022-02-15T16:01:58.400Z",
      "content": "<p>excellent idea using YOLOv5!</p>",
      "rawMarkdown": "excellent idea using YOLOv5!",
      "votes": 1
    },
    {
      "id": 1691763,
      "postDate": "2022-02-15T15:38:34.717Z",
      "content": "<p>a very clever and simple way to think about the solution. well done!</p>",
      "rawMarkdown": "a very clever and simple way to think about the solution. well done!",
      "votes": 1
    },
    {
      "id": 1691739,
      "postDate": "2022-02-15T15:25:01.947Z",
      "content": "<p>Attention area …. such simple and great idea! Brilliant! Thank you! Learned a lot from this description. Congratulations!</p>",
      "rawMarkdown": "Attention area .... such simple and great idea! Brilliant! Thank you! Learned a lot from this description. Congratulations!",
      "votes": 1
    },
    {
      "id": 1691719,
      "postDate": "2022-02-15T15:12:18.143Z",
      "content": "<p>Congratulations!  Simple but much more efficiently track method.   元宵节快乐 </p>",
      "rawMarkdown": "Congratulations!  Simple but much more efficiently track method.   元宵节快乐 ",
      "votes": 1
    },
    {
      "id": 1692459,
      "postDate": "2022-02-16T03:51:10.243Z",
      "content": "<p>Cheers! 元宵节快乐!</p>",
      "rawMarkdown": "Cheers! 元宵节快乐!",
      "votes": 2
    },
    {
      "id": 1692254,
      "postDate": "2022-02-15T23:32:53.527Z",
      "content": "<p>Thanks for the rundown. Very clear and informatve. And congratulations on the gold medal!</p>",
      "rawMarkdown": "Thanks for the rundown. Very clear and informatve. And congratulations on the gold medal!",
      "votes": 2
    },
    {
      "id": 1691762,
      "postDate": "2022-02-15T15:38:25.567Z",
      "content": "<p>Congratulations! 元宵节快乐:)</p>",
      "rawMarkdown": "Congratulations! 元宵节快乐:)",
      "votes": 2
    },
    {
      "id": 1695697,
      "postDate": "2022-02-18T10:20:34.170Z",
      "content": "<p>Congratulations🤩🤩Thanks for sharing your code <a href=\"https://www.kaggle.com/snaker\" target=\"_blank\">@snaker</a> , new follower 🙋‍♀️😊</p>",
      "rawMarkdown": "Congratulations🤩🤩Thanks for sharing your code @snaker , new follower 🙋‍♀️😊\n"
    },
    {
      "id": 2912693,
      "postDate": "2024-07-09T03:18:49.853Z",
      "content": "<p>Hi,How do you rotate 90 in yolov5?</p>",
      "rawMarkdown": "Hi,How do you rotate 90 in yolov5?"
    },
    {
      "id": 1750736,
      "postDate": "2022-04-10T03:02:56.503Z",
      "content": "<p>Thanks for your sharing, but i have a problem, in run.sh the hyp is ./configs/default.yaml, can you tell me where it comes from? sorry  i'm a novice， thanks again.</p>",
      "rawMarkdown": "Thanks for your sharing, but i have a problem, in run.sh the hyp is ./configs/default.yaml, can you tell me where it comes from? sorry  i'm a novice， thanks again."
    },
    {
      "id": 1696854,
      "postDate": "2022-02-19T06:40:06.437Z",
      "content": "<p>Thanks for sharing</p>",
      "rawMarkdown": "Thanks for sharing",
      "votes": 1
    }
  ],
  "comments": [
    {
      "id": 1698223,
      "author_name": "Chenglu",
      "author_url": "",
      "post_date": "2022-02-20T08:12:53.890000",
      "content": "<p>FYI, I just released the training code.</p>\n<p>Train: <a href=\"https://github.com/louis-she/reef-solution\" target=\"_blank\">https://github.com/louis-she/reef-solution</a><br>\nInference: <a href=\"https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527\" target=\"_blank\">https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527</a></p>",
      "votes": 7,
      "replies": [
        {
          "id": 1708222,
          "author_name": "",
          "author_url": "",
          "post_date": "2022-03-01T08:49:55.540000",
          "content": "",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1711549,
          "author_name": "Lainey",
          "author_url": "",
          "post_date": "2022-03-04T05:19:30.877000",
          "content": "<p>Thank you at first, and got a question here. I tried to reproduce your solution and find out the patric sequence splitor(efficient b0) is not included in the train repo. Would you mind showing more details about it? Sorry if it it a much too easy question for someone in this industry and thanks again.</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1717672,
          "author_name": "Chenglu",
          "author_url": "",
          "post_date": "2022-03-10T05:51:01.013000",
          "content": "<p>Sorry for the late reply, I have already made that dataset public.</p>\n<p>The splitor here is used to detect when it is a new sequence.</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1696816,
      "author_name": "gaobowen",
      "author_url": "",
      "post_date": "2022-02-19T06:02:46.247000",
      "content": "<p>Congratulations!</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1695434,
      "author_name": "Owen Xing",
      "author_url": "",
      "post_date": "2022-02-18T06:31:59.117000",
      "content": "<p>Congratulations. <br>\nMay I ask that in <strong>postprocessing</strong> time, does boosting the score with S means boosting the confidence that is inferred by the model? Thanks in advance.</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1695601,
          "author_name": "Chenglu",
          "author_url": "",
          "post_date": "2022-02-18T08:45:17.330000",
          "content": "<p>yes, just add S to the confidence of boxes that in the \"attention area\"</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1695216,
      "author_name": "栾鹏龙",
      "author_url": "",
      "post_date": "2022-02-18T02:49:44.603000",
      "content": "<p>Congratulations! </p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1694406,
      "author_name": "ljh528",
      "author_url": "",
      "post_date": "2022-02-17T12:09:05.703000",
      "content": "<p>I would like to know how many epochs did you train locally to converge</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1694436,
          "author_name": "Chenglu",
          "author_url": "",
          "post_date": "2022-02-17T12:33:31.037000",
          "content": "<p>13 epochs.</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 1695179,
          "author_name": "ljh528",
          "author_url": "",
          "post_date": "2022-02-18T02:10:40.873000",
          "content": "<p>Ok, thanks</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1693833,
      "author_name": "enddl22",
      "author_url": "",
      "post_date": "2022-02-17T01:45:33.300000",
      "content": "<p>Thanks for the solution, and congratulation on the second rank. <br>\nI am just wondering whether you also used samples that only have bounding boxes for your oof evaluation or included images that have no BBs. I experienced way much higher CV scores (e.g., 3fold avg 0.79 at 1800 img sz, same 3fold video split) only with BBs but looking at your oof score, you have 0.6685. I think it's more making sense to add w/ and w/o BBs into the evaluation since we do care about not only TP but FN and FP? or maybe I missed something..</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1693962,
          "author_name": "Chenglu",
          "author_url": "",
          "post_date": "2022-02-17T04:55:59.430000",
          "content": "<p>The evaluation was always on all the dataset ( include the ones without boxes ). Do not only evaluate on samples with bounding box only, it is not correct.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1693046,
      "author_name": "Ari",
      "author_url": "",
      "post_date": "2022-02-16T12:09:17.827000",
      "content": "<p>Congrats on 2nd place! Your tracking method is very similar to sequential non max suppression right?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1693961,
          "author_name": "Chenglu",
          "author_url": "",
          "post_date": "2022-02-17T04:55:03.280000",
          "content": "<p>I do not heard about sequential non max suppression. Understanding from the name, i do not think it's NMS. NMS is \"suppres\" score, drop box, this tracking method is boost score, and try to keep box.</p>",
          "votes": 2,
          "replies": []
        },
        {
          "id": 1694359,
          "author_name": "Ari",
          "author_url": "",
          "post_date": "2022-02-17T11:20:40.030000",
          "content": "<p>I was thinking more of the sequential part of sequential non max suppression since it matches bboxes across frames with a certain IOU threshold and boosts their score during the nms phase rather than after predicting. </p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1692518,
      "author_name": "aquaright",
      "author_url": "",
      "post_date": "2022-02-16T05:00:02.563000",
      "content": "<p>Hey <a href=\"https://www.kaggle.com/snaker\" target=\"_blank\">@snaker</a> , great work!</p>\n<p>Can I ask for what method you used to tune your hparams/augmentations? I'm pretty new to Kaggle, and I didn't have enough time to run yolov5's integrated wandb sweeps.</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1692572,
          "author_name": "Chenglu",
          "author_url": "",
          "post_date": "2022-02-16T05:51:25.733000",
          "content": "<p>yolov5 integrated with wandb by default, you just need to install wandb and everything is out of box.<br>\nfor augmentations, i use albumentations.</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1692925,
          "author_name": "somuSan",
          "author_url": "",
          "post_date": "2022-02-16T10:50:51.473000",
          "content": "<p>yeah it will be great to know, how people from the top tune their hyperparams, did you folks used the <code>--evolve</code> of ultralytics yolov5, or manually or some other tool. </p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 1693957,
          "author_name": "Chenglu",
          "author_url": "",
          "post_date": "2022-02-17T04:50:39.587000",
          "content": "<p>I do it manually.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1691847,
      "author_name": "Good Moon",
      "author_url": "",
      "post_date": "2022-02-15T16:41:08.953000",
      "content": "<p>Congratulations! Your rigorous experiment impressed me! 元宵节快乐.</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1691814,
      "author_name": "somuSan",
      "author_url": "",
      "post_date": "2022-02-15T16:18:50.580000",
      "content": "<p>Congratulations <a href=\"https://www.kaggle.com/snaker\" target=\"_blank\">@snaker</a> ! and thank you for sharing your solution.<br>\nCan you please explain <code>multiscaling +- 50%</code>, I did not understand that part. thank you</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1692338,
          "author_name": "Chenglu",
          "author_url": "",
          "post_date": "2022-02-16T01:30:26.660000",
          "content": "<p><a href=\"https://github.com/ultralytics/yolov5/blob/master/train.py#L472\" target=\"_blank\">https://github.com/ultralytics/yolov5/blob/master/train.py#L472</a></p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 1692416,
          "author_name": "",
          "author_url": "",
          "post_date": "2022-02-16T02:52:42.373000",
          "content": "",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1691793,
      "author_name": "Mohinur Abdurahimova",
      "author_url": "",
      "post_date": "2022-02-15T16:01:58.400000",
      "content": "<p>excellent idea using YOLOv5!</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1691763,
      "author_name": "Hoda",
      "author_url": "",
      "post_date": "2022-02-15T15:38:34.717000",
      "content": "<p>a very clever and simple way to think about the solution. well done!</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1691739,
      "author_name": "Remek Kinas",
      "author_url": "",
      "post_date": "2022-02-15T15:25:01.947000",
      "content": "<p>Attention area …. such simple and great idea! Brilliant! Thank you! Learned a lot from this description. Congratulations!</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1691719,
      "author_name": "KKY",
      "author_url": "",
      "post_date": "2022-02-15T15:12:18.143000",
      "content": "<p>Congratulations!  Simple but much more efficiently track method.   元宵节快乐 </p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1692459,
      "author_name": "Qishen Ha",
      "author_url": "",
      "post_date": "2022-02-16T03:51:10.243000",
      "content": "<p>Cheers! 元宵节快乐!</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 1692254,
      "author_name": "Julián Peller (dataista0)",
      "author_url": "",
      "post_date": "2022-02-15T23:32:53.527000",
      "content": "<p>Thanks for the rundown. Very clear and informatve. And congratulations on the gold medal!</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 1691762,
      "author_name": "sheep",
      "author_url": "",
      "post_date": "2022-02-15T15:38:25.567000",
      "content": "<p>Congratulations! 元宵节快乐:)</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 1695697,
      "author_name": "Aruna S",
      "author_url": "",
      "post_date": "2022-02-18T10:20:34.170000",
      "content": "<p>Congratulations🤩🤩Thanks for sharing your code <a href=\"https://www.kaggle.com/snaker\" target=\"_blank\">@snaker</a> , new follower 🙋‍♀️😊</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 2912693,
      "author_name": "murdonson1",
      "author_url": "",
      "post_date": "2024-07-09T03:18:49.853000",
      "content": "<p>Hi,How do you rotate 90 in yolov5?</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1750736,
      "author_name": "cycisOK",
      "author_url": "",
      "post_date": "2022-04-10T03:02:56.503000",
      "content": "<p>Thanks for your sharing, but i have a problem, in run.sh the hyp is ./configs/default.yaml, can you tell me where it comes from? sorry  i'm a novice， thanks again.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 1696854,
      "author_name": "Lee Chong777",
      "author_url": "",
      "post_date": "2022-02-19T06:40:06.437000",
      "content": "<p>Thanks for sharing</p>",
      "votes": 1,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "1691642": "Thanks Kaggle for hosting this interesting competition, and thanks my teammates for all of the efforts. Also it's my first detection competition so thanks the community for all the knowledge. \n\nLike the solution title, there are nothing fancy in our solution : )\n\nTraining code: https://github.com/louis-she/reef-solution\nInference: https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527\n\n**summary**\n\nOur solution is totally based on YOLOv5, I think there are three keys of this competition, **train/val split**, **resolution** and **luck**.\n\n**split - by video_id**\n\nIn the early of this competition, we saw that there is a very solid way to split the dataset called \"subsequence\". After some submissions, the LB is not stable enough, so in the end we use video_id 3 fold split, because in that time, we guess that the LB and private maybe totally different video sequences, besides, score of the CV is now almost positive correlation with the LB.\n\n**preprocessing - rotation is the key**\n\naugmentations that works, inherited from YOLOv5 default augmentation, we added:\n\n* mosaic prob@0.25\n* mixup prob@0.25\n* random rotate90\n\nthe random rotate90 will boost ~0.02 with both CV and LB, and it also benefits ensembling with different rotation.\n\n**training**\n\n* larger model works better\n\nthe diversity of YOLOv5 s/m/l/x is not very large, so we only use YOLOv5l6 model, for speed and performance balancing.\n\n* training with images that has ground truth only\n\nFrom YOLOv5 documentation, training with 10% background will produce the best results, but from our experiments, 0% background produce the best results.\n\n* multiscaling +- 50%\n\nThe YOLOv5 has builtin multiscaling switch, from what i know, scaling matters a lot in detection especially for anchor based detection methods, so we just enable it.\n\n**postprocessing/tracking**\n\npostprocessing is focusing on tracking. Instead of using existing tracking methods (which is not working), we use a more simple method, which I called \"attention area\". It is working as follows:\n1. the model has predicted some boxes B at N frame\n2. select the boxes from B which has a high confidence( larger than a threshold T ), these boxes are marked as \"attention area\"\n3. in the N + 1 frame, all the predicted boxes (not actually all, but confidence threshold > 0.01), if it has an IoU with the \"attention area\" larger than 0.5, boost the score of these boxes with S, then do the confidence filtering.\nThe T=0.15 and S=0.1 is a solid choice, this method boost both CV and LB by ~ 0.01.\n\n**ensembling**\n\nafter @sheep release the high resolution trick, we know that one model inference with different resolution will have a huge difference, from our experiments, single model trained with 2400 resolution and inference with 4800 resolution will get the highest LB ~ 0.73, we should be careful here, cause the CV is not true.\n\n| training resolution | inference resolution | mean OOF F2 | LB |\n| --- | --- | ---- | ---- |\n| 2400 | 1280  | 0.4384 | - |\n| 2400 | 1800  | 0.6342 | - |\n| 2400 | 2400  | 0.6865 | ~0.6 |\n| 2400 | 3200  | 0.6597 | - |\n| 2400 | 4000  | 0.5402 | - |\n| 2400 | 4800  | 0.3925 | 0.730 |\n\nAnd also, train with different resolution will also give different results.\n\n|training resolution |\tinference resolution |\tmean OOF F2 |\n| ---- | ---- | ---- |\n| 1280 | 1280 | 0.62 |\n| 1800 | 1800 | 0.6685 |\n| 2400 | 2400 | 0.6865 |\n| 3200 | 3200 | 0.6976 |\n\nall the evidences show that resolution matters a lot, high resolution benefit LB, but not CV, we are not sure if the private dataset has the same distribution as the LB, or just part of it, so chosing the selections is hard, luckly this time we got 4 chances. Another observation is that ensembling model numbers will benefit WBF, so we decide to take the total 9 hours inference quota as much as we can.  Our winner solution, private 0.737 public 0.648,  is ensembled of the following models/resolutions, 4 models inference with 11 resolutions: \n\n| train resolution\t| inference resolution\t| transform |\n| ---- | ---- | ---- |\n|1280|\t1800|\t- |\n|1800|\t1800|\t- |\n|1800|\t2000|\trotate 90 |\n|2400|\t2400|\t- |\n|2400|\t2600|\trotate 180 |\n|2400|\t2800|\trotate 90 |\n|3200|\t3200|\t- |\n|3200|\t3200|\trotate 270 |\n|3200|\t3400|\t- |\n|3200|\t3600|\trotate 180 |\n|3200|\t4000|\trotate 90 |\n\nThanks for reading, 元宵节快乐。",
    "1698223": "FYI, I just released the training code.\n\nTrain: https://github.com/louis-she/reef-solution\nInference: https://www.kaggle.com/snaker/yolo-ensemle?scriptVersionId=87785527",
    "1696816": "Congratulations!",
    "1695434": "Congratulations. \nMay I ask that in **postprocessing** time, does boosting the score with S means boosting the confidence that is inferred by the model? Thanks in advance.",
    "1695216": "Congratulations! ",
    "1694406": "I would like to know how many epochs did you train locally to converge",
    "1693833": "Thanks for the solution, and congratulation on the second rank. \nI am just wondering whether you also used samples that only have bounding boxes for your oof evaluation or included images that have no BBs. I experienced way much higher CV scores (e.g., 3fold avg 0.79 at 1800 img sz, same 3fold video split) only with BBs but looking at your oof score, you have 0.6685. I think it's more making sense to add w/ and w/o BBs into the evaluation since we do care about not only TP but FN and FP? or maybe I missed something..",
    "1693046": "Congrats on 2nd place! Your tracking method is very similar to sequential non max suppression right?",
    "1692518": "Hey @snaker , great work!\n\nCan I ask for what method you used to tune your hparams/augmentations? I'm pretty new to Kaggle, and I didn't have enough time to run yolov5's integrated wandb sweeps.",
    "1691847": "Congratulations! Your rigorous experiment impressed me! 元宵节快乐.",
    "1691814": "Congratulations @snaker ! and thank you for sharing your solution.\nCan you please explain `multiscaling +- 50%`, I did not understand that part. thank you",
    "1691793": "excellent idea using YOLOv5!",
    "1691763": "a very clever and simple way to think about the solution. well done!",
    "1691739": "Attention area .... such simple and great idea! Brilliant! Thank you! Learned a lot from this description. Congratulations!",
    "1691719": "Congratulations!  Simple but much more efficiently track method.   元宵节快乐 ",
    "1692459": "Cheers! 元宵节快乐!",
    "1692254": "Thanks for the rundown. Very clear and informatve. And congratulations on the gold medal!",
    "1691762": "Congratulations! 元宵节快乐:)",
    "1695697": "Congratulations🤩🤩Thanks for sharing your code @snaker , new follower 🙋‍♀️😊\n",
    "2912693": "Hi,How do you rotate 90 in yolov5?",
    "1750736": "Thanks for your sharing, but i have a problem, in run.sh the hyp is ./configs/default.yaml, can you tell me where it comes from? sorry  i'm a novice， thanks again.",
    "1696854": "Thanks for sharing"
  }
}