{
  "id": 651525,
  "title": "Discussion — Seeking Advice on Multi-View Inputs, Data Strategies, Loss Design & Model Complexity",
  "url": "/competitions/csiro-biomass/discussion/651525",
  "author_name": "",
  "post_date": "2025-12-04T01:40:05.191824300Z",
  "votes": 62,
  "comment_count": 19,
  "views": 0,
  "content": "<p>Hi everyone!  </p>\n<p>I have been experimenting on this competition for several weeks, and despite trying many architectures and training strategies, I am still hitting a <strong>performance plateau</strong> in both CV and LB.  </p>\n<p>After several weeks of experimentation on the CSIRO Image2Biomass competition, I’ve reached a point where progress has significantly slowed down. I would like to summarize the key problems I am currently facing and seek suggestions from the community.</p>\n<hr>\n<h1>🔍 0.1. <strong>Summary of My Approach</strong></h1>\n<p>Throughout development, I explored multiple model variants:</p>\n<h3><strong>✓ Two-Stream Image Model</strong></h3>\n<ul>\n<li>Split each image into left/right half for independent encoding  </li>\n<li>Supports Plain / Tiled / Tiled + FiLM  </li>\n<li>Uses structural relationships (GDM = Green + Clover, Total = GDM + Dead)  </li>\n</ul>\n<h3><strong>✓ Multimodal Student–Teacher Regularization</strong></h3>\n<ul>\n<li>Student: image-only model  </li>\n<li>Teacher: text-conditioned FiLM modulation using BERT  </li>\n<li>Training-only multimodal losses: InfoNCE, Distillation, FiLM-consistency  </li>\n</ul>\n<h3><strong>✓ Additional Components / 其它扩展尝试</strong></h3>\n<ul>\n<li>Tile-token Transformer aggregation  </li>\n<li>Pairwise ranking &amp; difference losses  </li>\n<li>FDA / CutMix / FMix augmentations  </li>\n<li>Target-weighted regression loss  </li>\n</ul>\n<hr>\n<h1>📈 0.2. <strong>CV &amp; LB Progression</strong></h1>\n<table>\n<thead>\n<tr>\n<th>Stage</th>\n<th>Model</th>\n<th>LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Simple CNN baseline</td>\n<td>0.48–0.50</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Two-Stream DINO</td>\n<td>0.52–0.57</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Tiled DINO (2×2)</td>\n<td>~0.58–0.60</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Tiled + FiLM</td>\n<td>~0.60–0.63</td>\n</tr>\n<tr>\n<td>5</td>\n<td>Multimodal Reg.</td>\n<td>LB unchanged or worse(Best 0.65)</td>\n</tr>\n<tr>\n<td>6</td>\n<td>Tile-token Transformer</td>\n<td>~0.63</td>\n</tr>\n<tr>\n<td>7</td>\n<td>Model Ensemble</td>\n<td>~0.66</td>\n</tr>\n</tbody>\n</table>\n<p>➡ <strong>Single Model Best LB so far ≈ 0.65, but completely stuck at this level.</strong></p>\n<hr>\n<h1>🔍 <strong>1. Multi-View Image Construction — Will Multi-Channel Views Actually Help?</strong></h1>\n<p>I am experimenting with constructing multi-view inputs from a <em>single original image</em>, including:</p>\n<ul>\n<li>Raw RGB channels  </li>\n<li>Grayscale version  </li>\n<li>Estimated depth maps (MiDaS / ZoeDepth style)  </li>\n<li>Concatenating all views into a multi-channel “super-image”</li>\n</ul>\n<p><strong>Questions</strong></p>\n<p>👉 Does artificially expanding views actually increase data diversity, or does it introduce noise?  </p>\n<p>👉 Has anyone tested multi-channel stacking on small datasets?  </p>\n<p>My concern is that these synthetic views may <em>not</em> behave like truly independent data sources.</p>\n<hr>\n<h1>🔍 <strong>2. Training Stability — Should We Use More Careful Data Splits?</strong></h1>\n<p>Some images have extreme biomass values (very high or very low), and mixing them in the same batch seems to destabilize training.</p>\n<p><strong>Questions</strong></p>\n<p>👉 Should we use stratification by <em>multiple targets</em> rather than just Dry_Total?  </p>\n<p>👉 Should extreme-value images be isolated or grouped to stabilize learning?  </p>\n<p>👉 Any fold-splitting strategies that work better?  </p>\n<hr>\n<h1>🔍 <strong>3. Additional Data — Is External Pasture Data Useful or Harmful?</strong></h1>\n<p>I found some external pasture datasets (e.g., Irish grass biomass datasets), but I worry:</p>\n<ul>\n<li>Different species composition  </li>\n<li>Different climate &amp; soil conditions  </li>\n<li>Different imaging setup  </li>\n<li>Different biomass scale</li>\n</ul>\n<p>At the same time, deleting “problematic images” in the official dataset is impossible because the dataset is already too small.</p>\n<p><strong>Questions</strong></p>\n<p>👉 Has anyone successfully used external biomass datasets to improve LB?  </p>\n<p>👉 How to judge whether cross-domain data is helping or hurting?  </p>\n<hr>\n<h1>🔍 <strong>4. Large Models vs Small Models — Should We Avoid Heavy Models?</strong></h1>\n<p>I explored very complex architectures:</p>\n<ul>\n<li>Large ViTs (DINOv2-L, EVA02-L, ViT-Large)  </li>\n<li>Multi-layer Mixture-of-Experts (MoE)  </li>\n<li>Deep multimodal cross-attention  </li>\n<li>Heavy FiLM-modulated pipelines</li>\n</ul>\n<p>But:</p>\n<ul>\n<li>Training becomes unstable  </li>\n<li>CV does not improve  </li>\n<li>LB sometimes gets worse  </li>\n<li>Very clear overfitting barrier</li>\n</ul>\n<p><strong>Questions</strong></p>\n<p>👉 Do top teams use heavy models, or do they keep models lightweight?  </p>\n<p>👉 Any tricks to safely train big models on tiny datasets?  </p>\n<hr>\n<h1>🔍 <strong>5. Loss Function — Should We Use Log-Loss or Gaussian-Style Regularization?</strong></h1>\n<p>Since WR² is highly sensitive to outliers, I am considering:</p>\n<ul>\n<li>Log-space MSE  </li>\n<li>Gaussian penalty around target  </li>\n<li>Robust loss (Huber / Tukey)  </li>\n<li>Target-wise dynamic weighting  </li>\n<li>Priors based on physical relationships</li>\n</ul>\n<p><strong>Questions</strong></p>\n<p>👉 Has anyone tried log-loss or Gaussian target smoothing?  </p>\n<p>👉 Any loss function that correlates better with LB WR²?  </p>\n<hr>\n<h1>🔍 <strong>6. Other General Questions</strong></h1>\n<p>A few more uncertainties:</p>\n<ul>\n<li><p>Should we treat each image as 5 outputs, or treat each (image, target) as independent samples?  </p></li>\n<li><p>Should we apply label smoothing for regression?  </p></li>\n<li><p>Does multi-task learning truly help in this competition?  </p></li>\n</ul>\n<hr>\n<h1>🙏 <strong>Final Note</strong></h1>\n<p>I would be extremely grateful for any suggestions, insights, or experiences.</p>\n<p>Thanks and wishing everyone good luck with this competition!  </p>\n<p>Komari wishes you a very happy day! 🌟\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F22065102%2F483c9dcab4269adfa2d6756d0acd4bb9%2Fthumb-1920-1371653.png?generation=1764812293929521&amp;alt=media\" alt=\"Komari wishes you a very happy day! 🌟\"></p>",
  "messages": [
    {
      "id": "3361943",
      "postDate": "12/04/2025 01:40:05",
      "content": "<p>Hi everyone!  </p>\n<p>I have been experimenting on this competition for several weeks, and despite trying many architectures and training strategies, I am still hitting a <strong>performance plateau</strong> in both CV and LB.  </p>\n<p>After several weeks of experimentation on the CSIRO Image2Biomass competition, I’ve reached a point where progress has significantly slowed down. I would like to summarize the key problems I am currently facing and seek suggestions from the community.</p>\n<hr>\n<h1>🔍 0.1. <strong>Summary of My Approach</strong></h1>\n<p>Throughout development, I explored multiple model variants:</p>\n<h3><strong>✓ Two-Stream Image Model</strong></h3>\n<ul>\n<li>Split each image into left/right half for independent encoding  </li>\n<li>Supports Plain / Tiled / Tiled + FiLM  </li>\n<li>Uses structural relationships (GDM = Green + Clover, Total = GDM + Dead)  </li>\n</ul>\n<h3><strong>✓ Multimodal Student–Teacher Regularization</strong></h3>\n<ul>\n<li>Student: image-only model  </li>\n<li>Teacher: text-conditioned FiLM modulation using BERT  </li>\n<li>Training-only multimodal losses: InfoNCE, Distillation, FiLM-consistency  </li>\n</ul>\n<h3><strong>✓ Additional Components / 其它扩展尝试</strong></h3>\n<ul>\n<li>Tile-token Transformer aggregation  </li>\n<li>Pairwise ranking &amp; difference losses  </li>\n<li>FDA / CutMix / FMix augmentations  </li>\n<li>Target-weighted regression loss  </li>\n</ul>\n<hr>\n<h1>📈 0.2. <strong>CV &amp; LB Progression</strong></h1>\n<table>\n<thead>\n<tr>\n<th>Stage</th>\n<th>Model</th>\n<th>LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Simple CNN baseline</td>\n<td>0.48–0.50</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Two-Stream DINO</td>\n<td>0.52–0.57</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Tiled DINO (2×2)</td>\n<td>~0.58–0.60</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Tiled + FiLM</td>\n<td>~0.60–0.63</td>\n</tr>\n<tr>\n<td>5</td>\n<td>Multimodal Reg.</td>\n<td>LB unchanged or worse(Best 0.65)</td>\n</tr>\n<tr>\n<td>6</td>\n<td>Tile-token Transformer</td>\n<td>~0.63</td>\n</tr>\n<tr>\n<td>7</td>\n<td>Model Ensemble</td>\n<td>~0.66</td>\n</tr>\n</tbody>\n</table>\n<p>➡ <strong>Single Model Best LB so far ≈ 0.65, but completely stuck at this level.</strong></p>\n<hr>\n<h1>🔍 <strong>1. Multi-View Image Construction — Will Multi-Channel Views Actually Help?</strong></h1>\n<p>I am experimenting with constructing multi-view inputs from a <em>single original image</em>, including:</p>\n<ul>\n<li>Raw RGB channels  </li>\n<li>Grayscale version  </li>\n<li>Estimated depth maps (MiDaS / ZoeDepth style)  </li>\n<li>Concatenating all views into a multi-channel “super-image”</li>\n</ul>\n<p><strong>Questions</strong></p>\n<p>👉 Does artificially expanding views actually increase data diversity, or does it introduce noise?  </p>\n<p>👉 Has anyone tested multi-channel stacking on small datasets?  </p>\n<p>My concern is that these synthetic views may <em>not</em> behave like truly independent data sources.</p>\n<hr>\n<h1>🔍 <strong>2. Training Stability — Should We Use More Careful Data Splits?</strong></h1>\n<p>Some images have extreme biomass values (very high or very low), and mixing them in the same batch seems to destabilize training.</p>\n<p><strong>Questions</strong></p>\n<p>👉 Should we use stratification by <em>multiple targets</em> rather than just Dry_Total?  </p>\n<p>👉 Should extreme-value images be isolated or grouped to stabilize learning?  </p>\n<p>👉 Any fold-splitting strategies that work better?  </p>\n<hr>\n<h1>🔍 <strong>3. Additional Data — Is External Pasture Data Useful or Harmful?</strong></h1>\n<p>I found some external pasture datasets (e.g., Irish grass biomass datasets), but I worry:</p>\n<ul>\n<li>Different species composition  </li>\n<li>Different climate &amp; soil conditions  </li>\n<li>Different imaging setup  </li>\n<li>Different biomass scale</li>\n</ul>\n<p>At the same time, deleting “problematic images” in the official dataset is impossible because the dataset is already too small.</p>\n<p><strong>Questions</strong></p>\n<p>👉 Has anyone successfully used external biomass datasets to improve LB?  </p>\n<p>👉 How to judge whether cross-domain data is helping or hurting?  </p>\n<hr>\n<h1>🔍 <strong>4. Large Models vs Small Models — Should We Avoid Heavy Models?</strong></h1>\n<p>I explored very complex architectures:</p>\n<ul>\n<li>Large ViTs (DINOv2-L, EVA02-L, ViT-Large)  </li>\n<li>Multi-layer Mixture-of-Experts (MoE)  </li>\n<li>Deep multimodal cross-attention  </li>\n<li>Heavy FiLM-modulated pipelines</li>\n</ul>\n<p>But:</p>\n<ul>\n<li>Training becomes unstable  </li>\n<li>CV does not improve  </li>\n<li>LB sometimes gets worse  </li>\n<li>Very clear overfitting barrier</li>\n</ul>\n<p><strong>Questions</strong></p>\n<p>👉 Do top teams use heavy models, or do they keep models lightweight?  </p>\n<p>👉 Any tricks to safely train big models on tiny datasets?  </p>\n<hr>\n<h1>🔍 <strong>5. Loss Function — Should We Use Log-Loss or Gaussian-Style Regularization?</strong></h1>\n<p>Since WR² is highly sensitive to outliers, I am considering:</p>\n<ul>\n<li>Log-space MSE  </li>\n<li>Gaussian penalty around target  </li>\n<li>Robust loss (Huber / Tukey)  </li>\n<li>Target-wise dynamic weighting  </li>\n<li>Priors based on physical relationships</li>\n</ul>\n<p><strong>Questions</strong></p>\n<p>👉 Has anyone tried log-loss or Gaussian target smoothing?  </p>\n<p>👉 Any loss function that correlates better with LB WR²?  </p>\n<hr>\n<h1>🔍 <strong>6. Other General Questions</strong></h1>\n<p>A few more uncertainties:</p>\n<ul>\n<li><p>Should we treat each image as 5 outputs, or treat each (image, target) as independent samples?  </p></li>\n<li><p>Should we apply label smoothing for regression?  </p></li>\n<li><p>Does multi-task learning truly help in this competition?  </p></li>\n</ul>\n<hr>\n<h1>🙏 <strong>Final Note</strong></h1>\n<p>I would be extremely grateful for any suggestions, insights, or experiences.</p>\n<p>Thanks and wishing everyone good luck with this competition!  </p>\n<p>Komari wishes you a very happy day! 🌟\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F22065102%2F483c9dcab4269adfa2d6756d0acd4bb9%2Fthumb-1920-1371653.png?generation=1764812293929521&amp;alt=media\" alt=\"Komari wishes you a very happy day! 🌟\"></p>",
      "rawMarkdown": "Hi everyone!  \n\nI have been experimenting on this competition for several weeks, and despite trying many architectures and training strategies, I am still hitting a **performance plateau** in both CV and LB.  \n\nAfter several weeks of experimentation on the CSIRO Image2Biomass competition, I’ve reached a point where progress has significantly slowed down. I would like to summarize the key problems I am currently facing and seek suggestions from the community.\n\n---\n\n# 🔍 0.1. **Summary of My Approach**\n\nThroughout development, I explored multiple model variants:\n\n### **✓ Two-Stream Image Model**  \n- Split each image into left/right half for independent encoding  \n- Supports Plain / Tiled / Tiled + FiLM  \n- Uses structural relationships (GDM = Green + Clover, Total = GDM + Dead)  \n\n### **✓ Multimodal Student–Teacher Regularization**  \n- Student: image-only model  \n- Teacher: text-conditioned FiLM modulation using BERT  \n- Training-only multimodal losses: InfoNCE, Distillation, FiLM-consistency  \n\n### **✓ Additional Components / 其它扩展尝试**  \n- Tile-token Transformer aggregation  \n- Pairwise ranking & difference losses  \n- FDA / CutMix / FMix augmentations  \n- Target-weighted regression loss  \n\n---\n\n# 📈 0.2. **CV & LB Progression**\n\n| Stage | Model | LB |\n|-----------|------------|-----|\n| 1 | Simple CNN baseline | 0.48–0.50 |\n| 2 | Two-Stream DINO | 0.52–0.57 |\n| 3 | Tiled DINO (2×2) | ~0.58–0.60 |\n| 4 | Tiled + FiLM | ~0.60–0.63 |\n| 5 | Multimodal Reg. | LB unchanged or worse(Best 0.65) |\n| 6 | Tile-token Transformer | ~0.63 |\n| 7 | Model Ensemble | ~0.66 |\n\n➡ **Single Model Best LB so far ≈ 0.65, but completely stuck at this level.**\n\n---\n\n# 🔍 **1. Multi-View Image Construction — Will Multi-Channel Views Actually Help?**  \n\nI am experimenting with constructing multi-view inputs from a *single original image*, including:\n\n- Raw RGB channels  \n- Grayscale version  \n- Estimated depth maps (MiDaS / ZoeDepth style)  \n- Concatenating all views into a multi-channel “super-image”\n\n**Questions**\n\n👉 Does artificially expanding views actually increase data diversity, or does it introduce noise?  \n\n👉 Has anyone tested multi-channel stacking on small datasets?  \n\nMy concern is that these synthetic views may *not* behave like truly independent data sources.\n\n---\n\n# 🔍 **2. Training Stability — Should We Use More Careful Data Splits?**  \n\nSome images have extreme biomass values (very high or very low), and mixing them in the same batch seems to destabilize training.\n\n**Questions**\n\n👉 Should we use stratification by *multiple targets* rather than just Dry_Total?  \n\n👉 Should extreme-value images be isolated or grouped to stabilize learning?  \n\n👉 Any fold-splitting strategies that work better?  \n\n---\n\n# 🔍 **3. Additional Data — Is External Pasture Data Useful or Harmful?**  \n\nI found some external pasture datasets (e.g., Irish grass biomass datasets), but I worry:\n\n- Different species composition  \n- Different climate & soil conditions  \n- Different imaging setup  \n- Different biomass scale\n\nAt the same time, deleting “problematic images” in the official dataset is impossible because the dataset is already too small.\n\n**Questions**\n\n👉 Has anyone successfully used external biomass datasets to improve LB?  \n\n👉 How to judge whether cross-domain data is helping or hurting?  \n\n---\n\n# 🔍 **4. Large Models vs Small Models — Should We Avoid Heavy Models?**  \n\nI explored very complex architectures:\n\n- Large ViTs (DINOv2-L, EVA02-L, ViT-Large)  \n- Multi-layer Mixture-of-Experts (MoE)  \n- Deep multimodal cross-attention  \n- Heavy FiLM-modulated pipelines\n\nBut:\n\n- Training becomes unstable  \n- CV does not improve  \n- LB sometimes gets worse  \n- Very clear overfitting barrier\n\n**Questions**\n\n👉 Do top teams use heavy models, or do they keep models lightweight?  \n\n👉 Any tricks to safely train big models on tiny datasets?  \n\n---\n\n# 🔍 **5. Loss Function — Should We Use Log-Loss or Gaussian-Style Regularization?**  \n\nSince WR² is highly sensitive to outliers, I am considering:\n\n- Log-space MSE  \n- Gaussian penalty around target  \n- Robust loss (Huber / Tukey)  \n- Target-wise dynamic weighting  \n- Priors based on physical relationships\n\n**Questions**\n\n👉 Has anyone tried log-loss or Gaussian target smoothing?  \n\n👉 Any loss function that correlates better with LB WR²?  \n\n---\n\n# 🔍 **6. Other General Questions**\n\nA few more uncertainties:\n\n- Should we treat each image as 5 outputs, or treat each (image, target) as independent samples?  \n\n- Should we apply label smoothing for regression?  \n\n- Does multi-task learning truly help in this competition?  \n\n---\n\n# 🙏 **Final Note**\n\nI would be extremely grateful for any suggestions, insights, or experiences.\n\nThanks and wishing everyone good luck with this competition!  \n\nKomari wishes you a very happy day! 🌟\n![Komari wishes you a very happy day! 🌟](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F22065102%2F483c9dcab4269adfa2d6756d0acd4bb9%2Fthumb-1920-1371653.png?generation=1764812293929521&alt=media)",
      "votes": null
    },
    {
      "id": "3363055",
      "postDate": "12/05/2025 18:32:24",
      "content": "<p>Lots of very good questions - not sure your going to get a lot of feedback.  The GAP between 0.65 and 0.76 is likely filled with over-fitting or a couple of very good augmentations / data edits.</p>\n<p>In my 45+ years of trying to make sense of data I did learn the skill of identifying a crappy data set.  This one hits all the check marks for being poor.  Several weeks ago I made a prediction that 0.75 would be a nice place to have a good stable model.  Still would like to reach that level, but like you stuck at 0.65.  Looking at Huber today - will not come back and tell you if it worked, but if my score tomorrow is better than 0.65 ……</p>",
      "rawMarkdown": "Lots of very good questions - not sure your going to get a lot of feedback.  The GAP between 0.65 and 0.76 is likely filled with over-fitting or a couple of very good augmentations / data edits.\n\nIn my 45+ years of trying to make sense of data I did learn the skill of identifying a crappy data set.  This one hits all the check marks for being poor.  Several weeks ago I made a prediction that 0.75 would be a nice place to have a good stable model.  Still would like to reach that level, but like you stuck at 0.65.  Looking at Huber today - will not come back and tell you if it worked, but if my score tomorrow is better than 0.65 ......",
      "votes": null
    },
    {
      "id": "3363233",
      "postDate": "12/05/2025 20:26:10",
      "content": "<p>Hi <a href=\"https://www.kaggle.com/chikakomari\" target=\"_blank\">@chikakomari</a>,</p>\n<p>Thank you so much for the detailed discussion and for sharing your \"DINO v2 + Tiled\" notebook! Your tiled approach has been incredibly helpful for my experiments as well.</p>\n<p>In my experiments, simply adding the following preprocessing steps significantly improved my single model score (e.g., LB 0.60 -&gt; 0.62):</p>\n<ol>\n<li><strong>Date Stamp Removal</strong>: Masking the orange timestamps and removing them using Inpainting.</li>\n<li><strong>Artifact Removal</strong>: Cropping out the bottom part of images where cardboard or color charts often appear.</li>\n<li><strong>Lighting Normalization</strong>: Applying CLAHE or White Balance correction to reduce the impact of shadows and color casts.</li>\n</ol>\n<p>By doing this, the model stops overfitting to \"text\" or \"garbage\" and focuses on the actual \"grass texture.\" Here is a simple implementation snippet:</p>\n<pre><code> cv2\n numpy  np\n\n ():\n    \n    h, w = img.shape[:]\n    \n    img = img[:(h*), :] \n\n    \n    hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)\n    \n    lower = np.array([, , ])\n    upper = np.array([, , ])\n    mask = cv2.inRange(hsv, lower, upper)\n\n    \n    mask = cv2.dilate(mask, np.ones((,), np.uint8), iterations=)\n\n    \n     np.(mask) &gt; :\n        img = cv2.inpaint(img, mask, , cv2.INPAINT_TELEA)\n\n     img\n</code></pre>\n<p>Your multimodal approach is also very inspiring. Let's keep pushing! Good luck!</p>",
      "rawMarkdown": "Hi @chikakomari,\n\nThank you so much for the detailed discussion and for sharing your \"DINO v2 + Tiled\" notebook! Your tiled approach has been incredibly helpful for my experiments as well.\n\nIn my experiments, simply adding the following preprocessing steps significantly improved my single model score (e.g., LB 0.60 -> 0.62):\n\n1.  **Date Stamp Removal**: Masking the orange timestamps and removing them using Inpainting.\n2.  **Artifact Removal**: Cropping out the bottom part of images where cardboard or color charts often appear.\n3.  **Lighting Normalization**: Applying CLAHE or White Balance correction to reduce the impact of shadows and color casts.\n\nBy doing this, the model stops overfitting to \"text\" or \"garbage\" and focuses on the actual \"grass texture.\" Here is a simple implementation snippet:\n\n```python\nimport cv2\nimport numpy as np\n\ndef clean_image(img):\n    # 1. Safe Crop (Remove artifacts at the bottom)\n    h, w = img.shape[:2]\n    # Cut bottom 10% where artifacts often appear\n    img = img[0:int(h*0.90), :] \n    \n    # 2. Inpaint Date Stamp (Remove orange text)\n    hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)\n    # Define orange color range (adjust as needed)\n    lower = np.array([5, 150, 150])\n    upper = np.array([25, 255, 255])\n    mask = cv2.inRange(hsv, lower, upper)\n    \n    # Dilate mask to cover text edges and reduce noise\n    mask = cv2.dilate(mask, np.ones((3,3), np.uint8), iterations=2)\n    \n    # Inpaint if mask is not empty\n    if np.sum(mask) > 0:\n        img = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)\n        \n    return img\n```\n\nYour multimodal approach is also very inspiring. Let's keep pushing! Good luck!",
      "votes": null
    },
    {
      "id": "3363246",
      "postDate": "12/05/2025 20:36:59",
      "content": "<p>Based on your experience in production: when you're working with a very small dataset like this one, how do you make sure you re not overfitting? Even comparing train and validation scores isnt very reliable because the validation set is so small and doesnt reflect real-world performance</p>",
      "rawMarkdown": "Based on your experience in production: when you're working with a very small dataset like this one, how do you make sure you re not overfitting? Even comparing train and validation scores isnt very reliable because the validation set is so small and doesnt reflect real-world performance",
      "votes": null
    },
    {
      "id": "3363359",
      "postDate": "12/05/2025 22:06:12",
      "content": "<p>My experience was almost 99% small datasets.  Doing short experiments on production lines to fix issues / make improvements.   Small required robust ranges of the variables.  But not so robust that you made rejects :)   In one experiment I went so robust that I exceeded the pressure relief value on a large pressurized tank - not good!</p>\n<p>So we would want predicted values to move enough to be statistically valid changes in average or variation.  If yes, than change the process settings.  Collect longer sets of data to the new, return to the old settings and recollect to verify the change.  Did things really improve.  </p>\n<p>Over fitting vs value of the improvement - with high value improvement than you take the risk that you have over fit.  With low value improvement, than redesign the experiment and try again.</p>\n<p>For this application, what is the real world risk?   I would think it's bad predictions when the biomass is low.  Bring too many animals into a pasture or leave them too long thinking you have enough chow.   My big errors on my current models are not predicting a large enough value on the high biomass images - real world risk is not bad - perhaps I don't bring as many animals as it would support or I plan to move them too soon.</p>",
      "rawMarkdown": "My experience was almost 99% small datasets.  Doing short experiments on production lines to fix issues / make improvements.   Small required robust ranges of the variables.  But not so robust that you made rejects :)   In one experiment I went so robust that I exceeded the pressure relief value on a large pressurized tank - not good!\n\nSo we would want predicted values to move enough to be statistically valid changes in average or variation.  If yes, than change the process settings.  Collect longer sets of data to the new, return to the old settings and recollect to verify the change.  Did things really improve.  \n\nOver fitting vs value of the improvement - with high value improvement than you take the risk that you have over fit.  With low value improvement, than redesign the experiment and try again.\n\nFor this application, what is the real world risk?   I would think it's bad predictions when the biomass is low.  Bring too many animals into a pasture or leave them too long thinking you have enough chow.   My big errors on my current models are not predicting a large enough value on the high biomass images - real world risk is not bad - perhaps I don't bring as many animals as it would support or I plan to move them too soon.",
      "votes": null
    },
    {
      "id": "3370600",
      "postDate": "12/11/2025 00:52:42",
      "content": "<p>Thanks for the comment, Jimmy. </p>\n<p>As you can see, the importance of this issue is self-evident. I understand that for data engineers, the criteria for a good dataset might include accuracy, large scale, no noise, clear and interpretable results. However, research on this topic is actually still in a relatively early stage. Challenges such as integrating data from different sources, information gaps across domains, the ever-changing natural environment, and the difficulty of collecting ground truth data… there are many real-world gaps at present. </p>\n<p>Many peers are actively exploring the best solutions for biomass estimation and have made meaningful progress (e.g., very interesting work I've been recently reading <a href=\"https://www.sciencedirect.com/science/article/pii/S2772375525006550\" target=\"_blank\">https://www.sciencedirect.com/science/article/pii/S2772375525006550</a> ), although their datasets also have certain issues in various aspects. This is how scientific research is—it’s rarely achieved in one step, and you often don’t even know whether a path will ultimately prove feasible until after you’ve tested it.</p>",
      "rawMarkdown": "Thanks for the comment, Jimmy. \n\nAs you can see, the importance of this issue is self-evident. I understand that for data engineers, the criteria for a good dataset might include accuracy, large scale, no noise, clear and interpretable results. However, research on this topic is actually still in a relatively early stage. Challenges such as integrating data from different sources, information gaps across domains, the ever-changing natural environment, and the difficulty of collecting ground truth data… there are many real-world gaps at present. \n\nMany peers are actively exploring the best solutions for biomass estimation and have made meaningful progress (e.g., very interesting work I've been recently reading https://www.sciencedirect.com/science/article/pii/S2772375525006550 ), although their datasets also have certain issues in various aspects. This is how scientific research is—it’s rarely achieved in one step, and you often don’t even know whether a path will ultimately prove feasible until after you’ve tested it.",
      "votes": null
    },
    {
      "id": "3371249",
      "postDate": "12/11/2025 11:26:21",
      "content": "<p>Could you please clarify whether the aforementioned preprocessing operations are applied only during inference, or during both training and inference?\nWish you good luck!</p>",
      "rawMarkdown": "Could you please clarify whether the aforementioned preprocessing operations are applied only during inference, or during both training and inference?\nWish you good luck!",
      "votes": null
    },
    {
      "id": "3371734",
      "postDate": "12/11/2025 16:16:17",
      "content": "<p>I have mentioned in a couple of posts that I have a good friend who owns a large heifer operation on the eastern plains of Colorado.  The amount of biomass is a super critical issue for them.  Heifer operations hope to feed pregnant cattle over the winter, have calf's in the spring that are sold in early fall.  Having to buy feed during either of those periods can make the difference between a year with profit and a year where only the bank wins.</p>\n<p>In general they tend to keep the herd size down to the minimum level to avoid the risk of the banks owning the land.  In the USA today herd size is down, for a lot of reasons; but risk avoidance is one of them.  Having a good estimate of the biomass in the fields today, as well as predictive models for upcoming months would help to size herds to the optimum.</p>\n<p>Keeps working on it - we all love meat!</p>",
      "rawMarkdown": "I have mentioned in a couple of posts that I have a good friend who owns a large heifer operation on the eastern plains of Colorado.  The amount of biomass is a super critical issue for them.  Heifer operations hope to feed pregnant cattle over the winter, have calf's in the spring that are sold in early fall.  Having to buy feed during either of those periods can make the difference between a year with profit and a year where only the bank wins.\n\nIn general they tend to keep the herd size down to the minimum level to avoid the risk of the banks owning the land.  In the USA today herd size is down, for a lot of reasons; but risk avoidance is one of them.  Having a good estimate of the biomass in the fields today, as well as predictive models for upcoming months would help to size herds to the optimum.\n\nKeeps working on it - we all love meat!",
      "votes": null
    },
    {
      "id": "3374781",
      "postDate": "12/12/2025 19:12:56",
      "content": "<p>I'm also stuck at 0.66. Tried all possible ideas that seem to work on validation data but poor performance on public LB. I tried Dinov2, all convnext sizes, all Eva variants, catboost, lightgbm on all possible features, and ensemble of them all, still 0.59-0.66. Feel like taking a break </p>",
      "rawMarkdown": "I'm also stuck at 0.66. Tried all possible ideas that seem to work on validation data but poor performance on public LB. I tried Dinov2, all convnext sizes, all Eva variants, catboost, lightgbm on all possible features, and ensemble of them all, still 0.59-0.66. Feel like taking a break",
      "votes": null
    },
    {
      "id": "3375922",
      "postDate": "12/13/2025 12:01:49",
      "content": "<p>me2\n<strong>😭</strong></p>",
      "rawMarkdown": "me2\n**😭**",
      "votes": null
    },
    {
      "id": "3376003",
      "postDate": "12/13/2025 13:25:01",
      "content": "<p>My Question is Still  Should We Avoid Heavy Models?</p>",
      "rawMarkdown": "My Question is Still  Should We Avoid Heavy Models?",
      "votes": null
    },
    {
      "id": "3376869",
      "postDate": "12/15/2025 10:06:18",
      "content": "<p>I'm not sure whether all timestamps are always located within a specific area in the bottom-right corner.Could you give me some tips?Good luck!</p>",
      "rawMarkdown": "I'm not sure whether all timestamps are always located within a specific area in the bottom-right corner.Could you give me some tips?Good luck!",
      "votes": null
    },
    {
      "id": "3376934",
      "postDate": "12/15/2025 12:43:06",
      "content": "<p>Hi <a href=\"https://www.kaggle.com/jiachengma\" target=\"_blank\">@jiachengma</a>,</p>\n<p>Thank you for your questions!</p>\n<p>To answer your first question: I applied these preprocessing steps during <strong>both training and inference</strong>. In my specific case, this improved the LB from 0.60 to 0.62.</p>\n<p>However, I haven't fully verified if this works well with other models, and to be honest, I should have validated it more thoroughly before posting the snippet. Regarding the timestamp locations, I am not 100% sure if my method covers all edge cases.</p>\n<p>Since I might not be able to explain the details perfectly, I decided to publish my full notebook so you can check the exact implementation:\n<a href=\"https://www.kaggle.com/code/youichwada/csiro-inf-convl-metapredictor-exp053\" target=\"_blank\">https://www.kaggle.com/code/youichwada/csiro-inf-convl-metapredictor-exp053</a></p>\n<p>This notebook is based on existing public works. While my LB (0.62) is not very high, I hope this code is useful to you. I would be very happy if you could help verify why this processing resulted in a +0.02 score increase.</p>\n<p>Best regards,</p>",
      "rawMarkdown": "Hi @jiachengma,\n\nThank you for your questions!\n\nTo answer your first question: I applied these preprocessing steps during **both training and inference**. In my specific case, this improved the LB from 0.60 to 0.62.\n\nHowever, I haven't fully verified if this works well with other models, and to be honest, I should have validated it more thoroughly before posting the snippet. Regarding the timestamp locations, I am not 100% sure if my method covers all edge cases.\n\nSince I might not be able to explain the details perfectly, I decided to publish my full notebook so you can check the exact implementation:\nhttps://www.kaggle.com/code/youichwada/csiro-inf-convl-metapredictor-exp053\n\nThis notebook is based on existing public works. While my LB (0.62) is not very high, I hope this code is useful to you. I would be very happy if you could help verify why this processing resulted in a +0.02 score increase.\n\nBest regards,",
      "votes": null
    },
    {
      "id": "3377169",
      "postDate": "12/15/2025 21:48:53",
      "content": "<p>I too tried a lot of methods. One method which really surprised me was using ridge regression models on top of features extracted using dinov2 giant (frozen). The LB score I got for that approach was 0.62 and then I changed ridge models to simple MLP heads and that one also got me 0.62 on LB. This approach took less then an hour for training and 1.5-3hrs for inference. </p>\n<p>But more importantly, I also experimented with removing bad data mentioned in this <a href=\"https://www.kaggle.com/competitions/csiro-biomass/discussion/631335\" target=\"_blank\">thread</a> and I didn't get any improvements at all and the models instead started getting heavily overfitted.</p>\n<p>I don't even know how to describe this dataset, because some features seems to be very useful (metadata) but not available in test sets and other attributes seems to have some bad ids (atleast that's what I think so). Dataset is also very small, so even removing one or couple images (even if it's bad) seems to take a toll on the LB score.</p>\n<p>I think a complex model won't even get enough data to learn anything from the dataset and will likely underfit. So my best guess is a clever strategy to leverage the smaller and simpler models.</p>\n<p>If anyone cracked this competition's dataset, I'd would be so glad to hear your thoughts.</p>",
      "rawMarkdown": "I too tried a lot of methods. One method which really surprised me was using ridge regression models on top of features extracted using dinov2 giant (frozen). The LB score I got for that approach was 0.62 and then I changed ridge models to simple MLP heads and that one also got me 0.62 on LB. This approach took less then an hour for training and 1.5-3hrs for inference. \n\nBut more importantly, I also experimented with removing bad data mentioned in this [thread](https://www.kaggle.com/competitions/csiro-biomass/discussion/631335) and I didn't get any improvements at all and the models instead started getting heavily overfitted.\n\nI don't even know how to describe this dataset, because some features seems to be very useful (metadata) but not available in test sets and other attributes seems to have some bad ids (atleast that's what I think so). Dataset is also very small, so even removing one or couple images (even if it's bad) seems to take a toll on the LB score.\n\nI think a complex model won't even get enough data to learn anything from the dataset and will likely underfit. So my best guess is a clever strategy to leverage the smaller and simpler models.\n\nIf anyone cracked this competition's dataset, I'd would be so glad to hear your thoughts.",
      "votes": null
    },
    {
      "id": "3377341",
      "postDate": "12/16/2025 06:28:32",
      "content": "<p>Thanks for your share.Yesterday, I tried to clean the 'paper', 'red circle', 'shadow' and 'timestamp'.But the LB result is still no change.(still in 0.60)\nThank you. Good luck!</p>",
      "rawMarkdown": "Thanks for your share.Yesterday, I tried to clean the 'paper', 'red circle', 'shadow' and 'timestamp'.But the LB result is still no change.(still in 0.60)\nThank you. Good luck!",
      "votes": null
    },
    {
      "id": "3377890",
      "postDate": "12/17/2025 05:38:13",
      "content": "<p>Hello, in your experiment, did the operations such as Supports Plain / Tiled / Tiled + FiLM play a role in improving the LB score?</p>",
      "rawMarkdown": "Hello, in your experiment, did the operations such as Supports Plain / Tiled / Tiled + FiLM play a role in improving the LB score?",
      "votes": null
    },
    {
      "id": "3377968",
      "postDate": "12/17/2025 08:47:22",
      "content": "<p>Yeah, Tiled + FiLM improves my LB score a lot, it's worth trying🤩</p>",
      "rawMarkdown": "Yeah, Tiled + FiLM improves my LB score a lot, it's worth trying🤩",
      "votes": null
    },
    {
      "id": "3378083",
      "postDate": "12/17/2025 13:53:08",
      "content": "<p>Thank you so much for your idea and experience. May I ask during model training, it is better to train only the head, the last few layers, or the entire model? In my experiments, training only the head gives the best performance. By the way, xiaoju is the cutest.</p>",
      "rawMarkdown": "Thank you so much for your idea and experience. May I ask during model training, it is better to train only the head, the last few layers, or the entire model? In my experiments, training only the head gives the best performance. By the way, xiaoju is the cutest.",
      "votes": null
    },
    {
      "id": "3378143",
      "postDate": "12/17/2025 15:46:41",
      "content": "<p>Thank you 😃, I'm just about to apply these in my experiment.</p>",
      "rawMarkdown": "Thank you 😃, I'm just about to apply these in my experiment.",
      "votes": null
    },
    {
      "id": "3382213",
      "postDate": "12/26/2025 21:55:40",
      "content": "<p>Could you tell me more about your CNN-based solution that achieved the 0.5 on LB? I'm trying to achieve this result with CNN, but I'm falling short.</p>",
      "rawMarkdown": "Could you tell me more about your CNN-based solution that achieved the 0.5 on LB? I'm trying to achieve this result with CNN, but I'm falling short.",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 3363055,
      "author_name": "pcjimmmy",
      "author_url": "",
      "post_date": "12/05/2025 18:32:24",
      "content": "<p>Lots of very good questions - not sure your going to get a lot of feedback.  The GAP between 0.65 and 0.76 is likely filled with over-fitting or a couple of very good augmentations / data edits.</p>\n<p>In my 45+ years of trying to make sense of data I did learn the skill of identifying a crappy data set.  This one hits all the check marks for being poor.  Several weeks ago I made a prediction that 0.75 would be a nice place to have a good stable model.  Still would like to reach that level, but like you stuck at 0.65.  Looking at Huber today - will not come back and tell you if it worked, but if my score tomorrow is better than 0.65 ……</p>",
      "votes": null,
      "replies": [
        {
          "id": 3363246,
          "author_name": "nizarcharrada",
          "author_url": "",
          "post_date": "12/05/2025 20:36:59",
          "content": "<p>Based on your experience in production: when you're working with a very small dataset like this one, how do you make sure you re not overfitting? Even comparing train and validation scores isnt very reliable because the validation set is so small and doesnt reflect real-world performance</p>",
          "votes": null,
          "replies": [
            {
              "id": 3363359,
              "author_name": "pcjimmmy",
              "author_url": "",
              "post_date": "12/05/2025 22:06:12",
              "content": "<p>My experience was almost 99% small datasets.  Doing short experiments on production lines to fix issues / make improvements.   Small required robust ranges of the variables.  But not so robust that you made rejects :)   In one experiment I went so robust that I exceeded the pressure relief value on a large pressurized tank - not good!</p>\n<p>So we would want predicted values to move enough to be statistically valid changes in average or variation.  If yes, than change the process settings.  Collect longer sets of data to the new, return to the old settings and recollect to verify the change.  Did things really improve.  </p>\n<p>Over fitting vs value of the improvement - with high value improvement than you take the risk that you have over fit.  With low value improvement, than redesign the experiment and try again.</p>\n<p>For this application, what is the real world risk?   I would think it's bad predictions when the biomass is low.  Bring too many animals into a pasture or leave them too long thinking you have enough chow.   My big errors on my current models are not predicting a large enough value on the high biomass images - real world risk is not bad - perhaps I don't bring as many animals as it would support or I plan to move them too soon.</p>",
              "votes": null,
              "replies": []
            }
          ]
        },
        {
          "id": 3370600,
          "author_name": "qiyuliaocsiro",
          "author_url": "",
          "post_date": "12/11/2025 00:52:42",
          "content": "<p>Thanks for the comment, Jimmy. </p>\n<p>As you can see, the importance of this issue is self-evident. I understand that for data engineers, the criteria for a good dataset might include accuracy, large scale, no noise, clear and interpretable results. However, research on this topic is actually still in a relatively early stage. Challenges such as integrating data from different sources, information gaps across domains, the ever-changing natural environment, and the difficulty of collecting ground truth data… there are many real-world gaps at present. </p>\n<p>Many peers are actively exploring the best solutions for biomass estimation and have made meaningful progress (e.g., very interesting work I've been recently reading <a href=\"https://www.sciencedirect.com/science/article/pii/S2772375525006550\" target=\"_blank\">https://www.sciencedirect.com/science/article/pii/S2772375525006550</a> ), although their datasets also have certain issues in various aspects. This is how scientific research is—it’s rarely achieved in one step, and you often don’t even know whether a path will ultimately prove feasible until after you’ve tested it.</p>",
          "votes": null,
          "replies": [
            {
              "id": 3371734,
              "author_name": "pcjimmmy",
              "author_url": "",
              "post_date": "12/11/2025 16:16:17",
              "content": "<p>I have mentioned in a couple of posts that I have a good friend who owns a large heifer operation on the eastern plains of Colorado.  The amount of biomass is a super critical issue for them.  Heifer operations hope to feed pregnant cattle over the winter, have calf's in the spring that are sold in early fall.  Having to buy feed during either of those periods can make the difference between a year with profit and a year where only the bank wins.</p>\n<p>In general they tend to keep the herd size down to the minimum level to avoid the risk of the banks owning the land.  In the USA today herd size is down, for a lot of reasons; but risk avoidance is one of them.  Having a good estimate of the biomass in the fields today, as well as predictive models for upcoming months would help to size herds to the optimum.</p>\n<p>Keeps working on it - we all love meat!</p>",
              "votes": null,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 3363233,
      "author_name": "youichwada",
      "author_url": "",
      "post_date": "12/05/2025 20:26:10",
      "content": "<p>Hi <a href=\"https://www.kaggle.com/chikakomari\" target=\"_blank\">@chikakomari</a>,</p>\n<p>Thank you so much for the detailed discussion and for sharing your \"DINO v2 + Tiled\" notebook! Your tiled approach has been incredibly helpful for my experiments as well.</p>\n<p>In my experiments, simply adding the following preprocessing steps significantly improved my single model score (e.g., LB 0.60 -&gt; 0.62):</p>\n<ol>\n<li><strong>Date Stamp Removal</strong>: Masking the orange timestamps and removing them using Inpainting.</li>\n<li><strong>Artifact Removal</strong>: Cropping out the bottom part of images where cardboard or color charts often appear.</li>\n<li><strong>Lighting Normalization</strong>: Applying CLAHE or White Balance correction to reduce the impact of shadows and color casts.</li>\n</ol>\n<p>By doing this, the model stops overfitting to \"text\" or \"garbage\" and focuses on the actual \"grass texture.\" Here is a simple implementation snippet:</p>\n<pre><code> cv2\n numpy  np\n\n ():\n    \n    h, w = img.shape[:]\n    \n    img = img[:(h*), :] \n\n    \n    hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)\n    \n    lower = np.array([, , ])\n    upper = np.array([, , ])\n    mask = cv2.inRange(hsv, lower, upper)\n\n    \n    mask = cv2.dilate(mask, np.ones((,), np.uint8), iterations=)\n\n    \n     np.(mask) &gt; :\n        img = cv2.inpaint(img, mask, , cv2.INPAINT_TELEA)\n\n     img\n</code></pre>\n<p>Your multimodal approach is also very inspiring. Let's keep pushing! Good luck!</p>",
      "votes": null,
      "replies": [
        {
          "id": 3371249,
          "author_name": "gravity20",
          "author_url": "",
          "post_date": "12/11/2025 11:26:21",
          "content": "<p>Could you please clarify whether the aforementioned preprocessing operations are applied only during inference, or during both training and inference?\nWish you good luck!</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 3376869,
          "author_name": "gravity20",
          "author_url": "",
          "post_date": "12/15/2025 10:06:18",
          "content": "<p>I'm not sure whether all timestamps are always located within a specific area in the bottom-right corner.Could you give me some tips?Good luck!</p>",
          "votes": null,
          "replies": [
            {
              "id": 3376934,
              "author_name": "youichwada",
              "author_url": "",
              "post_date": "12/15/2025 12:43:06",
              "content": "<p>Hi <a href=\"https://www.kaggle.com/jiachengma\" target=\"_blank\">@jiachengma</a>,</p>\n<p>Thank you for your questions!</p>\n<p>To answer your first question: I applied these preprocessing steps during <strong>both training and inference</strong>. In my specific case, this improved the LB from 0.60 to 0.62.</p>\n<p>However, I haven't fully verified if this works well with other models, and to be honest, I should have validated it more thoroughly before posting the snippet. Regarding the timestamp locations, I am not 100% sure if my method covers all edge cases.</p>\n<p>Since I might not be able to explain the details perfectly, I decided to publish my full notebook so you can check the exact implementation:\n<a href=\"https://www.kaggle.com/code/youichwada/csiro-inf-convl-metapredictor-exp053\" target=\"_blank\">https://www.kaggle.com/code/youichwada/csiro-inf-convl-metapredictor-exp053</a></p>\n<p>This notebook is based on existing public works. While my LB (0.62) is not very high, I hope this code is useful to you. I would be very happy if you could help verify why this processing resulted in a +0.02 score increase.</p>\n<p>Best regards,</p>",
              "votes": null,
              "replies": [
                {
                  "id": 3377341,
                  "author_name": "gravity20",
                  "author_url": "",
                  "post_date": "12/16/2025 06:28:32",
                  "content": "<p>Thanks for your share.Yesterday, I tried to clean the 'paper', 'red circle', 'shadow' and 'timestamp'.But the LB result is still no change.(still in 0.60)\nThank you. Good luck!</p>",
                  "votes": null,
                  "replies": []
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "id": 3374781,
      "author_name": "jeannkouagou",
      "author_url": "",
      "post_date": "12/12/2025 19:12:56",
      "content": "<p>I'm also stuck at 0.66. Tried all possible ideas that seem to work on validation data but poor performance on public LB. I tried Dinov2, all convnext sizes, all Eva variants, catboost, lightgbm on all possible features, and ensemble of them all, still 0.59-0.66. Feel like taking a break </p>",
      "votes": null,
      "replies": [
        {
          "id": 3375922,
          "author_name": "akomwins",
          "author_url": "",
          "post_date": "12/13/2025 12:01:49",
          "content": "<p>me2\n<strong>😭</strong></p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 3376003,
      "author_name": "khushikyad001",
      "author_url": "",
      "post_date": "12/13/2025 13:25:01",
      "content": "<p>My Question is Still  Should We Avoid Heavy Models?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3377169,
      "author_name": "ashok205",
      "author_url": "",
      "post_date": "12/15/2025 21:48:53",
      "content": "<p>I too tried a lot of methods. One method which really surprised me was using ridge regression models on top of features extracted using dinov2 giant (frozen). The LB score I got for that approach was 0.62 and then I changed ridge models to simple MLP heads and that one also got me 0.62 on LB. This approach took less then an hour for training and 1.5-3hrs for inference. </p>\n<p>But more importantly, I also experimented with removing bad data mentioned in this <a href=\"https://www.kaggle.com/competitions/csiro-biomass/discussion/631335\" target=\"_blank\">thread</a> and I didn't get any improvements at all and the models instead started getting heavily overfitted.</p>\n<p>I don't even know how to describe this dataset, because some features seems to be very useful (metadata) but not available in test sets and other attributes seems to have some bad ids (atleast that's what I think so). Dataset is also very small, so even removing one or couple images (even if it's bad) seems to take a toll on the LB score.</p>\n<p>I think a complex model won't even get enough data to learn anything from the dataset and will likely underfit. So my best guess is a clever strategy to leverage the smaller and simpler models.</p>\n<p>If anyone cracked this competition's dataset, I'd would be so glad to hear your thoughts.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3377890,
      "author_name": "kagger3",
      "author_url": "",
      "post_date": "12/17/2025 05:38:13",
      "content": "<p>Hello, in your experiment, did the operations such as Supports Plain / Tiled / Tiled + FiLM play a role in improving the LB score?</p>",
      "votes": null,
      "replies": [
        {
          "id": 3377968,
          "author_name": "gothamjocker",
          "author_url": "",
          "post_date": "12/17/2025 08:47:22",
          "content": "<p>Yeah, Tiled + FiLM improves my LB score a lot, it's worth trying🤩</p>",
          "votes": null,
          "replies": [
            {
              "id": 3378143,
              "author_name": "kagger3",
              "author_url": "",
              "post_date": "12/17/2025 15:46:41",
              "content": "<p>Thank you 😃, I'm just about to apply these in my experiment.</p>",
              "votes": null,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 3378083,
      "author_name": "forgakki",
      "author_url": "",
      "post_date": "12/17/2025 13:53:08",
      "content": "<p>Thank you so much for your idea and experience. May I ask during model training, it is better to train only the head, the last few layers, or the entire model? In my experiments, training only the head gives the best performance. By the way, xiaoju is the cutest.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3382213,
      "author_name": "michakorlatowicz",
      "author_url": "",
      "post_date": "12/26/2025 21:55:40",
      "content": "<p>Could you tell me more about your CNN-based solution that achieved the 0.5 on LB? I'm trying to achieve this result with CNN, but I'm falling short.</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "3361943": "Hi everyone!  \n\nI have been experimenting on this competition for several weeks, and despite trying many architectures and training strategies, I am still hitting a **performance plateau** in both CV and LB.  \n\nAfter several weeks of experimentation on the CSIRO Image2Biomass competition, I’ve reached a point where progress has significantly slowed down. I would like to summarize the key problems I am currently facing and seek suggestions from the community.\n\n---\n\n# 🔍 0.1. **Summary of My Approach**\n\nThroughout development, I explored multiple model variants:\n\n### **✓ Two-Stream Image Model**  \n- Split each image into left/right half for independent encoding  \n- Supports Plain / Tiled / Tiled + FiLM  \n- Uses structural relationships (GDM = Green + Clover, Total = GDM + Dead)  \n\n### **✓ Multimodal Student–Teacher Regularization**  \n- Student: image-only model  \n- Teacher: text-conditioned FiLM modulation using BERT  \n- Training-only multimodal losses: InfoNCE, Distillation, FiLM-consistency  \n\n### **✓ Additional Components / 其它扩展尝试**  \n- Tile-token Transformer aggregation  \n- Pairwise ranking & difference losses  \n- FDA / CutMix / FMix augmentations  \n- Target-weighted regression loss  \n\n---\n\n# 📈 0.2. **CV & LB Progression**\n\n| Stage | Model | LB |\n|-----------|------------|-----|\n| 1 | Simple CNN baseline | 0.48–0.50 |\n| 2 | Two-Stream DINO | 0.52–0.57 |\n| 3 | Tiled DINO (2×2) | ~0.58–0.60 |\n| 4 | Tiled + FiLM | ~0.60–0.63 |\n| 5 | Multimodal Reg. | LB unchanged or worse(Best 0.65) |\n| 6 | Tile-token Transformer | ~0.63 |\n| 7 | Model Ensemble | ~0.66 |\n\n➡ **Single Model Best LB so far ≈ 0.65, but completely stuck at this level.**\n\n---\n\n# 🔍 **1. Multi-View Image Construction — Will Multi-Channel Views Actually Help?**  \n\nI am experimenting with constructing multi-view inputs from a *single original image*, including:\n\n- Raw RGB channels  \n- Grayscale version  \n- Estimated depth maps (MiDaS / ZoeDepth style)  \n- Concatenating all views into a multi-channel “super-image”\n\n**Questions**\n\n👉 Does artificially expanding views actually increase data diversity, or does it introduce noise?  \n\n👉 Has anyone tested multi-channel stacking on small datasets?  \n\nMy concern is that these synthetic views may *not* behave like truly independent data sources.\n\n---\n\n# 🔍 **2. Training Stability — Should We Use More Careful Data Splits?**  \n\nSome images have extreme biomass values (very high or very low), and mixing them in the same batch seems to destabilize training.\n\n**Questions**\n\n👉 Should we use stratification by *multiple targets* rather than just Dry_Total?  \n\n👉 Should extreme-value images be isolated or grouped to stabilize learning?  \n\n👉 Any fold-splitting strategies that work better?  \n\n---\n\n# 🔍 **3. Additional Data — Is External Pasture Data Useful or Harmful?**  \n\nI found some external pasture datasets (e.g., Irish grass biomass datasets), but I worry:\n\n- Different species composition  \n- Different climate & soil conditions  \n- Different imaging setup  \n- Different biomass scale\n\nAt the same time, deleting “problematic images” in the official dataset is impossible because the dataset is already too small.\n\n**Questions**\n\n👉 Has anyone successfully used external biomass datasets to improve LB?  \n\n👉 How to judge whether cross-domain data is helping or hurting?  \n\n---\n\n# 🔍 **4. Large Models vs Small Models — Should We Avoid Heavy Models?**  \n\nI explored very complex architectures:\n\n- Large ViTs (DINOv2-L, EVA02-L, ViT-Large)  \n- Multi-layer Mixture-of-Experts (MoE)  \n- Deep multimodal cross-attention  \n- Heavy FiLM-modulated pipelines\n\nBut:\n\n- Training becomes unstable  \n- CV does not improve  \n- LB sometimes gets worse  \n- Very clear overfitting barrier\n\n**Questions**\n\n👉 Do top teams use heavy models, or do they keep models lightweight?  \n\n👉 Any tricks to safely train big models on tiny datasets?  \n\n---\n\n# 🔍 **5. Loss Function — Should We Use Log-Loss or Gaussian-Style Regularization?**  \n\nSince WR² is highly sensitive to outliers, I am considering:\n\n- Log-space MSE  \n- Gaussian penalty around target  \n- Robust loss (Huber / Tukey)  \n- Target-wise dynamic weighting  \n- Priors based on physical relationships\n\n**Questions**\n\n👉 Has anyone tried log-loss or Gaussian target smoothing?  \n\n👉 Any loss function that correlates better with LB WR²?  \n\n---\n\n# 🔍 **6. Other General Questions**\n\nA few more uncertainties:\n\n- Should we treat each image as 5 outputs, or treat each (image, target) as independent samples?  \n\n- Should we apply label smoothing for regression?  \n\n- Does multi-task learning truly help in this competition?  \n\n---\n\n# 🙏 **Final Note**\n\nI would be extremely grateful for any suggestions, insights, or experiences.\n\nThanks and wishing everyone good luck with this competition!  \n\nKomari wishes you a very happy day! 🌟\n![Komari wishes you a very happy day! 🌟](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F22065102%2F483c9dcab4269adfa2d6756d0acd4bb9%2Fthumb-1920-1371653.png?generation=1764812293929521&alt=media)",
    "3363055": "Lots of very good questions - not sure your going to get a lot of feedback.  The GAP between 0.65 and 0.76 is likely filled with over-fitting or a couple of very good augmentations / data edits.\n\nIn my 45+ years of trying to make sense of data I did learn the skill of identifying a crappy data set.  This one hits all the check marks for being poor.  Several weeks ago I made a prediction that 0.75 would be a nice place to have a good stable model.  Still would like to reach that level, but like you stuck at 0.65.  Looking at Huber today - will not come back and tell you if it worked, but if my score tomorrow is better than 0.65 ......",
    "3363233": "Hi @chikakomari,\n\nThank you so much for the detailed discussion and for sharing your \"DINO v2 + Tiled\" notebook! Your tiled approach has been incredibly helpful for my experiments as well.\n\nIn my experiments, simply adding the following preprocessing steps significantly improved my single model score (e.g., LB 0.60 -> 0.62):\n\n1.  **Date Stamp Removal**: Masking the orange timestamps and removing them using Inpainting.\n2.  **Artifact Removal**: Cropping out the bottom part of images where cardboard or color charts often appear.\n3.  **Lighting Normalization**: Applying CLAHE or White Balance correction to reduce the impact of shadows and color casts.\n\nBy doing this, the model stops overfitting to \"text\" or \"garbage\" and focuses on the actual \"grass texture.\" Here is a simple implementation snippet:\n\n```python\nimport cv2\nimport numpy as np\n\ndef clean_image(img):\n    # 1. Safe Crop (Remove artifacts at the bottom)\n    h, w = img.shape[:2]\n    # Cut bottom 10% where artifacts often appear\n    img = img[0:int(h*0.90), :] \n    \n    # 2. Inpaint Date Stamp (Remove orange text)\n    hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)\n    # Define orange color range (adjust as needed)\n    lower = np.array([5, 150, 150])\n    upper = np.array([25, 255, 255])\n    mask = cv2.inRange(hsv, lower, upper)\n    \n    # Dilate mask to cover text edges and reduce noise\n    mask = cv2.dilate(mask, np.ones((3,3), np.uint8), iterations=2)\n    \n    # Inpaint if mask is not empty\n    if np.sum(mask) > 0:\n        img = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)\n        \n    return img\n```\n\nYour multimodal approach is also very inspiring. Let's keep pushing! Good luck!",
    "3363246": "Based on your experience in production: when you're working with a very small dataset like this one, how do you make sure you re not overfitting? Even comparing train and validation scores isnt very reliable because the validation set is so small and doesnt reflect real-world performance",
    "3363359": "My experience was almost 99% small datasets.  Doing short experiments on production lines to fix issues / make improvements.   Small required robust ranges of the variables.  But not so robust that you made rejects :)   In one experiment I went so robust that I exceeded the pressure relief value on a large pressurized tank - not good!\n\nSo we would want predicted values to move enough to be statistically valid changes in average or variation.  If yes, than change the process settings.  Collect longer sets of data to the new, return to the old settings and recollect to verify the change.  Did things really improve.  \n\nOver fitting vs value of the improvement - with high value improvement than you take the risk that you have over fit.  With low value improvement, than redesign the experiment and try again.\n\nFor this application, what is the real world risk?   I would think it's bad predictions when the biomass is low.  Bring too many animals into a pasture or leave them too long thinking you have enough chow.   My big errors on my current models are not predicting a large enough value on the high biomass images - real world risk is not bad - perhaps I don't bring as many animals as it would support or I plan to move them too soon.",
    "3370600": "Thanks for the comment, Jimmy. \n\nAs you can see, the importance of this issue is self-evident. I understand that for data engineers, the criteria for a good dataset might include accuracy, large scale, no noise, clear and interpretable results. However, research on this topic is actually still in a relatively early stage. Challenges such as integrating data from different sources, information gaps across domains, the ever-changing natural environment, and the difficulty of collecting ground truth data… there are many real-world gaps at present. \n\nMany peers are actively exploring the best solutions for biomass estimation and have made meaningful progress (e.g., very interesting work I've been recently reading https://www.sciencedirect.com/science/article/pii/S2772375525006550 ), although their datasets also have certain issues in various aspects. This is how scientific research is—it’s rarely achieved in one step, and you often don’t even know whether a path will ultimately prove feasible until after you’ve tested it.",
    "3371249": "Could you please clarify whether the aforementioned preprocessing operations are applied only during inference, or during both training and inference?\nWish you good luck!",
    "3371734": "I have mentioned in a couple of posts that I have a good friend who owns a large heifer operation on the eastern plains of Colorado.  The amount of biomass is a super critical issue for them.  Heifer operations hope to feed pregnant cattle over the winter, have calf's in the spring that are sold in early fall.  Having to buy feed during either of those periods can make the difference between a year with profit and a year where only the bank wins.\n\nIn general they tend to keep the herd size down to the minimum level to avoid the risk of the banks owning the land.  In the USA today herd size is down, for a lot of reasons; but risk avoidance is one of them.  Having a good estimate of the biomass in the fields today, as well as predictive models for upcoming months would help to size herds to the optimum.\n\nKeeps working on it - we all love meat!",
    "3374781": "I'm also stuck at 0.66. Tried all possible ideas that seem to work on validation data but poor performance on public LB. I tried Dinov2, all convnext sizes, all Eva variants, catboost, lightgbm on all possible features, and ensemble of them all, still 0.59-0.66. Feel like taking a break",
    "3375922": "me2\n**😭**",
    "3376003": "My Question is Still  Should We Avoid Heavy Models?",
    "3376869": "I'm not sure whether all timestamps are always located within a specific area in the bottom-right corner.Could you give me some tips?Good luck!",
    "3376934": "Hi @jiachengma,\n\nThank you for your questions!\n\nTo answer your first question: I applied these preprocessing steps during **both training and inference**. In my specific case, this improved the LB from 0.60 to 0.62.\n\nHowever, I haven't fully verified if this works well with other models, and to be honest, I should have validated it more thoroughly before posting the snippet. Regarding the timestamp locations, I am not 100% sure if my method covers all edge cases.\n\nSince I might not be able to explain the details perfectly, I decided to publish my full notebook so you can check the exact implementation:\nhttps://www.kaggle.com/code/youichwada/csiro-inf-convl-metapredictor-exp053\n\nThis notebook is based on existing public works. While my LB (0.62) is not very high, I hope this code is useful to you. I would be very happy if you could help verify why this processing resulted in a +0.02 score increase.\n\nBest regards,",
    "3377169": "I too tried a lot of methods. One method which really surprised me was using ridge regression models on top of features extracted using dinov2 giant (frozen). The LB score I got for that approach was 0.62 and then I changed ridge models to simple MLP heads and that one also got me 0.62 on LB. This approach took less then an hour for training and 1.5-3hrs for inference. \n\nBut more importantly, I also experimented with removing bad data mentioned in this [thread](https://www.kaggle.com/competitions/csiro-biomass/discussion/631335) and I didn't get any improvements at all and the models instead started getting heavily overfitted.\n\nI don't even know how to describe this dataset, because some features seems to be very useful (metadata) but not available in test sets and other attributes seems to have some bad ids (atleast that's what I think so). Dataset is also very small, so even removing one or couple images (even if it's bad) seems to take a toll on the LB score.\n\nI think a complex model won't even get enough data to learn anything from the dataset and will likely underfit. So my best guess is a clever strategy to leverage the smaller and simpler models.\n\nIf anyone cracked this competition's dataset, I'd would be so glad to hear your thoughts.",
    "3377341": "Thanks for your share.Yesterday, I tried to clean the 'paper', 'red circle', 'shadow' and 'timestamp'.But the LB result is still no change.(still in 0.60)\nThank you. Good luck!",
    "3377890": "Hello, in your experiment, did the operations such as Supports Plain / Tiled / Tiled + FiLM play a role in improving the LB score?",
    "3377968": "Yeah, Tiled + FiLM improves my LB score a lot, it's worth trying🤩",
    "3378083": "Thank you so much for your idea and experience. May I ask during model training, it is better to train only the head, the last few layers, or the entire model? In my experiments, training only the head gives the best performance. By the way, xiaoju is the cutest.",
    "3378143": "Thank you 😃, I'm just about to apply these in my experiment.",
    "3382213": "Could you tell me more about your CNN-based solution that achieved the 0.5 on LB? I'm trying to achieve this result with CNN, but I'm falling short."
  },
  "source": "meta"
}