深度学习(三十七)——CenterNet, Anchor-Free, NN Quantization
CenterNet
CenterNet是中科院、牛津、Huawei Noah’s Ark Lab的一個聯(lián)合團隊的作品。(2019.4)
論文:
《CenterNet: Keypoint Triplets for Object Detection》
上圖是CenterNet的網(wǎng)絡結(jié)構(gòu)圖。
正如之前提到的,框?qū)τ谖矬w來說不是一個最好的表示。同理,Corner也不是什么特別好的表示:絕大多數(shù)情況下,Corner同樣是遠離物體的。
也正是由于Corner和物體的關(guān)聯(lián)度不大,CornerNet才發(fā)明了corner pooling操作,用以提取Corner。
但是即使這樣,由于沒有anchor的限制,使得任意兩個角點都可以組成一個目標框,這就對判斷兩個角點是否屬于同一物體的算法要求很高,一但準確度差一點,就會產(chǎn)生很多錯誤目標框。
有鑒于此,CenterNet除了Corner之外,還添加了Center的預測分支,也就是上圖中的center pooling+center heatmap。這主要基于以下假設:如果目標框是準確的,那么在其中心區(qū)域能夠檢測到目標中心點的概率就會很高,反之亦然。
因此,首先利用左上和右下兩個角點生成初始目標框,對每個預測框定義一個中心區(qū)域,然后判斷每個目標框的中心區(qū)域是否含有中心點,若有則保留該目標框,若無則刪除該目標框。
為了和CornerNet做比較,CenterNet同樣使用了Hourglass Network作為骨干網(wǎng)絡。并針對中心點和角點的提取,提出了Center pooling和Cascade corner pooling操作。這里不再贅述。
參考:
https://mp.weixin.qq.com/s/wWqdjsJ6U86lML0rSohz4A
CenterNet:將目標視為點
https://zhuanlan.zhihu.com/p/62789701
中科院牛津華為諾亞提出CenterNet,one-stage detector可達47AP,已開源!
https://mp.weixin.qq.com/s/CEcN5Aljvs7AyOLPRFjUaw
真Anchor Free目標檢測----CenterNet詳解
Anchor-Free
在前面的章節(jié),我們已經(jīng)簡要的分析了Anchor Free和Anchor Base模型的差異,并介紹了兩個Anchor-Free的模型——CornerNet和CenterNet。
這里對其他比較重要的Anchor-Free模型做一個簡單介紹。
ExtremeNet
ExtremeNet是UT Austin的Xingyi Zhou的作品。(2019.1)
論文:
《Bottom-up Object Detection by Grouping Extreme and Center Points》
代碼:
https://github.com/xingyizhou/ExtremeNet
上圖是ExtremeNet的網(wǎng)絡結(jié)構(gòu)圖。它預測是關(guān)鍵點就不光是角點和中心點了,事實上它預測了9個點。具體的方法和CenterNet類似,也是heatmap抽取關(guān)鍵點。
顯然,這類關(guān)鍵點算法是受到人臉/姿態(tài)關(guān)鍵點算法的啟發(fā),因此它們采用Hourglass Network作為骨干網(wǎng)絡也就順理成章了,后者正是比較經(jīng)典的關(guān)鍵點算法模型之一。
FoveaBox
論文:
《FoveaBox: Beyond Anchor-based Object Detector》
上兩圖是FoveaBox的網(wǎng)絡結(jié)構(gòu)圖。
它的主要思路是:直接學習目標存在的概率和目標框的坐標位置,其中包括預測類別相關(guān)的語義圖和生成類別無關(guān)的候選目標框。
事實上這和YOLOv1的思路是一致的。但FoveaBox比YOLOv1精度高,主要在于FPN提供了多尺度的信息,而YOLOv1只有單尺度的信息。
此外,Focal loss也是Anchor-Free模型的常用手段。
總結(jié)
Anchor-Free模型主要是為了解決Two-stage模型運算速度較慢的問題而提出的,因此它們絕大多數(shù)都是One-stage模型。從目前的效果來看,某些Anchor-Free模型其精度已經(jīng)接近Two-stage模型,但運算速度相比YOLOv3等傳統(tǒng)One-stage模型,仍有較大差距,尚無太大的實用優(yōu)勢(可以使用,但優(yōu)勢不大)。
其他比較知名的Anchor-Free模型還有:
- FCOS
《FCOS: Fully Convolutional One-Stage Object Detection》
- FSAF
《Feature Selective Anchor-Free Module》
- DenseBox
《DenseBox: Unifying Landmark Localization and Object Detection》
參考
https://zhuanlan.zhihu.com/p/63024247
錨框:Anchor box綜述
https://mp.weixin.qq.com/s/dYV446meJXtCQVFrLzWV8A
目標檢測中Anchor的認識及理解
https://mp.weixin.qq.com/s/WAx3Zazx9Pq7Lb3vKa510w
目標檢測最新方向:推翻固有設置,不再一成不變Anchor
https://zhuanlan.zhihu.com/p/64563186
Anchor free深度學習的目標檢測方法
https://mp.weixin.qq.com/s/DoN-vha1H-2lHhbFOaVS8w
FoveaBox:目標檢測新紀元,無Anchor時代來臨!
https://zhuanlan.zhihu.com/p/62198865
最新的Anchor-Free目標檢測模型FCOS,現(xiàn)已開源!
https://mp.weixin.qq.com/s/N93TrVnUuvAgfcoHXevTHw
FCOS: 最新的one-stage逐像素目標檢測算法
https://mp.weixin.qq.com/s/04h80ubIxjJbT9BxQy5FSw
目標檢測:Anchor-Free時代
https://zhuanlan.zhihu.com/p/66156431
從Densebox到Dubox:更快、性能更優(yōu)、更易部署的anchor-free目標檢測
https://zhuanlan.zhihu.com/p/63273342
聊聊Anchor的"前世今生"(上)
https://zhuanlan.zhihu.com/p/68291859
聊聊Anchor的"前世今生"(下)
https://zhuanlan.zhihu.com/p/62372897
物體檢測的輪回:anchor-based與anchor-free
https://mp.weixin.qq.com/s/m_PvEbq2QbTXNmj_gObKmQ
Anchor-free目標檢測之ExtremeNet
NN Quantization
概述
NN的量化計算是近來NN計算優(yōu)化的方向之一。相比于傳統(tǒng)的浮點計算,整數(shù)計算無疑速度更快,而NN由于自身特性,對單點計算的精確度要求不高,且損失的精度還可以通過retrain的方式恢復大部分,因此通常的科學計算的硬件(沒錯就是指的GPU)并不太適合NN運算,尤其是NN Inference。
傳統(tǒng)的GPU并不適合NN運算,因此Nvidia也好,還是其他GPU廠商也好,通常都在GPU中又集成了NN加速的硬件,因此雖然商品名還是叫做GPU,但是工作原理已經(jīng)有別于傳統(tǒng)的GPU了。
這方面的文章以Xilinx的白皮書較為經(jīng)典:
https://china.xilinx.com/support/documentation/white_papers/c_wp486-deep-learning-int8.pdf
利用Xilinx器件的INT8優(yōu)化開展深度學習
Distiller
https://nervanasystems.github.io/distiller/index.html
Intel AI Lab推出的Distiller是一個關(guān)于模型壓縮、量化的工具包。這里是它的文檔,總結(jié)了業(yè)界主要使用的各種方法。
參考:
https://mp.weixin.qq.com/s/A5ka8evElmcuHdowof7kww
Intel發(fā)布神經(jīng)網(wǎng)絡壓縮庫Distiller:快速利用前沿算法壓縮PyTorch模型
Conservative vs. Aggressive
Quantization主要分為兩大類:
1.“Conservative” Quantization。這里主要指不低于INT8精度的量化。
實踐表明,由于NN訓練時采用的凸優(yōu)化算法,其最終結(jié)果一般僅是局部最優(yōu)。因此,即便是兩次訓練(數(shù)據(jù)集、模型完全相同,樣本訓練順序、參數(shù)初始值隨機)之間的差異,通常也遠大于FP64的精度。所以,一般而言,FP32對于模型訓練已經(jīng)完全夠用了。
FP16相對于FP32,通常會有不到1%的精度損失。即使是不re-train的INT8,通常也只有3%~15%的精度損失。因此這類量化被歸為"Conservative" Quantization。其特點是完全采用FP32的參數(shù)進行量化,或者在此基礎上進行re-train。
1.“Aggressive” Quantization。這里指的是INT4或更低精度的量化。
這種量化由于過于激進,re-train也沒啥大用,因此必須從頭訓練。而且由于INT4表達能力有限,模型結(jié)構(gòu)也要進行一定的修改,比如增加每一層的filter的數(shù)量。
INT量化
論文:
《On the efficient representation and execution of deep acoustic models》
一個浮點數(shù)包括底數(shù)和指數(shù)兩部分。將兩者分開,就得到了一般的INT量化。
量化的過程一般如下:
1.使用一批樣本進行推斷,記錄下每個layer的數(shù)值范圍。
2.根據(jù)該范圍進行量化。
量化的方法又分為兩種:
1)直接使用浮點數(shù)表示中的指數(shù)。也就是所謂的fractional length,相當于2的整數(shù)冪。
2)使用更一般的scale來表示。這種方式的精度較高,但運算量稍大。
量化誤差過大,一般可用以下方法減小:
1.按照每個channel的數(shù)值范圍,分別量化。
2.分析weight、bias,找到異常值,并消除之。這些異常值通常是由于死去的神經(jīng)元所導致的誤差無法更新造成的。
如何確定每個layer的數(shù)值范圍,實際上也有多種方法:
1.取整批樣本在該layer的數(shù)值范圍的并集,也就是所有最大(小)值的極值。
2.取所有最大(小)值的平均值。
UINT量化
論文:
《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》
UINT量化使用bias將數(shù)據(jù)搬移到均值為0的區(qū)間。
這篇論文的另一個貢獻在于:原先的INT8量化是針對已經(jīng)訓練好的模型。而現(xiàn)在還可以在訓練的時候就進行量化——前向計算進行量化,而反向的誤差修正不做量化。
bfloat16
bfloat16是Google針對AI領(lǐng)域的特殊情況提出的浮點格式。目前已有Intel的AI processors和Google的TPU,提供對該格式的原生支持。
上圖比較了bfloat16和IEEE fp32/fp16的差異。可以看出bfloat16有如下特點:
1.bfloat16可以直接截取float32的前16位得到,所以在float32和bfloat16之間進行轉(zhuǎn)換時非常容易。
2.bfloat16的Dynamic Range比float16大,不容易下溢。這點在training階段更為重要,梯度一般都挺小的,一旦下溢變成0,就傳遞不了了。
3.bfloat16既可以用于訓練又可以用于推斷。Amazon也證明Deep Speech模型使用BFloat的訓練和推斷的效果都足夠好。Uint8在大部分情況下不能用于訓練,只能用于推斷。
論文:
《Mixed Precision Training》
參考:
https://www.zhihu.com/question/275682777
如何評價Google在TensorFlow中引入的bfloat16數(shù)據(jù)類型?
https://zhuanlan.zhihu.com/p/56114254
PAI自動混合精度訓練—TensorCore硬件加速單元在阿里PAI平臺落地應用實踐
Saturate Quantization
上述各種量化方法都是在保證數(shù)值表示范圍的情況下,盡可能提高fl或者scale。這種方法也叫做Non-saturation Quantization。
NVIDIA在如下文章中提出了一種新方法:
http://on-demand.gputechconf.com/gtc/2017/presentation/s7310-8-bit-inference-with-tensorrt.pdf
8-bit Inference with TensorRT
Saturate Quantization的做法是:將超出上限或下限的值,設置為上限值或下限值。
如何設置合理的Saturate threshold呢?
可以設置一組門限,然后計算每個門限的分布和原分布的相似度,即KL散度。然后選擇最相似分布的門限即可。
量化技巧
1.設計模型時,需要對輸入進行歸一化,縮小輸入值的值域范圍,以減小量化帶來的精度損失。
2.tensor中各分量的值域范圍最好相近。這個的原理和第1條一致。比如YOLO的結(jié)果中,同時包含分類和bbox,而且分類的值域范圍遠大于bbox,導致量化效果不佳。
3.最好不要使用ReluN這樣的激活函數(shù),死的神經(jīng)元太多。神經(jīng)元一旦“死亡”,相應的權(quán)值就不再更新,而這些值往往不在正常范圍內(nèi)。
4.對于sigmoid、tanh這樣的S形函數(shù),其輸入在∣x∣>σ\mid x \mid > \sigma∣x∣>σ范圍的值,最終的結(jié)果都在sigmoid、tanh的上下限附近。因此,可以直接將這些x值量化為σ\sigmaσ。這里的σ\sigmaσ的取值,對于sigmoid來說是6,而對于tanh來說是3。
NN硬件的指標術(shù)語
MACC:multiply-accumulate,乘法累加。
FLOPS:Floating-point Operations Per Second,每秒所執(zhí)行的浮點運算次數(shù)。
顯然NN的INT8計算主要以MACC為單位。
gemmlowp
gemmlowp是Google提出的一個支持低精度數(shù)據(jù)的GEMM(General Matrix Multiply)庫。
代碼:
https://github.com/google/gemmlowp
論文
《Quantizing deep convolutional networks for efficient inference: A whitepaper》
總結(jié)
以上是生活随笔為你收集整理的深度学习(三十七)——CenterNet, Anchor-Free, NN Quantization的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习(三十六)——R-FCN, FP
- 下一篇: 深度学习(三十八)——深度强化学习(1)