v0.18.0-beta

Release Highlights

CV-CUDA v0.18.0-beta includes the following changes.

  • New Features and Enhancements:

    • Added FP16 (F16) image support to the following operators, on the tensor, var-shape, and planar paths alike: AdjustContrast, AdjustHue, AdjustSaturation, AdjustSharpness, AutoContrast, AverageBlur, BilateralFilter, BrightnessContrast, ChannelReorder, ColorTwist, Conv2D, ConvertTo, CopyMakeBorder, CropFlipNormalizeReformat, CvtColor, Erase, Flip, GammaContrast, Gaussian, GaussianNoise, HQResize, Invert, JointBilateralFilter, Laplacian, MedianBlur, Morphology, Normalize, PadAndStack, RandomResizedCrop, Remap, Resize, ResizeCropConvertReformat, Rotate, Solarize, Threshold, WarpAffine, and WarpPerspective (issue #260).

      Interpolating operators use native half storage with float arithmetic. Exceptions: Conv2D kernels and the ColorTwist matrix stay 32-bit float, Remap F16 is single-channel (matching F32), Threshold OTSU/TRIANGLE and subsampled YUV420/422 conversions remain 8-bit only, and ResizeCropConvertReformat gains F16 output only.

    • Added the complete CIE L*a*b* conversion family to CvtColor for U8, F16, and F32 tensors and var-shape batches: sRGB and linear RGB/BGR in both directions, with interleaved and planar layouts and dedicated Lab formats (issue #282).

  • Performance Improvements:

    • Vectorized Morphology planar C3 dilate and Reformat planar RGB8 interleave.

    • Added specialized fast paths for GaussianNoise planar C3 var-shape, BilateralFilter planar C3 radius-2, CLAHE 8x8 tensor tiles, and Threshold planar U8 binary var-shape.

    • WarpAffine cubic with an integer inverse transform now uses the nearest specialization, where it is bit-exact.

    • MedianBlur skips the sort when the center pixel already holds the median rank; Inpaint narrows its source scan window; NonMaximumSuppression scans by warp; BndBox flattens dense image copies.

  • Bug Fixes:

    • CUDA kernel launch errors are now reported as exceptions across the modern and legacy operators. AdvCvtColor and CLAHE previously aborted the process instead of propagating the failure, and workspace allocation failures now surface as public exceptions.

    • Made cvcuda.Stream current-stream contexts host-thread-local. A host thread without an active context now resolves cvcuda.Stream.current to cvcuda.Stream.default. Invalid cross-thread or out-of-order __exit__ calls raise RuntimeError instead of corrupting another context (issue #274).

    • NonMaximumSuppression no longer keeps duplicate boxes that tie on both score and area; a deterministic index tiebreak now retains exactly one (issue #292).

    • Tightened input validation, replacing undefined behavior with errors: PadAndStack top/left tensor exports, FindHomography reusable operator capsules and dimensions, MinMaxLoc tensor layouts, MinAreaRect point-count rank, and Stack output metadata.

    • Fixed Resize per-column source coordinates, wide AREA resize types, partial OSD tiles, and Flip planar float3 on CUDA 12 SM80.

    • Python container and cache fixes: Tensor/Image batches keep their state after a failed insert, and the cache accounting no longer drifts on eviction, thread-local clears, or interpreter shutdown.

  • Compatibility Changes:

    • Default aarch64 (SBSA) builds now include SM120 code generation — RTX PRO 6000 Blackwell and GeForce RTX 50 series — when built with CUDA 12.8 or newer.

    • cvcuda.Stream contexts no longer span host threads. Code that entered a stream context on one thread and submitted work from others — a worker pool inside a with cvcuda.Stream(): block, for example — previously picked up that stream and now submits on the legacy default stream instead, without an error. Enter the context on each thread that submits work.

    • Leaving a cvcuda.Stream context raises RuntimeError when the stream is not the entering thread’s current stream. Contexts exited from another thread, or nested contexts exited out of order — including contexts interleaved by coroutines or generators on one thread — previously did so silently. The error is suppressed while an exception is already propagating out of the context body, so that exception still reaches the caller.

    • cvcuda.Stream.default is read-only. Assigning it previously succeeded and changed nothing — cvcuda.Stream.current resolves the default stream internally rather than through the attribute — so the two names disagreed from then on. Enter a stream’s context or pass it as the operator’s stream argument instead.