CVPR2019論文觀察:感知邊緣檢測的雙向級聯網絡
BDCN:Bi-Directional Cascade Network for Perceptual Edge Detection
摘要
探索多尺寸表示對解決不同尺寸的目標改進邊沿檢測是很關鍵的。 為了提取不同尺度的邊沿,提出一種雙向級聯網絡Bi-Directional Cascade Network (BDCN) 結構,每一層都由特定尺度上的標記邊緣來監督,不會對所有的CNN輸出直接應用同樣的監測方案。同時,通過BDCN訓練,為了豐富多尺度表現,引入一種尺度增強模型Scale Enhancement Module (SEM),使用膨脹卷積生成多尺度特征,不用更深的CNN,也不用融合多尺度邊沿映射。這些方法有助於在不同的層進行多尺度表示訓練,同時,通過這些尺度來描繪的方法檢測邊沿。訓練尺度專用層也可以生成有一個參數分量的緊致網絡。用三個數據集:i.e., BSDS500, NYUDv2, and Multicue,獲取0.828的ODS F-measure,高於BSDS500數據集上當前技術狀態1.3%,文章實現代碼開源共享。
本文是解決邊緣提取問題,應該是目前最好的方法了。
論文鏈接地址:https://arxiv.org/pdf/1902.10903v1.pdf。
背景
輪廓這個東西,尺度不同一的問題非常嚴重,比如說,一個人的邊緣,手部的輪廓好頭部的輪廓尺度就很不一樣,手彎彎曲曲很小,這樣的邊緣很難學習;但頭部或者身體,就很寬很大,對於網絡來說很好學習。那么如何解決多尺度問題就是邊緣提取的重點。作者就提出了一種雙向的(bi-directional)級聯網絡結構,每個層的輸出都被一個特定尺度的邊緣label監督,這個特定尺度是網絡自身學習到的。為了增強每個層輸出的特征,使用類似ASPP結構的SEM模塊產生多尺度特征。最后的輸出是許多多尺度特征的融合。
亮點
一般的多尺度特征,要么利用圖像金字塔,最后做融合多個特征,這樣的方式帶來了重復的運算;要么利用非常深的網絡提取不同stage的特征,這樣帶來了大量參數和推理時間。基於VGG的卷積部分,設計了輕量型的網絡結構做邊緣檢測,取得了很好的效果。
每個層對應一個特征的尺度,比如說,淺層因為感受野的關系,只能聚焦在局部圖案而高層就能注意到目標級別的信息,那么對最后的層以及中間的層使用相同的label做監督是否合理呢?當然不是了,作者希望每個層能學習自身能捕捉到的尺度,即淺層對手指的邊緣提取較好,深層對目標級的邊緣提取較好,最后對所有層的輸出做融合。
提出了一種類似ASPP的模塊,形式簡單。
使用很新穎的雙向loss監督方式,讓每個中間層學習自身合適的尺度。
方法
假設Y是邊緣的label,label中很小部分的邊緣,也有大部位的邊緣,意思是label中存在很大的尺度變化,那么我們將Y分解為不同尺度的疊加
是某一個特征的尺度的label。
很容易知道,人為的去分解label為s個尺度是不現實的,作者希望能用網絡自動學習特定層的特定尺度。規定一些符號:
是第S個卷積層的輸出特征圖,
是專門用
提取邊緣的。那么第s層的監督方式為:
其中
。如何能得到
呢?
一種可能的方案是,用Y減去其他層的輸出置信圖
。這樣就得到了
的label,用它來做第J層的監督label。
不過作者也證明了這樣對於自動讓中間層學習適合他們的尺度是沒有用的,因為根據鏈式法則,
對任何一個,
的導數都為1。那么對於任意的
都接受相同的梯度,意味着還是用相同的label去監督每一個層,這就犯了前面提到的,這不是更優的監督方式。
為了解決這個問題,作者設計了很新穎的方式。將
再分解為兩個互補的監督。其中一個忽略比s尺度更小監督,另一個忽略尺度比s大的監督。這里的監督其實是每個中間層預測的結果,之所以稱其為監督,因為是面向每個的輸出對D本身參數而言,
是D的監督。至於
的究竟更傾向於捕捉什么尺度,由后面的部分自行決定。
公式可能不夠直白。看下面的圖
這是網絡的部分結構,前三層是VGG的前三個階段,SEM模塊和1x1卷積的結合。每個ID block對應了一個VGG的stage和若干SEM,同時有多少SEM就有多少1x1的conv。
重點在最下面。先看block1,
是第一個stage的其中一個輸出,此時的預測圖分辨率和原圖一致,故無需上采樣。它這個會送到之后的所有階段,和其他stage經過上采樣的輸出相加去計算當前scale的loss。注意高stage是不沿着
這條線往更低的尺度送的。高尺度會沿着
線路往更低的尺度送,只是圖上沒有畫出來,和的情況是類似的。
那么對於VGG作為backbone來說,loss將會有10個,同時網絡最后結合所有的
,concat一起在用1x1的conv融合,得到的結果也去計算loss、一共有11個loss。
值得一提的是,對一個中間層的監督是混雜了其他層的信息的,當然希望對某一層的監督不要去影響其它層,所以源碼用了detach來斷開梯度向其他層傳播。
損失函數
這里還是簡單說一下,對11個loss,分為兩類。一類是side loss,就是前10個層的輸出計算的loss,最后的loss就是融合前10個輸出得到的預測圖,用它計算得到的loss,稱為fuse loss。
每個loss使用WBCE,帶調整正負樣本權重的loss。在兩類loss之間使用兩個超參數權衡兩類loss,side loss的權重為0.5,fuse loss的權重是1.1。
實驗
每個BLOCK確實捕捉到了他們自身適合的邊緣尺度。前幾層的局部信息很強,后幾層,輸出的是目標級別的邊緣。
使用detach來解決中間層s對其他層的影響。
最終的輸出是fuse作為最終預測,但訓練階段需要用所有中間層數據和fuse,一共11個預測結果。
最終預測還需要加sigmioid激活函數,然后乘上255。,化成uint8型就能顯示了。