1. 程式人生 > >CVPR 2020 三篇有趣的論文解讀

CVPR 2020 三篇有趣的論文解讀

**作者 | 文永亮** **學校 | 哈爾濱工業大學(深圳)** **研究方向 | 視訊預測、時空序列預測** ## 目錄 - **AdderNet** — 其實不需要這麼多乘法 - **Deep Snake for Real-Time Instance Segmentation** — 用輪廓做例項分割 - **Blurry Video Frame Interpolation** — 完美的金字塔 ## AdderNet (在深度學習中我們真的需要乘法?) ![1582885309650](https://raw.githubusercontent.com/ManWingloeng/pic_store/master/CVPR2020.assets/1582885309650.png) 這篇論文是北大、諾亞、鵬城、悉大的論文,觀點比較有趣,在喜提**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的實驗結果: ![1582887041821](https://raw.githubusercontent.com/ManWingloeng/pic_store/master/CVPR2020.assets/1582887041821.png) ![1582887234629](https://raw.githubusercontent.com/ManWingloeng/pic_store/master/CVPR2020.assets/1582887234629.png) 可以看到在把卷積替換成加法之後好像也沒有太多精度的丟失,正如標題說的,我們真的需要這麼多乘法嗎? ## Deep Snake用於例項分割 ![image-20200305170006338](https://raw.githubusercontent.com/ManWingloeng/pic_store/master/CVPR2020.assets/image-20200305170006338.png) 這篇工作是來自浙江大學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} * k\right)_{i}=\sum_{j=-r}^{r}\left(f_{N}\right)_{i+j} k_{j} $$ 我們定義特徵為藍色部分的圓圈,那麼它可以表達為$f_{i(\bmod N)}$ ,*是標準的卷積操作,整個迴圈卷積就是每一個藍色的特徵與黃色的kernel相乘得到對應高亮的綠色輸出,一圈下來就得到完整的輸出,kernel也是共享的。 ![image-20200305171835252](https://raw.githubusercontent.com/ManWingloeng/pic_store/master/CVPR2020.assets/image-20200305171835252.png) 我們可以通過圖(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 模糊視訊插幀 ![image-20200304184153117](https://raw.githubusercontent.com/ManWingloeng/pic_store/master/CVPR2020.assets/image-20200304184153117.png) 這篇paper是上海交通大學的翟廣濤教授組的模糊視訊插幀技術,主要是為了提高視訊質量並且達到插幀的效果,我覺得這篇論文十分優秀,只可惜程式碼還在重構中,repo說6.14公佈,這也有點久啊。 repo url : *https://github.com/laomao0/BIN* 這篇論文設計的很精巧,模型構建中分為兩塊: - **1.金字塔模組** - **2.金字塔間的遞迴模組** 如下圖所示: ![image-20200304144316823](https://raw.githubusercontent.com/ManWingloeng/pic_store/master/CVPR2020.assets/image-20200304144316823.png) 其實這網路結構很容易理解,$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,主要是保證中間產生的幀與金字塔最後產生的幀保持空間上的一致性。
金字塔模組的構建有(a)Backbone (b)Residual Dense Block 兩種
其中**金字塔模組**具有可調節的空間感受域和時間範圍,可以從圖中看到,作者採用了三種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} \rho\left(\hat{\mathbf{I}}_{n}^{t}-\mathbf{G}_{n}^{t}\right)\\ \mathcal{L}_{c}=\frac{1}{T} \sum_{t=1}^{T} \sum_{n \in \Omega} \rho\left(\mathbf{I}_{n}^{t}-\hat{\mathbf{I}}_{n}^{t}\right)\\ \mathcal{L}=\mathcal{L}_{p}+\mathcal{L}_{c}\\ $$ **資料集**用的是:**Adobe240**和**YouTube240**,可以看到論文的效果取了Scale=4的時候跟GT已經看不出太大的區別了。
而且**Scale越大圖片質量就越好**: