簡體   English   中英

使用 FFT 實現二維卷積

[英]Implement 2D convolution using FFT

TensorFlow.conv2d()在卷積具有大內核(過濾器)的大圖像時速度慢得不切實際。 使用相同大小的內核對 1024x1024 圖像進行卷積需要幾分鍾時間。 為了進行比較, cv2.filter2D()立即返回結果。

我找到了tf.fft2()tf.rfft()

但是,我不清楚如何使用這些函數執行簡單的圖像過濾。

如何使用 FFT 使用 TensorFlow 實現快速 2D 圖像過濾?

可以使用卷積定理和離散時間傅立葉變換 (DTFT) 計算x * y形式的線性離散卷積。 如果x * y是圓形離散卷積,則可以使用離散傅立葉變換 (DFT) 進行計算。

卷積定理狀態x * y可以使用傅立葉變換計算為

卷積定理

在哪里傅里葉變換 表示傅里葉變換和傅里葉逆變換 傅里葉逆變換。 xy是離散的並且它們的卷積是線性卷積時,這是使用 DTFT 計算的

離散卷積定理

如果xy是離散的並且它們的卷積是循環卷積,則上面的 DTFT 將被 DFT 替換。 注意:線性卷積問題可以嵌入到循環卷積問題中。


我更熟悉 MATLAB,但通過閱讀tf.signal.fft2dtf.signal.ifft2d的 TensorFlow 文檔,下面的解決方案應該可以通過替換 MATLAB 函數fft2ifft2輕松轉換為 TensorFlow。

在 MATLAB(和 TensorFlow)中, fft2 (和tf.signal.fft2d )使用快速傅立葉變換算法計算 DFT。 如果xy的卷積是圓形的,則可以通過以下方式計算

ifft2(fft2(x).*fft2(y))

其中.*表示 MATLAB 中逐個元素的乘法。 但是,如果它是線性的,那么我們將數據零填充到長度2N-1 ,其中N是一維的長度(問題中的 1024)。 在 MATLAB 中,這可以通過兩種方式之一計算。 首先,通過

h = ifft2(fft2(x, 2*N-1, 2*N-1).*fft2(y, 2*N-1, 2*N-1));

其中 MATLAB 通過零填充計算xy2*N-1點二維傅立葉變換,然后是2*N-1點二維傅立葉逆變換。 這個方法不能在 TensorFlow 中使用(根據我對文檔的理解)所以 next 是唯一的選擇。 在 MATLAB 和 TensorFlow 中,可以通過首先將xy擴展到2*N-1 x 2*N-1 ,然后計算2*N-1點二維傅里葉變換和傅里葉逆變換來計算卷積

x_extended = x;
x_extended(2*N-1, 2*N-1) = 0;

y_extended = y;
y_extended(2*N-1, 2*N-1) = 0;

h_extended = ifft2(fft2(x_extended).*fft2(y_extended));

在 MATLAB 中, hh_extended完全相等。 xy的卷積可以在沒有傅立葉變換的情況下計算

hC = conv2(x, y);

在 MATLAB 中。


在我的筆記本電腦上的 MATLAB 中, conv2(x, y)需要 55 秒,而傅立葉變換方法需要不到 0.4 秒。

這可以通過類似於scipy.signal.fftconvolve實現的方式來完成。

這是一個例子,假設我們有一個圖像(二維,如果你還有多個通道,你可以使用 3d 而不是 2 個函數)(im)和一個過濾器(例如高斯)。

首先,對圖像進行傅立葉變換並定義fft_lenghts (如果濾波器具有不同的形狀,則很有用,在這種情況下,它將填充零。)

fft_lenght1 = tf.shape(im)[0]
fft_lenght2 = tf.shape(im)[1]
im_fft = tf.signal.rfft2d(im, fft_length=[fft_lenght1, fft_lenght2])

接下來,取濾波器的 FFT(注意,例如對於 2d 高斯濾波器,請確保中心位於左上角,即僅使用“四分之一”)

kernel_fft = tf.signal.rfft2d(kernel, fft_length=[fft_lenght1, fft_lenght2])

最后取回逆變換得到卷積后的圖像

im_blurred = tf.signal.irfft2d(im_fft * kernel_fft, [fft_lenght1, fft_lenght2])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM