{
  "id": 229649,
  "title": "[34th place solution] Single model Yolov5",
  "url": "/competitions/vinbigdata-chest-xray-abnormalities-detection/discussion/229649",
  "author_name": "Phat Tran",
  "post_date": "2021-03-31T04:52:02.312000",
  "votes": 23,
  "comment_count": 13,
  "views": 0,
  "content": "<p>Congratulations to all the winners and special thanks to Vingroup Big Data Institute for organizing a very interesting competition, I have learned a lot from this.</p>\n<p>At the beginning of the competition, I decided to use Retinanet (from <a href=\"https://keras.io/examples/vision/retinanet\" target=\"_blank\">this post</a>) but after almost two months I could not improve my score. I switched to Yolov5 since I notice a promising result from <a href=\"https://www.kaggle.com/awsaf49\" target=\"_blank\">@awsaf49</a> <a href=\"https://www.kaggle.com/awsaf49/vinbigdata-cxr-ad-yolov5-14-class-train\" target=\"_blank\">Yolov5 notebook</a> and the mAP increased significantly (I wish I had realized earlier :)), and then I stick with it.</p>\n<p>My solution is the ensemble of 5 folds Yolov5x (thanks to <a href=\"https://github.com/glenn-jocher\" target=\"_blank\">Glenn Jocher</a>) and uses 2 class filter classifier to remove normal images.</p>\n<h2>Preprocessing</h2>\n<ul>\n<li>Fusion box using WBF with IOU 0.5</li>\n<li>Remove (incorrect) annotations by some data visualization (bar plot) based on: position/width/height/w/h ratio/area of bounding boxes</li>\n<li>I noticed that the bounding boxes of class <code>Calcification</code> is sometimes overlapping with <code>Aortic enlargement</code> in the train data, but my model predicts smaller boxes, So I decided to fix them by using prediction from Retinanet model.</li>\n<li>5 Folds stratified split, use this repo <a href=\"https://github.com/trent-b/iterative-stratification\" target=\"_blank\">https://github.com/trent-b/iterative-stratification</a></li>\n</ul>\n<h2>Detection</h2>\n<ul>\n<li>5 Folds ensemble of YoloV5x (640x640), using provided weight from the repository for initialization</li>\n<li>Config: mostly identical with <a href=\"https://github.com/ultralytics/yolov5/blob/master/data/hyp.scratch.yaml\" target=\"_blank\">hyp.scatch.yaml</a>. But I changed some augmentations as below:<ul>\n<li>Scale: 0.6</li>\n<li>Translate: 0.2</li>\n<li>Degrees and Shear: 0.1 (might be too small)</li>\n<li>Mosaic: 0.7</li></ul></li>\n<li>Besides, I added random intensity [-10 10] inspired by <a href=\"https://www.kaggle.com/zfturbo\" target=\"_blank\">ZFTurbo</a> <a href=\"https://www.kaggle.com/c/google-ai-open-images-object-detection-track/discussion/64633\" target=\"_blank\">post</a>.</li>\n</ul>\n<h2>Classification (2 class filter)</h2>\n<ul>\n<li>I was focusing on improving my detection models and forget about the importance of classification, then I tried to train my own classifier model, the score improve 0.001 on Private data compared to <a href=\"https://www.kaggle.com/awsaf49\" target=\"_blank\">@awsaf49</a> <a href=\"https://www.kaggle.com/awsaf49/vinbigdata-2-class-filter\" target=\"_blank\">result</a></li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>Model</th>\n<th>Public score</th>\n<th>Private score</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Ensemble of 4 folds</td>\n<td>0.279</td>\n<td><strong>0.272</strong></td>\n</tr>\n<tr>\n<td>Awsaf result</td>\n<td><strong>0.281</strong></td>\n<td>0.271</td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li><p>I trained EfficientNetB5 (noisy student) in 4 folds and remove the confusing images based on the difference between prediction and ground truth: If (prediction - ground truth label) &gt; 0.95 then remove (wrong prediction but too high confident)</p></li>\n<li><p>Then I train EfficientB5 again with cleaned data, and the ensemble of 4 folds with AUC score on validation data as below</p></li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>Fold</th>\n<th>AUC</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>0.9935</td>\n</tr>\n<tr>\n<td>1</td>\n<td>0.9929</td>\n</tr>\n<tr>\n<td>2</td>\n<td>0.9927</td>\n</tr>\n<tr>\n<td>3</td>\n<td>0.9930</td>\n</tr>\n</tbody>\n</table>\n<h2>Things that not work</h2>\n<ul>\n<li>Label smoothing for Yolov5: I tried but LB is too bad so I skipped</li>\n<li>VFnet and EfficientDet: worse performance than Yolov5 (probably my config is not good) and take longer time to train</li>\n</ul>\n<p>When the private score is released, I noticed that my score on YoloV5x (preprocessing iou 0.6) perform quite better result on the private score, but very slow score on LB so I skipped this, It would be better if I did ensemble my final prediction based on CV instead of LB :D</p>",
  "messages": [
    {
      "id": 1257760,
      "postDate": "2021-03-31T04:52:02.313Z",
      "content": "<p>Congratulations to all the winners and special thanks to Vingroup Big Data Institute for organizing a very interesting competition, I have learned a lot from this.</p>\n<p>At the beginning of the competition, I decided to use Retinanet (from <a href=\"https://keras.io/examples/vision/retinanet\" target=\"_blank\">this post</a>) but after almost two months I could not improve my score. I switched to Yolov5 since I notice a promising result from <a href=\"https://www.kaggle.com/awsaf49\" target=\"_blank\">@awsaf49</a> <a href=\"https://www.kaggle.com/awsaf49/vinbigdata-cxr-ad-yolov5-14-class-train\" target=\"_blank\">Yolov5 notebook</a> and the mAP increased significantly (I wish I had realized earlier :)), and then I stick with it.</p>\n<p>My solution is the ensemble of 5 folds Yolov5x (thanks to <a href=\"https://github.com/glenn-jocher\" target=\"_blank\">Glenn Jocher</a>) and uses 2 class filter classifier to remove normal images.</p>\n<h2>Preprocessing</h2>\n<ul>\n<li>Fusion box using WBF with IOU 0.5</li>\n<li>Remove (incorrect) annotations by some data visualization (bar plot) based on: position/width/height/w/h ratio/area of bounding boxes</li>\n<li>I noticed that the bounding boxes of class <code>Calcification</code> is sometimes overlapping with <code>Aortic enlargement</code> in the train data, but my model predicts smaller boxes, So I decided to fix them by using prediction from Retinanet model.</li>\n<li>5 Folds stratified split, use this repo <a href=\"https://github.com/trent-b/iterative-stratification\" target=\"_blank\">https://github.com/trent-b/iterative-stratification</a></li>\n</ul>\n<h2>Detection</h2>\n<ul>\n<li>5 Folds ensemble of YoloV5x (640x640), using provided weight from the repository for initialization</li>\n<li>Config: mostly identical with <a href=\"https://github.com/ultralytics/yolov5/blob/master/data/hyp.scratch.yaml\" target=\"_blank\">hyp.scatch.yaml</a>. But I changed some augmentations as below:<ul>\n<li>Scale: 0.6</li>\n<li>Translate: 0.2</li>\n<li>Degrees and Shear: 0.1 (might be too small)</li>\n<li>Mosaic: 0.7</li></ul></li>\n<li>Besides, I added random intensity [-10 10] inspired by <a href=\"https://www.kaggle.com/zfturbo\" target=\"_blank\">ZFTurbo</a> <a href=\"https://www.kaggle.com/c/google-ai-open-images-object-detection-track/discussion/64633\" target=\"_blank\">post</a>.</li>\n</ul>\n<h2>Classification (2 class filter)</h2>\n<ul>\n<li>I was focusing on improving my detection models and forget about the importance of classification, then I tried to train my own classifier model, the score improve 0.001 on Private data compared to <a href=\"https://www.kaggle.com/awsaf49\" target=\"_blank\">@awsaf49</a> <a href=\"https://www.kaggle.com/awsaf49/vinbigdata-2-class-filter\" target=\"_blank\">result</a></li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>Model</th>\n<th>Public score</th>\n<th>Private score</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Ensemble of 4 folds</td>\n<td>0.279</td>\n<td><strong>0.272</strong></td>\n</tr>\n<tr>\n<td>Awsaf result</td>\n<td><strong>0.281</strong></td>\n<td>0.271</td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li><p>I trained EfficientNetB5 (noisy student) in 4 folds and remove the confusing images based on the difference between prediction and ground truth: If (prediction - ground truth label) &gt; 0.95 then remove (wrong prediction but too high confident)</p></li>\n<li><p>Then I train EfficientB5 again with cleaned data, and the ensemble of 4 folds with AUC score on validation data as below</p></li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>Fold</th>\n<th>AUC</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>0.9935</td>\n</tr>\n<tr>\n<td>1</td>\n<td>0.9929</td>\n</tr>\n<tr>\n<td>2</td>\n<td>0.9927</td>\n</tr>\n<tr>\n<td>3</td>\n<td>0.9930</td>\n</tr>\n</tbody>\n</table>\n<h2>Things that not work</h2>\n<ul>\n<li>Label smoothing for Yolov5: I tried but LB is too bad so I skipped</li>\n<li>VFnet and EfficientDet: worse performance than Yolov5 (probably my config is not good) and take longer time to train</li>\n</ul>\n<p>When the private score is released, I noticed that my score on YoloV5x (preprocessing iou 0.6) perform quite better result on the private score, but very slow score on LB so I skipped this, It would be better if I did ensemble my final prediction based on CV instead of LB :D</p>",
      "rawMarkdown": "Congratulations to all the winners and special thanks to Vingroup Big Data Institute for organizing a very interesting competition, I have learned a lot from this.\n\nAt the beginning of the competition, I decided to use Retinanet (from [this post](https://keras.io/examples/vision/retinanet)) but after almost two months I could not improve my score. I switched to Yolov5 since I notice a promising result from @awsaf49 [Yolov5 notebook](https://www.kaggle.com/awsaf49/vinbigdata-cxr-ad-yolov5-14-class-train) and the mAP increased significantly (I wish I had realized earlier :)), and then I stick with it.\n\nMy solution is the ensemble of 5 folds Yolov5x (thanks to [Glenn Jocher](https://github.com/glenn-jocher)) and uses 2 class filter classifier to remove normal images.\n\n## Preprocessing\n\n- Fusion box using WBF with IOU 0.5\n- Remove (incorrect) annotations by some data visualization (bar plot) based on: position/width/height/w/h ratio/area of bounding boxes\n- I noticed that the bounding boxes of class `Calcification` is sometimes overlapping with `Aortic enlargement` in the train data, but my model predicts smaller boxes, So I decided to fix them by using prediction from Retinanet model.\n- 5 Folds stratified split, use this repo https://github.com/trent-b/iterative-stratification\n\n## Detection\n\n- 5 Folds ensemble of YoloV5x (640x640), using provided weight from the repository for initialization\n- Config: mostly identical with [hyp.scatch.yaml](https://github.com/ultralytics/yolov5/blob/master/data/hyp.scratch.yaml). But I changed some augmentations as below:\n    + Scale: 0.6\n    + Translate: 0.2\n    + Degrees and Shear: 0.1 (might be too small)\n    + Mosaic: 0.7\n- Besides, I added random intensity [-10 10] inspired by [ZFTurbo](https://www.kaggle.com/zfturbo) [post](https://www.kaggle.com/c/google-ai-open-images-object-detection-track/discussion/64633).\n\n\n## Classification (2 class filter)\n\n- I was focusing on improving my detection models and forget about the importance of classification, then I tried to train my own classifier model, the score improve 0.001 on Private data compared to @awsaf49 [result](https://www.kaggle.com/awsaf49/vinbigdata-2-class-filter)\n\n| Model | Public score | Private score |\n| --- | --- | --- |\n| Ensemble of 4 folds | 0.279 | **0.272** |\n| Awsaf result | **0.281** | 0.271 |\n\n- I trained EfficientNetB5 (noisy student) in 4 folds and remove the confusing images based on the difference between prediction and ground truth: If (prediction - ground truth label) > 0.95 then remove (wrong prediction but too high confident)\n\n- Then I train EfficientB5 again with cleaned data, and the ensemble of 4 folds with AUC score on validation data as below\n\n| Fold | AUC |\n| --- | --- |\n| 0 | 0.9935 |\n| 1 | 0.9929 |\n| 2 | 0.9927 |\n| 3 | 0.9930 |\n\n## Things that not work\n\n- Label smoothing for Yolov5: I tried but LB is too bad so I skipped\n- VFnet and EfficientDet: worse performance than Yolov5 (probably my config is not good) and take longer time to train\n\n\nWhen the private score is released, I noticed that my score on YoloV5x (preprocessing iou 0.6) perform quite better result on the private score, but very slow score on LB so I skipped this, It would be better if I did ensemble my final prediction based on CV instead of LB :D",
      "votes": 23
    },
    {
      "id": 1257786,
      "postDate": "2021-03-31T05:14:32.510Z",
      "content": "<p>Congrats on strongly silver finish <a href=\"https://www.kaggle.com/ptran1203\" target=\"_blank\">@ptran1203</a> </p>",
      "rawMarkdown": "Congrats on strongly silver finish @ptran1203 ",
      "votes": 3,
      "replies": [
        {
          "id": 1257803,
          "postDate": "2021-03-31T05:37:10.053Z",
          "content": "<p>Thank you!</p>",
          "rawMarkdown": "Thank you!",
          "votes": 1
        }
      ]
    },
    {
      "id": 1259762,
      "postDate": "2021-04-01T16:37:38.800Z",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/ptran1203\" target=\"_blank\">@ptran1203</a> , thanks for sharing yr solution !</p>",
      "rawMarkdown": "Congrats @ptran1203 , thanks for sharing yr solution !",
      "votes": 1,
      "replies": [
        {
          "id": 1260730,
          "postDate": "2021-04-02T11:29:49.247Z",
          "content": "<p>Thank you!</p>",
          "rawMarkdown": "Thank you!"
        }
      ]
    },
    {
      "id": 1258520,
      "postDate": "2021-03-31T17:24:45.087Z",
      "content": "<p>Congratz , Great to see my name in your solution. 😄</p>",
      "rawMarkdown": "Congratz , Great to see my name in your solution. 😄",
      "votes": 1,
      "replies": [
        {
          "id": 1259426,
          "postDate": "2021-04-01T12:03:47.780Z",
          "content": "<p>Thank you, your great kernels help me a lot in this competition 😁</p>",
          "rawMarkdown": "Thank you, your great kernels help me a lot in this competition 😁",
          "votes": 1
        }
      ]
    },
    {
      "id": 1257777,
      "postDate": "2021-03-31T05:00:41.953Z",
      "content": "<p><a href=\"https://www.kaggle.com/ptran1203\" target=\"_blank\">@ptran1203</a> Congratulations on Silver Finish and Thanks for sharing the approach</p>",
      "rawMarkdown": "@ptran1203 Congratulations on Silver Finish and Thanks for sharing the approach",
      "votes": 1,
      "replies": [
        {
          "id": 1257805,
          "postDate": "2021-03-31T05:37:25.370Z",
          "content": "<p>Thank you!</p>",
          "rawMarkdown": "Thank you!",
          "votes": 1
        }
      ]
    },
    {
      "id": 1257808,
      "postDate": "2021-03-31T05:41:43.973Z",
      "content": "<p>Thanks for sharing! I am wondering how mush scores have increased due to the wbf preprocess method.</p>",
      "rawMarkdown": "Thanks for sharing! I am wondering how mush scores have increased due to the wbf preprocess method.",
      "votes": 2,
      "replies": [
        {
          "id": 1257811,
          "postDate": "2021-03-31T05:47:05.700Z",
          "content": "<p>I did not train my model with original data, I used WBF box fusion with iou 0.4, 0.5 and 0.6 during the competition. IOU = 0.6 probably the best threshold I can found</p>",
          "rawMarkdown": "I did not train my model with original data, I used WBF box fusion with iou 0.4, 0.5 and 0.6 during the competition. IOU = 0.6 probably the best threshold I can found",
          "votes": 2
        },
        {
          "id": 1257839,
          "postDate": "2021-03-31T06:22:41.567Z",
          "content": "<p>Thanks for ur easy explanation.</p>",
          "rawMarkdown": "Thanks for ur easy explanation.",
          "votes": 1
        }
      ]
    },
    {
      "id": 1260868,
      "postDate": "2021-04-02T13:26:11.923Z",
      "content": "<p>……………..</p>",
      "rawMarkdown": ".................",
      "replies": [
        {
          "id": 1260925,
          "postDate": "2021-04-02T14:38:23.300Z",
          "content": "<p>hmm 🤔……</p>",
          "rawMarkdown": "hmm 🤔......\n"
        }
      ]
    }
  ],
  "comments": [
    {
      "id": 1257786,
      "author_name": "KhanhVD",
      "author_url": "",
      "post_date": "2021-03-31T05:14:32.510000",
      "content": "<p>Congrats on strongly silver finish <a href=\"https://www.kaggle.com/ptran1203\" target=\"_blank\">@ptran1203</a> </p>",
      "votes": 3,
      "replies": [
        {
          "id": 1257803,
          "author_name": "Phat Tran",
          "author_url": "",
          "post_date": "2021-03-31T05:37:10.053000",
          "content": "<p>Thank you!</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1259762,
      "author_name": "Sidney Ng",
      "author_url": "",
      "post_date": "2021-04-01T16:37:38.800000",
      "content": "<p>Congrats <a href=\"https://www.kaggle.com/ptran1203\" target=\"_blank\">@ptran1203</a> , thanks for sharing yr solution !</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1260730,
          "author_name": "Phat Tran",
          "author_url": "",
          "post_date": "2021-04-02T11:29:49.247000",
          "content": "<p>Thank you!</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 1258520,
      "author_name": "Awsaf",
      "author_url": "",
      "post_date": "2021-03-31T17:24:45.087000",
      "content": "<p>Congratz , Great to see my name in your solution. 😄</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1259426,
          "author_name": "Phat Tran",
          "author_url": "",
          "post_date": "2021-04-01T12:03:47.780000",
          "content": "<p>Thank you, your great kernels help me a lot in this competition 😁</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1257777,
      "author_name": "Tensor Girl",
      "author_url": "",
      "post_date": "2021-03-31T05:00:41.953000",
      "content": "<p><a href=\"https://www.kaggle.com/ptran1203\" target=\"_blank\">@ptran1203</a> Congratulations on Silver Finish and Thanks for sharing the approach</p>",
      "votes": 1,
      "replies": [
        {
          "id": 1257805,
          "author_name": "Phat Tran",
          "author_url": "",
          "post_date": "2021-03-31T05:37:25.370000",
          "content": "<p>Thank you!</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1257808,
      "author_name": "Wonho Song",
      "author_url": "",
      "post_date": "2021-03-31T05:41:43.973000",
      "content": "<p>Thanks for sharing! I am wondering how mush scores have increased due to the wbf preprocess method.</p>",
      "votes": 2,
      "replies": [
        {
          "id": 1257811,
          "author_name": "Phat Tran",
          "author_url": "",
          "post_date": "2021-03-31T05:47:05.700000",
          "content": "<p>I did not train my model with original data, I used WBF box fusion with iou 0.4, 0.5 and 0.6 during the competition. IOU = 0.6 probably the best threshold I can found</p>",
          "votes": 2,
          "replies": []
        },
        {
          "id": 1257839,
          "author_name": "Wonho Song",
          "author_url": "",
          "post_date": "2021-03-31T06:22:41.567000",
          "content": "<p>Thanks for ur easy explanation.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 1260868,
      "author_name": "devanshu singh",
      "author_url": "",
      "post_date": "2021-04-02T13:26:11.923000",
      "content": "<p>……………..</p>",
      "votes": 0,
      "replies": [
        {
          "id": 1260925,
          "author_name": "Phat Tran",
          "author_url": "",
          "post_date": "2021-04-02T14:38:23.300000",
          "content": "<p>hmm 🤔……</p>",
          "votes": 0,
          "replies": []
        }
      ]
    }
  ],
  "raw_markdown_by_id": {
    "1257760": "Congratulations to all the winners and special thanks to Vingroup Big Data Institute for organizing a very interesting competition, I have learned a lot from this.\n\nAt the beginning of the competition, I decided to use Retinanet (from [this post](https://keras.io/examples/vision/retinanet)) but after almost two months I could not improve my score. I switched to Yolov5 since I notice a promising result from @awsaf49 [Yolov5 notebook](https://www.kaggle.com/awsaf49/vinbigdata-cxr-ad-yolov5-14-class-train) and the mAP increased significantly (I wish I had realized earlier :)), and then I stick with it.\n\nMy solution is the ensemble of 5 folds Yolov5x (thanks to [Glenn Jocher](https://github.com/glenn-jocher)) and uses 2 class filter classifier to remove normal images.\n\n## Preprocessing\n\n- Fusion box using WBF with IOU 0.5\n- Remove (incorrect) annotations by some data visualization (bar plot) based on: position/width/height/w/h ratio/area of bounding boxes\n- I noticed that the bounding boxes of class `Calcification` is sometimes overlapping with `Aortic enlargement` in the train data, but my model predicts smaller boxes, So I decided to fix them by using prediction from Retinanet model.\n- 5 Folds stratified split, use this repo https://github.com/trent-b/iterative-stratification\n\n## Detection\n\n- 5 Folds ensemble of YoloV5x (640x640), using provided weight from the repository for initialization\n- Config: mostly identical with [hyp.scatch.yaml](https://github.com/ultralytics/yolov5/blob/master/data/hyp.scratch.yaml). But I changed some augmentations as below:\n    + Scale: 0.6\n    + Translate: 0.2\n    + Degrees and Shear: 0.1 (might be too small)\n    + Mosaic: 0.7\n- Besides, I added random intensity [-10 10] inspired by [ZFTurbo](https://www.kaggle.com/zfturbo) [post](https://www.kaggle.com/c/google-ai-open-images-object-detection-track/discussion/64633).\n\n\n## Classification (2 class filter)\n\n- I was focusing on improving my detection models and forget about the importance of classification, then I tried to train my own classifier model, the score improve 0.001 on Private data compared to @awsaf49 [result](https://www.kaggle.com/awsaf49/vinbigdata-2-class-filter)\n\n| Model | Public score | Private score |\n| --- | --- | --- |\n| Ensemble of 4 folds | 0.279 | **0.272** |\n| Awsaf result | **0.281** | 0.271 |\n\n- I trained EfficientNetB5 (noisy student) in 4 folds and remove the confusing images based on the difference between prediction and ground truth: If (prediction - ground truth label) > 0.95 then remove (wrong prediction but too high confident)\n\n- Then I train EfficientB5 again with cleaned data, and the ensemble of 4 folds with AUC score on validation data as below\n\n| Fold | AUC |\n| --- | --- |\n| 0 | 0.9935 |\n| 1 | 0.9929 |\n| 2 | 0.9927 |\n| 3 | 0.9930 |\n\n## Things that not work\n\n- Label smoothing for Yolov5: I tried but LB is too bad so I skipped\n- VFnet and EfficientDet: worse performance than Yolov5 (probably my config is not good) and take longer time to train\n\n\nWhen the private score is released, I noticed that my score on YoloV5x (preprocessing iou 0.6) perform quite better result on the private score, but very slow score on LB so I skipped this, It would be better if I did ensemble my final prediction based on CV instead of LB :D",
    "1257786": "Congrats on strongly silver finish @ptran1203 ",
    "1259762": "Congrats @ptran1203 , thanks for sharing yr solution !",
    "1258520": "Congratz , Great to see my name in your solution. 😄",
    "1257777": "@ptran1203 Congratulations on Silver Finish and Thanks for sharing the approach",
    "1257808": "Thanks for sharing! I am wondering how mush scores have increased due to the wbf preprocess method.",
    "1260868": "................."
  }
}