(转)图森技术汇 | 聊聊Anchor的前世今生(上)
圖森技術(shù)匯 | 聊聊Anchor的"前世今生"(上)
圖森技術(shù)匯 | 聊聊Anchor的"前世今生"(下)
圖森的文章,很有深度;雖遂轉(zhuǎn)載。參考鏈接在上面
本文轉(zhuǎn)自圖森未來首席科學家王乃巖,感興趣的同學可以移步首席的知乎號交流@Naiyan Wang
正如大家所見,最近一段時間各種所謂anchor-free的detection算法得到了很多的關(guān)注,我其實是一個非常不愿意蹭熱點的人,技術(shù)上的東西更愿意“讓子彈飛一會”,再發(fā)表看法。所以今天在這里,我們先來談?wù)劯鞣N對于anchor based detection方法中anchor設(shè)置的改進。在正式開始介紹這些改進之前,先先來介紹一些我理解的anchor,以及它在detection系統(tǒng)中發(fā)揮的作用。
首先,我想說的第一個觀點是絕大多數(shù)top-down detector都是在做某種意義上的refinement和cascade。區(qū)別無外乎在于,refine的次數(shù)以及每次refine的方法。在傳統(tǒng)方法中從無論sliding window出發(fā),不斷去篩選正樣本;還是后續(xù)使用Selective search或者Edgebox直接生成proposal都是基于這樣的思路。后續(xù)基于Deep learning的方法也沒有走出這個套路,在one stage算法中,主流的方法便是在refine預(yù)先指定的anchor;在two stage算法中,試圖使用RPN來替代sliding window或者其他生成proposal的方法,再通過提取的region feature來refine這些proposal。
anchor這個概念最早出現(xiàn)在Faster RCNN的paper中,如果能理解前面提到的內(nèi)容,其實anchor就是在這個cascade過程中的起點。由于在Faster RCNN那個年代還沒有FPN這種顯式處理scale variation的辦法,anchor的一大作用便是顯式枚舉出不同的scale和aspect ratio。原因也很簡單,只使用一個scale的feature map和同一組weight,要去預(yù)測出所有scale和aspect ratio的目標,本身就是很困難的一件事。通過anchor的引入,將scale和aspect ratio進行劃分,針對某個特定的區(qū)間和組合,使用一組特定學習到的weight去處理,從而緩解這個問題。需要注意的是,anchor本身并不會參與到網(wǎng)絡(luò)的運算中去,影響的只會是classification和bbox regression分支的target(訓練階段)和怎樣decode box(測試階段)。換句話說,網(wǎng)絡(luò)其實預(yù)測的是相對于anchor的offset,只有在最終從offset轉(zhuǎn)換到bbox時,才會使用。這樣的想法也很自然被各種One stage方法所吸收,形成了anchor已經(jīng)是detection標配的stereotype。說了這么多為什么現(xiàn)在anchor free的方法又卷土重來了呢?這個問題我會在下一篇文章中講講我個人的看法,下面言歸正傳,我們來看看這些嘗試去學習和優(yōu)化anchor的方法都具體做了什么。
在這幾篇文章中,想法最為直接的是[1],想要解決的問題也最為簡單,就是在一個dataset上,我怎么選擇anchor shape。注意,在這個工作中區(qū)別于后續(xù)幾個工作,學習出來的anchor是在整個dataset上共享的。一般而言,對于anchor shape的設(shè)定,除了手工拍拍腦袋隨意設(shè)置幾個scale和aspect ratio之外,對于ground-truth bbox進行一次聚類也是一個常用的方法。在[1]中,作者就是希望減少這部分hand-crafted的工作(雖然還是使用了kmeans作為初始化…)。具體做法也是非常地直接和直觀,由于anchor shape在One stage方法中只影響bbox regression分支,我們可以在bbox regression的loss中,把anchor也作為一個優(yōu)化的變量,求導優(yōu)化。具體細節(jié)就不再贅述,有興趣的讀者可以參照原文。另外一些同時期的工作,在這個基礎(chǔ)上更進一步,希望能夠得到每張圖,甚至是對于feature map上每個位置上都有不同的adaptive anchor,也可以針對不同的dataset泛化性能更強。MetaAnchor[2]算是在這個方向是最早的一個嘗試。MetaAnchor希望從一些預(yù)設(shè)定的anchor出發(fā),有可能再結(jié)合上圖像本身的feature,生成一組新的anchor weight。如下圖所示:
注意,在這里其實生成的并不是refine過的anchor本身,而是直接用于classification和bbox regression分支的weight。這也就是為什么這個工作叫做MetaAnchor的原因,因為這個思想其實源自于meta learning。具體實現(xiàn)上,生成函數(shù)G的選取就直接選擇為兩層的MLP,分別有依賴于圖像自身的feature和不依賴于圖像自身的feature的兩種形式,即:
其中theta*為所有anchor共享的weight。b_i為anchor box自身的表示,作者在文中直接選擇了normalized過的長和寬這兩維作為anchor的feature。x很直接,即為這個feature map對應(yīng)位置上的feature。回到上面整體的觀點上看,MetaAnchor其實是implicit地多做了一次refinement,只不過不是explicit地生成了新的anchor,而是直接生成了對應(yīng)的weight。下一個要介紹的工作[3]雖然介紹的motivation看上去和anchor本身無關(guān),但實際的做法也算是某種refinement。在這里,我來講一講我自己的看法,而不再重復(fù)paper中講的故事,有興趣的讀者可以直接參閱作者本人的解讀:https://zhuanlan.zhihu.com/p/55416312。個人理解,這篇工作其實最想做的是在One stage的框架內(nèi),實現(xiàn)了一個兩級的Cascade refinement。但是由于不像two stage的方法,可以通過region features來直接align anchor和提取出的feature,作者在文中嘗試了下圖(b)?(d)三種實現(xiàn)方式,測試得到的最終結(jié)果類似,便使用了最直接的辦法:兩個stage共享同一個head,使用一樣的feature,直接去做兩次預(yù)測。如下圖。
其中和原始的RetinaNet的區(qū)別在于,在分類和回歸的兩支上,分別加入對第一次refine之后的新anchor設(shè)置新的training target:
在分類的分支上,可以認為同樣的一個預(yù)測(注意兩個term里都是c_i)有兩個監(jiān)督信號,一個是原始anchor對應(yīng)的label,一個是第一次refine過后的anchor對應(yīng)的label。在回歸分支上略有區(qū)別的是這兩次refinement對應(yīng)的regression weight不等,也就是兩個term中一個是t_i0,一個是t_i1。個人覺得最起碼回歸這個branch的方法更合理一些,在這個分類branch中兩個輸入都不變,在cascade不同層之間只是變化anchor,也就是訓練的target,這看上去是一個比較wired的方案。不過,作者在實驗中也證明了,哪怕只訓練refine之后的label,仍然可以得到可觀的性能提升。最后一個要介紹的工作Guided Anchor算是我個人覺得在這幾篇工作中完成度最高的一篇。同樣,作者本人也有自己介紹過這個工作:https://zhuanlan.zhihu.com/p/55854246
整個方法分為兩個大的部分,第一部分是Anchor generation,這個部分并沒有太多特別的地方,可以認為是一個特殊的RPN,分別預(yù)測這個位置是否存在物體,和以這個位置為中心的anchor的長和寬。和RPN的區(qū)別在于,沒有中心點的回歸,關(guān)于為什么這么做,作者自己在上面知乎專欄中已有回復(fù)。第二部分是Feature adaptation,個人覺得這是一個非常重要的模塊,試圖解決one stage中一個核心的問題:anchor和其對應(yīng)的feature怎樣align?這里作者的方案是Feature adaptation模塊。作者使用生成的anchor的shape來預(yù)測給Deformable Conv使用的offset,這樣可以使用deformable conv來aggregate anchor內(nèi)的feature,可以算是某種簡化版本的region feature。通過這個辦法,使得最終預(yù)測的feature map和實際的anchor scale相關(guān)。
另外這篇文章中,比較有意思的一點是探究了對于two stage的方法,怎樣使用更好的proposal?也就是說怎樣把proposal中更高的recall轉(zhuǎn)換成最終detection結(jié)果中的precision。這里作者給出了一些經(jīng)驗:1) 使用更少的proposal訓練。 2) 使用更高的正樣本IoU threshold。簡單來說,在recall更高的時候,我們應(yīng)該讓后續(xù)的任務(wù)變得更“簡單”和“專注”一些,這樣避免一些困難樣本對detection head的影響。雖然沒有特別深入探究這個現(xiàn)象的原因,但這個發(fā)現(xiàn)也是很有指導意義的。
總結(jié)一下,除了第一篇工作以外,我們都可以從一個統(tǒng)一的視角下來理解這個事情:1) 用盡量低的代價,在one stage detector或者是two stage生成proposal的過程中引入一次額外的refinement,anchor其實只是refine這件事情的一個載體。2) 在detection的head上,有兩個輸入,即輸入的feature和對應(yīng)的網(wǎng)絡(luò)weight,決定一個輸出,即前面提到的和anchor相關(guān)的分類和回歸目標,即變化了anchor其實變化的話head的輸出。后三篇文章中,都變化了輸出,但是對于輸入的處理不同:MetaAnchor中變化的是weight,GuidedAnchor中,通過feature adaptation變化了輸入的feature,Consistent optimization中全部固定。希望講了這么多,能夠幫助大家更好地理解這一系列的工作。下一篇當然是會來講講最近火爆的Anchor free方法啦,敬請期待!
[1] Zhong, Y., Wang, J., Peng, J., & Zhang, L. (2018). Anchor Box Optimization for Object Detection. arXiv preprint arXiv:1812.00469.
[2] Yang, T., Zhang, X., Li, Z., Zhang, W., & Sun, J. (2018). Metaanchor: Learning to detect objects with customized anchors. In NIPS2018.
[3] Kong, T., Sun, F., Liu, H., Jiang, Y., & Shi, J. (2019). Consistent Optimization for Single-Shot Object Detection. arXiv preprint arXiv:1901.06563.
[4] Wang, J., Chen, K., Yang, S., Loy, C. C., & Lin, D. (2019). Region proposal by guided anchoring. In CVPR2019.
總結(jié)
以上是生活随笔為你收集整理的(转)图森技术汇 | 聊聊Anchor的前世今生(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 麦咖啡MACfEE服务器安全防护设置技巧
- 下一篇: 华中计算机基础试题,华中科技大学2009