1. 程式人生 > >影象卷積的fft實現驗證(python)

影象卷積的fft實現驗證(python)

1、Caffe的卷積操作時間主要在矩陣乘法,假設一個m*n卷積核,且輸入通道數為1,輸出特徵圖大小為h*w,則乘法個數m*n*h*w,這裡的優化僅限於對矩陣的乘法優化,因此,只要選擇適合的矩陣計算庫就可以了。

2、若使用FFT來計算影象卷積。其主要步驟如下。

假設輸入影象的大小為len=h*w,卷積核大小k_lenm*n;通常len>>k_len

  1. 對輸入影象AFFT,其演算法的時間複雜度為o(lenlglen)

  2. 對卷積核BFFT,但是由於卷積核與輸入影象尺寸不一樣,需要將卷積核擴充套件,即將卷積核倒置後,補len-k_len個0。

  3. AB傅立葉變換的結果相乘,即對應位相乘獲得結果

    C。乘法個數為len,時間複雜度為o(len)

  4. CIFFT,得到結果D,在D中每隔k_len的值實部取出來,就是影象卷積的結果。因為影象卷積其實就是對應位相乘,所以需要每隔k_len取值,時間複雜度為o(len)

假設卷積核個數>1,需要對卷積核重新擴充套件後重復2)3)4)步驟,並與上一個卷積核影象卷積的值對應位相加就能獲得。

驗證正確性:

輸入影象的卷積順序-1,1,3,82,43,1,31,3,1,354,-2,-3,-1

卷積核1,2,-1,3

影象卷積結果:22,96,15,50.

此處注意,計算結果是用卷積核與輸入影象進行乘法累加。

使用FFT結果:22,96,15,50

此處注意,將卷積核逆置。

結果正確

暫時未能看出此方法的優越性,從空間上看,需要對卷積核進行擴充套件,其空間大小與輸入影象的尺寸大小一樣。時間上分析,僅二者FFT對應相乘的時間的乘法個數就和矩陣乘法個數的數量級是一樣的了(當len>>k_len時)。適用於卷積核尺寸較大的情景。


雖然沒理解為什麼效能提升這麼多,但是該論文所做的實驗證明了FFT效能很好,雖然複雜度推導跟我推導的差不多~此論文用了cuFFT

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

至於多通道,多卷積核的,經python驗證,卷積結果正確,其大概步驟如下:


水平有限,出錯之處,希望得到各位的指正。