完全なドキュメントもこちらでご覧いただけます。
このパッケージは、2D離散ウェーブレットと2Dデュアルツリー複合体ウェーブレット変換、それらの逆、およびPytorchを使用して両方を通過する勾配を通過させるためのサポートを提供します。
実装は、マルチチャネル画像のバッチで使用するように設計されています。 「NCHW」データ形式を持っている標準のPytorch実装を使用します。
また、2-D DTCWTベースの散布ネットを実行するためのレイヤーが追加されています。これは、KymatioのMorletベースの散布ネットに似ていますが、約10倍高速です。
このリポジトリを使用する場合は、博士論文を引用してください。第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 ())バージョン1.0.0は、分離可能なDWT計算のサポートを追加し、対称、ゼロ、期間化などのパディングスキームを増やしました。
また、ウェーブレット変換クラスを作成するときにチャネルの数を指定する必要はもうありません。
DTCWTをPythonパッケージと比較し、PywaveletsでDWTを実行して、GTX1080を使用してPytorch_Waveletsで両方を実行します。 Numpyメソッドは、Intelの並列Pythonを使用して14コアXeon Phiマシンで実行されました。 DTWCWTの場合、最初のスケールには近い_sym_aフィルターを使用し、その後のスケールにはqshift_aフィルターを使用します。 DWTには、DB4フィルターを使用します。
固定された入力サイズの場合、しかしスケールの数(1〜4)の場合は、次の速度(5回のランで平均)があります。

高さ512 x 512の入力サイズの場合、3スケール変換のバッチサイズも変化します。結果の速度は次のとおりです。

pytorch_waveletsをインストールする最も簡単な方法は、リポジトリをクローンしてピップインストールすることです。後のバージョンはPYPIでリリースされますが、ドキュメントは最初に更新する必要があります。
$ git clone https://github.com/fbcotter/pytorch_wavelets $ cd pytorch_wavelets $ pipインストール。
(ただし、ライブラリに重要な変更を実行する場合は、開発コマンドがより便利になる場合があります。)テストスイートが提供されているため、システムのコードが動作することを確認できます。
$ pip install -r tests/compoestion.txt $ pytestテスト/
DWTの場合 - ハイパス出力には余分な寸法があり、(LH、HL、HH)係数を積み重ねることに注意してください。また、YH出力は最初に最高の詳細係数を持ち、最後の粗い係数(pywaveletsの反対)を持っていることに注意してください。
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 ))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 ))いくつかの最初のメモ:
これは、Pytorchユーザーにとって驚くことではありません。 DWTとDTCWTがCUDAの呼び出しをサポートするTransforms:
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 ))自動化されたテストでは、GPU機能をテストすることはできませんが、CPUの実行を確認します。リポジトリがGPUで動作しているかどうかをテストするには、リポジトリをダウンロードし、CUDAが有効になっているPytorchがあることを確認できます( torch.cuda.is_available() Trueが返されるかどうかを確認します)。
PIPインストール-Rテスト/要件.txt pytestテスト/
リポジトリのベースから。
勾配を前方および後方変換に通すことができます。必要なのは、それぞれへの入力がexecime_grad属性がtrueに設定されていることを確認することです。
ケンブリッジ大学ニックキングスベリーによるMATLABのデュアルツリーコンプレックスウェーブレット変換パックに基づいています。オリジナルのreadmeは、original_readme.txtにあります。このファイルは、元のMATLABツールボックスの使用条件の概要を示しています。
DT CWTの詳細については、私のWebサイトからダウンロード可能な論文から入手できます(以下に示す)。最高のチュートリアルは、1999年の王立協会の論文にあります。特に、これは、「実際の」クワッド番号サブイメージと複雑なサブイメージのペア間の変換を説明しています。 Q-Shiftフィルターは、ICIP 2000ペーパーで説明されており、2001年5月のペーパーでは、応用および計算高調波分析に関するジャーナルについて詳しく説明しています。
このコードは著作権であり、研究目的でのみ無料で提供されます。コードの提供の見返りに、私が尋ねるのは、アルゴリズムを使用する場合、あなたが書いた論文でこの作業に正当な参照を与えること、そしてDT CWTの良いアプリケーションを見つけた場合に私に知らせてくれることです。アプリケーションが良ければ、私はコラボレーションに非常に興味があります。これらのアルゴリズムの使用から生じる責任は受け付けません。
2003年6月、ケンブリッジ大学ニックキングスベリー。
ケンブリッジ大学、ケンブリッジSt.、ケンブリッジCB2 1PZ、英国、またはトリニティカレッジ、ケンブリッジCB2 1TQ、イギリス、エンジニアリング、エンジニアリング部のNg Kingsbury博士。電話:(0または+44)1223 338514/332647;ホーム:1954 211152;ファックス:1223 338564 /332662;電子メール:[email protected] Webホームページ:http://www.eng.cam.ac.uk/~ngk/