Dokumentasi lengkapnya juga tersedia di sini.
Paket ini memberikan dukungan untuk menghitung wavelet diskrit 2D dan transformasi wavelet kompleks dual-tree 2D, invers, dan gradien lewat melalui keduanya menggunakan pytorch.
Implementasi ini dirancang untuk digunakan dengan batch gambar multichannel. Kami menggunakan implementasi Pytorch standar memiliki format data 'NCHW'.
Kami juga telah menambahkan lapisan untuk melakukan scatternet berbasis DTCWT 2-D. Ini mirip dengan scatternet berbasis Morlet di Kymatio, tetapi kira -kira 10 kali lebih cepat.
Jika Anda menggunakan repo ini, silakan kutip tesis PhD saya, Bab 3: https://doi.org/10.17863/cam.53748.
import torch
from pytorch_wavelets import DWT1DForward , DWT1DInverse # or simply DWT1D, IDWT1D
dwt = DWT1DForward ( wave = 'db6' , J = 3 )
X = torch . randn ( 10 , 5 , 100 )
yl , yh = dwt ( X )
print ( yl . shape )
> >> torch . Size ([ 10 , 5 , 22 ])
print ( yh [ 0 ]. shape )
> >> torch . Size ([ 10 , 5 , 55 ])
print ( yh [ 1 ]. shape )
> >> torch . Size ([ 10 , 5 , 33 ])
print ( yh [ 2 ]. shape )
> >> torch . Size ([ 10 , 5 , 22 ])
idwt = DWT1DInverse ( wave = 'db6' )
x = idwt (( yl , yh )) import torch
from pytorch_wavelets import ScatLayer
scat = ScatLayer ()
X = torch . randn ( 10 , 5 , 64 , 64 )
# A first order scatternet with 6 orientations and one lowpass channels
# gives 7 times the input channel dimension
Z = scat ( X )
print ( Z . shape )
> >> torch . Size ([ 10 , 35 , 32 , 32 ])
# A second order scatternet with 6 orientations and one lowpass channels
# gives 7^2 times the input channel dimension
scat2 = torch . nn . Sequential ( ScatLayer (), ScatLayer ())
Z = scat2 ( X )
print ( Z . shape )
> >> torch . Size ([ 10 , 245 , 16 , 16 ])
# We also have a slightly more specialized, but slower, second order scatternet
from pytorch_wavelets import ScatLayerj2
scat2a = ScatLayerj2 ()
Z = scat2a ( X )
print ( Z . shape )
> >> torch . Size ([ 10 , 245 , 16 , 16 ])
# These all of course work with cuda
scat2a . cuda ()
Z = scat2a ( X . cuda ())Versi 1.0.0 kini telah menambahkan dukungan untuk perhitungan DWT yang dapat dipisahkan, dan lebih banyak skema bantalan, seperti simetris, nol dan periodisasi.
Juga, tidak perlu lagi menentukan jumlah saluran saat membuat kelas transformasi wavelet.
Kami membandingkan melakukan DTCWT dengan paket Python dan melakukan DWT dengan Pywavelets untuk melakukan keduanya di Pytorch_wavelets, menggunakan GTX1080. Metode numpy dijalankan pada mesin 14 core xeon phi menggunakan python paralel Intel. Untuk DTWCWT kami menggunakan filter near_sym_a untuk skala pertama dan filter Qshift_a untuk skala berikutnya. Untuk DWT kami menggunakan filter DB4.
Untuk ukuran input yang tetap, tetapi memvariasikan jumlah skala (dari 1 hingga 4) kami memiliki kecepatan berikut (rata -rata lebih dari 5 run):

Untuk ukuran input dengan tinggi dan lebar 512 dengan 512, kami juga memvariasikan ukuran batch untuk transformasi skala 3. Kecepatan yang dihasilkan adalah:

Cara termudah untuk menginstal pytorch_wavelets adalah dengan mengkloning repo dan pip menginstalnya. Versi yang lebih baru akan dirilis di PYPI tetapi dokumen perlu diperbarui terlebih dahulu:
$ git clone https://github.com/fbcotter/pytorch_wavelets $ CD pytorch_wavelets Instal $ Pip.
;
$ pip menginstal -r tes/persyaratan.txt $ tes pytest/
Untuk DWT - perhatikan bahwa output highpass memiliki dimensi ekstra, di mana kami menumpuk koefisien (LH, HL, HH). Perhatikan juga bahwa output YH memiliki koefisien detail terbaik terlebih dahulu, dan yang paling kasar (sebaliknya dengan pywavelet).
import torch
from pytorch_wavelets import DWTForward , DWTInverse
xfm = DWTForward ( J = 3 , wave = 'db3' , mode = 'zero' )
X = torch . randn ( 10 , 5 , 64 , 64 )
Yl , Yh = xfm ( X )
print ( Yl . shape )
> >> torch . Size ([ 10 , 5 , 12 , 12 ])
print ( Yh [ 0 ]. shape )
> >> torch . Size ([ 10 , 5 , 3 , 34 , 34 ])
print ( Yh [ 1 ]. shape )
> >> torch . Size ([ 10 , 5 , 3 , 19 , 19 ])
print ( Yh [ 2 ]. shape )
> >> torch . Size ([ 10 , 5 , 3 , 12 , 12 ])
ifm = DWTInverse ( wave = 'db3' , mode = 'zero' )
Y = ifm (( Yl , Yh ))Untuk dtcwt:
import torch
from pytorch_wavelets import DTCWTForward , DTCWTInverse
xfm = DTCWTForward ( J = 3 , biort = 'near_sym_b' , qshift = 'qshift_b' )
X = torch . randn ( 10 , 5 , 64 , 64 )
Yl , Yh = xfm ( X )
print ( Yl . shape )
> >> torch . Size ([ 10 , 5 , 16 , 16 ])
print ( Yh [ 0 ]. shape )
> >> torch . Size ([ 10 , 5 , 6 , 32 , 32 , 2 ])
print ( Yh [ 1 ]. shape )
> >> torch . Size ([ 10 , 5 , 6 , 16 , 16 , 2 ])
print ( Yh [ 2 ]. shape )
> >> torch . Size ([ 10 , 5 , 6 , 8 , 8 , 2 ])
ifm = DTCWTInverse ( biort = 'near_sym_b' , qshift = 'qshift_b' )
Y = ifm (( Yl , Yh ))Beberapa catatan awal:
Ini seharusnya tidak mengejutkan bagi pengguna Pytorch. DWT dan DTCWT Mengubah Dukungan Cuda Panggilan:
import torch
from pytorch_wavelets import DTCWTForward , DTCWTInverse
xfm = DTCWTForward ( J = 3 , biort = 'near_sym_b' , qshift = 'qshift_b' ). cuda ()
X = torch . randn ( 10 , 5 , 64 , 64 ). cuda ()
Yl , Yh = xfm ( X )
ifm = DTCWTInverse ( biort = 'near_sym_b' , qshift = 'qshift_b' ). cuda ()
Y = ifm (( Yl , Yh )) Tes otomatis tidak dapat menguji fungsionalitas GPU, tetapi periksa CPU berjalan. Untuk menguji apakah repo sedang mengerjakan GPU Anda, Anda dapat mengunduh repo, memastikan Anda memiliki Pytorch dengan CUDA diaktifkan (tes akan memeriksa untuk melihat apakah torch.cuda.is_available() mengembalikan true), dan jalankan:
Pip Instal -R Tes/Persyaratan.txt tes pytest/
Dari dasar repo.
Dimungkinkan untuk melewati gradien melalui transformasi ke depan dan ke belakang. Yang perlu Anda lakukan adalah memastikan bahwa input ke masing -masing memiliki atribut yang diperlukan_grad diatur ke True.
Berdasarkan paket transformasi wavelet kompleks dual-tree untuk Matlab oleh Nick Kingsbury, Cambridge University. Readme asli dapat ditemukan di asli_readme.txt. File ini menguraikan kondisi penggunaan kotak alat MATLAB asli.
Informasi lebih lanjut tentang DT CWT dapat diperoleh dari makalah yang dapat diunduh dari situs web saya (diberikan di bawah). Tutorial terbaik ada di koran Royal Society 1999. Khususnya ini menjelaskan konversi antara subimage quad-number 'nyata' dan pasangan subimage yang kompleks. Filter Q-shift dijelaskan dalam makalah ICIP 2000 dan secara lebih rinci dalam makalah Mei 2001 untuk Journal on Applied and Computational Harmonic Analysis.
Kode ini adalah hak cipta dan disediakan secara gratis untuk tujuan penelitian saja. Sebagai imbalan untuk memasok kode, yang saya minta hanyalah bahwa, jika Anda menggunakan algoritma, Anda memberikan referensi untuk pekerjaan ini di makalah apa pun yang Anda tulis dan bahwa Anda memberi tahu saya jika Anda menemukan aplikasi yang baik untuk DT CWT. Jika aplikasinya bagus, saya akan sangat tertarik dengan kolaborasi. Saya tidak menerima tanggung jawab yang timbul dari penggunaan algoritma ini.
Nick Kingsbury, Universitas Cambridge, Juni 2003.
Dr Ng Kingsbury, Departemen Teknik, Universitas Cambridge, Trumpington St., Cambridge CB2 1PZ, Inggris., Atau Trinity College, Cambridge CB2 1TQ, Inggris. Telepon: (0 atau +44) 1223 338514 /332647; Rumah: 1954 211152; Faks: 1223 338564 /332662; E-mail: [email protected] Halaman Beranda Web: http://www.eng.cam.ac.uk/~ngk/