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, andWarpPerspective(issue #260).Interpolating operators use native half storage with float arithmetic. Exceptions:
Conv2Dkernels and theColorTwistmatrix stay 32-bit float,RemapF16 is single-channel (matching F32),ThresholdOTSU/TRIANGLE and subsampled YUV420/422 conversions remain 8-bit only, andResizeCropConvertReformatgains F16 output only.Added the complete CIE L*a*b* conversion family to
CvtColorfor 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
Morphologyplanar C3 dilate andReformatplanar RGB8 interleave.Added specialized fast paths for
GaussianNoiseplanar C3 var-shape,BilateralFilterplanar C3 radius-2,CLAHE8x8 tensor tiles, andThresholdplanar U8 binary var-shape.WarpAffinecubic with an integer inverse transform now uses the nearest specialization, where it is bit-exact.MedianBlurskips the sort when the center pixel already holds the median rank;Inpaintnarrows its source scan window;NonMaximumSuppressionscans by warp;BndBoxflattens dense image copies.
Bug Fixes:
CUDA kernel launch errors are now reported as exceptions across the modern and legacy operators.
AdvCvtColorandCLAHEpreviously aborted the process instead of propagating the failure, and workspace allocation failures now surface as public exceptions.Made
cvcuda.Streamcurrent-stream contexts host-thread-local. A host thread without an active context now resolvescvcuda.Stream.currenttocvcuda.Stream.default. Invalid cross-thread or out-of-order__exit__calls raiseRuntimeErrorinstead of corrupting another context (issue #274).NonMaximumSuppressionno 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:
PadAndStacktop/left tensor exports,FindHomographyreusable operator capsules and dimensions,MinMaxLoctensor layouts,MinAreaRectpoint-count rank, andStackoutput metadata.Fixed
Resizeper-column source coordinates, wide AREA resize types, partial OSD tiles, andFlipplanar float3 on CUDA 12 SM80.Python container and cache fixes:
Tensor/Imagebatches 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.Streamcontexts no longer span host threads. Code that entered a stream context on one thread and submitted work from others — a worker pool inside awith 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.Streamcontext raisesRuntimeErrorwhen 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.defaultis read-only. Assigning it previously succeeded and changed nothing —cvcuda.Stream.currentresolves 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.