Releases: rapidsai/cucim
v23.06.00
🚨 Breaking Changes
🐛 Bug Fixes
- Fix SHA256 check failure in test suite (#564) @grlee77
- Handle space character in ./run download_testdata (#556) @gigony
- Fix
return_error='always'
behavior in phase_cross_correlation (#549) @grlee77 - Only load versioned
libcufile
(#548) @jakirkham - add a 20 minute timeout for pytest runs on CI (#545) @grlee77
- protect against possible out of bounds memory access in 2D distance transform (#540) @grlee77
📖 Documentation
- Fix doc building via
run build_package
(#553) @grlee77 - update changelog for release 23.04.00 and 23.04.01 (#552) @grlee77
🛠️ Improvements
- Allow numpy 1.24. (#563) @bdice
- run docs nightly too (#560) @AyodeAwe
- Update cupy dependency (#558) @vyasr
- Remove libjpeg dependency (#557) @gigony
- Enable sccache hits from local builds (#551) @AyodeAwe
- Revert shared workflows branch (#550) @ajschmidt8
- Support Python 3.9 build/tests (#547) @shwina
- Remove usage of rapids-get-rapids-version-from-git (#546) @jjacobelli
- Use ARC V2 self-hosted runners for GPU jobs (#538) @jjacobelli
- Remove underscore in build string. (#528) @bdice
v23.04.01
🚨 Breaking Changes
🐛 Bug Fixes
- Fix bug in median filter with non-uniform footprint (#521) @grlee77
- use cp.around instead of cp.round for CuPy 10.x compatiblity (#508) @grlee77
- Fix error in LZ4-compressed Zarr writing demo (#506) @grlee77
- Normalize whitespace. (#474) @bdice
🛠️ Improvements
- Pin
libwebp-base
(#541) @ajschmidt8 - allow scikit-image 0.20 as well (#536) @grlee77
- Pass
AWS_SESSION_TOKEN
andSCCACHE_S3_USE_SSL
vars to conda build (#525) @ajschmidt8 - Update aarch64 to GCC 11 (#524) @bdice
- Update to GCC 11 (#522) @bdice
- Upgrade dockcross and pybind11 (#519) @gigony
- Binary morphology: omit weights array when possible (#517) @grlee77
- Fix inefficiency in handling clipping of image range in
resize
and other transforms (#516) @grlee77 - Fix GHA build workflow (#515) @AjayThorve
- Reduce error handling verbosity in CI tests scripts (#511) @AjayThorve
- Update shared workflow branches (#510) @ajschmidt8
- Remove gpuCI scripts. (#505) @bdice
- Move date to build string in
conda
recipe (#497) @ajschmidt8
v23.04.00
🚨 Breaking Changes
🐛 Bug Fixes
- Fix bug in median filter with non-uniform footprint (#521) @grlee77
- use cp.around instead of cp.round for CuPy 10.x compatiblity (#508) @grlee77
- Fix error in LZ4-compressed Zarr writing demo (#506) @grlee77
- Normalize whitespace. (#474) @bdice
🛠️ Improvements
- allow scikit-image 0.20 as well (#536) @grlee77
- Pass
AWS_SESSION_TOKEN
andSCCACHE_S3_USE_SSL
vars to conda build (#525) @ajschmidt8 - Update aarch64 to GCC 11 (#524) @bdice
- Update to GCC 11 (#522) @bdice
- Upgrade dockcross and pybind11 (#519) @gigony
- Binary morphology: omit weights array when possible (#517) @grlee77
- Fix inefficiency in handling clipping of image range in
resize
and other transforms (#516) @grlee77 - Fix GHA build workflow (#515) @AjayThorve
- Reduce error handling verbosity in CI tests scripts (#511) @AjayThorve
- Update shared workflow branches (#510) @ajschmidt8
- Remove gpuCI scripts. (#505) @bdice
- Move date to build string in
conda
recipe (#497) @ajschmidt8
v23.02.00
🚨 Breaking Changes
🐛 Bug Fixes
- apply bug fix to vendored ndimage code (#494) @grlee77
- Closes #490 -- fixes bug in hue jitter (#491) @benlansdell
- Fix random seed used in test_3d_similarity_estimation (#472) @grlee77
📖 Documentation
🚀 New Features
- Add colocalization measures (#488) @grlee77
- Add disambiguation option to phase_cross_correlation (skimage 0.20 feature) (#486) @grlee77
🛠️ Improvements
- Update shared workflow branches (#501) @ajschmidt8
- Update
isort
version to 5.12.0 (#492) @ajschmidt8 - Improve rank filtering performance by removing use of footprint kernel when possible (#485) @grlee77
- use vendored version of cupy.pad with added performance optimizations (#482) @grlee77
- add docs builds to Github Actions (#481) @AjayThorve
- Update
numpy
version specifier (#480) @ajschmidt8 - Build CUDA
11.8
and Python3.10
Packages (#476) @ajschmidt8 - Add GitHub Actions Workflows. (#471) @bdice
- Fix conflicts in "Forward-merge branch-22.12 to branch-23.02" (#468) @jakirkham
- Enable copy_prs. (#465) @bdice
v22.12.00
🚨 Breaking Changes
- Implement additional deprecations carried out for scikit-image 0.20 (#451) @grlee77
- improved implementation of ridge filters (bug fixes and reduced memory footprint) (#423) @grlee77
🐛 Bug Fixes
- pin to cmake !3.25.0 on CI to avoid bug with CUDA+conda during build (#444) @grlee77
- update incorrect argument and deprecated function for tifffile.TiffWriter (#433) @JoohyungLee0106
- Fix rotate behavior for ndim > 2 (#432) @grlee77
📖 Documentation
- add whole-slide tiled read/write demos for measuring GPUDirect Storage (GDS) I/O performance (#452) @grlee77
- Add demo for distance_transform_edt (#394) @grlee77
🚀 New Features
- Support no-compression method in converter (#443) @gigony
- add three segmentation metrics (#425) @grlee77
- add isotropic binary morphology functions (#421) @grlee77
- Add blob feature detectors (blob_dog, blob_log, blob_doh) (#413) @monzelr
🛠️ Improvements
- additional minor updates (skimage 0.20) (#455) @grlee77
- Implement additional deprecations carried out for scikit-image 0.20 (#451) @grlee77
- Faster
hessian_matrix_*
andstructure_tensor_eigvals
via analytical eigenvalues for the 3D case (#434) @grlee77 - use fused kernels to reduce overhead in corner detector implementations (#426) @grlee77
- Misc updates for consistency with scikit-image 0.20 (#424) @grlee77
- improved implementation of ridge filters (bug fixes and reduced memory footprint) (#423) @grlee77
- analytical moments computations, support pixel spacings in moments and regionprops (#422) @grlee77
- Forward merge branch-22.10 to branch-22.12 (#420) @grlee77
- Support
sampling
kwarg fordistance_transform_edt
(take pixel/voxel sizes into account) (#407) @grlee77 - Improve performance of Euclidean distance transform (#406) @grlee77
v22.10.00
🐛 Bug Fixes
- Correctly use dtype when computing shared memory requirements of separable convolution (#409) @grlee77
- Forward-merge branch-22.08 to branch-22.10 (#403) @jakirkham
- Add missing imports of euler_number and perimeter_crofton (#386) @grlee77
📖 Documentation
- update pypi CHANGELOG.md for releases 22.08.00 and 22.08.01 (#404) @grlee77
- Update README.md (#396) @HesAnEasyCoder
🚀 New Features
- Allow cupy 11 (#399) @galipremsagar
- Add cucim.skimage.feature.match_descriptors (#338) @grlee77
🛠️ Improvements
- Merge docs and add links (#415) @jakirkham
- Add benchmarks for scikit-image functions introduced in 22.08 (#378) @grlee77
v22.08.01
v22.08.00
🚨 Breaking Changes
🐛 Bug Fixes
- create SimilarityTransform using CuPy 9.x-compatible indexing (#365) @grlee77
- Add
__init__.py
incucim.core
(#359) @jakirkham - Stain extraction: use a less strict condition across channels when thresholding (#316) @grlee77
- Incorporate bug fixes from skimage 0.19.3 (#312) @grlee77
- fix RawKernel bug for canny filter when quantiles are used (#310) @grlee77
📖 Documentation
- Defer loading of
custom.js
(#383) @galipremsagar - add cucim.core.morphology to API docs + other docstring fixes (#367) @grlee77
- Update README.md (#361) @HesAnEasyCoder
- remove unimplemented functions from See Also and fix version numbers in deprecation warnings (#356) @grlee77
- Forward-merge branch-22.06 to branch-22.08 (#344) @grlee77
- Update README.md (#315) @HesAnEasyCoder
- Update index.rst (#314) @HesAnEasyCoder
- Update PyPI package documentation for v22.06.00 (#311) @gigony
🚀 New Features
- Add segmentation with the Chan-Vese active contours method (#343) @grlee77
- Add cucim.skimage.morphology.medial_axis (#342) @grlee77
- Add cucim.skimage.segmentation.expand_labels (#341) @grlee77
- Add Euclidean distance transform for images/volumes (#318) @grlee77
🛠️ Improvements
- Revert "Allow CuPy 11" (#362) @galipremsagar
- Fix issues with day & night modes in python docs (#360) @galipremsagar
- Allow CuPy 11 (#357) @jakirkham
- more efficient separable convolution (#355) @grlee77
- Support resolution and spacing metadata (#349) @gigony
- Performance optimizations to morphological segmentation functions (#340) @grlee77
- benchmarks: avoid use of deprecated pandas API (#339) @grlee77
- Reduce memory overhead and improve performance of normalize_colors_pca (#328) @grlee77
- Protect against obscure divide by zero error in edge case of
normalize_colors_pca
(#327) @grlee77 - complete parametrization of cucim.skimage benchmarks (#324) @grlee77
- parameterization of
filters
andfeatures
benchmarks (v2) (#322) @grlee77 - Add a fast histogram-based median filter (#317) @grlee77
- Remove custom compiler environment variables (#307) @ajschmidt8
v22.06.00
The 22.06.00 release adds a new function cucim.skimage.segmentation.clear_border
that can be used to remove any labels touching the image/volume border. There are also new functions for stain extraction and normalization of digital pathology slides stained with hematoxyling and eosin: cucim.core.operations.color.stain_extraction_pca
and cucim.core.operations.color.normalize_colors_pca
.
Aside from this, there are also a number of performance improvements. Specifically, edge detection with cucim.skimage.feature.canny
should be 3-4x faster than previously. Binary and grayscale morphological operations can now be performed much faster for large footprint sizes. To take advantage of this, set the decomposition
kwarg of the footprint-generation functions to 'series'
, 'separable'
or 'crosses'
, as available. This provides a sequence of small footprints (structuring elements) that can be passed to the footprint
argument of any morphology function, enabling identical output in a much shorter run time. The specific functions in cucim.skimage.morphology
that support this new feature are square
, rectangle
, diamond
, disk
, ellipse
, octagon
, cube
, ball
and octahedron
.
One backward incompatible change was made to the dtype used when casting 8 and 16-bit signed and unsigned integer data types to floating point. Specifically when functions convert these types to floating point, 32-bit precision will now be used. Previously these were promoted to 64-bit floating point as in upstream scikit-image. This change was made to improve performance and reduce memory consumption.
Although not new to this release, we would like to encourage users to set the CUPY_ACCELERATORS environment variable to "cub,cutensor". This improves the performance of many functions involving histograms (e.g. cucim.skimage.filters.threshold_otsu
) or reduction operations (e.g. cucim.skimage.transform.integral_image
).
Additional details of the changes in this release are given below.
🚨 Breaking Changes
🐛 Bug Fixes
- Populate correct channel names for RGBA image (#294) @gigony
- Merge branch-22.04 into branch-22.06 (#258) @jakirkham
- Fix: return object-typed properties as NumPy arrays in
skimage.measure.regionprops_table
(#272) @alxndrkalinin
📖 Documentation
🚀 New Features
- add missing
cucim.skimage.segmentation.clear_border
function (#267) @grlee77 - add
cucim.core.operations.color.stain_extraction_pca
andcucim.core.operations.color.normalize_colors_pca
for digital pathology H&E stain extraction and normalization (#273) @grlee77, @drbeh
🛠️ Improvements
- Update to use DLPack v0.6 (#295) @gigony
- Remove plugin-related messages temporarily (#291) @gigony
- Simplify recipes (#286) @Ethyling
- Use cupy.fuse to improve efficiency hessian_matrix_eigvals (#280) @grlee77
- Promote small integer types to single rather than double precision (#278) @grlee77
- improve efficiency of histogram-based thresholding functions (#276) @grlee77
- Enable footprint decomposition for morphology (#274) @grlee77
- Remove unused dependencies in GPU tests job (#268) @Ethyling
- Use conda compilers (#232) @Ethyling
- Build packages using mambabuild (#216) @Ethyling
New Contributors
- Alexandr Kalinin (@alxndrkalinin) made their first contribution in #272
- Behrooz Hashemian (@drbeh) made their first contribution in #273
v22.04.00
This version would be available through both Conda (https://anaconda.org/rapidsai/cucim) and PyPI package (https://pypi.org/project/cucim/22.04.00/).
cuCIM's GPUDirectStorage (GDS) API was introduced at GTC 2022 Spring "Accelerating Storage IO to GPUs with Magnum IO [S41347]" session on March 24.
cuCIM's GDS API examples are available at https://github.com/NVIDIA/MagnumIO/tree/main/gds/readers/cucim-gds.
In the below sections, ✨ means that the item is a new change in cuCIM's PyPI package, compared with the previous release (v22.02.01).
🚨 Breaking Changes
🐛 Bug Fixes
- ✨ Fix ImportError from vendored code (#252) @grlee77
- ✨ Fix wrong dimension in metadata (#248) @gigony
- Handle file descriptor ownership and update documents for GDS (#234) @gigony
- Check nullptr of handler in CuFileDriver::close() (#229) @gigony
- Fix docs builds (#218) @ajschmidt8
- Apply fixes to skimage.transform scheduled for scikit-image 0.19.2 (#208) @grlee77
🚀 New Features
-
Randomization of transforms per image per batch (#231) @shekhardw
-
Expose data type of CuImage object for interoperability with NumPy (#246) @gigony
1. Randomization of transforms per image per batch
Random Color Jitter transform implemented. Random Image Flip, Random Image Rotate90 and Random Zoom transforms are updated to apply transforms per image per batch. Execution of these transforms on per image per batch basis may result in increase in runtime.
2. Expose data type of CuImage object for interoperability with NumPy
CuImage
object exposestypestr
property.DLDataType
andDLDataTypeCode
type is available undercucim.clara
.
Prior to this change, it was not easy to convert CuImage's dtype
(DLDataType) to NumPy's dtype
and had to use the below workaround.
>>> from cucim import CuImage
>>> a = CuImage("notebooks/input/image.tif")
>>> b = a.read_region((0,0), (10,10))
>>> import numpy as np
>>> np.dtype(b.__array_interface__["typestr"]) # b would expose `__cuda_array_interface__` if memory is in GPU.
dtype('uint8')
With this change, we can convert the data type of CuImage to NumPy's dtype
easily, and also can access cuCIM's DLDataType.
>>> from cucim import CuImage
>>> a = CuImage("notebooks/input/image.tif")
>>> b = a.read_region((0,0), (10,10))
>>> import numpy as np
>>> b.typestr
'|u1'
>>> np.dtype(b.typestr) == np.uint8
True
>>> from cucim.clara import DLDataType, DLDataTypeCode
>>> b.dtype == DLDataType(DLDataTypeCode.DLUInt, 8, 1)
True
🛠️ Improvements
- Remove verbose plugin messages temporarily (only available in the PyPI package)
- Address #109 ([BUG] - Info messages appearing as warnings in Jupyter notebooks)
- Will support log level configuration later with the official PR.
- Temporarily disable new
ops-bot
functionality (#239) @ajschmidt8 - Add
.github/ops-bot.yaml
config file (#236) @ajschmidt8