{
  "id": 667537,
  "title": "identify the camera?",
  "url": "/competitions/csiro-biomass/discussion/667537",
  "author_name": "",
  "post_date": "2026-01-13T02:16:56.280342Z",
  "votes": 37,
  "comment_count": 10,
  "views": 0,
  "content": "<p>Gemini: \"\"\"\nSince you can't read the model name, you have to look at the image signal itself. Smartphones and DSLRs process images differently:</p>\n<ul>\n<li>Smartphones usually apply heavy noise reduction (smoothing) and sharpening, resulting in \"cleaner\" but sometimes \"waxy\" textures.</li>\n<li>Real Cameras often leave more natural sensor grain (noise) and have a different depth-of-field falloff.</li>\n</ul>\n<p>You can use this Python script to calculate \"Blurriness\" and \"Noise\" scores. If you plot these, you will likely see two distinct clusters corresponding to the two equipment types.\n\"\"\"</p>\n<pre><code>import cv2\nimport numpy as np\nimport os\nimport matplotlib.pyplot as plt\nfrom tqdm import tqdm\n\nfolder_path = '/kaggle/input/csiro-biomass/train'\n\ndef analyze_image_quality(image_path):\n    # Read image in grayscale\n    img = cv2.imread(image_path, 0)\n    if img is None: return None\n\n    # 1. Estimate Blurriness (Laplacian Variance)\n    # High score = Sharp (DSLR or sharp phone). Low score = Blurry.\n    blur_score = cv2.Laplacian(img, cv2.CV_64F).var()\n\n    # 2. Estimate Noise Level\n    # We smooth the image and subtract it from original to find \"grain\"\n    # Then we measure the standard deviation of that grain.\n    blurred = cv2.GaussianBlur(img, (5, 5), 0)\n    noise_residual = cv2.absdiff(img, blurred)\n    noise_score = np.mean(noise_residual)\n\n    return blur_score, noise_score\n\n# Analyze first 500 images to see the trend\nresults = []\nfilenames = []\n\nprint(\"Analyzing image forensics...\")\nfor filename in tqdm(os.listdir(folder_path)[:500]):\n    if filename.endswith(\".jpg\"):\n        path = os.path.join(folder_path, filename)\n        scores = analyze_image_quality(path)\n        if scores:\n            results.append(scores)\n            filenames.append(filename)\n\n# Split into X and Y for plotting\nblur_scores, noise_scores = zip(*results)\n\n# Plotting\nplt.figure(figsize=(10, 6))\nplt.scatter(blur_scores, noise_scores, alpha=0.5, c='blue', edgecolors='k')\nplt.title(\"Image Forensic Clustering: Smartphone vs. Camera?\")\nplt.xlabel(\"Sharpness (Laplacian Variance)\")\nplt.ylabel(\"Noise/Grain Level\")\nplt.grid(True, alpha=0.3)\nplt.show()\n</code></pre>\n<p><img src=\"https://i.imgur.com/tvWg4Gx.png\" alt=\"img\"></p>",
  "messages": [
    {
      "id": "3390361",
      "postDate": "01/13/2026 02:16:56",
      "content": "<p>Gemini: \"\"\"\nSince you can't read the model name, you have to look at the image signal itself. Smartphones and DSLRs process images differently:</p>\n<ul>\n<li>Smartphones usually apply heavy noise reduction (smoothing) and sharpening, resulting in \"cleaner\" but sometimes \"waxy\" textures.</li>\n<li>Real Cameras often leave more natural sensor grain (noise) and have a different depth-of-field falloff.</li>\n</ul>\n<p>You can use this Python script to calculate \"Blurriness\" and \"Noise\" scores. If you plot these, you will likely see two distinct clusters corresponding to the two equipment types.\n\"\"\"</p>\n<pre><code>import cv2\nimport numpy as np\nimport os\nimport matplotlib.pyplot as plt\nfrom tqdm import tqdm\n\nfolder_path = '/kaggle/input/csiro-biomass/train'\n\ndef analyze_image_quality(image_path):\n    # Read image in grayscale\n    img = cv2.imread(image_path, 0)\n    if img is None: return None\n\n    # 1. Estimate Blurriness (Laplacian Variance)\n    # High score = Sharp (DSLR or sharp phone). Low score = Blurry.\n    blur_score = cv2.Laplacian(img, cv2.CV_64F).var()\n\n    # 2. Estimate Noise Level\n    # We smooth the image and subtract it from original to find \"grain\"\n    # Then we measure the standard deviation of that grain.\n    blurred = cv2.GaussianBlur(img, (5, 5), 0)\n    noise_residual = cv2.absdiff(img, blurred)\n    noise_score = np.mean(noise_residual)\n\n    return blur_score, noise_score\n\n# Analyze first 500 images to see the trend\nresults = []\nfilenames = []\n\nprint(\"Analyzing image forensics...\")\nfor filename in tqdm(os.listdir(folder_path)[:500]):\n    if filename.endswith(\".jpg\"):\n        path = os.path.join(folder_path, filename)\n        scores = analyze_image_quality(path)\n        if scores:\n            results.append(scores)\n            filenames.append(filename)\n\n# Split into X and Y for plotting\nblur_scores, noise_scores = zip(*results)\n\n# Plotting\nplt.figure(figsize=(10, 6))\nplt.scatter(blur_scores, noise_scores, alpha=0.5, c='blue', edgecolors='k')\nplt.title(\"Image Forensic Clustering: Smartphone vs. Camera?\")\nplt.xlabel(\"Sharpness (Laplacian Variance)\")\nplt.ylabel(\"Noise/Grain Level\")\nplt.grid(True, alpha=0.3)\nplt.show()\n</code></pre>\n<p><img src=\"https://i.imgur.com/tvWg4Gx.png\" alt=\"img\"></p>",
      "rawMarkdown": "Gemini: \"\"\"\nSince you can't read the model name, you have to look at the image signal itself. Smartphones and DSLRs process images differently:\n\n- Smartphones usually apply heavy noise reduction (smoothing) and sharpening, resulting in \"cleaner\" but sometimes \"waxy\" textures.\n- Real Cameras often leave more natural sensor grain (noise) and have a different depth-of-field falloff.\n\nYou can use this Python script to calculate \"Blurriness\" and \"Noise\" scores. If you plot these, you will likely see two distinct clusters corresponding to the two equipment types.\n\"\"\"\n\n```\nimport cv2\nimport numpy as np\nimport os\nimport matplotlib.pyplot as plt\nfrom tqdm import tqdm\n\nfolder_path = '/kaggle/input/csiro-biomass/train'\n\ndef analyze_image_quality(image_path):\n    # Read image in grayscale\n    img = cv2.imread(image_path, 0)\n    if img is None: return None\n    \n    # 1. Estimate Blurriness (Laplacian Variance)\n    # High score = Sharp (DSLR or sharp phone). Low score = Blurry.\n    blur_score = cv2.Laplacian(img, cv2.CV_64F).var()\n    \n    # 2. Estimate Noise Level\n    # We smooth the image and subtract it from original to find \"grain\"\n    # Then we measure the standard deviation of that grain.\n    blurred = cv2.GaussianBlur(img, (5, 5), 0)\n    noise_residual = cv2.absdiff(img, blurred)\n    noise_score = np.mean(noise_residual)\n    \n    return blur_score, noise_score\n\n# Analyze first 500 images to see the trend\nresults = []\nfilenames = []\n\nprint(\"Analyzing image forensics...\")\nfor filename in tqdm(os.listdir(folder_path)[:500]):\n    if filename.endswith(\".jpg\"):\n        path = os.path.join(folder_path, filename)\n        scores = analyze_image_quality(path)\n        if scores:\n            results.append(scores)\n            filenames.append(filename)\n\n# Split into X and Y for plotting\nblur_scores, noise_scores = zip(*results)\n\n# Plotting\nplt.figure(figsize=(10, 6))\nplt.scatter(blur_scores, noise_scores, alpha=0.5, c='blue', edgecolors='k')\nplt.title(\"Image Forensic Clustering: Smartphone vs. Camera?\")\nplt.xlabel(\"Sharpness (Laplacian Variance)\")\nplt.ylabel(\"Noise/Grain Level\")\nplt.grid(True, alpha=0.3)\nplt.show()\n```\n\n![img](https://i.imgur.com/tvWg4Gx.png)",
      "votes": null
    },
    {
      "id": "3390370",
      "postDate": "01/13/2026 03:05:59",
      "content": "<p>I will definitely incorporate this into my folds thank you :)</p>",
      "rawMarkdown": "I will definitely incorporate this into my folds thank you :)",
      "votes": null
    },
    {
      "id": "3390379",
      "postDate": "01/13/2026 03:48:18",
      "content": "<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F31551546%2F992826632bc2aaffd394de6d8881eb7a%2Fimage_2026-01-13_044738370.png?generation=1768276059478726&amp;alt=media\" alt=\"\"></p>",
      "rawMarkdown": "![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F31551546%2F992826632bc2aaffd394de6d8881eb7a%2Fimage_2026-01-13_044738370.png?generation=1768276059478726&alt=media)",
      "votes": null
    },
    {
      "id": "3390393",
      "postDate": "01/13/2026 04:26:51",
      "content": "<p>Ah. It is just stratification by state. So not really helpful.</p>",
      "rawMarkdown": "Ah. It is just stratification by state. So not really helpful.",
      "votes": null
    },
    {
      "id": "3390402",
      "postDate": "01/13/2026 04:54:20",
      "content": "<p>I think blurriness and sharpness are definitely very important signals</p>",
      "rawMarkdown": "I think blurriness and sharpness are definitely very important signals",
      "votes": null
    },
    {
      "id": "3390535",
      "postDate": "01/13/2026 10:55:23",
      "content": "<p>Wow! I didn't even know this was possible.</p>",
      "rawMarkdown": "Wow! I didn't even know this was possible.",
      "votes": null
    },
    {
      "id": "3390783",
      "postDate": "01/14/2026 00:07:33",
      "content": "<p>This is very helpful. Thanks</p>",
      "rawMarkdown": "This is very helpful. Thanks",
      "votes": null
    },
    {
      "id": "3390797",
      "postDate": "01/14/2026 00:55:42",
      "content": "<p>\"Blurriness\" and \"Noise\" scores?</p>",
      "rawMarkdown": "\"Blurriness\" and \"Noise\" scores?",
      "votes": null
    },
    {
      "id": "3390812",
      "postDate": "01/14/2026 01:26:47",
      "content": "<p>Nice insight!</p>",
      "rawMarkdown": "Nice insight!",
      "votes": null
    },
    {
      "id": "3397401",
      "postDate": "01/27/2026 07:46:30",
      "content": "<p>Nice insight!</p>",
      "rawMarkdown": "Nice insight!",
      "votes": null
    },
    {
      "id": "3397918",
      "postDate": "01/28/2026 09:24:14",
      "content": "<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F21739094%2Ffa86c5588fd6ef5d4fd7135f904bc104%2FCapture.PNG?generation=1769592252368772&amp;alt=media\" alt=\"\"></p>",
      "rawMarkdown": "![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F21739094%2Ffa86c5588fd6ef5d4fd7135f904bc104%2FCapture.PNG?generation=1769592252368772&alt=media)",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 3390370,
      "author_name": "aliozanmemetoglu",
      "author_url": "",
      "post_date": "01/13/2026 03:05:59",
      "content": "<p>I will definitely incorporate this into my folds thank you :)</p>",
      "votes": null,
      "replies": [
        {
          "id": 3390379,
          "author_name": "berringurler",
          "author_url": "",
          "post_date": "01/13/2026 03:48:18",
          "content": "<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F31551546%2F992826632bc2aaffd394de6d8881eb7a%2Fimage_2026-01-13_044738370.png?generation=1768276059478726&amp;alt=media\" alt=\"\"></p>",
          "votes": null,
          "replies": [
            {
              "id": 3390393,
              "author_name": "returnofsputnik",
              "author_url": "",
              "post_date": "01/13/2026 04:26:51",
              "content": "<p>Ah. It is just stratification by state. So not really helpful.</p>",
              "votes": null,
              "replies": [
                {
                  "id": 3390402,
                  "author_name": "aliozanmemetoglu",
                  "author_url": "",
                  "post_date": "01/13/2026 04:54:20",
                  "content": "<p>I think blurriness and sharpness are definitely very important signals</p>",
                  "votes": null,
                  "replies": []
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "id": 3390535,
      "author_name": "paritoshtripathi5",
      "author_url": "",
      "post_date": "01/13/2026 10:55:23",
      "content": "<p>Wow! I didn't even know this was possible.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3390783,
      "author_name": "itzgauurab",
      "author_url": "",
      "post_date": "01/14/2026 00:07:33",
      "content": "<p>This is very helpful. Thanks</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3390797,
      "author_name": "navneetbende",
      "author_url": "",
      "post_date": "01/14/2026 00:55:42",
      "content": "<p>\"Blurriness\" and \"Noise\" scores?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3390812,
      "author_name": "cdeotte",
      "author_url": "",
      "post_date": "01/14/2026 01:26:47",
      "content": "<p>Nice insight!</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3397401,
      "author_name": "hellozq",
      "author_url": "",
      "post_date": "01/27/2026 07:46:30",
      "content": "<p>Nice insight!</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3397918,
      "author_name": "",
      "author_url": "",
      "post_date": "01/28/2026 09:24:14",
      "content": "<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F21739094%2Ffa86c5588fd6ef5d4fd7135f904bc104%2FCapture.PNG?generation=1769592252368772&amp;alt=media\" alt=\"\"></p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "3390361": "Gemini: \"\"\"\nSince you can't read the model name, you have to look at the image signal itself. Smartphones and DSLRs process images differently:\n\n- Smartphones usually apply heavy noise reduction (smoothing) and sharpening, resulting in \"cleaner\" but sometimes \"waxy\" textures.\n- Real Cameras often leave more natural sensor grain (noise) and have a different depth-of-field falloff.\n\nYou can use this Python script to calculate \"Blurriness\" and \"Noise\" scores. If you plot these, you will likely see two distinct clusters corresponding to the two equipment types.\n\"\"\"\n\n```\nimport cv2\nimport numpy as np\nimport os\nimport matplotlib.pyplot as plt\nfrom tqdm import tqdm\n\nfolder_path = '/kaggle/input/csiro-biomass/train'\n\ndef analyze_image_quality(image_path):\n    # Read image in grayscale\n    img = cv2.imread(image_path, 0)\n    if img is None: return None\n    \n    # 1. Estimate Blurriness (Laplacian Variance)\n    # High score = Sharp (DSLR or sharp phone). Low score = Blurry.\n    blur_score = cv2.Laplacian(img, cv2.CV_64F).var()\n    \n    # 2. Estimate Noise Level\n    # We smooth the image and subtract it from original to find \"grain\"\n    # Then we measure the standard deviation of that grain.\n    blurred = cv2.GaussianBlur(img, (5, 5), 0)\n    noise_residual = cv2.absdiff(img, blurred)\n    noise_score = np.mean(noise_residual)\n    \n    return blur_score, noise_score\n\n# Analyze first 500 images to see the trend\nresults = []\nfilenames = []\n\nprint(\"Analyzing image forensics...\")\nfor filename in tqdm(os.listdir(folder_path)[:500]):\n    if filename.endswith(\".jpg\"):\n        path = os.path.join(folder_path, filename)\n        scores = analyze_image_quality(path)\n        if scores:\n            results.append(scores)\n            filenames.append(filename)\n\n# Split into X and Y for plotting\nblur_scores, noise_scores = zip(*results)\n\n# Plotting\nplt.figure(figsize=(10, 6))\nplt.scatter(blur_scores, noise_scores, alpha=0.5, c='blue', edgecolors='k')\nplt.title(\"Image Forensic Clustering: Smartphone vs. Camera?\")\nplt.xlabel(\"Sharpness (Laplacian Variance)\")\nplt.ylabel(\"Noise/Grain Level\")\nplt.grid(True, alpha=0.3)\nplt.show()\n```\n\n![img](https://i.imgur.com/tvWg4Gx.png)",
    "3390370": "I will definitely incorporate this into my folds thank you :)",
    "3390379": "![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F31551546%2F992826632bc2aaffd394de6d8881eb7a%2Fimage_2026-01-13_044738370.png?generation=1768276059478726&alt=media)",
    "3390393": "Ah. It is just stratification by state. So not really helpful.",
    "3390402": "I think blurriness and sharpness are definitely very important signals",
    "3390535": "Wow! I didn't even know this was possible.",
    "3390783": "This is very helpful. Thanks",
    "3390797": "\"Blurriness\" and \"Noise\" scores?",
    "3390812": "Nice insight!",
    "3397401": "Nice insight!",
    "3397918": "![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F21739094%2Ffa86c5588fd6ef5d4fd7135f904bc104%2FCapture.PNG?generation=1769592252368772&alt=media)"
  },
  "source": "meta"
}