0
本文作者: AI科技評(píng)論 | 編輯:汪思穎 | 2019-02-28 11:33 |
雷鋒網(wǎng) AI 科技評(píng)論按,本文作者陳愷,該文首發(fā)于知乎,雷鋒網(wǎng) AI 科技評(píng)論獲其授權(quán)轉(zhuǎn)載。
前言
進(jìn)入圖片物體檢測(cè)這個(gè)坑也有一年出頭了,而且至少短期內(nèi)還將繼續(xù)待在坑里而且還拉了同伙入坑。值此新(ji)春(xu)佳(ban)節(jié)(zhuan)之際,打算介紹一些做過(guò)的工作,寫(xiě)一下對(duì)這個(gè)領(lǐng)域的理解,另外有空的話也會(huì)講講 mmdetection 的設(shè)計(jì)和一些實(shí)現(xiàn)。
作為開(kāi)篇,就講一下啟動(dòng)最早的一個(gè)項(xiàng)目,"Region Proposal by Guided Anchoring"。這篇 paper 的方法用在了 COCO Challenge 2018 檢測(cè)任務(wù)的冠軍方法中,在極高的 baseline 上漲了 1 個(gè)點(diǎn)。最近公開(kāi)在 ArXiv 上,歡迎大家提出意見(jiàn)。
概述
我們提出了一種新的 anchor 生成方法 —— Guided Anchoring,即通過(guò)圖像特征來(lái)指導(dǎo) anchor 的生成。通過(guò)預(yù)測(cè) anchor 的位置和形狀,來(lái)生成稀疏而且形狀任意的 anchor,并且設(shè)計(jì)了 Feature Adaption 模塊來(lái)修正特征圖使之與 anchor 形狀更加匹配。在使用 ResNet-50-FPN 作為 backbone 的情況下,Guided Anchoring 將 RPN 的 recall(AR@1000) 提高了 9.1 個(gè)點(diǎn),將其用于不同的物體檢測(cè)器上,可以提高 mAP 1.2 到 2.7 個(gè)點(diǎn)不等。
下圖是我們的方法和傳統(tǒng) RPN 的性能和速度對(duì)比,可以看到要顯著優(yōu)于傳統(tǒng) RPN。
下面是應(yīng)用在不同檢測(cè)方法上的結(jié)果,backbone 均為 ResNet-50-FPN。
背景
Anchor 是物體檢測(cè)中的一個(gè)重要概念,通常是人為設(shè)計(jì)的一組框,作為分類(lèi)(classification)和框回歸(bounding box regression)的基準(zhǔn)框。無(wú)論是單階段(single-stage)檢測(cè)器還是兩階段(two-stage)檢測(cè)器,都廣泛地使用了 anchor。例如,兩階段檢測(cè)器的第一階段通常采用 RPN 生成 proposal,是對(duì) anchor 進(jìn)行分類(lèi)和回歸的過(guò)程,即 anchor -> proposal -> detection bbox;大部分單階段檢測(cè)器是直接對(duì) anchor 進(jìn)行分類(lèi)和回歸,也就是 anchor -> detection bbox。
常見(jiàn)的生成 anchor 的方式是滑窗(sliding window),也就是首先定義 k 個(gè)特定尺度(scale)和長(zhǎng)寬比(aspect ratio)的 anchor,然后在全圖上以一定的步長(zhǎng)滑動(dòng)。這種方式在 Faster R-CNN,SSD,RetinaNet 等經(jīng)典檢測(cè)方法中被廣泛使用。
Motivation
通過(guò) sliding window 生成 anchor 的辦法簡(jiǎn)單可行,但也不是完美的,不然就不會(huì)有要講的這篇 paper 了。首先,anchor 的尺度和長(zhǎng)寬比需要預(yù)先定義,這是一個(gè)對(duì)性能影響比較大的超參,而且對(duì)于不同數(shù)據(jù)集和方法需要單獨(dú)調(diào)整。如果尺度和長(zhǎng)寬比設(shè)置不合適,可能會(huì)導(dǎo)致 recall 不夠高,或者 anchor 過(guò)多影響分類(lèi)性能和速度。一方面,大部分的 anchor 都分布在背景區(qū)域,對(duì) proposal 或者檢測(cè)不會(huì)有任何正面作用;另一方面,預(yù)先定義好的 anchor 形狀不一定能滿足極端大小或者長(zhǎng)寬比懸殊的物體。所以我們期待的是稀疏,形狀根據(jù)位置可變的 anchor。
Formulation
首先我們思考 anchor 是如何生成的。我們通常使用 4 個(gè)數(shù) (x, y, w, h) 來(lái)描述一個(gè) anchor,即中心點(diǎn)坐標(biāo)和寬高。我們將 anchor 的分布 formulate 成如下公式。
Anchor 的概率分布被分解為兩個(gè)條件概率分布,也就是給定圖像特征之后 anchor 中心點(diǎn)的概率分布,和給定圖像特征和中心點(diǎn)之后的形狀概率分布,這也是論文標(biāo)題中 Guided Anchoring 的由來(lái)。Sliding window 可以看成是是均勻分布而
是沖激函數(shù)的一個(gè)特例。
根據(jù)上面的公式,anchor 的生成過(guò)程可以分解為兩個(gè)步驟,anchor 位置預(yù)測(cè)和形狀預(yù)測(cè)。在這個(gè)看起來(lái)很簡(jiǎn)單的 formulation 上,我們走過(guò)一些彎路,討論過(guò)一些奇奇怪怪的方法,最后發(fā)現(xiàn)大道至簡(jiǎn)。
方法
如圖所示,在原始 RPN 的特征圖基礎(chǔ)上,我們采用兩個(gè)分支分別預(yù)測(cè) anchor 位置和形狀,然后結(jié)合在一起得到 anchor。之后采用一個(gè) Feature Adaption 模塊進(jìn)行 anchor 特征的調(diào)整,得到新的特征圖供之后的預(yù)測(cè)(anchor 的分類(lèi)和回歸)使用。整個(gè)方法可以 end-to-end training,而且相比之前只是增加了 3 個(gè) 1x1 conv 和一個(gè) 3x3 deformable conv,帶來(lái)的模型參數(shù)量的變化很小。
位置預(yù)測(cè)
位置預(yù)測(cè)分支的目標(biāo)是預(yù)測(cè)哪些區(qū)域應(yīng)該作為中心點(diǎn)來(lái)生成 anchor,是一個(gè)二分類(lèi)問(wèn)題。不同于 RPN 或者 segmentation 的分類(lèi),這里我們并不是預(yù)測(cè)每個(gè)點(diǎn)是前景還是背景,而是預(yù)測(cè)是不是物體的中心。
我們將整個(gè) feature map 的區(qū)域分為物體中心區(qū)域,外圍區(qū)域和忽略區(qū)域,大概思路就是將 ground truth 框的中心一小塊對(duì)應(yīng)在 feature map 上的區(qū)域標(biāo)為物體中心區(qū)域,在訓(xùn)練的時(shí)候作為正樣本,其余區(qū)域按照離中心的距離標(biāo)為忽略或者負(fù)樣本,具體設(shè)計(jì)在 paper 里講得比較清楚。通過(guò)位置預(yù)測(cè),我們可以篩選出一小部分區(qū)域作為 anchor 的候選中心點(diǎn)位置,使得 anchor 數(shù)量大大降低。在 inference 的時(shí)候,預(yù)測(cè)完位置之后,我們可以采用 masked conv 替代普通的 conv,只在有 anchor 的地方進(jìn)行計(jì)算,可以進(jìn)行加速。
形狀預(yù)測(cè)
形狀預(yù)測(cè)分支的目標(biāo)是給定 anchor 中心點(diǎn),預(yù)測(cè)最佳的長(zhǎng)和寬,這是一個(gè)回歸問(wèn)題。按照往常做法,當(dāng)然是先算出 target,也就是該中心點(diǎn)的 anchor 最優(yōu)的 w 和 h,然后用 L1/L2/Smooth L1 這類(lèi) loss 來(lái)監(jiān)督。然而這玩意的 target 并不好計(jì)算,而且實(shí)現(xiàn)起來(lái)也會(huì)比較困難,所以我們直接使用 IoU 作為監(jiān)督,來(lái)學(xué)習(xí) w 和 h。既然我們算不出來(lái)最優(yōu)的 w 和 h,而計(jì)算 IoU 又是可導(dǎo)的操作,那就讓網(wǎng)絡(luò)自己去優(yōu)化使得 IoU 最大吧。后來(lái)改用了 bounded IoU Loss,但原理是一樣的。
這里面還有個(gè)問(wèn)題,就是對(duì)于某個(gè) anchor,應(yīng)該優(yōu)化和哪個(gè) ground truth 的 IoU,也就是說(shuō)應(yīng)該把這個(gè) anchor 分配給哪個(gè) ground truth。對(duì)于以前常規(guī)的 anchor,我們可以直接計(jì)算它和所有 ground truth 的 IoU,然后將它分配給 IoU 最大的那個(gè) gt。但是很不幸現(xiàn)在的 anchor 的 w 和 h 是不確定的,是一個(gè)需要預(yù)測(cè)的變量。我們將這個(gè) anchor 和某個(gè) gt 的 IoU 表示為
當(dāng)然我們不可能真的把所有可能的 w 和 h 遍歷一遍然后求 IoU 的最大值,所以采用了近似的方法,也就是 sample 一些可能的 w 和 h。理論上 sample 得越多,近似效果越好,但出于效率的考慮,我們 sample 了常見(jiàn)的 9 組 w 和 h。我們通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),最終結(jié)果對(duì) sample 的組數(shù)這個(gè)超參并不敏感,也就是說(shuō)不管 sample 多少組,近似效果已經(jīng)足夠。
生成 anchor
在得到 anchor 位置和中心點(diǎn)的預(yù)測(cè)之后,我們便可以生成 anchor 了,如下圖所示。這時(shí)的 anchor 是稀疏而且每個(gè)位置不一樣的。采用生成的 anchor 取代 sliding window,AR (Average Recall) 已經(jīng)可以超過(guò)普通 RPN 4 個(gè)點(diǎn)了,代價(jià)僅僅是增加兩個(gè) 1x1 conv。
Feature Adaption
故事本可以就此結(jié)束,我們用生成的 anchor 和之前的特征圖來(lái)進(jìn)行 anchor 的分類(lèi)和回歸,漲點(diǎn)美滋滋。但是我們發(fā)現(xiàn)一個(gè)不合理的地方,大家都是同一層 conv 的特征,憑啥我就可以比別人優(yōu)秀一些,代表一個(gè)又長(zhǎng)又大的 anchor,你就只能代表一個(gè)小小的 anchor。
不合理的原因一方面在于,在同一層 conv 的不同位置,feature 的 receiptive field 是相同的,在原來(lái)的 RPN 里面,大家都表示相同形狀的 anchor,所以相安無(wú)事,但是現(xiàn)在每個(gè) anchor 都有自己獨(dú)特的形狀大小,和 feature 就不是特別好地 match。另一方面,對(duì)原本的特征圖來(lái)說(shuō),它并不知道形狀預(yù)測(cè)分支預(yù)測(cè)的 anchor 形狀,但是接下來(lái)的分類(lèi)和回歸卻是基于預(yù)測(cè)出的 anchor 來(lái)做的,可能會(huì)比較懵逼。
我們?cè)黾恿艘粋€(gè) Feature Adaption 模塊來(lái)解決這種問(wèn)題。思路很簡(jiǎn)單,就是把 anchor 的形狀信息直接融入到特征圖中,這樣新得到的特征圖就可以去適應(yīng)每個(gè)位置 anchor 的形狀。我們利用一個(gè) 3x3 的 deformable convolution 來(lái)修正原始的特征圖,而 deformable convolution 的 offset 是通過(guò) anchor 的 w 和 h 經(jīng)過(guò)一個(gè) 1x1 conv 得到的。(此處應(yīng)該劃重點(diǎn),如果是像正常的 deformable convolution 一樣,用特征圖來(lái)預(yù)測(cè) offset,則提升有限,因?yàn)闆](méi)有起到根據(jù) anchor 形狀來(lái) adapt 的效果)
通過(guò)這樣的操作,達(dá)到了讓 feature 的有效范圍和 anchor 形狀更加接近的目的,同一個(gè) conv 的不同位置也可以代表不同形狀大小的 anchor 了。從表格可以看到,F(xiàn)eature Adaption 還是很給力的,帶來(lái)了接近 5 個(gè)點(diǎn)的提升。
高質(zhì)量 proposal 的正確打開(kāi)方式
故事到這里其實(shí)也可以結(jié)束了,但是我們遇到了和之前一些改進(jìn) proposal 的 paper 里相同的問(wèn)題,那就是 proposal 質(zhì)量提升很多(如下圖),但是在 detector 上性能提升比較有限。在不同的檢測(cè)模型上,使用 Guided Anchoring 可以提升 1 個(gè)點(diǎn)左右。明明有很好的 proposal,但是 mAP 卻沒(méi)有漲很多,讓人十分難受。
經(jīng)過(guò)一番探究,我們發(fā)現(xiàn)了以下兩點(diǎn):1. 減少 proposal 數(shù)量,2. 增大訓(xùn)練時(shí)正樣本的 IoU 閾值(這個(gè)更重要)。既然在 top300 里面已經(jīng)有了很多高 IoU 的 proposal,那么何必用 1000 個(gè)框來(lái)訓(xùn)練和測(cè)試,既然 proposal 們都這么優(yōu)秀,那么讓 IoU 標(biāo)準(zhǔn)嚴(yán)格一些也未嘗不可。
這個(gè)正確的打開(kāi)方式基本是 Jiaqi 獨(dú)立調(diào)出來(lái)的,讓 performance 一下好看了很多。通過(guò)這兩個(gè)改進(jìn),在 Faster R-CNN 上的漲點(diǎn)瞬間提升到了 2.7 個(gè)點(diǎn)(沒(méi)有加任何 trick),其他方法上也有大幅提升。
談?wù)?anchor 設(shè)計(jì)準(zhǔn)則
我們?cè)?paper 里提到了 anchor 設(shè)計(jì)的兩個(gè)準(zhǔn)則,alignment(中心對(duì)齊) 和 consistency(特征一致)。其中 alignment 是指 anchor 的中心點(diǎn)要和 feature 的位置對(duì)齊,consistency 是指 anchor 的特征要和形狀匹配。
Alignment
由于每個(gè) anchor 都是由 feature map 上的一個(gè)點(diǎn)表示,那么這個(gè) anchor 最好是以這個(gè)點(diǎn)為中心,否則位置偏了的話,這個(gè)點(diǎn)的 feature 和這個(gè) anchor 就不是非常好地對(duì)應(yīng)起來(lái),用該 feature 來(lái)預(yù)測(cè) anchor 的分類(lèi)和回歸會(huì)有問(wèn)題。我們?cè)O(shè)計(jì)了類(lèi)似 cascade/iterative RPN 的實(shí)驗(yàn)來(lái)證明這一點(diǎn),對(duì) anchor 進(jìn)行兩次回歸,第一次回歸采用常規(guī)做法,即中心點(diǎn)和長(zhǎng)寬都進(jìn)行回歸,這樣第一次回歸之后,anchor 中心點(diǎn)和 feature map 每一個(gè)像素的中心就不再完全對(duì)齊。我們發(fā)現(xiàn)這樣的兩次 regress 提升十分有限。所以我們?cè)谛螤铑A(yù)測(cè)分支只對(duì) w 和 h 做預(yù)測(cè),而不回歸中心點(diǎn)位置。
Consistency
這條準(zhǔn)則是我們?cè)O(shè)計(jì) feature adaption 的初衷,由于每個(gè)位置 anchor 形狀不同而破壞了特征的一致性,我們需要通過(guò) feature adaption 來(lái)進(jìn)行修正。這條準(zhǔn)則本質(zhì)上是對(duì)于如何準(zhǔn)確提取 anchor 特征的討論。對(duì)于兩階段檢測(cè)器的第二階段,我們可以通過(guò) RoI Pooling 或者 RoI Align 來(lái)精確地提取 RoI 的特征。但是對(duì)于 RPN 或者單階段檢測(cè)器的 anchor 來(lái)說(shuō),由于數(shù)量巨大,我們不可能通過(guò)這種 heavy 的方法來(lái)實(shí)現(xiàn)特征和框的精確 match,還是只能用特征圖上一個(gè)點(diǎn),也就是 512x1x1 的向量來(lái)表示。那么 Feature Adaption 起到了一個(gè)讓特征和 anchor 對(duì)應(yīng)更加精確的作用,這種設(shè)計(jì)在其他地方也有可以借鑒之處。
總結(jié)
在 anchor 設(shè)計(jì)中,alignment 和 consistency 這兩個(gè)準(zhǔn)則十分重要。
采用兩個(gè) branch 分別預(yù)測(cè) anchor 的位置和形狀,不需要預(yù)先定義。
利用 anchor 形狀來(lái) adapt 特征圖。
高質(zhì)量 proposal 可以使用更少的數(shù)量和更高的 IoU 進(jìn)行訓(xùn)練。
即插即用,無(wú)縫替換。
關(guān)于 code
預(yù)計(jì)在三月底或者四月的某個(gè)時(shí)候 release 在 mmdetection (https://github.com/open-mmlab/mmdetection) 里,歡迎 watch。
Arxiv 鏈接
https://arxiv.org/abs/1901.03278
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。