All Projects → v0lta → PyTorch-Wavelet-Toolbox

v0lta / PyTorch-Wavelet-Toolbox

Licence: EUPL-1.2 license
Differentiable fast wavelet transforms in PyTorch with GPU support.

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to PyTorch-Wavelet-Toolbox

haarpsi
The Haar wavelet-based perceptual similarity index (HaarPSI) is a similarity measure for images that aims to correctly assess the perceptual similarity between two images with respect to a human viewer.
Stars: ✭ 27 (-76.92%)
Mutual labels:  wavelet-transform
Smile
Statistical Machine Intelligence & Learning Engine
Stars: ✭ 5,412 (+4525.64%)
Mutual labels:  wavelet
naps
An experiment for building gateware for the axiom micro / beta using nmigen and yosys
Stars: ✭ 28 (-76.07%)
Mutual labels:  wavelet
WaveletCNN
Wavelet CNN, Texture Classification in Keras
Stars: ✭ 19 (-83.76%)
Mutual labels:  wavelet
lens
The official network explorer for Wavelet.
Stars: ✭ 28 (-76.07%)
Mutual labels:  wavelet
CCWT
Complex Continuous Wavelet Transform
Stars: ✭ 136 (+16.24%)
Mutual labels:  wavelet
ITKIsotropicWavelets
External Module for ITK, implementing Isotropic Wavelets and Riesz Filter for multiscale phase analysis.
Stars: ✭ 12 (-89.74%)
Mutual labels:  wavelet
YANGstraight source
Analytic signal-based source information analysis for YANGstraight and real-time interactive tools
Stars: ✭ 31 (-73.5%)
Mutual labels:  wavelet
nhwcodec
NHW : A Next-Generation Image Compression Codec
Stars: ✭ 56 (-52.14%)
Mutual labels:  wavelet
wavelet-denoiser
A wavelet audio denoiser done in python
Stars: ✭ 29 (-75.21%)
Mutual labels:  wavelet
PlateFlex
Estimating effective elastic thickness of the lithosphere
Stars: ✭ 20 (-82.91%)
Mutual labels:  wavelet-analysis
Wavelet-like-Auto-Encoder
No description or website provided.
Stars: ✭ 61 (-47.86%)
Mutual labels:  wavelet-analysis
Mathematical-Modeling
A sharing of the learning process of mathematical modeling 数学建模常用工具模型算法分享:数学建模竞赛优秀论文,数学建模常用算法模型,LaTeX论文模板,SPSS工具分享。
Stars: ✭ 30 (-74.36%)
Mutual labels:  wavelet-analysis
COVID-19-train-audio
COVID-19 Coughs files for training AI models
Stars: ✭ 39 (-66.67%)
Mutual labels:  wavelet-analysis
adaptive-wavelets
Adaptive, interpretable wavelets across domains (NeurIPS 2021)
Stars: ✭ 58 (-50.43%)
Mutual labels:  wavelet-analysis
ssqueezepy
Synchrosqueezing, wavelet transforms, and time-frequency analysis in Python
Stars: ✭ 315 (+169.23%)
Mutual labels:  wavelet-transform
Imfusion
Image fusion using Discrete Wavelet Transformation
Stars: ✭ 23 (-80.34%)
Mutual labels:  wavelet-transform

Pytorch Wavelet Toolbox (ptwt)

GitHub Actions Documentation Status PyPI Versions PyPI - Project PyPI - License Black code style

Welcome to the PyTorch wavelet toolbox. This package implements:

  • 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,
  • MatrixWavedec and MatrixWaverec provide sparse-matrix-based fast wavelet transforms with boundary filters,
  • 2d sparse-matrix transforms with separable & non-separable boundary filters are available (experimental),
  • 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 supports pywt-wavelets. Complete documentation is available: https://pytorch-wavelet-toolbox.readthedocs.io/

Installation

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

$ 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:

import torch
import numpy as np
import pywt
import ptwt  # use "from src import ptwt" for a cloned the repo

# 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 supports discrete wavelets see also pywt.wavelist(kind='discrete'). I have tested Daubechies-Wavelets db-x and symlets sym-x, which 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:

import ptwt, pywt, torch
import numpy as np
import scipy.misc

face = np.transpose(scipy.misc.face(),
                        [2, 0, 1]).astype(np.float64)
pytorch_face = torch.tensor(face)
coefficients = ptwt.wavedec2(pytorch_face, pywt.Wavelet("haar"),
                                level=2, mode="constant")
reconstruction = ptwt.waverec2(coefficients, pywt.Wavelet("haar"))
np.max(np.abs(face - reconstruction.squeeze(1).numpy()))

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:

import torch
import numpy as np
import pywt
import ptwt  # use "from src import ptwt" for a cloned the repo

# 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))
# forward
matrix_wavedec = ptwt.MatrixWavedec(pywt.Wavelet("haar"), level=2)
coeff = matrix_wavedec(data_torch)
print(coeff)
# backward
matrix_waverec = ptwt.MatrixWaverec(pywt.Wavelet("haar"))
rec = matrix_waverec(coeff)
print(rec)

The process for the 2d transforms MatrixWavedec2, MatrixWaverec2 works similarly. By default, a non-separable transformation is used. To use a separable transformation, pass separable=True 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. After cloning the repository, and moving into the main directory, and installing nox with pip install nox run:

$ nox --session test

Citation

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

@phdthesis{handle:20.500.11811/9245,
  urn: https://nbn-resolving.org/urn:nbn:de:hbz:5-63361,
  author = {{Moritz Wolter}},
  title = {Frequency Domain Methods in Recurrent Neural Networks for Sequential Data Processing},
  school = {Rheinische Friedrich-Wilhelms-Universität Bonn},
  year = 2021,
  month = jul,
  url = {https://hdl.handle.net/20.500.11811/9245}
}

If you use the boundary wavelet support please additionally cite:

@thesis{Blanke2021,
  author = {Felix Blanke},
  title = {{Randbehandlung bei Wavelets für Faltungsnetzwerke}},
  type = {Bachelor's Thesis},
  annote = {Gbachelor},
  year = {2021},
  school = {Institut f\"ur Numerische Simulation, Universit\"at Bonn}
}
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].