CVPR 2020 三篇有趣的論文解讀
- 2020 年 3 月 13 日
- 筆記
作者 | 文永亮
學校 | 哈爾濱工業大學(深圳)
研究方向 | 影片預測、時空序列預測
目錄
- AdderNet — 其實不需要這麼多乘法
- Deep Snake for Real-Time Instance Segmentation — 用輪廓做實例分割
- Blurry Video Frame Interpolation — 完美的金字塔
AdderNet (在深度學習中我們真的需要乘法?)

這篇論文是北大、諾亞、鵬城、悉大的論文,觀點比較有趣,在喜提CVPR2020之前也比較火了,下面我可以介紹一下。
論文指出我們可以定義如下公式,首先我們定義核大小為d,輸入通道為(c_{in}),輸出通道為(c_{out})的濾波器(F in mathbb{R}^{d times d times c_{i n} times c_{o u t}}),長寬為H, W 的輸入特徵為(X in mathbb{R}^{H times W times c_{i n}}),
[ Y(m, n, t)=sum_{i=0}^{d} sum_{j=0}^{d} sum_{k=0}^{c_{i n}} S(X(m+i, n+j, k), F(i, j, k, t)) ]
其中 (S(cdot, cdot)) 為相似度計算方法,如果設 (S(x, y)=x×y) ,這就是卷積的一種定義方法了。 那麼論文就引出加法網路的基本運算元如何定義的:
[ Y(m, n, t)=-sum_{i=0}^{d} sum_{j=0}^{d} sum_{k=0}^{c_{i n}}|X(m+i, n+j, k)-F(i, j, k, t)| ]
如上定義只用了加法的(ell{1})距離,可以有效地計算濾波器和特徵之間的相似度。
在CIFAR-10和CIFAR-100以及ImageNet的實驗結果:


可以看到在把卷積替換成加法之後好像也沒有太多精度的丟失,正如標題說的,我們真的需要這麼多乘法嗎?
Deep Snake用於實例分割

這篇工作是來自浙江大學Deepwise AI Lab的,我起初看到感覺十分有趣,這篇論文的實例分割並不是每個像素的去分,而是用輪廓圍住了實例。程式碼已經開源,有興趣的同學可以去看看。
repo url:https://github.com/zju3dv/snake

基本思想是給實例一個初始輪廓,用循環卷積(Circular Convolution)方法學習更新輪廓,最後得到offsets。
我在下面介紹一下Circular Convolution:

[ left(f_{N}right)_{i} triangleq sum_{j=-infty}^{infty} f_{i-j N}=f_{i(bmod N)}\ left(f_{N} * kright)_{i}=sum_{j=-r}^{r}left(f_{N}right)_{i+j} k_{j} ]
我們定義特徵為藍色部分的圓圈,那麼它可以表達為(f_{i(bmod N)}) ,*是標準的卷積操作,整個循環卷積就是每一個藍色的特徵與黃色的kernel相乘得到對應高亮的綠色輸出,一圈下來就得到完整的輸出,kernel也是共享的。

我們可以通過圖(b)看到整個演算法的pipeline,首先輸入圖片,實驗中使用了CenterNet作為目標檢測器, Center Net將檢測任務重新定義為關鍵點檢測問題,這樣得到一個初始的box,然後取每邊的中點連接作為初始的Diamond contour(實際實驗中作者說他upsample成了40個點),然後通過變形操作使點回歸到實例的邊界點,然後通過邊界點一半向外拓展1/4的邊長得到一個Octagon contour(八邊形輪廓),再做變形操作最終回歸到目標的形狀邊界。
作者在三個數據集上做了實驗,分別是Cityscapes, Kins, Sbd。可以看到在Kins上的數據集的AP值比Mask RCNN好一些。

其分割的效果也不錯且有點有趣:

可以看到確實挺快的, Sbd數據集的512 × 512 的圖片,在Intel i7 3.7GHz,GTX 1080 Ti GPU達到32.3 fps。

BIN 模糊影片插幀

這篇paper是上海交通大學的翟廣濤教授組的模糊影片插幀技術,主要是為了提高影片品質並且達到插幀的效果,我覺得這篇論文十分優秀,只可惜程式碼還在重構中,repo說6.14公布,這也有點久啊。
repo url : https://github.com/laomao0/BIN
這篇論文設計的很精巧,模型構建中分為兩塊:
-
1.金字塔模組
-
2.金字塔間的遞歸模組
如下圖所示:

其實這網路結構很容易理解,(B_0,B_2,B_4,B_6,B_8)都是輸入,當我們取Scale 2的時候,輸入取(B_0,B_2,B_4), 我們可通過(B_0,B_2)得到中間插幀(hat{{I}}_1),同理可得(hat{I}_3),最後通過(hat{{I}}_1)和(hat{I}_3)插幀得到(hat{{I}}_2)。
數學表達如下:
[ hat{mathbf{I}}_{1: 1: 2 N-1}=mathcal{F}left(mathbf{B}_{0: 2: 2 N}right) ]
[ hat{mathbf{I}}_{1}=mathcal{F}_{mathrm{b}}left(mathbf{B}_{0}, mathbf{B}_{2}right) ]
但是Scale 3和4的時候就不一樣了,我舉例Scale 3的時候,Scale 4同理
[ hat{mathbf{I}}_{1}=mathcal{F}_{mathrm{b_1}}left(mathbf{B}_{0}, mathbf{B}_{2}right)\ {mathbf{I'}}_{3}=mathcal{F}_{mathrm{b_1}}left(mathbf{B}_{2}, mathbf{B}_{4}right)\ hat{mathbf{I}}_{2}=mathcal{F}_{mathrm{b_2}}left(mathbf{hat{I}}_{1}, mathbf{I'}_{3}right)\ hat{mathbf{I}}_{3}=mathcal{F}_{mathrm{b_2}}left(mathbf{hat{I}}_{2}, mathbf{hat{I}}_{4},mathbf{B}_{3},mathbf{B}_{4}right)\ {mathbf{I'}}_{5}=mathcal{F}_{mathrm{b_1}}left(mathbf{B}_{4}, mathbf{B}_{6}right) ]
這樣通過(B_0,B_2,B_4,B_6)就會得到中間1,3,5的插幀,或許有人疑惑為什麼會有(mathbf{I'}_{3}) 和(hat{mathbf{I}}_{3}) ,這兩個有什麼區別,這裡主要就是因為作者做了一個Cycle Consistency的loss,主要是保證中間產生的幀與金字塔最後產生的幀保持空間上的一致性。

其中金字塔模組具有可調節的空間感受域和時間範圍,可以從圖中看到,作者採用了三種scale,隨著scale的增加,網路將會拓展的更深,因此具有更大的空間感受域,同時在時間範圍內輸入的數量會需要更多,所以說時間範圍也正是如此,從而控制計算複雜度和復原能力。金字塔模組使用普通的卷積神經網路搭建而成,其中同一級的共享權重,這其實節省了很多參數空間,但是這樣是否就缺乏了時間上的資訊呢?
如果採用Scale 2的時候,我們可以分析金字塔之間如何傳遞資訊的,如圖中(b)部分:

ConvLSTM構成的Inter-Pyramid Recurrent Module實際上就是為了傳遞時空上的資訊,這裡Time Step為2,(B_2^{t}) 與(B_2^{t+1}) 實際上是同一張輸入,但是進入了兩個不同的模組,整體step前進了一步,其中的ConvLSTM就是為了傳遞C和H的,其公式如下:
[ mathbf{H}^{t}, mathbf{C}^{t}=mathcal{F}_{mathrm{c}}left(hat{mathbf{I}}_{3}^{t}, mathbf{H}^{t-1}, mathbf{C}^{t-1}right) ]
損失函數非常的簡單,這裡不做過多的說明,分為了重構誤差(L_p) (Pixel Reconstruction) 和 一致性誤差(L_c) (Cycle Consistency) :
[ rho(x)=sqrt{x^{2}+epsilon^{2}}\ mathcal{L}_{p}=frac{1}{T} sum_{t=1}^{T} sum_{n=1}^{2 M-1} rholeft(hat{mathbf{I}}_{n}^{t}-mathbf{G}_{n}^{t}right)\ mathcal{L}_{c}=frac{1}{T} sum_{t=1}^{T} sum_{n in Omega} rholeft(mathbf{I}_{n}^{t}-hat{mathbf{I}}_{n}^{t}right)\ mathcal{L}=mathcal{L}_{p}+mathcal{L}_{c}\ ]
數據集用的是:Adobe240和YouTube240,可以看到論文的效果取了Scale=4的時候跟GT已經看不出太大的區別了。

而且Scale越大圖片品質就越好:



