Skip to content

onnx

This module implements scalers for ONNX models.

Classes:

  • ArtCNN

    Super-Resolution Convolutional Neural Networks optimised for anime.

  • BaseOnnxScaler

    Abstract generic scaler class for an ONNX model.

  • DPIR

    Deep Plug-and-Play Image Restoration.

  • GenericOnnxScaler

    Generic scaler class for an ONNX model.

  • Waifu2x

    Well known Image Super-Resolution for Anime-Style Art.

logger module-attribute

logger = getLogger(__name__)

BackendLike

BackendLike = type[Backend] | Backend

ArtCNN

ArtCNN(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNLuma

Super-Resolution Convolutional Neural Networks optimised for anime.

https://github.com/Artoriuz/ArtCNN/releases/latest

Defaults to R8F64.

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Classes:

  • C4F16

    This has 4 internal convolution layers with 16 filters each.

  • C4F16_DN

    The same as C4F16 but intended to also denoise. Works well on noisy sources when you don't want any sharpening.

  • C4F16_DS

    The same as C4F16 but intended to also denoise and sharpen.

  • C4F32

    This has 4 internal convolution layers with 32 filters each.

  • C4F32_DN

    The same as C4F32 but intended to also denoise. Works well on noisy sources when you don't want any sharpening.

  • C4F32_DS

    The same as C4F32 but intended to also denoise and sharpen.

  • R16F96

    The biggest model. Can compete with or outperform Waifu2x Cunet.

  • R8F64

    A smaller and faster version of R16F96 but very competitive.

  • R8F64_Chroma

    The new and fancy big chroma model.

  • R8F64_Chroma_DN

    Noise-focused variant of R8F64_Chroma.

  • R8F64_DS

    The same as R8F64 but intended to also denoise and sharpen.

  • R8F64_JPEG420

    1x RGB model meant to clean JPEG artifacts and to fix chroma subsampling.

  • R8F64_JPEG444

    1x RGB model meant to clean JPEG artifacts.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

C4F16

C4F16(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNLuma

This has 4 internal convolution layers with 16 filters each.

The currently fastest variant. Not really recommended for any filtering. Should strictly be used for real-time applications and even then the other non R ones should be fast enough...

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN.C4F16().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
340
341
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return super().preprocess_clip(get_y(clip), **kwargs)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

C4F16_DN

C4F16_DN(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNLuma

The same as C4F16 but intended to also denoise. Works well on noisy sources when you don't want any sharpening.

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN.C4F16_DN().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
340
341
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return super().preprocess_clip(get_y(clip), **kwargs)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

C4F16_DS

C4F16_DS(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNLuma

The same as C4F16 but intended to also denoise and sharpen.

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN.C4F16_DS().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
340
341
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return super().preprocess_clip(get_y(clip), **kwargs)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

C4F32

C4F32(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNLuma

This has 4 internal convolution layers with 32 filters each.

If you need an even faster model.

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN.C4F32().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
340
341
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return super().preprocess_clip(get_y(clip), **kwargs)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

C4F32_DN

C4F32_DN(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNLuma

The same as C4F32 but intended to also denoise. Works well on noisy sources when you don't want any sharpening.

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN.C4F32_DN().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
340
341
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return super().preprocess_clip(get_y(clip), **kwargs)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

C4F32_DS

C4F32_DS(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNLuma

The same as C4F32 but intended to also denoise and sharpen.

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN.C4F32_DS().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
340
341
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return super().preprocess_clip(get_y(clip), **kwargs)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

R16F96

R16F96(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNLuma

The biggest model. Can compete with or outperform Waifu2x Cunet.

Also quite a bit slower but is less heavy on vram.

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN.R16F96().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
340
341
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return super().preprocess_clip(get_y(clip), **kwargs)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

R8F64

R8F64(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNLuma

A smaller and faster version of R16F96 but very competitive.

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN.R8F64().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
340
341
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return super().preprocess_clip(get_y(clip), **kwargs)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

R8F64_Chroma

R8F64_Chroma(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNChroma

The new and fancy big chroma model.

These don't double the input clip and rather just try to enhance the chroma using luma information.

Example usage:

from vsscale import ArtCNN

chroma_upscaled = ArtCNN.R8F64_Chroma().scale(clip)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %r", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %r", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %r", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %r", self.inference, kwargs)

    u, v = self.backend.inference(clip, self.model, overlaps, tilesize, flexible=True, **kwargs)

    logger.debug("%s: Inferenced clip: %r", self.inference, u.format)
    logger.debug("%s: Inferenced clip: %r", self.inference, v.format)

    return core.std.ShufflePlanes([clip, u, v], [0, 0, 0], vs.YUV, clip)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
373
374
375
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = norm_expr(clip, "x 0.5 -", [1, 2], func=self.__class__)
    return super().postprocess_clip(clip, input_clip, **kwargs)

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
362
363
364
365
366
367
368
369
370
371
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    assert clip.format.color_family == vs.YUV

    if (clip.format.subsampling_h, clip.format.subsampling_w) != (0, 0):
        logger.debug("%s: Before pp; Clip format is %r", self.preprocess_clip, clip.format)
        fmt = clip.format.replace(subsampling_h=0, subsampling_w=0)
        clip = Kernel.ensure_obj(kwargs.pop("chroma_scaler", Bilinear)).resample(clip, fmt, **kwargs)
        logger.debug("%s: Before pp; Clip format is %r", self.preprocess_clip, clip.format)

    return norm_expr(clip, ("x 0 1 clamp", "x 0.5 + 0 1 clamp"), func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

R8F64_Chroma_DN

R8F64_Chroma_DN(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNChroma

Noise-focused variant of R8F64_Chroma.

Trained for noisy or heavily compressed sources, aggressively removing chroma noise and artifacts.

Example usage:

from vsscale import ArtCNN

chroma_upscaled = ArtCNN.R8F64_Chroma_DN().scale(clip)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %r", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %r", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %r", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %r", self.inference, kwargs)

    u, v = self.backend.inference(clip, self.model, overlaps, tilesize, flexible=True, **kwargs)

    logger.debug("%s: Inferenced clip: %r", self.inference, u.format)
    logger.debug("%s: Inferenced clip: %r", self.inference, v.format)

    return core.std.ShufflePlanes([clip, u, v], [0, 0, 0], vs.YUV, clip)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
373
374
375
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = norm_expr(clip, "x 0.5 -", [1, 2], func=self.__class__)
    return super().postprocess_clip(clip, input_clip, **kwargs)

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
362
363
364
365
366
367
368
369
370
371
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    assert clip.format.color_family == vs.YUV

    if (clip.format.subsampling_h, clip.format.subsampling_w) != (0, 0):
        logger.debug("%s: Before pp; Clip format is %r", self.preprocess_clip, clip.format)
        fmt = clip.format.replace(subsampling_h=0, subsampling_w=0)
        clip = Kernel.ensure_obj(kwargs.pop("chroma_scaler", Bilinear)).resample(clip, fmt, **kwargs)
        logger.debug("%s: Before pp; Clip format is %r", self.preprocess_clip, clip.format)

    return norm_expr(clip, ("x 0 1 clamp", "x 0.5 + 0 1 clamp"), func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

R8F64_DS

R8F64_DS(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNNLuma

The same as R8F64 but intended to also denoise and sharpen.

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN.R8F64_DS().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
340
341
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return super().preprocess_clip(get_y(clip), **kwargs)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

R8F64_JPEG420

R8F64_JPEG420(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNN, BaseOnnxScalerRGB

1x RGB model meant to clean JPEG artifacts and to fix chroma subsampling.

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN.R8F64_JPEG420().scale(clip)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
260
261
262
263
264
265
266
267
268
269
270
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    logger.debug("%s.post: Before pp; Clip format is %r", self, clip.format)

    out_fmt = input_clip.format.replace(subsampling_w=0, subsampling_h=0)
    # Resamples only for color_family changes e.g. RGB -> YUV
    if clip.format != out_fmt:
        clip = self.kernel.resample(clip, out_fmt, input_clip, range=input_clip, **kwargs)

    logger.debug("%s.post: After pp; Clip format is %r", self, clip.format)

    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
251
252
253
254
255
256
257
258
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = self.kernel.resample(
        clip,
        clip.format.replace(color_family=vs.ColorFamily.RGB, subsampling_w=0, subsampling_h=0),
        Matrix.RGB,
        **kwargs,
    )
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

R8F64_JPEG444

R8F64_JPEG444(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNN, BaseOnnxScalerRGB

1x RGB model meant to clean JPEG artifacts.

Example usage:

from vsscale import ArtCNN

doubled = ArtCNN.R8F64_JPEG444().scale(clip)

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
260
261
262
263
264
265
266
267
268
269
270
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    logger.debug("%s.post: Before pp; Clip format is %r", self, clip.format)

    out_fmt = input_clip.format.replace(subsampling_w=0, subsampling_h=0)
    # Resamples only for color_family changes e.g. RGB -> YUV
    if clip.format != out_fmt:
        clip = self.kernel.resample(clip, out_fmt, input_clip, range=input_clip, **kwargs)

    logger.debug("%s.post: After pp; Clip format is %r", self, clip.format)

    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
251
252
253
254
255
256
257
258
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = self.kernel.resample(
        clip,
        clip.format.replace(color_family=vs.ColorFamily.RGB, subsampling_w=0, subsampling_h=0),
        Matrix.RGB,
        **kwargs,
    )
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width

    (int | None, default: None ) –

    Target width.

  • height

    (int | None, default: None ) –

    Target height.

  • **kwargs

    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
340
341
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return super().preprocess_clip(get_y(clip), **kwargs)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip

    (VideoNode) –

    The input clip to be scaled.

  • width

    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height

    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift

    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • rfactor

    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

BaseArtCNN

BaseArtCNN(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseOnnxScaler

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width

    (int | None, default: None ) –

    Target width.

  • height

    (int | None, default: None ) –

    Target height.

  • **kwargs

    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
218
219
220
221
222
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Performs preprocessing on the clip prior to inference.
    """
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip

    (VideoNode) –

    The input clip to be scaled.

  • width

    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height

    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift

    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • rfactor

    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

BaseArtCNNChroma

BaseArtCNNChroma(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNN

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width

    (int | None, default: None ) –

    Target width.

  • height

    (int | None, default: None ) –

    Target height.

  • **kwargs

    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %r", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %r", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %r", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %r", self.inference, kwargs)

    u, v = self.backend.inference(clip, self.model, overlaps, tilesize, flexible=True, **kwargs)

    logger.debug("%s: Inferenced clip: %r", self.inference, u.format)
    logger.debug("%s: Inferenced clip: %r", self.inference, v.format)

    return core.std.ShufflePlanes([clip, u, v], [0, 0, 0], vs.YUV, clip)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
373
374
375
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = norm_expr(clip, "x 0.5 -", [1, 2], func=self.__class__)
    return super().postprocess_clip(clip, input_clip, **kwargs)

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
362
363
364
365
366
367
368
369
370
371
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    assert clip.format.color_family == vs.YUV

    if (clip.format.subsampling_h, clip.format.subsampling_w) != (0, 0):
        logger.debug("%s: Before pp; Clip format is %r", self.preprocess_clip, clip.format)
        fmt = clip.format.replace(subsampling_h=0, subsampling_w=0)
        clip = Kernel.ensure_obj(kwargs.pop("chroma_scaler", Bilinear)).resample(clip, fmt, **kwargs)
        logger.debug("%s: Before pp; Clip format is %r", self.preprocess_clip, clip.format)

    return norm_expr(clip, ("x 0 1 clamp", "x 0.5 + 0 1 clamp"), func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip

    (VideoNode) –

    The input clip to be scaled.

  • width

    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height

    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift

    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • rfactor

    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

BaseArtCNNLuma

BaseArtCNNLuma(
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseArtCNN

Initializes the scaler with the specified parameters.

Parameters:

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 8 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
def __init__(
    self,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 8,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    model = self._model if hasattr(self, "_model") else self.__class__.__name__

    super().__init__(
        _get_onnx_model("ArtCNN", f"ArtCNN_{model}", func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        1,
        max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width

    (int | None, default: None ) –

    Target width.

  • height

    (int | None, default: None ) –

    Target height.

  • **kwargs

    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
340
341
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return super().preprocess_clip(get_y(clip), **kwargs)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip

    (VideoNode) –

    The input clip to be scaled.

  • width

    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height

    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift

    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • rfactor

    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

BaseDPIR

BaseDPIR(
    strength: SupportsFloat | VideoNode = 10,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 16,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseOnnxScalerRGB, BaseOnnxScaler

Initializes the scaler with the specified parameters.

Parameters:

  • strength

    (SupportsFloat | VideoNode, default: 10 ) –

    Threshold (8-bit scale) strength for deblocking/denoising. If a VideoNode is used, it must be in GRAY8, GRAYH, or GRAYS format, with pixel values representing the 8-bit thresholds.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 16 ) –

    The size of overlap between tiles.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
def __init__(
    self,
    strength: SupportsFloat | vs.VideoNode = 10,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 16,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        strength: Threshold (8-bit scale) strength for deblocking/denoising. If a VideoNode is used, it must be in
            GRAY8, GRAYH, or GRAYS format, with pixel values representing the 8-bit thresholds.
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    self.strength = strength

    super().__init__(
        None,
        backend,
        tiles,
        tilesize,
        overlap,
        8,
        -1,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

    if isinstance(self.backend, (Backend.TRT, Backend.ORT, Backend.NCNN, Backend.OV_CPU, Backend.OV_GPU)):
        bl = set(self.backend.fp16_blacklist_ops or []).union(["Conv_123"])
        self.backend = dataclasses.replace(self.backend, fp16_blacklist_ops=bl)

backend instance-attribute

backend = replace(backend, fp16_blacklist_ops=bl)

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

strength instance-attribute

strength = strength

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width

    (int | None, default: None ) –

    Target width.

  • height

    (int | None, default: None ) –

    Target height.

  • **kwargs

    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    # Normalizing the strength clip
    strength_fmt = clip.format.replace(color_family=vs.GRAY)

    if isinstance(self.strength, vs.VideoNode):
        self.strength = norm_expr(self.strength, "x 255 /", format=strength_fmt, func=self.__class__)
    else:
        self.strength = clip.std.BlankClip(format=strength_fmt, color=float(self.strength) / 255, keep=True)

    logger.debug("%s: Passing strength clip format: %r", self.inference, self.strength.format)

    # Get model name
    model_name = "drunet"
    if self._kind:
        model_name += f"_{self._kind}"

    if clip.format.color_family == vs.GRAY:
        model_name += "_gray"
    else:
        model_name += "_color"

    model = _get_onnx_model("DPIR", model_name, func=self.__class__)

    # Basic inference args
    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing model: %s", self.inference, model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    # Padding
    padding = padder.mod_padding(clip, self.multiple, 0)

    if not any(padding) or kwargs.pop("no_pad", False):
        return self.backend.inference([clip, self.strength], model, overlaps, tilesize, **kwargs)

    clip = padder.MIRROR(clip, *padding)
    strength = padder.MIRROR(self.strength, *padding)

    return self.backend.inference([clip, strength], self.model, overlaps, tilesize, **kwargs).std.Crop(*padding)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
260
261
262
263
264
265
266
267
268
269
270
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    logger.debug("%s.post: Before pp; Clip format is %r", self, clip.format)

    out_fmt = input_clip.format.replace(subsampling_w=0, subsampling_h=0)
    # Resamples only for color_family changes e.g. RGB -> YUV
    if clip.format != out_fmt:
        clip = self.kernel.resample(clip, out_fmt, input_clip, range=input_clip, **kwargs)

    logger.debug("%s.post: After pp; Clip format is %r", self, clip.format)

    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
853
854
855
856
857
858
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return (
        BaseOnnxScaler.preprocess_clip(self, clip, **kwargs)
        if get_color_family(clip) == vs.GRAY
        else BaseOnnxScalerRGB.preprocess_clip(self, clip, **kwargs)
    )

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    *,
    copy_props: bool = True,
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip

    (VideoNode) –

    The input clip to be scaled.

  • width

    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height

    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift

    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
839
840
841
842
843
844
845
846
847
848
849
850
851
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    *,
    copy_props: bool = True,
    **kwargs: Any,
) -> vs.VideoNode:
    assert check_variable_resolution(clip, self.__class__)

    return super().scale(clip, width, height, shift, copy_props=copy_props, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • rfactor

    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

BaseOnnxScaler

BaseOnnxScaler(
    model: SPathLike | None = None,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 0,
    multiple: int = 1,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseGenericScaler, ABC

Abstract generic scaler class for an ONNX model.

Initializes the scaler with the specified parameters.

Parameters:

  • model

    (SPathLike | None, default: None ) –

    Path to the ONNX model file.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 0 ) –

    The size of overlap between tiles.

  • multiple

    (int, default: 1 ) –

    Multiple of the tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
def __init__(
    self,
    model: SPathLike | None = None,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 0,
    multiple: int = 1,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        model: Path to the ONNX model file.
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        multiple: Multiple of the tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    super().__init__(kernel=kernel, scaler=scaler, shifter=shifter, **kwargs)

    if model is not None:
        self.model = SPath(model).resolve()

    if backend is None:
        self.backend = Backend.autoselect(**self.kwargs)
    elif isinstance(backend, type):
        self.backend = backend(**self.kwargs)
    elif self.kwargs:
        self.backend = dataclasses.replace(backend, **self.kwargs)
    else:
        self.backend = backend

    if isinstance(self.backend, Backend.ORT) and self.backend.fp16:
        bl = set(self.backend.fp16_blacklist_ops or []).union(["ConstantOfShape", "Resize"])
        self.backend = dataclasses.replace(self.backend, fp16_blacklist_ops=bl)

    self.tiles = tiles
    self.tilesize = tilesize
    self.overlap = overlap
    self.multiple = multiple

    if isinstance(self.overlap, int):
        self.overlap_w = self.overlap_h = self.overlap
    else:
        self.overlap_w, self.overlap_h = self.overlap

    self.max_instances = max_instances

    logger.info("%s: Using '%s' backend", self, self.backend.__class__.__name__)
    logger.debug("%s: %s", self, self.backend)
    logger.debug("%s: User tiles: %s", self, self.tiles)
    logger.debug("%s: User tilesize: %s", self, self.tilesize)
    logger.debug("%s: User overlap: %s", self, (self.overlap_w, self.overlap_h))
    logger.debug("%s: User multiple: %s", self, self.multiple)

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width

    (int | None, default: None ) –

    Target width.

  • height

    (int | None, default: None ) –

    Target height.

  • **kwargs

    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
218
219
220
221
222
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Performs preprocessing on the clip prior to inference.
    """
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip

    (VideoNode) –

    The input clip to be scaled.

  • width

    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height

    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift

    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • rfactor

    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

BaseOnnxScalerRGB

BaseOnnxScalerRGB(
    model: SPathLike | None = None,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 0,
    multiple: int = 1,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseOnnxScaler

Abstract ONNX class for RGB models.

Initializes the scaler with the specified parameters.

Parameters:

  • model

    (SPathLike | None, default: None ) –

    Path to the ONNX model file.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 0 ) –

    The size of overlap between tiles.

  • multiple

    (int, default: 1 ) –

    Multiple of the tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
def __init__(
    self,
    model: SPathLike | None = None,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 0,
    multiple: int = 1,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        model: Path to the ONNX model file.
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        multiple: Multiple of the tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    super().__init__(kernel=kernel, scaler=scaler, shifter=shifter, **kwargs)

    if model is not None:
        self.model = SPath(model).resolve()

    if backend is None:
        self.backend = Backend.autoselect(**self.kwargs)
    elif isinstance(backend, type):
        self.backend = backend(**self.kwargs)
    elif self.kwargs:
        self.backend = dataclasses.replace(backend, **self.kwargs)
    else:
        self.backend = backend

    if isinstance(self.backend, Backend.ORT) and self.backend.fp16:
        bl = set(self.backend.fp16_blacklist_ops or []).union(["ConstantOfShape", "Resize"])
        self.backend = dataclasses.replace(self.backend, fp16_blacklist_ops=bl)

    self.tiles = tiles
    self.tilesize = tilesize
    self.overlap = overlap
    self.multiple = multiple

    if isinstance(self.overlap, int):
        self.overlap_w = self.overlap_h = self.overlap
    else:
        self.overlap_w, self.overlap_h = self.overlap

    self.max_instances = max_instances

    logger.info("%s: Using '%s' backend", self, self.backend.__class__.__name__)
    logger.debug("%s: %s", self, self.backend)
    logger.debug("%s: User tiles: %s", self, self.tiles)
    logger.debug("%s: User tilesize: %s", self, self.tilesize)
    logger.debug("%s: User overlap: %s", self, (self.overlap_w, self.overlap_h))
    logger.debug("%s: User multiple: %s", self, self.multiple)

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width

    (int | None, default: None ) –

    Target width.

  • height

    (int | None, default: None ) –

    Target height.

  • **kwargs

    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
260
261
262
263
264
265
266
267
268
269
270
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    logger.debug("%s.post: Before pp; Clip format is %r", self, clip.format)

    out_fmt = input_clip.format.replace(subsampling_w=0, subsampling_h=0)
    # Resamples only for color_family changes e.g. RGB -> YUV
    if clip.format != out_fmt:
        clip = self.kernel.resample(clip, out_fmt, input_clip, range=input_clip, **kwargs)

    logger.debug("%s.post: After pp; Clip format is %r", self, clip.format)

    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
251
252
253
254
255
256
257
258
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = self.kernel.resample(
        clip,
        clip.format.replace(color_family=vs.ColorFamily.RGB, subsampling_w=0, subsampling_h=0),
        Matrix.RGB,
        **kwargs,
    )
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip

    (VideoNode) –

    The input clip to be scaled.

  • width

    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height

    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift

    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • rfactor

    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

BaseWaifu2x

BaseWaifu2x(
    scale: Literal[1, 2, 4] = 2,
    noise: Literal[-1, 0, 1, 2, 3] = -1,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 4,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseOnnxScalerRGB

Initializes the scaler with the specified parameters.

Parameters:

  • scale

    (Literal[1, 2, 4], default: 2 ) –

    Upscaling factor. 1 = no uspcaling, 2 = 2x, 4 = 4x.

  • noise

    (Literal[-1, 0, 1, 2, 3], default: -1 ) –

    Noise reduction level. -1 = none, 0 = low, 1 = medium, 2 = high, 3 = highest.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 4 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
def __init__(
    self,
    scale: Literal[1, 2, 4] = 2,
    noise: Literal[-1, 0, 1, 2, 3] = -1,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 4,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        scale: Upscaling factor. 1 = no uspcaling, 2 = 2x, 4 = 4x.
        noise: Noise reduction level. -1 = none, 0 = low, 1 = medium, 2 = high, 3 = highest.
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    self.scale_w2x = scale
    self.noise = noise
    model_name = self._model if hasattr(self, "_model") else self.__class__.__name__
    model_name = re.sub(r"(?<!^)(?=[A-Z])", "_", model_name).lower()  # CamelCase -> snake_case

    if self.scale_w2x > 1:
        model_name += f"_scale{self.scale_w2x}x"

    if self.noise >= 0:
        model_name += f"_noise{self.noise}"

    super().__init__(
        _get_onnx_model("Waifu2x", model_name, func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        max_instances=max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

noise instance-attribute

noise: Literal[-1, 0, 1, 2, 3] = noise

Noise reduction level

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scale_w2x instance-attribute

scale_w2x: Literal[1, 2, 4] = scale

Upscaling factor.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width

    (int | None, default: None ) –

    Target width.

  • height

    (int | None, default: None ) –

    Target height.

  • **kwargs

    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
260
261
262
263
264
265
266
267
268
269
270
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    logger.debug("%s.post: Before pp; Clip format is %r", self, clip.format)

    out_fmt = input_clip.format.replace(subsampling_w=0, subsampling_h=0)
    # Resamples only for color_family changes e.g. RGB -> YUV
    if clip.format != out_fmt:
        clip = self.kernel.resample(clip, out_fmt, input_clip, range=input_clip, **kwargs)

    logger.debug("%s.post: After pp; Clip format is %r", self, clip.format)

    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
251
252
253
254
255
256
257
258
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = self.kernel.resample(
        clip,
        clip.format.replace(color_family=vs.ColorFamily.RGB, subsampling_w=0, subsampling_h=0),
        Matrix.RGB,
        **kwargs,
    )
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip

    (VideoNode) –

    The input clip to be scaled.

  • width

    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height

    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift

    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • rfactor

    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

DPIR

DPIR(
    strength: SupportsFloat | VideoNode = 10,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 16,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseDPIR

Deep Plug-and-Play Image Restoration.

Initializes the scaler with the specified parameters.

Parameters:

  • strength

    (SupportsFloat | VideoNode, default: 10 ) –

    Threshold (8-bit scale) strength for deblocking/denoising. If a VideoNode is used, it must be in GRAY8, GRAYH, or GRAYS format, with pixel values representing the 8-bit thresholds.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 16 ) –

    The size of overlap between tiles.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Classes:

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
def __init__(
    self,
    strength: SupportsFloat | vs.VideoNode = 10,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 16,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        strength: Threshold (8-bit scale) strength for deblocking/denoising. If a VideoNode is used, it must be in
            GRAY8, GRAYH, or GRAYS format, with pixel values representing the 8-bit thresholds.
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    self.strength = strength

    super().__init__(
        None,
        backend,
        tiles,
        tilesize,
        overlap,
        8,
        -1,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

    if isinstance(self.backend, (Backend.TRT, Backend.ORT, Backend.NCNN, Backend.OV_CPU, Backend.OV_GPU)):
        bl = set(self.backend.fp16_blacklist_ops or []).union(["Conv_123"])
        self.backend = dataclasses.replace(self.backend, fp16_blacklist_ops=bl)

backend instance-attribute

backend = replace(backend, fp16_blacklist_ops=bl)

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

strength instance-attribute

strength = strength

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

DrunetDeblock

DrunetDeblock(
    strength: SupportsFloat | VideoNode = 10,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 16,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseDPIR

DPIR model for deblocking.

Initializes the scaler with the specified parameters.

Parameters:

  • strength

    (SupportsFloat | VideoNode, default: 10 ) –

    Threshold (8-bit scale) strength for deblocking/denoising. If a VideoNode is used, it must be in GRAY8, GRAYH, or GRAYS format, with pixel values representing the 8-bit thresholds.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 16 ) –

    The size of overlap between tiles.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
def __init__(
    self,
    strength: SupportsFloat | vs.VideoNode = 10,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 16,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        strength: Threshold (8-bit scale) strength for deblocking/denoising. If a VideoNode is used, it must be in
            GRAY8, GRAYH, or GRAYS format, with pixel values representing the 8-bit thresholds.
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    self.strength = strength

    super().__init__(
        None,
        backend,
        tiles,
        tilesize,
        overlap,
        8,
        -1,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

    if isinstance(self.backend, (Backend.TRT, Backend.ORT, Backend.NCNN, Backend.OV_CPU, Backend.OV_GPU)):
        bl = set(self.backend.fp16_blacklist_ops or []).union(["Conv_123"])
        self.backend = dataclasses.replace(self.backend, fp16_blacklist_ops=bl)

backend instance-attribute

backend = replace(backend, fp16_blacklist_ops=bl)

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

strength instance-attribute

strength = strength

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    # Normalizing the strength clip
    strength_fmt = clip.format.replace(color_family=vs.GRAY)

    if isinstance(self.strength, vs.VideoNode):
        self.strength = norm_expr(self.strength, "x 255 /", format=strength_fmt, func=self.__class__)
    else:
        self.strength = clip.std.BlankClip(format=strength_fmt, color=float(self.strength) / 255, keep=True)

    logger.debug("%s: Passing strength clip format: %r", self.inference, self.strength.format)

    # Get model name
    model_name = "drunet"
    if self._kind:
        model_name += f"_{self._kind}"

    if clip.format.color_family == vs.GRAY:
        model_name += "_gray"
    else:
        model_name += "_color"

    model = _get_onnx_model("DPIR", model_name, func=self.__class__)

    # Basic inference args
    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing model: %s", self.inference, model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    # Padding
    padding = padder.mod_padding(clip, self.multiple, 0)

    if not any(padding) or kwargs.pop("no_pad", False):
        return self.backend.inference([clip, self.strength], model, overlaps, tilesize, **kwargs)

    clip = padder.MIRROR(clip, *padding)
    strength = padder.MIRROR(self.strength, *padding)

    return self.backend.inference([clip, strength], self.model, overlaps, tilesize, **kwargs).std.Crop(*padding)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
260
261
262
263
264
265
266
267
268
269
270
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    logger.debug("%s.post: Before pp; Clip format is %r", self, clip.format)

    out_fmt = input_clip.format.replace(subsampling_w=0, subsampling_h=0)
    # Resamples only for color_family changes e.g. RGB -> YUV
    if clip.format != out_fmt:
        clip = self.kernel.resample(clip, out_fmt, input_clip, range=input_clip, **kwargs)

    logger.debug("%s.post: After pp; Clip format is %r", self, clip.format)

    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
853
854
855
856
857
858
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return (
        BaseOnnxScaler.preprocess_clip(self, clip, **kwargs)
        if get_color_family(clip) == vs.GRAY
        else BaseOnnxScalerRGB.preprocess_clip(self, clip, **kwargs)
    )

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    *,
    copy_props: bool = True,
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
839
840
841
842
843
844
845
846
847
848
849
850
851
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    *,
    copy_props: bool = True,
    **kwargs: Any,
) -> vs.VideoNode:
    assert check_variable_resolution(clip, self.__class__)

    return super().scale(clip, width, height, shift, copy_props=copy_props, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

DrunetDenoise

DrunetDenoise(
    strength: SupportsFloat | VideoNode = 10,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 16,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseDPIR

DPIR model for denoising.

Initializes the scaler with the specified parameters.

Parameters:

  • strength

    (SupportsFloat | VideoNode, default: 10 ) –

    Threshold (8-bit scale) strength for deblocking/denoising. If a VideoNode is used, it must be in GRAY8, GRAYH, or GRAYS format, with pixel values representing the 8-bit thresholds.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 16 ) –

    The size of overlap between tiles.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
def __init__(
    self,
    strength: SupportsFloat | vs.VideoNode = 10,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 16,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        strength: Threshold (8-bit scale) strength for deblocking/denoising. If a VideoNode is used, it must be in
            GRAY8, GRAYH, or GRAYS format, with pixel values representing the 8-bit thresholds.
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    self.strength = strength

    super().__init__(
        None,
        backend,
        tiles,
        tilesize,
        overlap,
        8,
        -1,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

    if isinstance(self.backend, (Backend.TRT, Backend.ORT, Backend.NCNN, Backend.OV_CPU, Backend.OV_GPU)):
        bl = set(self.backend.fp16_blacklist_ops or []).union(["Conv_123"])
        self.backend = dataclasses.replace(self.backend, fp16_blacklist_ops=bl)

backend instance-attribute

backend = replace(backend, fp16_blacklist_ops=bl)

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

strength instance-attribute

strength = strength

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    # Normalizing the strength clip
    strength_fmt = clip.format.replace(color_family=vs.GRAY)

    if isinstance(self.strength, vs.VideoNode):
        self.strength = norm_expr(self.strength, "x 255 /", format=strength_fmt, func=self.__class__)
    else:
        self.strength = clip.std.BlankClip(format=strength_fmt, color=float(self.strength) / 255, keep=True)

    logger.debug("%s: Passing strength clip format: %r", self.inference, self.strength.format)

    # Get model name
    model_name = "drunet"
    if self._kind:
        model_name += f"_{self._kind}"

    if clip.format.color_family == vs.GRAY:
        model_name += "_gray"
    else:
        model_name += "_color"

    model = _get_onnx_model("DPIR", model_name, func=self.__class__)

    # Basic inference args
    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing model: %s", self.inference, model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    # Padding
    padding = padder.mod_padding(clip, self.multiple, 0)

    if not any(padding) or kwargs.pop("no_pad", False):
        return self.backend.inference([clip, self.strength], model, overlaps, tilesize, **kwargs)

    clip = padder.MIRROR(clip, *padding)
    strength = padder.MIRROR(self.strength, *padding)

    return self.backend.inference([clip, strength], self.model, overlaps, tilesize, **kwargs).std.Crop(*padding)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
260
261
262
263
264
265
266
267
268
269
270
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    logger.debug("%s.post: Before pp; Clip format is %r", self, clip.format)

    out_fmt = input_clip.format.replace(subsampling_w=0, subsampling_h=0)
    # Resamples only for color_family changes e.g. RGB -> YUV
    if clip.format != out_fmt:
        clip = self.kernel.resample(clip, out_fmt, input_clip, range=input_clip, **kwargs)

    logger.debug("%s.post: After pp; Clip format is %r", self, clip.format)

    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
853
854
855
856
857
858
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return (
        BaseOnnxScaler.preprocess_clip(self, clip, **kwargs)
        if get_color_family(clip) == vs.GRAY
        else BaseOnnxScalerRGB.preprocess_clip(self, clip, **kwargs)
    )

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    *,
    copy_props: bool = True,
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
839
840
841
842
843
844
845
846
847
848
849
850
851
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    *,
    copy_props: bool = True,
    **kwargs: Any,
) -> vs.VideoNode:
    assert check_variable_resolution(clip, self.__class__)

    return super().scale(clip, width, height, shift, copy_props=copy_props, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width

    (int | None, default: None ) –

    Target width.

  • height

    (int | None, default: None ) –

    Target height.

  • **kwargs

    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    # Normalizing the strength clip
    strength_fmt = clip.format.replace(color_family=vs.GRAY)

    if isinstance(self.strength, vs.VideoNode):
        self.strength = norm_expr(self.strength, "x 255 /", format=strength_fmt, func=self.__class__)
    else:
        self.strength = clip.std.BlankClip(format=strength_fmt, color=float(self.strength) / 255, keep=True)

    logger.debug("%s: Passing strength clip format: %r", self.inference, self.strength.format)

    # Get model name
    model_name = "drunet"
    if self._kind:
        model_name += f"_{self._kind}"

    if clip.format.color_family == vs.GRAY:
        model_name += "_gray"
    else:
        model_name += "_color"

    model = _get_onnx_model("DPIR", model_name, func=self.__class__)

    # Basic inference args
    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing model: %s", self.inference, model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    # Padding
    padding = padder.mod_padding(clip, self.multiple, 0)

    if not any(padding) or kwargs.pop("no_pad", False):
        return self.backend.inference([clip, self.strength], model, overlaps, tilesize, **kwargs)

    clip = padder.MIRROR(clip, *padding)
    strength = padder.MIRROR(self.strength, *padding)

    return self.backend.inference([clip, strength], self.model, overlaps, tilesize, **kwargs).std.Crop(*padding)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
260
261
262
263
264
265
266
267
268
269
270
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    logger.debug("%s.post: Before pp; Clip format is %r", self, clip.format)

    out_fmt = input_clip.format.replace(subsampling_w=0, subsampling_h=0)
    # Resamples only for color_family changes e.g. RGB -> YUV
    if clip.format != out_fmt:
        clip = self.kernel.resample(clip, out_fmt, input_clip, range=input_clip, **kwargs)

    logger.debug("%s.post: After pp; Clip format is %r", self, clip.format)

    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
853
854
855
856
857
858
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    return (
        BaseOnnxScaler.preprocess_clip(self, clip, **kwargs)
        if get_color_family(clip) == vs.GRAY
        else BaseOnnxScalerRGB.preprocess_clip(self, clip, **kwargs)
    )

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    *,
    copy_props: bool = True,
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip

    (VideoNode) –

    The input clip to be scaled.

  • width

    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height

    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift

    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
839
840
841
842
843
844
845
846
847
848
849
850
851
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    *,
    copy_props: bool = True,
    **kwargs: Any,
) -> vs.VideoNode:
    assert check_variable_resolution(clip, self.__class__)

    return super().scale(clip, width, height, shift, copy_props=copy_props, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • rfactor

    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

GenericOnnxScaler

GenericOnnxScaler(
    model: SPathLike | None = None,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 0,
    multiple: int = 1,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseOnnxScaler

Generic scaler class for an ONNX model.

Example usage:

from vsscale import GenericOnnxScaler

scaled = GenericOnnxScaler("path/to/model.onnx").scale(clip, ...)

# For Windows paths:
scaled = GenericOnnxScaler(r"path\to\model.onnx").scale(clip, ...)

Initializes the scaler with the specified parameters.

Parameters:

  • model

    (SPathLike | None, default: None ) –

    Path to the ONNX model file.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 0 ) –

    The size of overlap between tiles.

  • multiple

    (int, default: 1 ) –

    Multiple of the tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
def __init__(
    self,
    model: SPathLike | None = None,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 0,
    multiple: int = 1,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        model: Path to the ONNX model file.
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        multiple: Multiple of the tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    super().__init__(kernel=kernel, scaler=scaler, shifter=shifter, **kwargs)

    if model is not None:
        self.model = SPath(model).resolve()

    if backend is None:
        self.backend = Backend.autoselect(**self.kwargs)
    elif isinstance(backend, type):
        self.backend = backend(**self.kwargs)
    elif self.kwargs:
        self.backend = dataclasses.replace(backend, **self.kwargs)
    else:
        self.backend = backend

    if isinstance(self.backend, Backend.ORT) and self.backend.fp16:
        bl = set(self.backend.fp16_blacklist_ops or []).union(["ConstantOfShape", "Resize"])
        self.backend = dataclasses.replace(self.backend, fp16_blacklist_ops=bl)

    self.tiles = tiles
    self.tilesize = tilesize
    self.overlap = overlap
    self.multiple = multiple

    if isinstance(self.overlap, int):
        self.overlap_w = self.overlap_h = self.overlap
    else:
        self.overlap_w, self.overlap_h = self.overlap

    self.max_instances = max_instances

    logger.info("%s: Using '%s' backend", self, self.backend.__class__.__name__)
    logger.debug("%s: %s", self, self.backend)
    logger.debug("%s: User tiles: %s", self, self.tiles)
    logger.debug("%s: User tilesize: %s", self, self.tilesize)
    logger.debug("%s: User overlap: %s", self, (self.overlap_w, self.overlap_h))
    logger.debug("%s: User multiple: %s", self, self.multiple)

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width

    (int | None, default: None ) –

    Target width.

  • height

    (int | None, default: None ) –

    Target height.

  • **kwargs

    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
224
225
226
227
228
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Handles postprocessing of the model's output after inference.
    """
    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
218
219
220
221
222
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Performs preprocessing on the clip prior to inference.
    """
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip

    (VideoNode) –

    The input clip to be scaled.

  • width

    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height

    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift

    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • rfactor

    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

Waifu2x

Waifu2x(*args: Any, **kwargs: Any)

Bases: _Waifu2xCunet

Well known Image Super-Resolution for Anime-Style Art.

Defaults to Cunet.

Example usage:

from vsscale import Waifu2x

doubled = Waifu2x().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • scale

    (Literal[1, 2, 4], default: 2 ) –

    Upscaling factor. 1 = no uspcaling, 2 = 2x, 4 = 4x.

  • noise

    (Literal[-1, 0, 1, 2, 3], default: -1 ) –

    Noise reduction level. -1 = none, 0 = low, 1 = medium, 2 = high, 3 = highest.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 4 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Classes:

  • CunetArt

    CUNet (Compact U-Net) model for anime art.

  • SwinUnetArt

    Swin-Unet-based model trained on anime-style images.

  • SwinUnetArtScan

    Swin-Unet model trained on anime scans.

  • SwinUnetPhoto

    Swin-Unet model trained on photographic content.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
654
655
def __init__(self, *args: Any, **kwargs: Any) -> None:
    super().__init__(*args, **kwargs, multiple=4)

Cunet class-attribute instance-attribute

Cunet = CunetArt

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

noise instance-attribute

noise: Literal[-1, 0, 1, 2, 3] = noise

Noise reduction level

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scale_w2x instance-attribute

scale_w2x: Literal[1, 2, 4] = scale

Upscaling factor.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

CunetArt

CunetArt(*args: Any, **kwargs: Any)

Bases: _Waifu2xCunet

CUNet (Compact U-Net) model for anime art.

Example usage:

from vsscale import Waifu2x

doubled = Waifu2x.CunetArt().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • scale

    (Literal[1, 2, 4], default: 2 ) –

    Upscaling factor. 1 = no uspcaling, 2 = 2x, 4 = 4x.

  • noise

    (Literal[-1, 0, 1, 2, 3], default: -1 ) –

    Noise reduction level. -1 = none, 0 = low, 1 = medium, 2 = high, 3 = highest.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 4 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
654
655
def __init__(self, *args: Any, **kwargs: Any) -> None:
    super().__init__(*args, **kwargs, multiple=4)

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

noise instance-attribute

noise: Literal[-1, 0, 1, 2, 3] = noise

Noise reduction level

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scale_w2x instance-attribute

scale_w2x: Literal[1, 2, 4] = scale

Upscaling factor.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
690
691
692
693
694
695
696
697
698
699
700
701
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    if kwargs.pop("no_pad", False) or (not clip.width % self.overlap_w and not clip.height % self.overlap_h):
        logger.debug("%s: Skipping padding for clip %r", self, clip)
        return super().inference(clip, **kwargs)

    logger.debug("%s: Padding clip %r", self, clip)
    with padder.ctx(4, 0) as pad:
        padded = pad.MIRROR(clip)
        scaled = super().inference(padded, **kwargs)
        cropped = pad.CROP(scaled)

    return cropped

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
703
704
705
706
707
708
709
710
711
712
713
714
715
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    # Cunet model also has a tint issue but it is not constant
    # It leaves flat areas alone but tints detailed areas.
    if kwargs.pop("no_tint_fix", False):
        return super().postprocess_clip(clip, input_clip, **kwargs)

    maximum_expr = combine_expr(ExprOp.matrix("x", 1, ConvMode.SQUARE, [(0, 0)])[0])
    tint_fix = norm_expr(
        clip,
        ["x 0.5 255 / +", maximum_expr, ExprOp.MIN],
        func="Waifu2x." + self.__class__.__name__,
    )
    return super().postprocess_clip(tint_fix, input_clip, **kwargs)

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
251
252
253
254
255
256
257
258
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = self.kernel.resample(
        clip,
        clip.format.replace(color_family=vs.ColorFamily.RGB, subsampling_w=0, subsampling_h=0),
        Matrix.RGB,
        **kwargs,
    )
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

    Additional note for the Cunet model:

    • A tint issue is also present but it is not constant. It leaves flat areas alone but tints detailed areas. This behavior can be disabled with postprocess_no_tint_fix=True

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`,
            and `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to
            the respective method. Use the prefix `inference_` to pass an argument to the inference method.

            Additional note for the Cunet model:

               - A tint issue is also present but it is not constant. It leaves flat areas alone but tints
               detailed areas.
               This behavior can be disabled with `postprocess_no_tint_fix=True`

    Returns:
        The scaled clip.
    """
    ...

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

SwinUnetArt

SwinUnetArt(
    scale: Literal[1, 2, 4] = 2,
    noise: Literal[-1, 0, 1, 2, 3] = -1,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 4,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseWaifu2x

Swin-Unet-based model trained on anime-style images.

Example usage:

from vsscale import Waifu2x

doubled = Waifu2x.SwinUnetArt().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • scale

    (Literal[1, 2, 4], default: 2 ) –

    Upscaling factor. 1 = no uspcaling, 2 = 2x, 4 = 4x.

  • noise

    (Literal[-1, 0, 1, 2, 3], default: -1 ) –

    Noise reduction level. -1 = none, 0 = low, 1 = medium, 2 = high, 3 = highest.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 4 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
def __init__(
    self,
    scale: Literal[1, 2, 4] = 2,
    noise: Literal[-1, 0, 1, 2, 3] = -1,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 4,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        scale: Upscaling factor. 1 = no uspcaling, 2 = 2x, 4 = 4x.
        noise: Noise reduction level. -1 = none, 0 = low, 1 = medium, 2 = high, 3 = highest.
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    self.scale_w2x = scale
    self.noise = noise
    model_name = self._model if hasattr(self, "_model") else self.__class__.__name__
    model_name = re.sub(r"(?<!^)(?=[A-Z])", "_", model_name).lower()  # CamelCase -> snake_case

    if self.scale_w2x > 1:
        model_name += f"_scale{self.scale_w2x}x"

    if self.noise >= 0:
        model_name += f"_noise{self.noise}"

    super().__init__(
        _get_onnx_model("Waifu2x", model_name, func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        max_instances=max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

noise instance-attribute

noise: Literal[-1, 0, 1, 2, 3] = noise

Noise reduction level

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scale_w2x instance-attribute

scale_w2x: Literal[1, 2, 4] = scale

Upscaling factor.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
260
261
262
263
264
265
266
267
268
269
270
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    logger.debug("%s.post: Before pp; Clip format is %r", self, clip.format)

    out_fmt = input_clip.format.replace(subsampling_w=0, subsampling_h=0)
    # Resamples only for color_family changes e.g. RGB -> YUV
    if clip.format != out_fmt:
        clip = self.kernel.resample(clip, out_fmt, input_clip, range=input_clip, **kwargs)

    logger.debug("%s.post: After pp; Clip format is %r", self, clip.format)

    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
251
252
253
254
255
256
257
258
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = self.kernel.resample(
        clip,
        clip.format.replace(color_family=vs.ColorFamily.RGB, subsampling_w=0, subsampling_h=0),
        Matrix.RGB,
        **kwargs,
    )
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

SwinUnetArtScan

SwinUnetArtScan(
    scale: Literal[1, 2, 4] = 2,
    noise: Literal[-1, 0, 1, 2, 3] = -1,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 4,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseWaifu2x

Swin-Unet model trained on anime scans.

Example usage:

from vsscale import Waifu2x

doubled = Waifu2x.SwinUnetArtScan().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • scale

    (Literal[1, 2, 4], default: 2 ) –

    Upscaling factor. 1 = no uspcaling, 2 = 2x, 4 = 4x.

  • noise

    (Literal[-1, 0, 1, 2, 3], default: -1 ) –

    Noise reduction level. -1 = none, 0 = low, 1 = medium, 2 = high, 3 = highest.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 4 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
def __init__(
    self,
    scale: Literal[1, 2, 4] = 2,
    noise: Literal[-1, 0, 1, 2, 3] = -1,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 4,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        scale: Upscaling factor. 1 = no uspcaling, 2 = 2x, 4 = 4x.
        noise: Noise reduction level. -1 = none, 0 = low, 1 = medium, 2 = high, 3 = highest.
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    self.scale_w2x = scale
    self.noise = noise
    model_name = self._model if hasattr(self, "_model") else self.__class__.__name__
    model_name = re.sub(r"(?<!^)(?=[A-Z])", "_", model_name).lower()  # CamelCase -> snake_case

    if self.scale_w2x > 1:
        model_name += f"_scale{self.scale_w2x}x"

    if self.noise >= 0:
        model_name += f"_noise{self.noise}"

    super().__init__(
        _get_onnx_model("Waifu2x", model_name, func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        max_instances=max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

noise instance-attribute

noise: Literal[-1, 0, 1, 2, 3] = noise

Noise reduction level

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scale_w2x instance-attribute

scale_w2x: Literal[1, 2, 4] = scale

Upscaling factor.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
260
261
262
263
264
265
266
267
268
269
270
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    logger.debug("%s.post: Before pp; Clip format is %r", self, clip.format)

    out_fmt = input_clip.format.replace(subsampling_w=0, subsampling_h=0)
    # Resamples only for color_family changes e.g. RGB -> YUV
    if clip.format != out_fmt:
        clip = self.kernel.resample(clip, out_fmt, input_clip, range=input_clip, **kwargs)

    logger.debug("%s.post: After pp; Clip format is %r", self, clip.format)

    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
251
252
253
254
255
256
257
258
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = self.kernel.resample(
        clip,
        clip.format.replace(color_family=vs.ColorFamily.RGB, subsampling_w=0, subsampling_h=0),
        Matrix.RGB,
        **kwargs,
    )
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

SwinUnetPhoto

SwinUnetPhoto(
    scale: Literal[1, 2, 4] = 2,
    noise: Literal[-1, 0, 1, 2, 3] = -1,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 4,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
)

Bases: BaseWaifu2x

Swin-Unet model trained on photographic content.

Example usage:

from vsscale import Waifu2x

doubled = Waifu2x.SwinUnetPhoto().supersample(clip, 2)

Initializes the scaler with the specified parameters.

Parameters:

  • scale

    (Literal[1, 2, 4], default: 2 ) –

    Upscaling factor. 1 = no uspcaling, 2 = 2x, 4 = 4x.

  • noise

    (Literal[-1, 0, 1, 2, 3], default: -1 ) –

    Noise reduction level. -1 = none, 0 = low, 1 = medium, 2 = high, 3 = highest.

  • backend

    (BackendLike | None, default: None ) –

    The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will be automatically selected, prioritizing fp16 support.

  • tiles

    (int | tuple[int, int] | None, default: None ) –

    Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the model's behavior may vary when they are used.

  • tilesize

    (int | tuple[int, int] | None, default: None ) –

    The size of each tile when splitting the image (if tiles are enabled).

  • overlap

    (int | tuple[int, int], default: 4 ) –

    The size of overlap between tiles.

  • max_instances

    (int, default: 2 ) –

    Maximum instances to spawn when scaling a variable resolution clip.

  • kernel

    (KernelLike, default: Catrom ) –

    Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.

  • scaler

    (ScalerLike | None, default: None ) –

    Scaler used for scaling operations. Defaults to kernel.

  • shifter

    (KernelLike | None, default: None ) –

    Kernel used for shifting operations. Defaults to kernel.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments.

Methods:

  • calc_tilesize

    Reimplementation of vsmlrt.calc_tilesize helper function

  • ensure_obj

    Ensure that the input is a scaler instance, resolving it if necessary.

  • from_param

    Resolve and return a scaler type from a given input (string, type, or instance).

  • get_scale_args

    Generate the keyword arguments used for scaling.

  • implemented_funcs

    Returns a set of function names that are implemented in the current class and the parent classes.

  • inference

    Runs inference on the given video clip using the configured model and backend.

  • is_abstract

    Return True if this class can't be instantiated.

  • kernel_radius

    Return the effective kernel radius for the scaler.

  • postprocess_clip

    Handles postprocessing of the model's output after inference.

  • preprocess_clip

    Performs preprocessing on the clip prior to inference.

  • scale

    Scale the given clip using the ONNX model.

  • supersample

    Supersample a clip by a given scaling factor.

Attributes:

Source code in vsscale/onnx.py
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
def __init__(
    self,
    scale: Literal[1, 2, 4] = 2,
    noise: Literal[-1, 0, 1, 2, 3] = -1,
    backend: BackendLike | None = None,
    tiles: int | tuple[int, int] | None = None,
    tilesize: int | tuple[int, int] | None = None,
    overlap: int | tuple[int, int] = 4,
    max_instances: int = 2,
    *,
    kernel: KernelLike = Catrom,
    scaler: ScalerLike | None = None,
    shifter: KernelLike | None = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the scaler with the specified parameters.

    Args:
        scale: Upscaling factor. 1 = no uspcaling, 2 = 2x, 4 = 4x.
        noise: Noise reduction level. -1 = none, 0 = low, 1 = medium, 2 = high, 3 = highest.
        backend: The backend to be used with the vs-mlrt framework. If set to None, the most suitable backend will
            be automatically selected, prioritizing fp16 support.
        tiles: Whether to split the image into multiple tiles. This can help reduce VRAM usage, but note that the
            model's behavior may vary when they are used.
        tilesize: The size of each tile when splitting the image (if tiles are enabled).
        overlap: The size of overlap between tiles.
        max_instances: Maximum instances to spawn when scaling a variable resolution clip.
        kernel: Base kernel to be used for certain scaling/shifting operations. Defaults to Catrom.
        scaler: Scaler used for scaling operations. Defaults to kernel.
        shifter: Kernel used for shifting operations. Defaults to kernel.
        **kwargs: Additional arguments.
    """
    self.scale_w2x = scale
    self.noise = noise
    model_name = self._model if hasattr(self, "_model") else self.__class__.__name__
    model_name = re.sub(r"(?<!^)(?=[A-Z])", "_", model_name).lower()  # CamelCase -> snake_case

    if self.scale_w2x > 1:
        model_name += f"_scale{self.scale_w2x}x"

    if self.noise >= 0:
        model_name += f"_noise{self.noise}"

    super().__init__(
        _get_onnx_model("Waifu2x", model_name, func=self.__class__),
        backend,
        tiles,
        tilesize,
        overlap,
        max_instances=max_instances,
        kernel=kernel,
        scaler=scaler,
        shifter=shifter,
        **kwargs,
    )

backend instance-attribute

backend = autoselect(**(kwargs))

kernel instance-attribute

kernel = ensure_obj(kernel, __class__)

kwargs instance-attribute

kwargs: dict[str, Any] = kwargs

Arguments passed to the implemented funcs or internal scale function.

max_instances instance-attribute

max_instances = max_instances

model instance-attribute

model = resolve()

multiple instance-attribute

multiple = multiple

noise instance-attribute

noise: Literal[-1, 0, 1, 2, 3] = noise

Noise reduction level

overlap instance-attribute

overlap = overlap

overlap_h instance-attribute

overlap_h = overlap

overlap_w instance-attribute

overlap_w = overlap

pretty_string property

pretty_string: str

Cached property returning a user-friendly string representation.

Returns:

  • str

    Pretty-printed string with arguments.

scale_function instance-attribute

scale_function: Callable[..., VideoNode]

Scale function called internally when performing scaling operations.

scale_w2x instance-attribute

scale_w2x: Literal[1, 2, 4] = scale

Upscaling factor.

scaler instance-attribute

scaler = ensure_obj(scaler or kernel, __class__)

shifter instance-attribute

shifter = ensure_obj(shifter or kernel, __class__)

tiles instance-attribute

tiles = tiles

tilesize instance-attribute

tilesize = tilesize

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler
    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except
    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width
    (int | None, default: None ) –

    Target width.

  • height
    (int | None, default: None ) –

    Target height.

  • **kwargs
    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    """
    Runs inference on the given video clip using the configured model and backend.
    """

    tilesize, overlaps = self.calc_tilesize(clip)

    logger.debug("%s: Passing clip to inference: %r", self.inference, clip.format)
    logger.debug("%s: Passing model: %s", self.inference, self.model)
    logger.debug("%s: Passing tiles size: %s", self.inference, tilesize)
    logger.debug("%s: Passing overlaps: %s", self.inference, overlaps)
    logger.debug("%s: Passing extra kwargs: %s", self.inference, kwargs)

    return self.backend.inference(clip, self.model, overlaps, tilesize, flexible=False, **kwargs)

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
260
261
262
263
264
265
266
267
268
269
270
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    logger.debug("%s.post: Before pp; Clip format is %r", self, clip.format)

    out_fmt = input_clip.format.replace(subsampling_w=0, subsampling_h=0)
    # Resamples only for color_family changes e.g. RGB -> YUV
    if clip.format != out_fmt:
        clip = self.kernel.resample(clip, out_fmt, input_clip, range=input_clip, **kwargs)

    logger.debug("%s.post: After pp; Clip format is %r", self, clip.format)

    return clip

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
251
252
253
254
255
256
257
258
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = self.kernel.resample(
        clip,
        clip.format.replace(color_family=vs.ColorFamily.RGB, subsampling_w=0, subsampling_h=0),
        Matrix.RGB,
        **kwargs,
    )
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip
    (VideoNode) –

    The input clip to be scaled.

  • width
    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height
    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift
    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`, and
            `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to the
            respective method. Use the prefix `inference_` to pass an argument to the inference method.

    Returns:
        The scaled clip.
    """
    if clip.format.sample_type != vs.SampleType.FLOAT:
        raise CustomRuntimeError("Only FLOAT formats are supported.", self.scale)

    width, height = self._wh_norm(clip, width, height)

    preprocess_kwargs = dict[str, Any]()
    postprocess_kwargs = dict[str, Any]()
    inference_kwargs = dict[str, Any]()

    for k in kwargs.copy():
        for prefix, ckwargs in zip(
            ("preprocess_", "postprocess_", "inference_"), (preprocess_kwargs, postprocess_kwargs, inference_kwargs)
        ):
            if k.startswith(prefix):
                ckwargs[k.removeprefix(prefix)] = kwargs.pop(k)
                break

    logger.debug("%s: Preprocess kwargs: %s", self.scale, preprocess_kwargs)
    logger.debug("%s: Postprocess kwargs: %s", self.scale, postprocess_kwargs)
    logger.debug("%s: Inference kwargs: %s", self.scale, inference_kwargs)

    wclip = self.preprocess_clip(clip, **preprocess_kwargs)

    if 0 not in {clip.width, clip.height}:
        scaled = self.inference(wclip, **inference_kwargs)
    else:
        logger.debug("%s: Variable resolution clip detected...", self.scale)

        if not isinstance(self.backend, Backend.TRT) or self.backend.static_shape:
            raise CustomValueError("Only TRT backends support static_shape=False", self.__class__, self.backend)

        scaled = ProcessVariableResClip.from_func(
            wclip, lambda c: self.inference(c, **inference_kwargs), False, wclip.format, self.max_instances
        )

    scaled = self.postprocess_clip(scaled, clip, **postprocess_kwargs)

    return self._finish_scale(scaled, clip, width, height, shift, **kwargs)

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip
    (VideoNode) –

    The source clip.

  • rfactor
    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift
    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs
    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)

calc_tilesize

calc_tilesize(clip: VideoNode) -> tuple[tuple[int, int], tuple[int, int]]

Reimplementation of vsmlrt.calc_tilesize helper function

Source code in vsscale/onnx.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
def calc_tilesize(self, clip: vs.VideoNode) -> tuple[tuple[int, int], tuple[int, int]]:
    """
    Reimplementation of vsmlrt.calc_tilesize helper function
    """

    def calc_size(dimension: int, tiles: int, overlap: int, multiple: int) -> int:
        return math.ceil((dimension + 2 * overlap * (tiles - 1)) / (tiles * multiple)) * multiple

    overlap_w = self.overlap_w
    overlap_h = self.overlap_h

    if isinstance(self.tilesize, tuple):
        tile_w, tile_h = self.tilesize
    elif isinstance(self.tilesize, int):
        tile_w, tile_h = self.tilesize, self.tilesize
    else:
        if self.tiles is None:
            overlap_w = 0
            overlap_h = 0
            tile_w = clip.width
            tile_h = clip.height
        elif isinstance(self.tiles, int):
            tile_w = calc_size(clip.width, self.tiles, self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles, self.overlap_h, self.multiple)
        else:
            tile_w = calc_size(clip.width, self.tiles[0], self.overlap_w, self.multiple)
            tile_h = calc_size(clip.height, self.tiles[1], self.overlap_h, self.multiple)

        if tile_w % self.multiple != 0 or tile_h % self.multiple != 0:
            raise CustomValueError(
                f"Tile size ({tile_w}, {tile_h}) must be divisible by {self.multiple}",
                self.__class__,
            )

    return (tile_w, tile_h), (overlap_w, overlap_h)

ensure_obj classmethod

ensure_obj(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self

Ensure that the input is a scaler instance, resolving it if necessary.

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

  • Self

    Scaler instance.

Source code in vskernels/abstract/base.py
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
@classmethod
def ensure_obj(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> Self:
    """
    Ensure that the input is a scaler instance, resolving it if necessary.

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Scaler instance.
    """
    return _base_ensure_obj(cls, scaler, func_except)

from_param classmethod

from_param(
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]

Resolve and return a scaler type from a given input (string, type, or instance).

Parameters:

  • scaler

    (str | type[Self] | Self | None, default: None ) –

    Scaler identifier (string, class, or instance).

  • func_except

    (FuncExcept | None, default: None ) –

    Function returned for custom error handling.

Returns:

Source code in vskernels/abstract/base.py
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
@classmethod
def from_param(
    cls,
    scaler: str | type[Self] | Self | None = None,
    /,
    func_except: FuncExcept | None = None,
) -> type[Self]:
    """
    Resolve and return a scaler type from a given input (string, type, or instance).

    Args:
        scaler: Scaler identifier (string, class, or instance).
        func_except: Function returned for custom error handling.

    Returns:
        Resolved scaler type.
    """
    return _base_from_param(cls, scaler, cls._err_class, func_except)

get_scale_args

get_scale_args(
    clip: VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]

Generate the keyword arguments used for scaling.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left).

  • width

    (int | None, default: None ) –

    Target width.

  • height

    (int | None, default: None ) –

    Target height.

  • **kwargs

    (Any, default: {} ) –

    Extra parameters to merge.

Returns:

  • dict[str, Any]

    Final dictionary of keyword arguments for the scale function.

Source code in vskernels/abstract/base.py
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
def get_scale_args(
    self,
    clip: vs.VideoNode,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    width: int | None = None,
    height: int | None = None,
    **kwargs: Any,
) -> dict[str, Any]:
    """
    Generate the keyword arguments used for scaling.

    Args:
        clip: The source clip.
        shift: Subpixel shift (top, left).
        width: Target width.
        height: Target height.
        **kwargs: Extra parameters to merge.

    Returns:
        Final dictionary of keyword arguments for the scale function.
    """
    return {"width": width, "height": height, "src_top": shift[0], "src_left": shift[1]} | self.kwargs | kwargs

implemented_funcs classmethod

implemented_funcs() -> frozenset[str]

Returns a set of function names that are implemented in the current class and the parent classes.

These functions determine which keyword arguments will be extracted from the __init__ method.

Returns:

Source code in vskernels/abstract/base.py
471
472
473
474
475
476
477
478
479
480
481
482
@classproperty.cached
@classmethod
def implemented_funcs(cls) -> frozenset[str]:
    """
    Returns a set of function names that are implemented in the current class and the parent classes.

    These functions determine which keyword arguments will be extracted from the `__init__` method.

    Returns:
        Frozen set of function names.
    """
    return frozenset(func for klass in cls.mro() for func in getattr(klass, "_implemented_funcs", ()))

inference

inference(clip: VideoNode, **kwargs: Any) -> VideoNode

Runs inference on the given video clip using the configured model and backend.

Source code in vsscale/onnx.py
690
691
692
693
694
695
696
697
698
699
700
701
def inference(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    if kwargs.pop("no_pad", False) or (not clip.width % self.overlap_w and not clip.height % self.overlap_h):
        logger.debug("%s: Skipping padding for clip %r", self, clip)
        return super().inference(clip, **kwargs)

    logger.debug("%s: Padding clip %r", self, clip)
    with padder.ctx(4, 0) as pad:
        padded = pad.MIRROR(clip)
        scaled = super().inference(padded, **kwargs)
        cropped = pad.CROP(scaled)

    return cropped

is_abstract classmethod

is_abstract() -> bool

Return True if this class can't be instantiated.

Source code in vskernels/abstract/base.py
465
466
467
468
469
@classproperty
@classmethod
def is_abstract(cls) -> bool:
    """Return True if this class can't be instantiated."""
    return _is_base_scaler_abstract(cls)

kernel_radius

kernel_radius() -> int

Return the effective kernel radius for the scaler.

Raises:

Returns:

  • int

    Kernel radius.

Source code in vskernels/abstract/base.py
428
429
430
431
432
433
434
435
436
437
438
439
@BaseScalerMeta.cachedproperty
def kernel_radius(self) -> int:
    """
    Return the effective kernel radius for the scaler.

    Raises:
        CustomNotImplementedError: If no kernel radius is defined.

    Returns:
        Kernel radius.
    """
    ...

postprocess_clip

postprocess_clip(
    clip: VideoNode, input_clip: VideoNode, **kwargs: Any
) -> VideoNode

Handles postprocessing of the model's output after inference.

Source code in vsscale/onnx.py
703
704
705
706
707
708
709
710
711
712
713
714
715
def postprocess_clip(self, clip: vs.VideoNode, input_clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    # Cunet model also has a tint issue but it is not constant
    # It leaves flat areas alone but tints detailed areas.
    if kwargs.pop("no_tint_fix", False):
        return super().postprocess_clip(clip, input_clip, **kwargs)

    maximum_expr = combine_expr(ExprOp.matrix("x", 1, ConvMode.SQUARE, [(0, 0)])[0])
    tint_fix = norm_expr(
        clip,
        ["x 0.5 255 / +", maximum_expr, ExprOp.MIN],
        func="Waifu2x." + self.__class__.__name__,
    )
    return super().postprocess_clip(tint_fix, input_clip, **kwargs)

preprocess_clip

preprocess_clip(clip: VideoNode, **kwargs: Any) -> VideoNode

Performs preprocessing on the clip prior to inference.

Source code in vsscale/onnx.py
251
252
253
254
255
256
257
258
def preprocess_clip(self, clip: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
    clip = self.kernel.resample(
        clip,
        clip.format.replace(color_family=vs.ColorFamily.RGB, subsampling_w=0, subsampling_h=0),
        Matrix.RGB,
        **kwargs,
    )
    return limiter(clip, func=self.__class__)

scale

scale(
    clip: VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Scale the given clip using the ONNX model.

Parameters:

  • clip

    (VideoNode) –

    The input clip to be scaled.

  • width

    (int | None, default: None ) –

    The target width for scaling. If None, the width of the input clip will be used.

  • height

    (int | None, default: None ) –

    The target height for scaling. If None, the height of the input clip will be used.

  • shift

    (tuple[float, float], default: (0, 0) ) –

    A tuple representing the shift values for the x and y axes.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments to be passed to the preprocess_clip, postprocess_clip, inference, and _final_scale methods. Use the prefix preprocess_ or postprocess_ to pass an argument to the respective method. Use the prefix inference_ to pass an argument to the inference method.

    Additional note for the Cunet model:

    • A tint issue is also present but it is not constant. It leaves flat areas alone but tints detailed areas. This behavior can be disabled with postprocess_no_tint_fix=True

Returns:

  • VideoNode

    The scaled clip.

Source code in vsscale/onnx.py
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
def scale(
    self,
    clip: vs.VideoNode,
    width: int | None = None,
    height: int | None = None,
    shift: tuple[float, float] = (0, 0),
    **kwargs: Any,
) -> vs.VideoNode:
    """
    Scale the given clip using the ONNX model.

    Args:
        clip: The input clip to be scaled.
        width: The target width for scaling. If None, the width of the input clip will be used.
        height: The target height for scaling. If None, the height of the input clip will be used.
        shift: A tuple representing the shift values for the x and y axes.
        **kwargs: Additional arguments to be passed to the `preprocess_clip`, `postprocess_clip`, `inference`,
            and `_final_scale` methods. Use the prefix `preprocess_` or `postprocess_` to pass an argument to
            the respective method. Use the prefix `inference_` to pass an argument to the inference method.

            Additional note for the Cunet model:

               - A tint issue is also present but it is not constant. It leaves flat areas alone but tints
               detailed areas.
               This behavior can be disabled with `postprocess_no_tint_fix=True`

    Returns:
        The scaled clip.
    """
    ...

supersample

supersample(
    clip: VideoNode,
    rfactor: float = 2.0,
    shift: tuple[TopShift, LeftShift] = (0, 0),
    **kwargs: Any,
) -> VideoNode

Supersample a clip by a given scaling factor.

Keyword arguments passed during initialization are automatically injected here, unless explicitly overridden by the arguments provided at call time. Only arguments that match named parameters in this method are injected.

Parameters:

  • clip

    (VideoNode) –

    The source clip.

  • rfactor

    (float, default: 2.0 ) –

    Scaling factor for supersampling.

  • shift

    (tuple[TopShift, LeftShift], default: (0, 0) ) –

    Subpixel shift (top, left) applied during scaling.

  • **kwargs

    (Any, default: {} ) –

    Additional arguments forwarded to the scale function.

Raises:

Returns:

  • VideoNode

    The supersampled clip.

Source code in vskernels/abstract/base.py
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
def supersample(
    self, clip: vs.VideoNode, rfactor: float = 2.0, shift: tuple[TopShift, LeftShift] = (0, 0), **kwargs: Any
) -> vs.VideoNode:
    """
    Supersample a clip by a given scaling factor.

    Keyword arguments passed during initialization are automatically injected here,
    unless explicitly overridden by the arguments provided at call time.
    Only arguments that match named parameters in this method are injected.

    Args:
        clip: The source clip.
        rfactor: Scaling factor for supersampling.
        shift: Subpixel shift (top, left) applied during scaling.
        **kwargs: Additional arguments forwarded to the scale function.

    Raises:
        CustomValueError: If resulting resolution is non-positive.

    Returns:
        The supersampled clip.
    """
    assert check_variable_resolution(clip, self.supersample)

    dst_width, dst_height = ceil(clip.width * rfactor), ceil(clip.height * rfactor)

    if max(dst_width, dst_height) <= 0.0:
        raise CustomValueError(
            'Multiplying the resolution by "rfactor" must result in a positive resolution!',
            self.supersample,
            rfactor,
        )

    return self.scale(clip, dst_width, dst_height, shift, **kwargs)