{
  "id": 145607,
  "title": "Random crop on slide",
  "url": "/competitions/prostate-cancer-grade-assessment/discussion/145607",
  "author_name": "Adil Zouitine",
  "post_date": "2020-04-23T20:36:54.353000",
  "votes": 5,
  "comment_count": 1,
  "views": 0,
  "content": "<p>Hello Kagglers,</p>\n\n<p>I am currently implementing an algorithm using segmentation masks.\nSo I coded a random crop for the <code>openslide</code> format.</p>\n\n<p>Here's the code:\n```python\nimport random\nfrom typing import Tuple</p>\n\n<p>import openslide\nimport PIL</p>\n\n<p>class SlideRandomCrop:\n    def <strong>init</strong>(self, patch_size: Tuple[int, int]):\n        self.w_patch, self.h_patch = patch_size</p>\n\n<pre><code>def __call__(self, slide:openslide.OpenSlide) -&amp;gt; PIL.Image.Image:\n    w_slide, h_slide = slide.dimensions\n    w_rand = random.randint(0, w_slide - self.w_patch)\n    h_rand = random.randint(0, h_slide - self.h_patch)\n    patch = slide.read_region(location=(w_rand, h_rand), level=0, size=(self.w_patch, self.h_patch))\n    return patch\n</code></pre>\n\n<p><code>\nHow to use it: \n</code>python\nimage_path = '/kaggle/input/prostate-cancer-grade-assessment/train_images/0005f7aaab2800f6170c399693a96917.tiff'</p>\n\n<p>image = openslide.OpenSlide(image_path)\ncrop = SlideRandomCrop(patch_size=(256, 256))\nrandom_patch = crop(image)\n```</p>\n\n<p>It's also compatible with the <code>transforms.Compose</code> from <code>torchvision</code> library.</p>\n\n<p>The next step is to find a smarter way to crop in order not to have patches composed only of backgrounds.</p>\n\n<p>Have fun and good kaggling :)</p>",
  "messages": [
    {
      "id": 818392,
      "postDate": "2020-04-23T20:36:54.353Z",
      "content": "<p>Hello Kagglers,</p>\n\n<p>I am currently implementing an algorithm using segmentation masks.\nSo I coded a random crop for the <code>openslide</code> format.</p>\n\n<p>Here's the code:\n```python\nimport random\nfrom typing import Tuple</p>\n\n<p>import openslide\nimport PIL</p>\n\n<p>class SlideRandomCrop:\n    def <strong>init</strong>(self, patch_size: Tuple[int, int]):\n        self.w_patch, self.h_patch = patch_size</p>\n\n<pre><code>def __call__(self, slide:openslide.OpenSlide) -&amp;gt; PIL.Image.Image:\n    w_slide, h_slide = slide.dimensions\n    w_rand = random.randint(0, w_slide - self.w_patch)\n    h_rand = random.randint(0, h_slide - self.h_patch)\n    patch = slide.read_region(location=(w_rand, h_rand), level=0, size=(self.w_patch, self.h_patch))\n    return patch\n</code></pre>\n\n<p><code>\nHow to use it: \n</code>python\nimage_path = '/kaggle/input/prostate-cancer-grade-assessment/train_images/0005f7aaab2800f6170c399693a96917.tiff'</p>\n\n<p>image = openslide.OpenSlide(image_path)\ncrop = SlideRandomCrop(patch_size=(256, 256))\nrandom_patch = crop(image)\n```</p>\n\n<p>It's also compatible with the <code>transforms.Compose</code> from <code>torchvision</code> library.</p>\n\n<p>The next step is to find a smarter way to crop in order not to have patches composed only of backgrounds.</p>\n\n<p>Have fun and good kaggling :)</p>",
      "rawMarkdown": "Hello Kagglers,\n\nI am currently implementing an algorithm using segmentation masks.\nSo I coded a random crop for the `openslide` format.\n\nHere's the code:\n```python\nimport random\nfrom typing import Tuple\n\nimport openslide\nimport PIL\n\n\nclass SlideRandomCrop:\n    def __init__(self, patch_size: Tuple[int, int]):\n        self.w_patch, self.h_patch = patch_size\n    \n    def __call__(self, slide:openslide.OpenSlide) -&gt; PIL.Image.Image:\n        w_slide, h_slide = slide.dimensions\n        w_rand = random.randint(0, w_slide - self.w_patch)\n        h_rand = random.randint(0, h_slide - self.h_patch)\n        patch = slide.read_region(location=(w_rand, h_rand), level=0, size=(self.w_patch, self.h_patch))\n        return patch\n```\nHow to use it: \n```python\nimage_path = '/kaggle/input/prostate-cancer-grade-assessment/train_images/0005f7aaab2800f6170c399693a96917.tiff'\n\nimage = openslide.OpenSlide(image_path)\ncrop = SlideRandomCrop(patch_size=(256, 256))\nrandom_patch = crop(image)\n```\n\nIt's also compatible with the `transforms.Compose` from `torchvision` library.\n\nThe next step is to find a smarter way to crop in order not to have patches composed only of backgrounds.\n\nHave fun and good kaggling :)",
      "votes": 5
    },
    {
      "id": 818426,
      "postDate": "2020-04-23T21:44:41.380Z",
      "content": "<p>thanks :)</p>",
      "rawMarkdown": "thanks :)",
      "votes": 1
    }
  ],
  "comments": [
    {
      "id": 818426,
      "author_name": "Alberto Maria Falletta",
      "author_url": "",
      "post_date": "2020-04-23T21:44:41.380000",
      "content": "<p>thanks :)</p>",
      "votes": 1,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "818392": "Hello Kagglers,\n\nI am currently implementing an algorithm using segmentation masks.\nSo I coded a random crop for the `openslide` format.\n\nHere's the code:\n```python\nimport random\nfrom typing import Tuple\n\nimport openslide\nimport PIL\n\n\nclass SlideRandomCrop:\n    def __init__(self, patch_size: Tuple[int, int]):\n        self.w_patch, self.h_patch = patch_size\n    \n    def __call__(self, slide:openslide.OpenSlide) -&gt; PIL.Image.Image:\n        w_slide, h_slide = slide.dimensions\n        w_rand = random.randint(0, w_slide - self.w_patch)\n        h_rand = random.randint(0, h_slide - self.h_patch)\n        patch = slide.read_region(location=(w_rand, h_rand), level=0, size=(self.w_patch, self.h_patch))\n        return patch\n```\nHow to use it: \n```python\nimage_path = '/kaggle/input/prostate-cancer-grade-assessment/train_images/0005f7aaab2800f6170c399693a96917.tiff'\n\nimage = openslide.OpenSlide(image_path)\ncrop = SlideRandomCrop(patch_size=(256, 256))\nrandom_patch = crop(image)\n```\n\nIt's also compatible with the `transforms.Compose` from `torchvision` library.\n\nThe next step is to find a smarter way to crop in order not to have patches composed only of backgrounds.\n\nHave fun and good kaggling :)",
    "818426": "thanks :)"
  }
}