{ "info": { "author": "Pierre-Antoine Ganaye", "author_email": "", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: POSIX", "Programming Language :: Python :: 3" ], "description": "# TorchMed\n\nRead and process medical images in PyTorch.\n\n[![Build Status](https://travis-ci.com/trypag/pytorch-med.svg?token=W7UTQDqNUe21xtLfiqRm&branch=master)](https://travis-ci.com/trypag/pytorch-med)\n[![codecov](https://codecov.io/gh/trypag/pytorch-med/branch/master/graph/badge.svg?token=kL3ASEka4B)](https://codecov.io/gh/trypag/pytorch-med)\n\n---\n\nThis library is designed as a flexible tool to process various types N dimension images.\nThrough a set of image **readers** based on famous projects (SimpleITK, NiBabel, OpenCV, Pillow)\nyou will be able to load your data. Once loaded, specific sub-sampling of the original\ndata is performed with **patterns** (describing what/how to extract) and **samplers**\n(checks where to extract).\n\nWith **readers**, **samplers** and **patterns**, you can compose **datasets** which\na perfectly suited for PyTorch.\n\n## Install\n\nFrom pip:\n\n```bash\npip install torchmed\n```\n\nLocally :\n\n```bash\npython install setup.py\n```\n\n## Usage\n\n### Reader\n\n```python\n>>> import torchmed\n\n>>> image = torchmed.readers.SitkReader('prepro_im_mni_bc.nii.gz')\n>>> label_map = torchmed.readers.SitkReader('prepro_seg_mni.nii.gz')\n# gets image data\n>>> image_array = image.to_torch()\n>>> label_array = label_map.to_torch()\n\n>>> image_array.size()\ntorch.Size([182, 218, 182])\n>>> type(image_array)\n\n>>> label_array[0,0,0]\ntensor(0.)\n# also available for Numpy\n>>> type(image.to_numpy())\n\n```\n\n### Pattern\n\nPatterns are useful to specify how the data should be extracted from an image.\nIt is possible to apply several patterns on one or more images.\n\n```python\n>>> import torchmed\n\n>>> image = torchmed.readers.SitkReader('prepro_im_mni_bc.nii.gz')\n>>> square_patch = torchmed.patterns.SquaredSlidingWindow([182, 7, 182], use_padding=False)\n# initialize the pattern with the image properties\n>>> square_patch.prepare(image_arr)\n\n# can_apply checks if a pattern can be applied at a given position\n>>> square_patch.can_apply(image_arr, [0,0,0])\nFalse\n>>> square_patch.can_apply(image_arr, [91,4,91])\nTrue\n>>> square_patch.can_apply(image_arr, [91,3,91])\nTrue\n>>> square_patch.can_apply(image_arr, [91,2,91])\nFalse\n>>> square_patch.can_apply(image_arr, [91,154,91])\nTrue\n\n# to extract a patch at a correct position\n>>> sample = square_patch(image_arr, [91,154,91])\n>>> sample.size()\ntorch.Size([182, 7, 182])\n```\n\n### Sampler\n\nMulti-processed sampler to automatically search for coordinates where sampling\n(pattern extraction) is possible.\n\n```python\n>>> from torchmed.readers import SitkReader\n>>> from torchmed.samplers import MaskableSampler\n>>> from torchmed.patterns import SquaredSlidingWindow\n\n# maps a name to each image\n>>> file_map = {\n... 'image_ref': SitkReader('prepro_im_mni_bc.nii.gz',\n... torch_type='torch.FloatTensor'),\n... 'target': SitkReader('prepro_seg_mni.nii.gz',\n... torch_type='torch.LongTensor')\n... }\n\n# sliding window pattern\n>>> patch2d = SquaredSlidingWindow(patch_size=[182, 7, 182], use_padding=False)\n# specify a pattern for each input image\n>>> pattern_mapper = {'input': ('image_ref', patch2d),\n... 'target': ('target', patch2d)}\n# muli-processed sampler with offset\n>>> sampler = MaskableSampler(pattern_mapper, offset=[91, 1, 91], nb_workers=4)\n>>> sampler.build(file_map)\n>>> len(sampler)\n212\n>>> sample = sampler[0]\n>>> type(sample)\n\n>>> sample[0].size()\ntorch.Size([3])\n>>> sample[1].size()\ntorch.Size([182, 7, 182])\n>>> sample[2].size()\ntorch.Size([182, 7, 182])\n```\n\n### Dataset\n\n`MedFile` and `MedFolder` are iterable datasets, returning samples from the input\ndata. Here is an example of how to build a `MedFolder` from a list of images.\nA `MedFolder` takes as input a list of `MedFile`s.\n\n```python\nimport os\nfrom torchmed.datasets import MedFile, MedFolder\n\nself.train_dataset = MedFolder(\n self.generate_medfiles(os.path.join(base_dir, 'train'), nb_workers))\n\ndef generate_medfiles(self, dir, nb_workers):\n # database composed of dirname contained in the allowed_data.txt\n database = open(os.path.join(dir, 'allowed_data.txt'), 'r')\n patient_list = [line.rstrip('\\n') for line in database]\n medfiles = []\n\n # builds a list of MedFiles, one for each folder\n for patient in patient_list:\n if patient:\n patient_dir = os.path.join(dir, patient)\n patient_data = self.build_patient_data_map(patient_dir)\n patient_file = MedFile(patient_data, self.build_sampler(nb_workers))\n medfiles.append(patient_file)\n\n return medfiles\n\ndef build_patient_data_map(self, dir):\n # pads each dimension of the image on both sides.\n pad_reflect = Pad(((1, 1), (3, 3), (1, 1)), 'reflect')\n file_map = {\n 'image_ref': SitkReader(\n os.path.join(dir, 'prepro_im_mni_bc.nii.gz'),\n torch_type='torch.FloatTensor', transform=pad_reflect),\n 'target': SitkReader(\n os.path.join(dir, 'prepro_seg_mni.nii.gz'),\n torch_type='torch.LongTensor', transform=pad_reflect)\n }\n\n return file_map\n\ndef build_sampler(self, nb_workers):\n # sliding window of size [184, 7, 184] without padding\n patch2d = SquaredSlidingWindow(patch_size=[184, 7, 184], use_padding=False)\n # pattern map links image id to a Sampler\n pattern_mapper = {'input': ('image_ref', patch2d),\n 'target': ('target', patch2d)}\n\n # add a fixed offset to make patch sampling faster (doesn't look for all positions)\n return MaskableSampler(pattern_mapper, offset=[92, 1, 92],\n nb_workers=nb_workers)\n\n```\n\n### Examples\n\nSee the `datasets` folder of the examples for a more pratical use case.\n\n#### Credits\n\nEvaluation metrics are mostly based on MedPy.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/trypag/pytorch-med", "keywords": "", "license": "GNU GPLv3", "maintainer": "", "maintainer_email": "", "name": "torchmed", "package_url": "https://pypi.org/project/torchmed/", "platform": "", "project_url": "https://pypi.org/project/torchmed/", "project_urls": { "Homepage": "https://github.com/trypag/pytorch-med" }, "release_url": "https://pypi.org/project/torchmed/0.0.1a0/", "requires_dist": [ "torch (>=1.0.0)", "nibabel", "SimpleITK", "Pillow", "numpy", "pandas", "scipy", "matplotlib", "opencv-python" ], "requires_python": ">=3", "summary": "A compagnon library for deep learning on medical imaging", "version": "0.0.1a0" }, "last_serial": 4782905, "releases": { "0.0.1a0": [ { "comment_text": "", "digests": { "md5": "bc7983fd2dec09bb564cc046813ded14", "sha256": "9ce70dbe19917bb3fa8795e37a45915c56ba9f07b0d596561555feee6c0367df" }, "downloads": -1, "filename": "torchmed-0.0.1a0-py3-none-any.whl", "has_sig": false, "md5_digest": "bc7983fd2dec09bb564cc046813ded14", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 34062, "upload_time": "2019-02-05T16:45:44", "url": "https://files.pythonhosted.org/packages/20/3a/3d3320e0e839bb4a8715ae15e610ccaa348c01b82381ffe7b253d463e105/torchmed-0.0.1a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7897f126bda4d41b1c429b323f0da8a3", "sha256": "4ab7744b6e164aa718e6cb83a3778b7952d2b0b6a108033a93f2e58dd078b269" }, "downloads": -1, "filename": "torchmed-0.0.1a0.tar.gz", "has_sig": false, "md5_digest": "7897f126bda4d41b1c429b323f0da8a3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 24396, "upload_time": "2019-02-05T16:45:46", "url": "https://files.pythonhosted.org/packages/96/61/fca68f16686aa44781724f5f7a4ebce054340d4dc68296dc1888c7684906/torchmed-0.0.1a0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bc7983fd2dec09bb564cc046813ded14", "sha256": "9ce70dbe19917bb3fa8795e37a45915c56ba9f07b0d596561555feee6c0367df" }, "downloads": -1, "filename": "torchmed-0.0.1a0-py3-none-any.whl", "has_sig": false, "md5_digest": "bc7983fd2dec09bb564cc046813ded14", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 34062, "upload_time": "2019-02-05T16:45:44", "url": "https://files.pythonhosted.org/packages/20/3a/3d3320e0e839bb4a8715ae15e610ccaa348c01b82381ffe7b253d463e105/torchmed-0.0.1a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7897f126bda4d41b1c429b323f0da8a3", "sha256": "4ab7744b6e164aa718e6cb83a3778b7952d2b0b6a108033a93f2e58dd078b269" }, "downloads": -1, "filename": "torchmed-0.0.1a0.tar.gz", "has_sig": false, "md5_digest": "7897f126bda4d41b1c429b323f0da8a3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 24396, "upload_time": "2019-02-05T16:45:46", "url": "https://files.pythonhosted.org/packages/96/61/fca68f16686aa44781724f5f7a4ebce054340d4dc68296dc1888c7684906/torchmed-0.0.1a0.tar.gz" } ] }