【深度學(xué)習(xí)】CornerNet: 將目標(biāo)檢測問題視作關(guān)鍵點(diǎn)檢測與配對
前言:
CornerNet于2019年3月份提出,CW近期回顧了下這個在當(dāng)時引起不少關(guān)注的目標(biāo)檢測模型,它的亮點(diǎn)在于提出了一套新的方法論——將目標(biāo)檢測轉(zhuǎn)化為對物體成對關(guān)鍵點(diǎn)(角點(diǎn))的檢測。通過將目標(biāo)物體視作成對的關(guān)鍵點(diǎn),其不需要在圖像上鋪設(shè)先驗(yàn)錨框(anchor),可謂實(shí)實(shí)在在的anchor-free,這也減少了整體框架中人工設(shè)計(handcraft)的成分。

為了讓自己的梳理工作更好地反饋到自身以實(shí)現(xiàn)內(nèi)化,CW決定在此記錄下自己對CornerNet的理解,同時也和大家進(jìn)行分享,如果有幸能夠幫助到你們,那我就更是happy了!
本文內(nèi)容有些長,但是如果你打算認(rèn)真回顧和思考有關(guān)CornerNet技術(shù)原理的細(xì)節(jié),不妨耐心地看下去。CW也將本文的目錄列出來了,大家也可根據(jù)自身需求節(jié)選部分內(nèi)容來看。(見文末)
研究動機(jī)及背景
作者發(fā)現(xiàn),目標(biāo)檢測中anchor-based方法存在以下問題:
1.為了給gt提供正樣本,需要密集鋪設(shè)多尺度的anchors,但這同時會造成正負(fù)樣本不均衡;
2.anchor的存在就勢必引入眾多handcraft成分,如anchor數(shù)量、尺度、長寬比等,模型的訓(xùn)練效果極大地受到這些因素的影響,另外還會影響模型推斷速度;
概述
● 通過預(yù)測得到的熱圖(heatmaps)來判別各位置是否屬于角點(diǎn);
● 基于預(yù)測的角點(diǎn)嵌入向量(embeddings)來對角點(diǎn)進(jìn)行配對(屬于同一物體的一對角點(diǎn)的embeddings之間的距離會比較小,屬于不同物體的則比較大),從而判斷哪些左上角點(diǎn)和右下角點(diǎn)是屬于同一物體的;
● 使用預(yù)測的偏移量(offsets)對角點(diǎn)位置進(jìn)行調(diào)整;
整體框架

最后,將池化特征分別輸入到3個不同的卷積模塊來預(yù)測heatmaps、embeddings以及offsets。
角點(diǎn)檢測
檢測包括分類+定位,這里主要是分類,即判斷特征圖上的各個(特征點(diǎn))位置是否屬于角點(diǎn),不需要顯式回歸角點(diǎn)的位置,角點(diǎn)的位置基本由特征點(diǎn)的位置決定,然后通過預(yù)測的offsets進(jìn)行調(diào)整。
● Heatmaps
分類基于兩組heatmaps,分別用于左上角和右下角的判斷。每組heatmap的shape是
,是物體類別數(shù)(不含背景),
是特征圖的尺寸。這樣,每個通道就對應(yīng)特定類別物體的角點(diǎn)判斷。理想狀態(tài)下,它是一個二值mask,值為1就代表該位置屬于角點(diǎn),而通常模型預(yù)測出來每個位置上的值是0~1,代表該位置屬于角點(diǎn)的置信度。
● Penalty Reduction
由此可知,對于每個角點(diǎn),只有1個正樣本位置。那么訓(xùn)練時,1個gt在heatmap上的標(biāo)簽就只有在其對應(yīng)的位置上值為1,其余均為0。不知你有沒feel到,這樣的話,很容易由于正樣本過少而導(dǎo)致低召回率。在實(shí)際情況中,即使我們選擇一對與gt角點(diǎn)有一定程度偏離的角點(diǎn)來形成預(yù)測框,那么它也有可能與gt box有較高的重疊度(IoU),這樣的預(yù)測框作為檢測結(jié)果也是不錯的選擇(如下圖,紅框是gt bboxes,綠框是距離gt角點(diǎn)較近的角點(diǎn)對形成的bboxes)。

于是,對于那些距離gt角點(diǎn)位置較近的負(fù)樣本位置,我們可以“在心里暗暗地將它們也作為候選的正樣本”,轉(zhuǎn)化到數(shù)學(xué)形式上,就是在計算loss時減低對它們的懲罰度,懲罰度與它們距離gt角點(diǎn)的遠(yuǎn)近相關(guān)(gt角點(diǎn) to 負(fù)樣本:你離我越近,我對你越溫柔~)。

以上x,y代表負(fù)樣本位置與gt角點(diǎn)位置的橫、縱坐標(biāo)之差,i,j是特征點(diǎn)的位置,
起到控制懲罰度嚴(yán)厲程度(變化快慢)的作用,值越大,懲罰越輕(可聯(lián)想到高斯曲線越扁平)。你看看,這就是CornerNet對這批“候選正樣本”的愛~
代表模型預(yù)測的heatmap中位置
屬于類別 C 物體角點(diǎn)的置信度,
。由上式可知,紅色框部分就可以達(dá)到降低距離gt角點(diǎn)較近的那些負(fù)樣本懲罰度的效果。而對于那些遠(yuǎn)離gt角點(diǎn)的負(fù)樣本,它們對應(yīng)的標(biāo)簽值依然是0,因此不受影響。
CornerNet告訴我們,許多事情不是非正即負(fù)、非0即1,世界本就是混沌。做人也一樣,不能太死板,對待他人要理解與包容,適當(dāng)?shù)膶捜菽軌蛟谏钪蝎@取小確幸(說不定還有大確幸呢)。
● Radius Computation
以上只談到對于距離gt角點(diǎn)在半徑為的圓內(nèi)的那些負(fù)樣本“給予適當(dāng)?shù)膶捜荨?,但并未說明半徑如何計算,不急,因?yàn)橐夥匠淌剑梢韵群缺Х?,休息下?/span>


移項(xiàng),整理得二元一次方程式:

還記得根的判別式因子嗎?其各項(xiàng)依次為:

易知判別式
(因?yàn)?/span>
所以),于是有解:

但是,我們需要的半徑應(yīng)該是正根,于是最終:



移項(xiàng)整理得:

此時,根的判別式因子:

判別式:

都是正根。為了兼容其它情況,我們需要取小的根,即 


移項(xiàng)整理得:

根的判別式因子:

易證判別式
(請讓CW偷下懶..),最終取較小的根:

以上3種情況都是根據(jù)求根公式計算出對應(yīng)的半徑值
,在實(shí)現(xiàn)時,將
代入計算。為了兼容各種情況,最終r的取值需要是三個解中的最小值:

為了緩解這一現(xiàn)象,在訓(xùn)練時,計算gt角點(diǎn)位置映射到特征圖位置時的量化誤差,將其作為offsets的訓(xùn)練標(biāo)簽:

訓(xùn)練模型讓其學(xué)會預(yù)測這個誤差值,以便在最終檢測時重新調(diào)整預(yù)測的角點(diǎn)位置。使用smooth-l1 loss對這部分進(jìn)行學(xué)習(xí):
訓(xùn)練完畢后,在測試時,就可以這樣調(diào)整預(yù)測的角點(diǎn)位置(實(shí)際實(shí)現(xiàn)時并非這樣,這里僅僅打個簡單的比方):
假設(shè)在heatmap上位置
被預(yù)測為角點(diǎn),其對應(yīng)預(yù)測的offsets為
,那么其映射到原圖上的位置就是:
![]()
角點(diǎn)配對
在特征圖的每個位置上,模型還會預(yù)測角點(diǎn)對應(yīng)的嵌入向量(embeddings),用于將左上角點(diǎn)和右下角點(diǎn)進(jìn)行配對。能否匹配成一對主要是由embeddings之間的距離來決定的(當(dāng)然,其實(shí)還有其它條件,如預(yù)測的角點(diǎn)必須屬于相同類別、右下角點(diǎn)的坐標(biāo)必須大于左上角點(diǎn)的坐標(biāo))。理想狀態(tài)下,同一物體的一對角點(diǎn)對應(yīng)的embeddings之間的距離較小,而不同物體的則較大。那么,如何實(shí)現(xiàn)這一目標(biāo)呢?
在訓(xùn)練時,CornerNet使用'pull loss'來拉近屬于同一物體的角點(diǎn)的embeddings,同時使用'push loss'來遠(yuǎn)離屬于不同物體的角點(diǎn)的embeddings:

其中
分別為目標(biāo)物體 K 的左上角和右下角對應(yīng)的embeddings,則是兩者的均值,delta=1,代表不同物體的角點(diǎn)對應(yīng)的embeddings之間的margin下限(to
:我們不熟,別靠太近,保持1米以外的文明距離)。 N 是目標(biāo)物體的數(shù)量,也就是說,僅對gt角點(diǎn)位置對應(yīng)的預(yù)測embeddings計算這些損失。
Corner Pooling
由于實(shí)際生活中許多物體并沒有角狀,比如圓形的餐盤、條形的繩子等,因此并沒有直觀明顯的視覺特征來表征角點(diǎn)。這也就是說,通過現(xiàn)有的視覺濾波器(卷積層、池化層等)去捕捉圖像的局部特征來檢測角點(diǎn),效果并不會太好。比如以下這些情況,物體的左上角和右下角點(diǎn)處并不存在物體本身的部分,即這些角點(diǎn)的位置本身并不存在物體的特征。

基于這種思想,作者提出了Corner Pooling,分別對用于收集左上角點(diǎn)特征和右下角點(diǎn)特征。對于左上角點(diǎn),其處理如下:

其中
分別表示池化層的輸入特征圖,它們的目標(biāo)是分別將豎直方向和水平方向的特征不斷匯集到上方和左方。這樣,在
中的左上角點(diǎn)就分別擁有了豎直方向和水平方向的極大值特征,分別代表
中位置
的特征值。
最終,將
進(jìn)行element-wise add得到輸出特征圖,于是,在其中的左上角點(diǎn)處就擁有了豎直加水平方向的極大值特征。

對于右下角點(diǎn)的處理也是同樣道理,經(jīng)Corner Pooling處理后,會在輸出特征圖的右下角點(diǎn)處匯聚到豎直和水平方向的極大值特征。
訓(xùn)練
網(wǎng)絡(luò)模型在基于Pytorch的默認(rèn)方式下進(jìn)行隨機(jī)初始化,并且沒有在額外的數(shù)據(jù)集上預(yù)訓(xùn)練。
訓(xùn)練損失最終的形式為:

其中![]()
作者在訓(xùn)練時還添加了中間監(jiān)督。前文提到過,backbone是兩個相同結(jié)構(gòu)的Hourglass Networks串聯(lián)而成,中間監(jiān)督的意思就是對第一個Hourglass Network的輸出預(yù)測也實(shí)行監(jiān)督。具體來說,就是將第一個Hourglass Network的輸出特征圖也輸入到后面的預(yù)測模塊:先經(jīng)過corner pooling池化,然后分別輸入到不同的卷積模塊分別預(yù)測heatmaps、embeddings和offsets,對這部分的預(yù)測結(jié)果也計算損失進(jìn)行訓(xùn)練。
那么可能有帥哥/靚女會疑問:那第二個Hourglass Network的輸入是什么呢?
測試

● 測試圖像處理
測試時對圖像的處理方式還蠻有“個性”,作者在paper中一筆帶過:
Instead of resizing an image to a fixed size, we maintain the original resolution of the image and pad it with zeros before feeding it to CornerNet.
意思是,不改變圖像分辨率,但使用0填充。但是,具體怎么做的,填充多少部分卻沒有詳細(xì)說明(能不能坦誠相對..)。CW對這實(shí)在不能忍,看了源碼后,發(fā)現(xiàn)是這樣做的:

代碼中 ' | 127 ' 這種方式會將new height和new width的低7位全部置1,猜測作者這樣做的意思應(yīng)該是想使得輸入圖像的尺寸至少為128x128吧(聯(lián)想到CornerNet訓(xùn)練時輸入分辨率是511x511,輸出特征圖分辨率正好是128x128)。
最后,將原圖裁剪下來放置在填充的全0圖像中,保持中心對齊,同時會記錄原圖在這個填充圖像中的區(qū)域邊界:
,以便后續(xù)將檢測結(jié)果還原到原圖坐標(biāo)空間。也就是說,在網(wǎng)絡(luò)輸入圖像中,區(qū)域邊界以外的部分都是0。
另外,對于每張圖片,還會將其水平鏡像圖片也一并輸入到網(wǎng)絡(luò)中(組成一個batch)進(jìn)行測試,最終的檢測結(jié)果是綜合原圖和鏡像圖片的結(jié)果。
OK,再來說說后處理過程,看是如何得到最終檢測結(jié)果的。
1. 首先,對heatmaps使用kernel大小為3×3的最大池化層(pad=1),輸出分辨率維持不變。將池化后的heatmaps與原h(huán)eatmaps作比較,于是可以知道,值改變了的位置就是非極大值位置,將這些位置的值(即置信度)置0,那么這些位置在后續(xù)就不可能作為可能的角點(diǎn)位置了,這樣起到了抑制非極大值的作用(paper中稱為NMS,但其實(shí)和目標(biāo)檢測常用的NMS有所區(qū)別,這里特別說明下);
2. 然后,從heatmaps中根據(jù)置信度選擇top100個左上角和右下角位置(在所有分類下進(jìn)行,不區(qū)分類別),并且根據(jù)對應(yīng)位置預(yù)測的offsets來調(diào)整角點(diǎn)位置;
3. 接著,計算左上角和右下角(每個左上角都和其余99個右下角)位置對應(yīng)預(yù)測的embeddings之間的距離,距離大于0.5的、屬于不同類別的、坐標(biāo)關(guān)系不滿足(右下角坐標(biāo)需大于左上角)的角點(diǎn)對就不能匹配成一對;
4. 緊接著,角點(diǎn)已經(jīng)完成配對,再次根據(jù)每對角點(diǎn)的平均置信度(得分)選出top100對,同時它們的平均得分作為各目標(biāo)的檢測分?jǐn)?shù);
實(shí)驗(yàn)分析
CornerNet同時輸出熱圖、嵌入和偏移,所有這些結(jié)果都會影響檢測性能。比如:熱圖中漏檢了任何一個角點(diǎn)就會丟失一個目標(biāo)、不正確的嵌入將導(dǎo)致許多錯誤的邊界框、預(yù)測的偏移不正確則嚴(yán)重影響邊界框的定位。
為了理解每個部件對最終的誤差有多大程度的影響,作者通過將預(yù)測的熱圖和偏移替換為gt,并在驗(yàn)證集上評估性能,以此來進(jìn)行誤差分析:
● 對負(fù)樣本位置的懲罰度降低

思考
最后,CW談?wù)勚档盟伎嫉膸讉€點(diǎn):
參考鏈接:
https://arxiv.org/abs/1808.01244
作者簡介
CW,畢業(yè)于中山大學(xué)(SYSU)數(shù)據(jù)科學(xué)與計算機(jī)學(xué)院,就職于騰訊技術(shù)工程與事業(yè)群(TEG)從事Devops工作,曾在AI LAB實(shí)習(xí),實(shí)操過道路交通元素與醫(yī)療病例圖像分割、視頻實(shí)時人臉檢測與表情識別、OCR等項(xiàng)目。
往期精彩回顧
本站qq群851320808,加入微信群請掃碼:
