Skip to main content

Binned GLCM 5 Features implemented in CuPy

Project description

📖Wiki

GLCM Binned 5-Features on CuPy

This directly utilizes CUDA to speed up the processing of GLCM.

Installation

Python >= 3.7

First, you need to install this

pip install glcm-cupy

Then, you need to install CuPy version corresponding to your CUDA version

I recommend using conda-forge as it worked for me :)

conda install -c conda-forge cupy cudatoolkit=<your_CUDA_version>

E.g: For CUDA 11.6,

conda install -c conda-forge cupy cudatoolkit=11.6

To install CuPy manually, see this page

Optional Installation

This supports RAPIDS cucim.

RAPIDS Installation Guide

It's automatically enabled if installed.

Usage

>>> from glcm_cupy import GLCM
>>> import numpy as np
>>> from PIL import Image
>>> ar = np.asarray(Image.open("image.jpg"))
>>> ar.shape
(1080, 1920, 3)
>>> g = GLCM(...).run(ar)
>>> g.shape
(1074, 1914, 3, 8)

The last dimension of g is the GLCM Features.

To retrieve a specific GLCM Feature:

>>> from glcm_cupy import CONTRAST
>>> g[..., CONTRAST].shape
(1074, 1914, 3)

You may also consider simply glcm if you're not reusing GLCM()

>>> from glcm_cupy import glcm
>>> g = glcm(ar, ...)

Example: Processing an Image

Features

These are the features implemented.

  • HOMOGENEITY = 0
  • CONTRAST = 1
  • ASM = 2
  • MEAN = 3
  • VAR = 4
  • CORRELATION = 5
  • DISSIMILARITY = 6

Don't see one you need? Raise an issue, I'll (hopefully) add it.

Radius & Step Size

  • The radius defines the window radius for each GLCM window.
  • The step size defines the distance between each window.
    • If it's diagonal, it treats a diagonal step as 1. It's not the euclidean distance.

Binning

To reduce GLCM processing time, you can specify bin_from & bin_to.

This will bin the image from a range to another.

I highly recommend using this to reduce time taken before raising it.

E.g.

I have an RGB image with a max value of 255.

I limit the max value to 31. This reduces the processing time.

GLCM(..., bin_from=256, bin_to=32).run(ar)

The lower the max value, the smaller the GLCM required. Thus allowing for more GLCMs to run concurrently.

Direction

By default, we have the following directions to run GLCM on.

  • East: Direction.EAST
  • South East: Direction.SOUTH_EAST
  • South: Direction.SOUTH
  • South West: Direction.SOUTH_WEST

For each direction, the GLCM will be bidirectional.

We can specify only certain directions here.

>>> from glcm_cupy import GLCM
>>> GLCM()
>>> g = GLCM(directions=(Direction.SOUTH_WEST, Direction.SOUTH))

The result of these directions will be averaged together.

Notes

Q: Why did my image shrink?

The image shrunk due to step_size & radius.

The amount of shrink per XY Dimension is size - 2 * step_size - 2 * radius

Q: What's the difference between this and glcmbin5?

This is the faster one, and easier to use. I highly recommend avoiding glcmbin5 as it has C++, which means you need to compile manually.

It's the first version of GLCM I made.

Contributors

CUDA Notes

Why is the kernel split into 4?

The kernel is split into 4 sections

  1. GLCM Creation
  2. Features (ASM, Contrast, Homogeneity, GLCM Mean I, GLCM Mean J)
  3. Features (GLCM Variance I, GLCM Variance J)
  4. Features (GLCM Correlation)

The reason why it's split is due to (2) being reliant on (1), and (3) on (2), ... .

There are some other solutions tried

  1. __syncthreads() will not work as we require to sync all blocks.
    1. We can't put all calculations in a block due to the thread limit of 512, 1024, 2048.
    2. We require 256 * 256 threads minimum to support a GLCM of max value 255.
  2. Cooperative Groups imposes a 24 block limit.

Thus, the best solution is to split the kernel.

Atomic Add

Threads cannot write to a single pointer in parallel, information will be overwritten and lost. This is the Race Condition.

In order to avoid this, we use Atomic Functions.

... it is guaranteed to be performed without interference from other threads

Change Log

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

glcm_cupy-0.1.10.tar.gz (15.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

glcm_cupy-0.1.10-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

File details

Details for the file glcm_cupy-0.1.10.tar.gz.

File metadata

  • Download URL: glcm_cupy-0.1.10.tar.gz
  • Upload date:
  • Size: 15.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.8.13 Windows/10

File hashes

Hashes for glcm_cupy-0.1.10.tar.gz
Algorithm Hash digest
SHA256 887cd7115ad19a34dc50d03aceabcd18c11a5f2dfc4a2708eee5c0db2ca35b92
MD5 7d119e5bbbdceea3b40733ef74c1db2f
BLAKE2b-256 e5f9f7302aa0b70d3efd1129b6dda723c622f415e34c4fba0293c2aa65f9cb15

See more details on using hashes here.

File details

Details for the file glcm_cupy-0.1.10-py3-none-any.whl.

File metadata

  • Download URL: glcm_cupy-0.1.10-py3-none-any.whl
  • Upload date:
  • Size: 19.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.8.13 Windows/10

File hashes

Hashes for glcm_cupy-0.1.10-py3-none-any.whl
Algorithm Hash digest
SHA256 9449c1d1b79b4f90db407799df5ca9dab32f9aa7a025f1278168ebf109905d71
MD5 acaba09a5d53414e06723f90f3dbec0f
BLAKE2b-256 306eccec06d3759570d4be4306e32115d34467c02df4f3aa593c68d7cc207553

See more details on using hashes here.

Supported by

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