Skip to main content

Fast sampling from large images

Project description

GitlabCIPipeline GitlabCICoverage Pypi Downloads

Built with detection related tasks in mind, but also useful for classification tasks.

The basic idea is to ensure your data is in MS-coco format, and then the CocoSampler class will let you sample positive and negative regions.

For classification tasks the MS-COCO data could just be that every image has an annotation that takes up the entire image.

Features

  • CocoDataset for managing and manipulating annotated image datasets

  • Amortized O(1) sampling of N-dimension space-time data (wrt to constant window size) (e.g. images and video).

  • Hierarchical or mutually exclusive category management.

  • Random negative window sampling.

  • Coverage-based positive sampling.

  • Dynamic toydata generator.

Example

This example shows how you can efficiently load subregions from images.

>>> # Imagine you have some images
>>> import kwimage
>>> image_paths = [
>>>     kwimage.grab_test_image_fpath('astro'),
>>>     kwimage.grab_test_image_fpath('carl'),
>>>     kwimage.grab_test_image_fpath('airport'),
>>> ]  # xdoc: +IGNORE_WANT
['~/.cache/kwimage/demodata/KXhKM72.png',
 '~/.cache/kwimage/demodata/flTHWFD.png',
 '~/.cache/kwimage/demodata/Airport.jpg']
>>> # And you want to randomly load subregions of them in O(1) time
>>> import ndsampler
>>> # First make a COCO dataset that refers to your images (and possibly annotations)
>>> dataset = {
>>>     'images': [{'id': i, 'file_name': fpath} for i, fpath in enumerate(image_paths)],
>>>     'annotations': [],
>>>     'categories': [],
>>> }
>>> coco_dset = ndsampler.CocoDataset(dataset)
>>> print(coco_dset)
<CocoDataset(tag=None, n_anns=0, n_imgs=3, n_cats=0)>
>>> # Now pass the dataset to a sampler and tell it where it can store temporary files
>>> workdir = ub.ensure_app_cache_dir('ndsampler/demo')
>>> sampler = ndsampler.CocoSampler(coco_dset, workdir=workdir)
>>> # Now you can load arbirary samples by specifing a target dictionary
>>> # with an image_id (gid) center location (cx, cy) and width, height.
>>> target = {'gid': 0, 'cx': 200, 'cy': 200, 'width': 100, 'height': 100}
>>> sample = sampler.load_sample(target)
>>> # The sample contains the image data, any visible annotations, a reference
>>> # to the original target, and params of the transform used to sample this
>>> # patch
>>> print(sorted(sample.keys()))
['annots', 'im', 'params', 'tr']
>>> im = sample['im']
>>> print(im.shape)
(100, 100, 3)
>>> # The load sample function is at the core of what ndsampler does
>>> # There are other helper functions like load_positive / load_negative
>>> # which deal with annotations. See those for more details.
>>> # For random negative sampling see coco_regions.

TODO

  • [ ] Currently only supports image-based detection tasks, but not much work is needed to extend to video. The code was originally based on sampling code for video, so ndimensions is builtin to most places in the code. However, there are currently no test cases that demonstrate that this library does work with video. So we should (a) port the video toydata code from irharn to test ndcases and (b) fix the code to work for both still images and video where things break.

  • [ ] Currently we are good at loading many small objects in 2d images. However, we are bad at loading images with one single large object that needs to be downsampled (e.g. loading an entire 1024x1024 image and downsampling it to 224x224). We should find a way to mitigate this using pyramid overviews in the backend COG files.

NOTES

There is a GDAL backend for FramesSampler

Installing gdal is a pain though.

https://gist.github.com/cspanring/5680334

Using conda is relatively simple

conda install gdal

# Test that this works
python -c "from osgeo import gdal; print(gdal)"

Also possible to use system packages

# References:
# https://gis.stackexchange.com/questions/28966/python-gdal-package-missing-header-file-when-installing-via-pip
# https://gist.github.com/cspanring/5680334


# Install GDAL system libs
sudo apt install libgdal-dev

GDAL_VERSION=`gdal-config --version`
echo "GDAL_VERSION = $GDAL_VERSION"
pip install --global-option=build_ext --global-option="-I/usr/include/gdal" GDAL==$GDAL_VERSION


# Test that this works
python -c "from osgeo import gdal; print(gdal)"

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ndsampler-0.5.4.tar.gz (104.8 kB view details)

Uploaded Source

Built Distribution

ndsampler-0.5.4-py2.py3-none-any.whl (109.0 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file ndsampler-0.5.4.tar.gz.

File metadata

  • Download URL: ndsampler-0.5.4.tar.gz
  • Upload date:
  • Size: 104.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.8.1

File hashes

Hashes for ndsampler-0.5.4.tar.gz
Algorithm Hash digest
SHA256 c562ada2bcbf8437ff88c290998a37f34ab92583e4af2a6436a18aaeb49dd40c
MD5 a5382e392ae79f3a4bece8ecfd4ce2cc
BLAKE2b-256 6c99389feed25a7a0e0e6c8ae1bcb7483cdaa7c59a481307d76cfa80f0a7ace5

See more details on using hashes here.

File details

Details for the file ndsampler-0.5.4-py2.py3-none-any.whl.

File metadata

  • Download URL: ndsampler-0.5.4-py2.py3-none-any.whl
  • Upload date:
  • Size: 109.0 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.8.1

File hashes

Hashes for ndsampler-0.5.4-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 c8120e315eab241d34dc7d4a81d6c3273e4f711a5c0c273b1504fb0dbdc9b4a7
MD5 b5b8cc47981cb13dc42c387b4c121001
BLAKE2b-256 25269844780aa46f2b61598d1040bf89fd5cb62c9d07abeb61dcd50307f631ea

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page