European Union Public License 1.2

项目介绍

v0lta/PyTorch-Wavelet-Toolbox 是一个托管在 GitHub 上的开源项目,主要使用 Python 编写,采用 European Union Public License 1.2 许可证,目前获得 435 个 Star、42 次 Fork。

仓库全名
v0lta/PyTorch-Wavelet-Toolbox
开源许可证
European Union Public License 1.2
Star 数
435
Fork 数
42
未关闭 Issue
8

README 摘要

Pytorch Wavelet Toolbox (ptwt) :target: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/actions/workflows/tests.yml :alt: GitHub Actions :target: https://pytorch-wavelet-toolbox.readthedocs.io/en/latest/ :alt: Documentation Status :target: https://pypi.org/project/ptwt/ :alt: PyPI Versions :target: https://pypi.org/project/ptwt/ :alt: PyPI - Project :target…

完整内容见 GitHub 原始 README 或本页 。

常见问题

PyTorch-Wavelet-Toolbox 用什么语言开发?

主要使用 Python 编写,采用 European Union Public License 1.2 许可证,目前有 435 个 Star。

PyTorch-Wavelet-Toolbox 可以免费商用吗?

仓库标注的许可证为 European Union Public License 1.2,商用前请先阅读仓库 LICENSE 文件确认授权范围。

如何获取 PyTorch-Wavelet-Toolbox 的源码?

可以直接克隆仓库:git clone https://github.com/v0lta/PyTorch-Wavelet-Toolbox.git;安装与运行步骤见仓库 README。

PyTorch-Wavelet-Toolbox 最近还在维护吗?

仓库最近一次更新为 1月23日,当前有 8 个未关闭 Issue;Star 数为 435,可作为社区活跃度的参考。

关于

[JMLR] Differentiable fast wavelet transforms in PyTorch with GPU support.

描述取自 GitHub 官方 API,中文内容由 GitRead 中文社区 编辑团队整理。

简要分析

热度分
954
价值分
316
活跃状态
活跃

README


Pytorch Wavelet Toolbox (ptwt)


… image:: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/actions/workflows/tests.yml/badge.svg :target: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/actions/workflows/tests.yml :alt: GitHub Actions

… image:: https://readthedocs.org/projects/pytorch-wavelet-toolbox/badge/?version=latest :target: https://pytorch-wavelet-toolbox.readthedocs.io/en/latest/ :alt: Documentation Status

… image:: https://img.shields.io/pypi/pyversions/ptwt :target: https://pypi.org/project/ptwt/ :alt: PyPI Versions

… image:: https://img.shields.io/pypi/v/ptwt :target: https://pypi.org/project/ptwt/ :alt: PyPI - Project

… image:: https://img.shields.io/pypi/l/ptwt :target: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/blob/main/LICENSE :alt: PyPI - License

… image:: https://img.shields.io/badge/code style-black-000000.svg :target: https://github.com/psf/black :alt: Black code style

… image:: https://static.pepy.tech/personalized-badge/ptwt?period=total&units=international_system&left_color=grey&right_color=brightgreen&left_text=Downloads :target: https://pepy.tech/project/ptwt

Welcome to the PyTorch wavelet toolbox. This package implements discrete-(DWT) as well as continuous-(CWT) wavelet transforms:

  • the fast wavelet transform (fwt) via wavedec and its inverse by providing the waverec function,
  • the two-dimensional fwt is called wavedec2 the synthesis counterpart waverec2,
  • wavedec3 and waverec3 cover the three-dimensional analysis and synthesis case,
  • fswavedec2, fswavedec3, fswaverec2 and fswaverec3 support separable transformations.
  • MatrixWavedec and MatrixWaverec implement sparse-matrix-based fast wavelet transforms with boundary filters,
  • 2d sparse-matrix transforms with separable & non-separable boundary filters are available,
  • MatrixWavedec3 and MatrixWaverec3 allow separable 3D-fwt’s with boundary filters.
  • cwt computes a one-dimensional continuous forward transform,
  • single and two-dimensional wavelet packet forward and backward transforms are available via the WaveletPacket and WaveletPacket2D objects,
  • finally, this package provides adaptive wavelet support (experimental).

This toolbox extends PyWavelets <https://pywavelets.readthedocs.io/en/latest/>_. In addition to boundary wavelets, we provide GPU and gradient support via a PyTorch backend. Complete documentation of our Python API is available at: https://pytorch-wavelet-toolbox.readthedocs.io/en/latest

This toolbox is independent work. Meta or the PyTorch team have not endorsed it.

Installation

Install the toolbox via pip or clone this repository. In order to use pip, type:

… code-block:: sh

pip install ptwt

You can remove it later by typing pip uninstall ptwt.

Example usage: “”“”“”“”“”“”“” Single dimensional transform

One way to compute fast wavelet transforms is to rely on padding and convolution. Consider the following example:

… code-block:: python

import torch import numpy as np import pywt import ptwt

generate an input of even length.

data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0]) data_torch = torch.from_numpy(data.astype(np.float32)) wavelet = pywt.Wavelet(‘haar’)

compare the forward fwt coefficients

print(pywt.wavedec(data, wavelet, mode=‘zero’, level=2)) print(ptwt.wavedec(data_torch, wavelet, mode=‘zero’, level=2))

invert the fwt.

print(ptwt.waverec(ptwt.wavedec(data_torch, wavelet, mode=‘zero’), wavelet))

The functions wavedec and waverec compute the 1d-fwt and its inverse. Internally both rely on conv1d, and its transposed counterpart conv_transpose1d from the torch.nn.functional module. This toolbox also supports discrete wavelets see pywt.wavelist(kind='discrete'). I have tested Daubechies-Wavelets db-x and symlets sym-x, are usually a good starting point.

Two-dimensional transform

Analog to the 1d-case wavedec2 and waverec2 rely on conv2d, and its transposed counterpart conv_transpose2d. To test an example, run:

… code-block:: python

import ptwt, torch from scipy import datasets

data = torch.tensor(datasets.face(), dtype=torch.float64)

permute [H, W, C] -> [C, H, W]

data = data.permute(2, 0, 1) coefficients = ptwt.wavedec2(face, “haar”, level=2, mode=“constant”) reconstruction = ptwt.waverec2(coefficients, “haar”) torch.max(torch.abs(face - reconstruction))

Speed tests

Speed tests comparing our tools to related libraries are available <https://github.com/v0lta/PyTorch-Wavelet-Toolbox/tree/main/examples/speed_tests/>_.

Boundary Wavelets with Sparse-Matrices

In addition to convolution and padding approaches, sparse-matrix-based code with boundary wavelet support is available. In contrast to padding, boundary wavelets do not add extra pixels at the edges. Internally, boundary wavelet support relies on torch.sparse.mm. Generate 1d sparse matrix forward and backward transforms with the MatrixWavedec and MatrixWaverec classes. Reconsidering the 1d case, try:

… code-block:: python

import torch import pywt import ptwt

generate an input of even length.

data = torch.arange(16, dtype=torch.float32)

forward

matrix_wavedec = ptwt.MatrixWavedec(haar, level=2) coeff = matrix_wavedec(data) print(coeff)

backward

matrix_waverec = ptwt.MatrixWaverec(“haar”) rec = matrix_waverec(coeff) print(rec)

The process for the 2d transforms MatrixWavedec2, MatrixWaverec2 works similarly. By default, a separable transformation is used. To use a non-separable transformation, pass separable=False to MatrixWavedec2 and MatrixWaverec2. Separable transformations use a 1D transformation along both axes, which might be faster since fewer matrix entries have to be orthogonalized.

Adaptive Wavelets

Experimental code to train an adaptive wavelet layer in PyTorch is available in the examples folder. In addition to static wavelets from pywt,

  • Adaptive product-filters
  • and optimizable orthogonal-wavelets are supported.

See https://github.com/v0lta/PyTorch-Wavelet-Toolbox/tree/main/examples/network_compression/ for a complete implementation.

Testing

The tests folder contains multiple tests to allow independent verification of this toolbox. The GitHub workflow executes a subset of all tests for efficiency reasons. After cloning the repository, moving into the main directory, and installing nox with pip install nox run

… code-block:: sh

nox --session test

for all existing tests.

Citation “”“”“”“”

If you use this work in a scientific context, please cite the following:

… code-block::

@article{JMLR:v25:23-0636, author = {Moritz Wolter and Felix Blanke and Jochen Garcke and Charles Tapley Hoyt}, title = {ptwt - The PyTorch Wavelet Toolbox}, journal = {Journal of Machine Learning Research}, year = {2024}, volume = {25}, number = {80}, pages = {1–7}, url = {http://jmlr.org/papers/v25/23-0636.html} }

评论

暂无评论