FlyAI資訊:cnn結構設計技巧-兼顧速度精度與工程實現

摘要: 深度決定了網絡的表達能力,網絡越深學習能力越強。寬度(通道數)決定了網絡在某一層學到的信息量,另外因爲卷積層能重組通道間的信息,這一操作能讓有效信息量增大(這也是1x1卷積的作用,它能學習出重組信息,使 ...

人工智能學習離不開實踐的驗證,推薦大家可以多在FlyAI-AI競賽服務平臺多參加訓練和競賽,以此來提升自己的能力。FlyAI是爲AI開發者提供數據競賽並支持GPU離線訓練的一站式服務平臺。每週免費提供項目開源算法樣例,支持算法能力變現以及快速的迭代算法模型。

 

總綱

cnn中各個參數的辯證矛盾。

深度決定了網絡的表達能力,網絡越深學習能力越強。

寬度(通道數)決定了網絡在某一層學到的信息量,另外因爲卷積層能重組通道間的信息,這一操作能讓有效信息量增大(這也是1x1卷積的作用,它能學習出重組信息,使得對於任務更友好,所以這裏不能和分離卷積一起比較,傳統卷積的有效卷積數更多,正比於輸入通道乘以輸出通道,分離卷積的有效卷積正比於輸入通道數,傳統卷積相當於分離卷積前升維再做分離卷積)。

感受也決定了網絡在某一層看到多大範圍,一般說來最後一層一定至少要能看到較大的有意義的物體,更大的感受野通常是無害的。感受野必須緩慢增大,這樣才能建模不同距離下的空間相關性。

在達到相同感受野的情況下,多層小卷積核的性能一定比大卷積核更好,因爲多層小卷積核的非線性更強,而且更有利於特徵共享。

 

 

多層小卷積核參數量少,非線性強,有利於特徵共享

分辨率很重要,儘量不要損失分辨率,爲了保住分辨率,在使用下采樣之前要保證在這一層上有足夠的感受野,這個感受野是相對感受野,是指這一個下采樣層相對於上一個下采樣層的感受野,把兩個下采樣之間看成一個子網絡的話,這個子網絡必須得有一定的感受野才能將空間信息編碼到下面的網絡去,而具體需要多大的相對感受野,只能實驗,一般說來,靠近輸入層的層空間信息冗餘度較高,所以越靠近輸入層相對感受野應該越小。同時在靠近輸入層的層,這裏可以合成一個大卷積核來降低計算量,因爲在輸入端,每一層卷積的計算量都非常大。另外相對感受野也必須緩慢變換。

 

本圖來自於dilated residual network。相對感受野指兩個下采樣之間的感受野。相對感受野也必須緩慢變化。另外空洞卷積一般用在子網絡的最後面,因爲空洞卷積容易丟失空間細節,也考慮了感受野緩慢變化這點,空洞卷積的膨脹率必須緩慢增加

這種矛盾決定了下面的做法:

前面幾層下采樣頻率高一點,中間層下采樣頻率降低,並使用不下采樣的方法提高深度。

網絡能深則深,在保持比較小寬度的時候,要想辦法加深網絡,變深的過程中網絡慢慢變胖。

使用小卷積核(不包括1x1,因爲它對於增加感受野無意義),小卷積核有利於網絡走向更深,並且有更好的識別魯棒性,尤其是在分辨率更小的特徵圖上,因爲卷積核的尺寸是相當於特徵圖的分辨率來說的,大特徵圖上偏大的卷積核其實也並不大。

下采樣在網絡前幾層的密度大一些,(這樣能儘可能用微弱精度損失換取速度提升) 越往後下采樣的密度應該更小,最終能夠下采樣的較大深度,以該層的感受野以及數據集中較大的有意義物體尺寸決定(自然不可能讓較大有意義的物體在某一層被下采樣到分辨率小於1,但是網絡依然可以work,只不過最後幾層可能廢棄了(要相信cnn的學習能力,因爲較大不了它也能學出單位卷積,也就是隻有中心元素不爲0的卷積核),更準確的說這是較大感受野的極限,較大感受野應該覆蓋數據集中較大有意義的物體)。

第一層下采樣的時候大卷積核能儘可能保住分辨率(其實相當於合成了兩三層小卷積核,另外,這和插值是類似的,類比於最近鄰插值,雙線性插值,雙三次插值,這其實和感受野理論一致,更遠的插值意味着更大的感受野)。

越靠前分辨率降低越快,中間一定要加深

shortcut connection裏,找不到concat,用add湊合吧,在需要量化的場合,add會更好,反之亦然。

先訓一個大模型然後裁剪,也許比直接訓一個小模型性能好。

能用可分離卷積替代的卷積一定要替代,一般除了第一個卷積,都能替代,替代完後考慮給替代可分離的通道數乘以2,因爲可分離卷積的參數和計算量都是線性增長的,這樣做依然有速度增益。同樣的道理適用於2+1分離卷積。

計算量線性增長,可以控制通道數和depth multiplier,代價小

這裏稍微提醒一下分離卷積在大型gpu上性能不好原因是gpu利用率,因爲大型gpu核心數太多,如果計算量不夠大核心沒有用完,那麼不同卷積層比較不出差異,反而層數帶來的延遲會更嚴重,但是我個人表示相信分離卷積在未來一定會被合成一個層,這只是工程問題。

inception或者shortcut connection或者dense connection其實都相當於ensemble模型,考慮結合使用,shortcut connection的使用幾乎是無痛的。

 

各種inception結構,尤其是後面兩種,使用空間分離卷積,計算量小且性能好

使用通道注意力,比如squeeze and excitation attention

 

通道注意力能使通道信息對於任務更友好,尤其是分類任務,semodule能被在任何原網絡任何地方插入,計算量只有小幅上漲

事實上,senet是hrnet的一個特例,hrnet不僅有通道注意力,同時也有空間注意力

 

hrnet的基本單元

 

多尺度處理方法

圖像金字塔,這種屬於在輸入側處理,使用的越來越少了。

所有的跨層連接本質上都是在做多尺度處理,這裏面有resnet的shortcut,fpn,和unet的encoderdecoder,這些跨層連接都能融合尺度信息,也包括densenet的dense connect。

分割篇

分割同時需要大感受野和高分辨率,分割的感受野要和物體大小相當,當然稍微小一些影響不大,另外注意分割一定需要background,這對於全卷積landmark模型也是一樣,需要backgroud,這兩個任務比較相似,都是需要大感受野和高分辨率。

分割網絡最後面完全可以使用不採樣的空洞卷積來做,這樣可以同時保證感受野和分辨率,但是空洞卷積儘可能用在後面,因爲前面使用下采樣能夠減少很多計算量,到了最後面使用空洞卷積計算量不會增大很多,但是後面的分辨率更重要,如果使用下一次,分辨率會下降的非常厲害,比如圖像下采樣到一定地步基本就喪失分辨能力了。

 

對於分割,網絡深處不要下采樣了,使用空洞卷積同時達到大感受野和高分辨率,同時太多計算成本增加。這裏插一點,mobilenet系列可以考慮用空洞卷積來替代後面的卷積,對於分割會更加友好。

 

另一種分割架構,最後面不再下采樣了,會損失很多分辨率,使用aspp來融合不同尺度的感受野。事實上aspp的計算量還是偏大,因爲它通常出現在8x或者16x下采樣的地方,但是通常fcn最深處下采樣是32x,如果aspp在這裏將無法建模小物體

空洞卷積不能亂用,感受野緩慢增大是必須的,這樣才能建模各種距離的空間相關性。aspp模塊一般都用在網絡很後面,用來建模不同的scale。空洞卷積和下采樣都會損失圖像細節,都能增大感受野,這兩點是相同的,但是空洞卷積能保證分辨率,所以對於landmark可以更多的使用空洞卷積,語義分割相應地要少一些,因爲分割很重視細節。另外在兩個下采樣之間的子網絡裏也可以使用空洞卷積,這樣可以減少層數,尤其在子網絡越靠近後面的時候,另外landmark使用空洞卷積的頻率應該高一些。

fastfcn提出了模塊jpu,它可以試作分割裏的fpn,它的能大幅減少分割的計算量

 

 

jpu可以看作分割裏的fpn

轉置卷積完全可以使用上採樣+卷積來替代。

 

幾種不同的上採樣:(a)先用upsamling或者unpooling然後接兩個conv,並使用跳轉連接,(b)使用upsampling或者unpooling然後接普通的conv,(c)接轉置卷積(d)卷積後使用upsampling或者unpooling,完全可以使用一個稍小的卷積核。此圖來自fastdepth

 

這四種上採樣方法裏面,a的性能較好,但是計算量較大,b的計算量也很大,b和c本質上是等價的,但是b的計算量更大,這工程實現的原因,c和d的計算量相當,但是c很容易產生棋盤格現象,d如果使用小卷積覈計算量會更小。

 

a和b還有更加快速的版本,可見

 

更快版本的upconv和upproj,具體來說就是用四個小卷積核,分別是3x3,2x3,3x2和2x2來代替大卷積核,然後用interleaving來代替unpooling

interleaving的實現如下,可以參見tensorflow的depth_tospace或者pytorch的pixel_shuffle,這就是子像素卷積

interleaving也就是子像素卷積,它也是一種上採樣方法

對於分割模型而言,在encoder和decoder之間使用長跳轉連接,在encoder和decoder內部使用短跳轉連接,尤其是encoder比較深的情況下,通常說來,長跳轉連接的作用更多的是爲了恢復分辨率,短跳轉連接的作用更多是爲了防止梯度消失。

 

需要短跳轉連接,否則中間層無法被有效更新。長短連接都能防止梯度消失,短連接防止梯度消失效果更明顯。長連接能讓融合高層語義特徵和低層空間特徵,融合高分辨率,保持邊緣等細節。

low-level篇

感受野也不是越大越好(大感受野意味着更多的語義信息),對於某些low-level的任務而言,比如圖像降噪,感受野可能也就局部patch大小,對於low-level而言,下采樣的意義更小,儘可能少使用下采樣。

 

對於low-level而言,感受野不用太大,具體指去噪,去馬賽克,圖像增強,和關鍵點等任務

檢測篇

對於檢測,anchor層不一定要有三層,同一層按照需求可以設定的aspect ratio和size都是可選的,比如blazeface使用兩層anchor,這個要按照需求設計,事實上不同的層其實代表着不用的scale,三層就是三個scale,兩層就是兩個scale,一般說來scale分爲大中小三種,但是依具體情況而變,主要取決於數據集中的scale分佈(這點可能需要修改了,因爲根據的論文,可能不需要鋪更密的anchor,但是需要新的採樣算法)。

 

更密集的anchor設置對於密集檢測更有利

 

blazeface使用兩層anchor

bifpn真的有用,性能有提升且計算量小。

檢測中各種融合不同scale的方法,bifpn取得了性能和速度的較好平衡

batchnorm一定要用,如果你是多機多卡,也可以考慮同步的batchnorm。

如果你的一階段檢測模型得不到好的分類結果,考慮兩階段,先檢測再分類。

檢測模型裏的預訓練模型是有用的,至少能提升前景背景的檢測區分度。

anchor free暫不討論,以後再添加,因爲anchor based方法效果已經不錯了,並且工程上非常成熟。另外請記住,密集檢測沒法完全做到anchor free,因爲事實上檢測目標的可能的位置和寬度高度的分佈範圍太廣 ,所以必須要加上限制,而這個限制本質上就是anchor,另外anchor很容易推廣到3d檢測。

 

anchor free方法裏面需要預測bbox,也需要一定限制,這個限制本質上也是一個anchor

metric learning篇

metric learning(圖像比對)一般說來是batchsize更大會性能更好,因爲這樣能採樣到的正負樣本對的範圍更大。

 

實際使用中,負樣本的空間是非常大的,比正樣本大很多,所以需要比較大的採樣空間

分類篇

如果你的分類精度不夠是因爲有兩類或者多類太相近造成的,考慮使用其他softmax,比如amsoftmax。

 

各種魔改的softmax能更好的增大類間差距,能夠更好的分開softmax分不開的類別

如果你的分類精度不夠是樣本不均衡造成的,考慮使用focal loss。

不要只看精度,考慮其他metrics,並始終以上線後的可視化效果爲最終評判標準。

landmark篇

儘可能使用全卷積網絡來做landmark,不要直接用fc迴歸,迴歸真的不太穩定。另外,數學意義上的cnn是平移不變的,位置信息是通過padding泄露出來,所以fc直接回歸landmark相當於用padding去擬合位置信息,另外迴歸模型都有着全局感受野,這樣相當於沒有空間注意力(很難定位到關鍵信息,除了分類模型,不應該讓其它任務擁有全局感受野)。

全卷積迴歸landmark如有必要一定要考慮part affinity fields的做法。

 

全卷積計算landmark,中間兩幅圖是heatmap高斯分佈,以landmark爲中心,下面是part affinity map

part affinity fields是替代picturiol structure model較好的選擇,並且它也是全卷積的,它能極大的提高關節點檢測的魯棒性,它和熱度圖有類似支持,它也是一個map,但是一般是二維向量(我也在思考一維的可能性),所以一個連接(比如胳膊)相當於一個兩通道的featuremap,在連接處有值,這個值就是從一個landmark指向另一個landmark的單位向量。paf對於解決多物體landmark問題非常有用,對於遮擋非常魯棒。

 

兩個全卷積分支,上面預測heatmap,小面預測paf,最後過一個parsing把兩支結合起來,在更高效的架構中,這兩個分支可以用一個分支代替。

另外,landmark和midlevel中的關鍵點角點有類似支持,不需要特別大的感受野,只需要在感受野範圍中能明顯區別出該點,當然更穩健的做法是讓感受野和物體大小相當,類似於分割。

視頻理解篇

 

視頻理解的常用架構,分爲lstm,單流和雙流,其中雙流使用稠密光流作爲一支輸入

 

雙目篇(立體匹配)

這裏提醒作立體匹配前必須做畸變校正和極線校正

 

原始雙目圖像的極線都是傾斜的,立體匹配一定要糾正爲圖像基線平行的平行線

 

視差和深度的關係

 

視差估計一般分爲兩個階段,代價初始值計算構建cost volume(cost-volume也是3d的)和代價聚合,在最簡單的架構裏面,直接在feature-map使用L1或者L2構建cost volume(也叫做distance-based cost volume)

 

 

在feature map上使用距離度量作爲cost

 

多級預測,最深層次預測一個粗視差,然後不斷預測residual,disparity網絡的主體是3d卷積

視差估計網絡

 

3d卷積負責代價匹配的代價其實很大,因爲3d卷積的計算量其實比較大。

GANet借鑑sgm(semi-global matching)算法的思想,使用如下公式來進行代價聚合,

 

動態規劃進行代價聚合,這個公式可以看成可微分的sgm

 

GA-Net使用GA來進行代價聚合,代替3d卷積,計算量小了非常多

3D篇

lidar篇

lidar更爲特殊,因爲它的輸入是分佈不均勻的空間點集,也就是點雲,不像2d圖像或者3d視頻那樣,均勻分佈。

 

點雲存在的問題:

無序性:點雲本質上是一長串點(nx3矩陣,其中n是點數)。在幾何上,點的順序不影響它在空間中對整體形狀的表示,例如,相同的點雲可以由兩個完全不同的矩陣表示。

相同的點雲在空間中經過一定的剛性變化(旋轉或平移),座標發生變化,我們希望不論點雲在怎樣的座標系下呈現,網絡都能得到相同的結果。

也就是說我們希望點雲上的神經網絡同時具有點集置換不變性和剛性不變性

pointnet的做法,保證置換不變性,去擬合一個對稱函數,對稱函數有置換不變性,比如x1+x2,同理x1-x2沒有置換不變性

 

爲了保證置換不變性去擬合一個對稱函數

爲了保證剛性不變性,類似於spatial transformer network的做法,用一個旁支去擬合一個剛性變換,

擬合一個剛性變換,作用在原始點集上,注意升維之後,就不止3個分量了

所有的擬合都是通過mlp進行的,

 

所以本質上它不是一個卷積神經網絡,pointnet的通用架構如下

 

pointnet

pointnet不是卷積神經網絡,在19年的cvpr上,有這樣一篇論文,叫pointconv,它實現了點集上的卷積

注意到的是輸出的是一個定義在三維平面上的函數,xyz是它的定義域,原始點集是常函數

其中,W 和 F 均爲連續函數,(x,y,z)(x,y,z) 是 3D 參考點的座標,(δx,δy,δz)(δx,δy,δz) 表示鄰域 G 中的 3D 點的相對座標。上式可以離散化到一個離散的 3D 點雲上。同時,考慮到 3D 點雲可能來自於一個不均勻採樣函數,爲了補償不均勻採樣,使用逆密度對學到的權重進行加權。PointConv 可以由下式表示,

離散化後如下所示

其中,S 表示逆密度係數函數。連續函數 W 可以用多層感知器(MLP)近似。函數 W 的輸入是以 (x, y, z) 爲中心的 3D 鄰域內的 3D 點的相對座標,輸出是每個點對應的特徵 F 的權重。S 是一個關於密度的函數,輸入是每個點的密度,輸出是每個點對應的逆密度係數。這個非線性的函數同樣可以用一個多層感知機近似。

 

pointconv是真正的卷積操作,可以期待以後在其上可以做3d分類,分割,檢測,和2d卷積網絡使用方法幾乎一致。

多任務篇

很多任務本來就是多任務的,比如檢測相當於同時做bbox迴歸和分類,實例分割相當於同時做語義分割和目標檢測

數據增強篇

一定要做圖像亮度變換增強,亮度魯棒性會更好,但是要結合你的數據的亮度分佈自適應的調整。

最後,在不改動網絡backbone的基礎上,多嘗試一些新的loss,工程上的代價並不大。



更多關於人工智能的文章,敬請訪問:FlyAI-AI競賽服務平臺學習圈學習;同時FlyAI歡迎廣大算法工程師在平臺發文,獲得更多原創獎勵。此外,FlyAI競賽平臺提供大量數據型賽題供學習黨和競賽黨蔘與,免費GPU試用,更多大賽經驗分享。