0 簡(jiǎn)介
本文拋棄網(wǎng)絡(luò)具體結(jié)構(gòu),僅僅從正負(fù)樣本區(qū)分和正負(fù)樣本平衡策略進(jìn)行分析,大體可以分為正負(fù)樣本定義、正負(fù)樣本采樣和平衡loss設(shè)計(jì)三個(gè)方面,主要是網(wǎng)絡(luò)預(yù)測(cè)輸出和loss核心設(shè)計(jì)即僅僅涉及網(wǎng)絡(luò)的head部分。所有涉及到的代碼均以mmdetection為主。本文第一部分,主要包括faster rcnn、libra rcnn、retinanet、ssd和yolo一共5篇文章。第二部分包括anchor-free的平衡策略,以及最新改進(jìn)算法。第三部分重點(diǎn)分析下anchor-free和anchor-base混合學(xué)習(xí)的Guided Anchoring以及yolo-ASFF,包括思路和代碼。
由于本人水平有限,如果有分析不對(duì)的地方,歡迎指正和交流!
1 anchor-base
1.1 two-stage
1.1.1 faster rcnn
論文名稱:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
(1) head結(jié)構(gòu)
faster rcnn包括兩個(gè)head:rpn head和rcnn head。其結(jié)構(gòu)如下:
rpn head的輸出是包括分類和回歸,分類是二分類,只區(qū)分前景和背景;回歸是僅僅對(duì)于前景樣本(正樣本)進(jìn)行基于anchor的變換回歸。rpn head的目的是提取roi,然后輸入到rcnn head部分進(jìn)行refine。rcnn head的輸出是包括分類和回歸,分類輸出是類別數(shù)+1(1是考慮背景),回歸是僅僅對(duì)于前景樣本不考慮分類類別進(jìn)行基于roi的變換回歸,rcnn head的目的是對(duì)rpn提取的roi特征進(jìn)行refine,輸出精準(zhǔn)bbox。
(2) 正負(fù)樣本定義
rpn和rcnn的正負(fù)樣本定義都是基于MaxIoUAssigner,只不過(guò)定義閾值不一樣而已。rpn的assigner:
rcnn的assigner:
下面對(duì)MaxIoUAssigner進(jìn)行詳細(xì)分析。首先分析原理,然后分析細(xì)節(jié)。正負(fù)樣本定義非常關(guān)鍵。MaxIoUAssigner的操作包括4個(gè)步驟:
首先初始化時(shí)候假設(shè)每個(gè)anchor的mask都是-1,表示都是忽略anchor
將每個(gè)anchor和所有g(shù)t的iou的最大Iou小于neg_iou_thr的anchor的mask設(shè)置為0,表示是負(fù)樣本(背景樣本)
對(duì)于每個(gè)anchor,計(jì)算其和所有g(shù)t的iou,選取最大的iou對(duì)應(yīng)的gt位置,如果其最大iou大于等于pos_iou_thr,則設(shè)置該anchor的mask設(shè)置為1,表示該anchor負(fù)責(zé)預(yù)測(cè)該gt bbox,是高質(zhì)量anchor
3的設(shè)置可能會(huì)出現(xiàn)某些gt沒(méi)有分配到對(duì)應(yīng)的anchor(由于iou低于pos_iou_thr),故下一步對(duì)于每個(gè)gt還需要找出和最大iou的anchor位置,如果其iou大于min_pos_iou,將該anchor的mask設(shè)置為1,表示該anchor負(fù)責(zé)預(yù)測(cè)對(duì)應(yīng)的gt。通過(guò)本步驟,可以最大程度保證每個(gè)gt都有anchor負(fù)責(zé)預(yù)測(cè),如果還是小于min_pos_iou,那就沒(méi)辦法了,只能當(dāng)做忽略樣本了。從這一步可以看出,3和4有部分anchor重復(fù)分配了,即當(dāng)某個(gè)gt和anchor的最大iou大于等于pos_iou_thr,那肯定大于min_pos_iou,此時(shí)3和4步驟分配的同一個(gè)anchor。
從上面4步分析,可以發(fā)現(xiàn)每個(gè)gt可能和多個(gè)anchor進(jìn)行匹配,每個(gè)anchor不可能存在和多個(gè)gt匹配的場(chǎng)景。在第4步中,每個(gè)gt最多只會(huì)和某一個(gè)anchor匹配,但是實(shí)際操作時(shí)候?yàn)榱硕嘣黾右恍┱龢颖?,通過(guò)參數(shù)gt_max_assign_all可以實(shí)現(xiàn)某個(gè)gt和多個(gè)anchor匹配場(chǎng)景。通常第4步引入的都是低質(zhì)量anchor,網(wǎng)絡(luò)訓(xùn)練有時(shí)候還會(huì)帶來(lái)噪聲,可能還會(huì)起反作用。
簡(jiǎn)單總結(jié)來(lái)說(shuō)就是:如果anchor和gt的iou低于neg_iou_thr的,那就是負(fù)樣本,其應(yīng)該包括大量數(shù)目;如果某個(gè)anchor和其中一個(gè)gt的最大iou大于pos_iou_thr,那么該anchor就負(fù)責(zé)對(duì)應(yīng)的gt;如果某個(gè)gt和所有anchor的iou中最大的iou會(huì)小于pos_iou_thr,但是大于min_pos_iou,則依然將該anchor負(fù)責(zé)對(duì)應(yīng)的gt;其余的anchor全部當(dāng)做忽略區(qū)域,不計(jì)算梯度。該最大分配策略,可以盡最大程度的保證每個(gè)gt都有合適的高質(zhì)量anchor進(jìn)行負(fù)責(zé)預(yù)測(cè),
下面結(jié)合代碼進(jìn)行分析:主要就是assign_wrt_overlaps函數(shù),核心操作和注釋如下:
通過(guò)代碼可以發(fā)現(xiàn),當(dāng)設(shè)置self.gt_max_assign_all=True時(shí)候是可能出現(xiàn)第4步的某個(gè)gt和多個(gè)anchor匹配場(chǎng)景,默認(rèn)參數(shù)就是True。
由于rcnn head預(yù)測(cè)值是rpn head的refine,故rcnn head面對(duì)的anchor(其實(shí)就是rpn輸出的roi)和gt的iou會(huì)高于rpn head部分,anchor質(zhì)量更高,故min_pos_iou閾值設(shè)置的比較高,由于pos_iou_thr和neg_iou_thr設(shè)置都是0.5,那么忽略區(qū)域那就是沒(méi)有了,因?yàn)閞cnn head面對(duì)的都是高質(zhì)量樣本,不應(yīng)該還存在忽略區(qū)域。
(3) 正負(fù)樣本采樣
步驟2可以區(qū)分正負(fù)和忽略樣本,但是依然存在大量的正負(fù)樣本不平衡問(wèn)題,解決辦法可以通過(guò)正負(fù)樣本采樣或者loss上面一定程度解決,faster rcnn默認(rèn)是需要進(jìn)行正負(fù)樣本采樣的。rpn head和rcnn head的采樣器都比較簡(jiǎn)單,就是隨機(jī)采樣,閾值不一樣而已。rpn head采樣器:
rcnn head采樣器:
num表示采樣后樣本總數(shù),包括正負(fù)和忽略樣本,pos_fraction表示其中的正樣本比例。add_gt_as_proposals是為了放在正樣本太少而加入的,可以保證前期收斂更快、更穩(wěn)定,屬于技巧。neg_pos_ub表示正負(fù)樣本比例,用于確定負(fù)樣本采樣個(gè)數(shù)上界,例如我打算采樣1000個(gè)樣本,正樣本打算采樣500個(gè),但是可能實(shí)際正樣本才200個(gè),那么正樣本實(shí)際上只能采樣200個(gè),如果設(shè)置neg_pos_ub=-1,那么就會(huì)對(duì)負(fù)樣本采樣800個(gè),用于湊足1000個(gè),但是如果設(shè)置為neg_pos_ub比例,例如1.5,那么負(fù)樣本最多采樣200x1.5=300個(gè),最終返回的樣本實(shí)際上不夠1000個(gè)。默認(rèn)情況neg_pos_ub=-1。由于rcnn head的輸入是rpn head的輸出,在網(wǎng)絡(luò)訓(xùn)練前期,rpn無(wú)法輸出大量高質(zhì)量樣本,故為了平衡和穩(wěn)定rcnn訓(xùn)練過(guò)程,通常會(huì)對(duì)rcnn head部分添加gt作為proposal。其代碼非常簡(jiǎn)單:
對(duì)正負(fù)樣本單獨(dú)進(jìn)行隨機(jī)采樣就行,如果不夠就全部保留。
由于原始faster rcnn采用的loss是ce和SmoothL1Loss,不存在loss層面解決正負(fù)樣本不平衡問(wèn)題,故不需要分析loss。
1.1.2 libra rcnn
論文名稱:Libra R-CNN: Towards Balanced Learning for Object Detection
libra主要是分析訓(xùn)練過(guò)程中的不平衡問(wèn)題,提出了對(duì)應(yīng)的解決方案。由于libra rcnn的head部分和正負(fù)樣本定義沒(méi)有修改,故不再分析,僅僅分析正負(fù)樣本采樣和平衡loss設(shè)計(jì)部分。
(1) 正負(fù)樣本采樣
注意libra rcnn的正負(fù)樣本采樣規(guī)則修改僅僅是對(duì)于rcnn而言,對(duì)于rpn head沒(méi)有任何修改,依然是隨機(jī)采樣器。原因是作者的主要目的是為了漲點(diǎn)mAP,作者認(rèn)為rpn漲幾個(gè)點(diǎn)對(duì)最終bbox 預(yù)測(cè)map沒(méi)有多大幫助,因?yàn)橹饕强縭cnn部分進(jìn)行回歸預(yù)測(cè)才能得到比較好的mAP。其參數(shù)如下:
主要看IoUBalancedNegSampler部分即可。僅僅作用于負(fù)樣本(iou=0~0.5之間)。作者認(rèn)為樣本級(jí)別的隨機(jī)采樣會(huì)帶來(lái)樣本不平衡,由于負(fù)樣本本身iou的不平衡,當(dāng)采用隨機(jī)采樣后,會(huì)出現(xiàn)難負(fù)(iou 0.5附近)和易負(fù)(iou接近0)樣本不平衡采樣,導(dǎo)致后面性能不好。作者發(fā)現(xiàn)了如果是隨機(jī)采樣的話,隨機(jī)采樣到的樣本超過(guò)70%都是在IoU在0到0.05之間的,都是易學(xué)習(xí)負(fù)樣本,作者覺(jué)得是不科學(xué)的,而實(shí)際統(tǒng)計(jì)得到的事實(shí)是60%的hard negative都落在IoU大于0.05的地方,但是隨機(jī)采樣只提供了30%,實(shí)在是太少了。最常用的解決難易樣本不平衡問(wèn)題的解決辦法就是ohem,基于Loss排序來(lái)采樣難負(fù)樣本,但是作者分析,(1) 這種方法對(duì)噪音數(shù)據(jù)會(huì)比較敏感,因?yàn)殄e(cuò)誤樣本loss高;(2) 參數(shù)比較難調(diào)。所以作者提出了IoU-balanced Sampling,如下所示:
可以看出,隨機(jī)采樣效果最不好,而iou balanced sampling操作會(huì)盡量保證各個(gè)iou區(qū)間內(nèi)都會(huì)采樣到。由于該操作比較簡(jiǎn)單,就不貼論文公式了。核心操作是對(duì)負(fù)樣本按照iou劃分k個(gè)區(qū)間,每個(gè)區(qū)間再進(jìn)行隨機(jī)采樣,保證易學(xué)習(xí)負(fù)樣本和難負(fù)樣本比例盡量平衡,實(shí)驗(yàn)表明對(duì)K不敏感,作者設(shè)置的是3。具體做法是對(duì)所有負(fù)樣本計(jì)算和gt的iou,并且劃分K個(gè)區(qū)間后,在每個(gè)區(qū)間內(nèi)均勻采樣就可以了。假設(shè)分成三個(gè)區(qū)間,我想總共取9個(gè),第一個(gè)區(qū)間有20個(gè)候選框,第二個(gè)區(qū)間有10個(gè),第三個(gè)區(qū)間有5個(gè),那這三個(gè)區(qū)間的采樣概率就是9/(3x20),9/(3x10),9/(3x5),這樣的概率就能在三個(gè)區(qū)間分別都取3個(gè),因?yàn)閰^(qū)間內(nèi)候選框多,它被選中的概率小,最終體現(xiàn)各個(gè)區(qū)間都選這么多框。
實(shí)際代碼做法是:首先按照iou分成k個(gè)區(qū)間,先嘗試在不同區(qū)間進(jìn)行隨機(jī)采樣采相同多數(shù)目的樣本,如果不夠就全部采樣;進(jìn)行一輪后,如果樣本數(shù)不夠,再剩下的樣本中均勻隨機(jī)采樣。例如假設(shè)總共有1000個(gè)候選負(fù)樣本(區(qū)間1:800個(gè),區(qū)間2:120個(gè),區(qū)間3:80個(gè)),分為3個(gè)區(qū)間,總共想取333個(gè),那么理論上每個(gè)區(qū)間是111個(gè),首先第一次在不同區(qū)間均勻采樣,此時(shí)區(qū)間1可以采樣得到111個(gè),區(qū)間2也可以得到111個(gè),區(qū)間3不夠,所以全部保留;然后不夠的樣本數(shù),在剩下的(800-111)+(120-111)+0個(gè)里面隨機(jī)取31個(gè),最終補(bǔ)齊333個(gè)。核心代碼如下:
意思是在各個(gè)區(qū)間內(nèi),如果夠數(shù)目就隨機(jī)采樣,如果不夠那就剩下的負(fù)樣本里面全部采樣。
(2) 平衡回歸loss
原始的faster rcnn的rcnn head,使用的回歸loss是smooth l1,作者認(rèn)為這個(gè)依然存在不平衡。作者分析是:loss解決Classification和Localization的問(wèn)題,屬于多任務(wù)loss,那么就存在一個(gè)平衡權(quán)重,一般來(lái)說(shuō)回歸權(quán)重會(huì)大一些,但一味的提高regression的loss其實(shí)會(huì)讓outlier的影響變大(類似于OHEM中的noise label),outlier外點(diǎn)樣本這里作者認(rèn)為是樣本損失大于等于1.0,這些樣本會(huì)產(chǎn)生巨大的梯度不利于訓(xùn)練過(guò)程,小于的叫做inliers。平衡回歸loss的目的是既不希望放大外點(diǎn)對(duì)梯度的影響,又要突出內(nèi)點(diǎn)中難負(fù)樣本的梯度,從而實(shí)現(xiàn)對(duì)外點(diǎn)容忍,對(duì)內(nèi)點(diǎn)區(qū)分難負(fù)樣本的作用。為此作者在smooth l1的基礎(chǔ)上進(jìn)行重新設(shè)計(jì),得到Balanced L1 Loss。核心操作就是想要得到一個(gè)當(dāng)樣本在附近產(chǎn)生稍微大點(diǎn)的梯度的函數(shù)。首先smooth l1的定義如下:
其梯度如下:
為了突出難樣本梯度,需要重新設(shè)計(jì)梯度函數(shù),作者想到了如下函數(shù):
梯度公式可以實(shí)現(xiàn)上述任務(wù)。然后反向計(jì)算就可以得到Loss函數(shù)了。為了保證連續(xù),還需要增加(9)的限制。
左邊是梯度曲線,右邊是loss曲線,可以看出非常巧妙。
1.2 one-stage
1.2.1 focal loss
論文名稱:Feature Pyramid Networks for Object Detection
該論文也叫做retinanet,是目前非常主流的FPN目標(biāo)檢測(cè)one-stage網(wǎng)絡(luò)結(jié)構(gòu),本文主要是提出了一個(gè)focal loss來(lái)對(duì)難易樣本進(jìn)行平衡,屬于平衡loss范疇。
(1) 網(wǎng)絡(luò)結(jié)構(gòu)
由于該網(wǎng)絡(luò)結(jié)構(gòu)非常流行,故這里僅僅簡(jiǎn)要說(shuō)明下,不做具體分析。
圖(d)即為retinanet的網(wǎng)絡(luò)結(jié)構(gòu)。主要特點(diǎn)是:(1) 多尺度預(yù)測(cè)輸出;(2) 采用FPN結(jié)構(gòu)進(jìn)行多層特征圖融合。網(wǎng)絡(luò)進(jìn)行多尺度預(yù)測(cè),尺度一共是5個(gè),每個(gè)尺度共享同一個(gè)head結(jié)構(gòu),但是分類和回歸分支是不共享權(quán)重的。
為了方便和faster rcnn進(jìn)行對(duì)比,下面再次貼出rpn結(jié)構(gòu),并解釋參數(shù)含義。
1. 共同部分
anchor_strides表示對(duì)應(yīng)的特征圖下采樣次數(shù),由于retinanet是從stage1開(kāi)始進(jìn)行多尺度預(yù)測(cè),故其stride比rpn大一倍;anchor_ratios表示anchor比例,一般是1:1,1:2和2:1三種;
2. 不同部分
rpn中的anchor_scales表示每個(gè)特征尺度上anchor的base尺度,例如這里是8,表示設(shè)定的anchor大小是8_[4,8,16,32,64],可以看出每個(gè)預(yù)測(cè)層是1個(gè)size * 3個(gè)比例,也就是每個(gè)預(yù)測(cè)層是3個(gè)anchor;而retianet是不同的,scales_pre_octave=3表示每個(gè)尺度上有3個(gè)scale size,分別是__,而octave_base_scale=4,意思其實(shí)和rpn的anchor_scales意思一樣,但是這里換個(gè)名字是因?yàn)閞etinanet的scale值是固定的,就一個(gè)值,而rpn可能是多個(gè)值;通過(guò)上面的設(shè)置,retinanet的每個(gè)預(yù)測(cè)層都有scale_pre_octivate_len(anchor_ratios)個(gè)anchor,這里是9個(gè),是非常多的,anchor的大小是octave_base_scale * [8,16,32,64,128]??梢悦黠@發(fā)現(xiàn)retinanet正負(fù)樣本不平衡問(wèn)題比f(wàn)aster rcnn更加嚴(yán)重。
(2) 正負(fù)樣本定義
retinanet是one-stage算法,其采用的正負(fù)樣本定義操作是MaxIoUAssigner,閾值定義和rpn不一樣,更加嚴(yán)格。如下所示:
min_pos_iou=0,可以保證每個(gè)GT一定有對(duì)應(yīng)的anchor負(fù)責(zé)預(yù)測(cè)。0.4以下是負(fù)樣本,0.5以上且是最大Iou的anchor是正樣本0.4~0.5之間的anchor是忽略樣本。其不需要正負(fù)樣本采樣器,因?yàn)槠涫峭ㄟ^(guò)平衡分類loss來(lái)解決的。
(3) 平衡分類loss
FocalLoss是本文重點(diǎn),是用于處理分類分支中大量正負(fù)樣本不平衡問(wèn)題,或者說(shuō)大量難易樣本不平衡問(wèn)題。作者首先也深入分析了OHEM的不足:它通過(guò)對(duì)loss排序,選出loss最大的example來(lái)進(jìn)行訓(xùn)練,這樣就能保證訓(xùn)練的區(qū)域都是hard example,這個(gè)方法的缺陷,是把所有的easy example(包括easy positive和easy negitive)都去除掉了,造成easy positive example無(wú)法進(jìn)一步提升訓(xùn)練的精度(表現(xiàn)的可能現(xiàn)象是預(yù)測(cè)出來(lái)了,但是bbox不是特別準(zhǔn)確),而且復(fù)雜度高影響檢測(cè)效率。故作者提出一個(gè)簡(jiǎn)單且高效的方法:Focal Loss焦點(diǎn)損失函數(shù),用于替代OHEM,功能是一樣的,需要強(qiáng)調(diào)的是:FL本質(zhì)上解決的是將大量易學(xué)習(xí)樣本的loss權(quán)重降低,但是不丟棄樣本,突出難學(xué)習(xí)樣本的loss權(quán)重,但是因?yàn)榇蟛糠忠讓W(xué)習(xí)樣本都是負(fù)樣本,所以順便解決了正負(fù)樣本不平衡問(wèn)題。其是根據(jù)交叉熵改進(jìn)而來(lái),本質(zhì)是dynamically scaled cross entropy loss,直接按照l(shuí)oss decay掉那些easy example的權(quán)重,這樣使訓(xùn)練更加bias到更有意義的樣本中去,說(shuō)通俗點(diǎn)就是一個(gè)解決分類問(wèn)題中類別不平衡、分類難度差異的一個(gè) loss。
上面的公式表示label必須是one-hot形式。只看圖示就很好理解了,對(duì)于任何一個(gè)類別的樣本,本質(zhì)上是希望學(xué)習(xí)的概率為1,當(dāng)預(yù)測(cè)輸出接近1時(shí)候,該樣本loss權(quán)重是很低的,當(dāng)預(yù)測(cè)的結(jié)果越接近0,該樣本loss權(quán)重就越高。而且相比于原始的CE,這種差距會(huì)進(jìn)一步拉開(kāi)。由于大量樣本都是屬于well-classified examples,故這部分樣本的loss全部都需要往下拉。其簡(jiǎn)單思想版本如下:
1.2.2 yolov2 or yolov3
論文名稱:YOLOv3: An Incremental Improvement
yolov2和yolov3差不多,主要是網(wǎng)絡(luò)有差異,不是我們分析的重點(diǎn),下面以yolov3為例。
(1) head結(jié)構(gòu)
yolov3也是多尺度輸出,每個(gè)尺度有3個(gè)anchor。對(duì)于任何一個(gè)分支都是輸出[anchor數(shù)×(x,y,w,h,confidence,class類別數(shù))h',w']。需要注意的是,其和faster rcnn或者ssd不一樣,其類別預(yù)測(cè)是不考慮背景的,所以才多引入了一個(gè)confidence的概念,該分支用于區(qū)分前景和背景。,所以最復(fù)雜的設(shè)計(jì)就在condidence上面了。
(2) 正負(fù)樣本定義
yolo系列的正負(fù)樣本定義比較簡(jiǎn)單,原則和MaxIoUAssigner(固定anchor和gt值計(jì)算)非常類似,但是更加簡(jiǎn)單粗暴:保證每個(gè)gt bbox一定有一個(gè)唯一的anchor進(jìn)行對(duì)應(yīng),匹配規(guī)則就是IOU最大,而沒(méi)有考慮其他亂七八糟的。具體就是:對(duì)于某個(gè)ground truth,首先要確定其中心點(diǎn)要落在哪個(gè)cell上,然后計(jì)算這個(gè)cell的每個(gè)anchor與ground truth的IOU值,計(jì)算IOU值時(shí)不考慮坐標(biāo),只考慮形狀(因?yàn)閍nchor沒(méi)有坐標(biāo)xy信息),所以先將anchor與ground truth的中心點(diǎn)都移動(dòng)到同一位置(原點(diǎn)),然后計(jì)算出對(duì)應(yīng)的IOU值,IOU值最大的那個(gè)先驗(yàn)框anchor與ground truth匹配,對(duì)應(yīng)的預(yù)測(cè)框用來(lái)預(yù)測(cè)這個(gè)ground truth。這個(gè)匹配規(guī)則和ssd和faster rcnn相比,簡(jiǎn)單很多,其沒(méi)有啥閾值的概念。對(duì)于分類分支和bbox回歸分支,采用上述MaxIoU分配原則,可以保證每個(gè)gt bbox一定有唯一的anchor進(jìn)行負(fù)責(zé)預(yù)測(cè),而不考慮閾值,即使某些anchor與gt的匹配度不高也負(fù)責(zé),而faster rcnn里面的MaxIoUAssigner是可能由于anchor設(shè)置不合理導(dǎo)致某個(gè)gt沒(méi)有anchor進(jìn)行對(duì)應(yīng),而變成忽略區(qū)域的??梢钥闯鲞@種分配制度會(huì)導(dǎo)致正樣本比較少。對(duì)于confidence分支,其在上述MaxIoU分配原則下,還需要從負(fù)樣本中劃分出額外的忽略區(qū)域。因?yàn)橛行゛nchor雖然沒(méi)有和gt有最大iou,但是其iou依然很高,如果作為正樣本來(lái)對(duì)待,由于質(zhì)量不是很高以及為了和分類、回歸分支的正樣本定義一致,所以不適合作為正樣本,但是如果作為負(fù)樣本那也不合適,畢竟iou很大,這部分位置的anchor就應(yīng)該設(shè)置為忽略區(qū)域,一般忽略iou閾值是0.7即將負(fù)樣本中的iou大于0.7中的anchor設(shè)置為忽略區(qū)域(需要特別注意一個(gè)細(xì)節(jié):此處的iou是每個(gè)位置的anchor預(yù)測(cè)值和所有g(shù)t計(jì)算iou,而不是固定的anchor和所有g(shù)t計(jì)算iou,因?yàn)榇颂幮枰紤]位置信息,faster rcnn系列不需要這么算的原因是faster rcnn是每個(gè)位置都會(huì)預(yù)測(cè)xywh,而yolo系列是基于grid網(wǎng)格預(yù)測(cè),xy和wh預(yù)測(cè)是分開(kāi)來(lái)的,所以會(huì)更復(fù)雜一些)??偨Y(jié)就是:
1.基于max iou分配準(zhǔn)則,區(qū)分正負(fù)樣本
2.在負(fù)樣本范圍內(nèi),將iou(基于anchor預(yù)測(cè)值和gt計(jì)算)大于忽略閾值的anchor定義為忽略區(qū)域,實(shí)時(shí)改變
3.此時(shí)就區(qū)分出了正、負(fù)和忽略anchor樣本,正anchor用于分類、回歸分支學(xué)習(xí),正負(fù)anchor用于confidence分支學(xué)習(xí),忽略區(qū)域不考慮。
對(duì)于yolov3,由于是多尺度預(yù)測(cè),故還有一個(gè)細(xì)節(jié)需要注意:首先需要將gt利用 max iou原則分配到不同的預(yù)測(cè)層上去,然后在每個(gè)層上單獨(dú)計(jì)算正負(fù)樣本和忽略樣本,也就是和faster rcnn不一樣的地方是yolov3不存在某個(gè)gt會(huì)分配到多個(gè)層進(jìn)行預(yù)測(cè)的可能性,而是一定是某一層負(fù)責(zé)的。但是不同的具體代碼實(shí)現(xiàn)時(shí)候可能會(huì)有些許差別。
(3) loss
由于其采用的是普通的bce分類Loss和smooth l1 回歸loss,故不再進(jìn)行分析。
1.2.3 ssd
論文地址:SSD: Single Shot MultiBox Detector
(1) head結(jié)構(gòu)
ssd是最典型的多尺度預(yù)測(cè)結(jié)構(gòu),是非常早期的網(wǎng)絡(luò)。
其ssd300的head結(jié)構(gòu)如下:
可以看出,ssd一共包括6個(gè)尺度輸出,每個(gè)尺度的strides可以從anchor_strides中看出來(lái),basesize_ratio_range表示正方形anchor的min_size和max_size,anchor_ratios表示每個(gè)預(yù)測(cè)層的anchor個(gè)數(shù),以及比例。有點(diǎn)繞,下面具體分析。為了方便設(shè)置anchor,作者設(shè)計(jì)了一個(gè)公式來(lái)生成anchor,具體為:
k為特征圖索引,m為5,而不是6,因?yàn)榈谝粚虞敵鎏卣鲌DConv4_3比較特殊,是單獨(dú)設(shè)置的,表示anchor大小相對(duì)于圖片的比例,和是比例的最小和最大值,論文中設(shè)置min=0.2(ssd300中,coco數(shù)據(jù)集設(shè)置為0.15,voc數(shù)據(jù)集設(shè)置為0.2),max=0.9,但是實(shí)際上代碼不是這樣寫的。實(shí)際上是:對(duì)于第一個(gè)特征圖Conv4_3,其先驗(yàn)框的尺度比例一般設(shè)置為,故第一層的=0.1,輸入是300,故conv4_3的min_size=30。對(duì)于從第二層開(kāi)始的特征圖,則利用上述公式進(jìn)行線性增加,然后再乘以圖片大小,可以得到各個(gè)特征圖的尺度為60,111,162,213,264。最后一個(gè)特征圖conv9_2的size是直接計(jì)算的,300*105/100=315。以上計(jì)算可得每個(gè)特征的min_size和max_size,如下:
計(jì)算得到min_size和max_size后,需要再使用寬高比例因子來(lái)生成更多比例的anchor,一般選取,但是對(duì)于比例為1的先驗(yàn)框,作者又單獨(dú)多設(shè)置了一種比例為1,的尺度,所以一共是6種尺度。但是在實(shí)現(xiàn)時(shí),Conv4_3,Conv8_2和Conv9_2層僅使用4個(gè)先驗(yàn)框,它們不使用長(zhǎng)寬比為3,1/3的先驗(yàn)框,每個(gè)單元的先驗(yàn)框的中心點(diǎn)分布在各個(gè)單元的中心。具體細(xì)節(jié)如下:
以feature map上每個(gè)點(diǎn)的中點(diǎn)為中心(offset=0.5),生成一些列同心的prior box(然后中心點(diǎn)的坐標(biāo)會(huì)乘以step,相當(dāng)于從feature map位置映射回原圖位置)。
正方形prior box最小邊長(zhǎng)為和最大邊長(zhǎng)為:min_size和
根據(jù)aspect ratio,會(huì)生成2個(gè)長(zhǎng)方形,長(zhǎng)寬為
目的是保存在該比例下,面積不變。以fc7為例,前面知道其min_size=60,max_size=111,由于其需要6種比例,故生成過(guò)程是:
第一種比例,(min_size,min_size)=(60,60)
第二種比例,,
第三種比例,,
第四種比例,(sqrt{60×110},sqrt{60×110})$
不管哪個(gè)框架實(shí)現(xiàn),核心思想都是一樣,但是可能某些數(shù)據(jù)的設(shè)置不一樣。下面以mmdetection為例:
(2) 正負(fù)樣本定義
ssd采用的正負(fù)樣本定義器依然是MaxIoUAssigner,但是由于參數(shù)設(shè)置不一樣,故有了不同的解釋。
其定義anchor與gt的iou小于0.5的就全部認(rèn)為是負(fù)樣本,大于0.5的最大iou樣本認(rèn)為是正樣本anchor,同時(shí)由于min_pos_iou=0以及gt_max_assign_all=False,可以發(fā)現(xiàn)該設(shè)置的結(jié)果是每個(gè)gt可能和多個(gè)anchor匹配上,匹配閾值比較低,且每個(gè)gt一定會(huì)和某個(gè)anchor匹配上,不可能存在gt沒(méi)有anchor匹配的情況,且沒(méi)有忽略樣本。總結(jié)下意思就是:
anchor和所有g(shù)t的iou都小于0.5,則認(rèn)為是負(fù)樣本
anchor和某個(gè)gt的最大iou大于0.5,則認(rèn)為是正樣本
gt和所有anchor的最大iou值,如果大于0.0,則認(rèn)為該最大iou anchor是正樣本
沒(méi)有忽略樣本
(3) 平衡分類loss
由于正負(fù)樣本差距較大,如果直接采用ce和smooth l1訓(xùn)練,效果可能不太好,比較樣本不平衡嚴(yán)重。故作者的ce loss其實(shí)采用了ohem+ce的策略,通過(guò)train_cfg.neg_pos_ratio=3來(lái)配置負(fù)樣本是正樣本的3倍。
核心就是按照分類loss進(jìn)行topk,得到3倍的負(fù)樣本進(jìn)行反向傳播。
2 anchor-free
2.1 fcos
論文名稱:FCOS: Fully Convolutional One-Stage Object Detection
FCOS堪稱anchor free論文的典范,因?yàn)槠浣Y(jié)構(gòu)主流,思路簡(jiǎn)單清晰,效果蠻好,故一直是后續(xù)anchor free的基準(zhǔn)對(duì)比算法。FCOS的核心是將輸入圖像上的位置作為anchor point的中心點(diǎn),并且對(duì)這些anchor point進(jìn)行回歸。
(1) head結(jié)構(gòu)
fcos的骨架和neck部分是標(biāo)準(zhǔn)的resnet+fpn結(jié)構(gòu),和retinanet完全相同。如下所示:
我們僅僅考慮head部分。除去center-ness分支,則可以看出和retinanet完全相同。其配置如下:
可以看出一共5個(gè)尺度進(jìn)行預(yù)測(cè),每個(gè)尺度的stride可以從strides中看出來(lái)。由于其是anchor free論文,故少了很多復(fù)雜參數(shù)。
(2) 正負(fù)樣本定義
考慮到anchor free預(yù)測(cè)值和anchor base不一樣,故還是需要提前說(shuō)下網(wǎng)絡(luò)預(yù)測(cè)形式。FCOS是全卷積預(yù)測(cè)模式,對(duì)于cls分支,輸出是h x w x (class+1),每個(gè)空間位置值為1,表示該位置有特定類別的gt bbox,對(duì)于回歸分支,輸出是h x w x 4,其4個(gè)值的含義是:
每個(gè)點(diǎn)回歸的4個(gè)數(shù)代表距離4條邊的距離,非常簡(jiǎn)單易懂。和所有目標(biāo)檢測(cè)算法一樣,需要提前定義好正負(fù)樣本,同時(shí)由于是多尺度預(yù)測(cè)輸出,還需要首先考慮gt由哪一個(gè)輸出層具體負(fù)責(zé)。作者首先設(shè)計(jì)了min_size和max_size來(lái)確定某個(gè)gt到底由哪一層負(fù)責(zé),具體設(shè)置是0, 64, 128, 256, 512和無(wú)窮大,也就是說(shuō)對(duì)于第1個(gè)輸出預(yù)測(cè)層而言,其stride=8,負(fù)責(zé)最小尺度的物體,對(duì)于第1層上面的任何一個(gè)空間位置點(diǎn),如果有g(shù)t bbox映射到特征圖上,滿足0 < max(中心點(diǎn)到4條邊的距離) < 64,那么該gt bbox就屬于第1層負(fù)責(zé),其余層也是采用類似原則。總結(jié)來(lái)說(shuō)就是第1層負(fù)責(zé)預(yù)測(cè)尺度在0~64范圍內(nèi)的gt,第2層負(fù)責(zé)預(yù)測(cè)尺度在64~128范圍內(nèi)的gt,其余類推。通過(guò)該分配策略就可以將不同大小的gt分配到最合適的預(yù)測(cè)層進(jìn)行學(xué)習(xí)。
第二步是需要確定在每個(gè)輸出層上面,哪些空間位置是正樣本區(qū)域,哪些是負(fù)樣本區(qū)域。原版的fcos的正負(fù)樣本策略非常簡(jiǎn)單粗暴:在bbox區(qū)域內(nèi)的都是正樣本,其余地方都是負(fù)樣本,而沒(méi)有忽略樣本區(qū)域??上攵@種做法不友好,因?yàn)闃?biāo)注本身就存在大量噪聲,如果bbox全部區(qū)域都作為正樣本,那么bbox邊沿的位置作為正樣本負(fù)責(zé)預(yù)測(cè)是難以得到好的效果的,顯然是不太靠譜的(在文本檢測(cè)領(lǐng)域,都會(huì)采用shrink的做法來(lái)得到正樣本區(qū)域),所以后面又提出了center sampling的做法來(lái)確定正負(fù)樣本,具體是:引入了center_sample_radius(基于當(dāng)前stride參數(shù))的參數(shù)用于確定在半徑范圍內(nèi)的樣本都屬于正樣本區(qū)域,其余區(qū)域作為負(fù)樣本,依然沒(méi)有定義忽略樣本。默認(rèn)配置center_sample_radius=1.5,如果第1層為例,其stride=8,那么也就是說(shuō)在該輸出層上,對(duì)于任何一個(gè)gt,基于gt bbox中心點(diǎn)為起點(diǎn),在半徑為1.5*8=12個(gè)像素范圍內(nèi)都屬于正樣本區(qū)域。其核心代碼如下:
如果需要進(jìn)行中心采樣,那么基于采樣半徑比例×當(dāng)前stride的范圍內(nèi)都屬于正樣本inside_gt_bbox_mask,其余樣本全部屬于負(fù)樣本??赡芎芏嗳硕加幸蓡?wèn):為啥不需要設(shè)置忽略區(qū)域?個(gè)人猜測(cè)原因可能是:1. 設(shè)置忽略區(qū)域,又需要增加一個(gè)超參;2.多了一個(gè)center-ness分支,可以很大程度抑制這部分區(qū)域?qū)μ荻鹊挠绊憽?.間接的增加了正樣本數(shù)目。不管咋說(shuō)應(yīng)該是作者實(shí)驗(yàn)后發(fā)現(xiàn)沒(méi)有很大必要吧。
(3) 平衡loss設(shè)計(jì)
可以發(fā)現(xiàn)上述肯定存在大量正負(fù)樣本不平衡問(wèn)題,故作者對(duì)于分類分支采用了one-stage常用的focal loss;對(duì)于bbox回歸問(wèn)題,由于很多論文表明直接優(yōu)化bbox比單獨(dú)優(yōu)化4個(gè)值更靠譜,故作者采用了GIOU loss來(lái)回歸4個(gè)值,對(duì)于center-ness分支,采用的是CrossEntropyLoss,當(dāng)做分類問(wèn)題處理。
(4) 附加內(nèi)容
center-ness作用比較大,從上面的正負(fù)樣本定義就可以看出來(lái),如果沒(méi)有center-ness,對(duì)于所有正樣本區(qū)域,其距離bbox中心不同遠(yuǎn)近的loss權(quán)重居然是一樣的,這明顯是違反直覺(jué)的,理論上應(yīng)該越是遠(yuǎn)離Bbox中心的空間位置,其權(quán)重應(yīng)該越小,作者實(shí)驗(yàn)也發(fā)現(xiàn)如果沒(méi)有center-ness分支,會(huì)產(chǎn)生大量假正樣本,導(dǎo)致很多虛檢。center-ness本質(zhì)就是對(duì)正樣本區(qū)域按照距離gt bbox中心來(lái)設(shè)置權(quán)重,這是作者的做法,還有很多類似做法,不過(guò)有些是在Loss上面做文章,例如在ce loss基礎(chǔ)上乘上一個(gè)類似預(yù)center-ness的權(quán)重來(lái)實(shí)現(xiàn)同樣效果(例如Soft Anchor-Point Object Detection)。center-ness效果如下:
2.2 centernet
論文名稱:Objects as Points
centernet也是非常流行的anchor-free論文,其核心是:一些場(chǎng)景的cv任務(wù)例如2d目標(biāo)檢測(cè)、3d目標(biāo)檢測(cè)、深度估計(jì)和關(guān)鍵點(diǎn)估計(jì)等等任務(wù)都可以建模成以物體中心點(diǎn)學(xué)習(xí),外加上在該中心點(diǎn)位置處額外學(xué)習(xí)一些各自特有屬性的通用做法。對(duì)于目標(biāo)檢測(cè),可以將bbox回歸問(wèn)題建模成學(xué)習(xí)bbox中心點(diǎn)+bbox寬高問(wèn)題,如下所示:
(1) head結(jié)構(gòu)
centernet的輸出也非常簡(jiǎn)單,其相比較于FCOS等算法,使用更大分辨率的輸出特征圖(縮放了4倍),本質(zhì)上是因?yàn)槠洳捎藐P(guān)鍵點(diǎn)檢測(cè)思路做法,而關(guān)鍵點(diǎn)檢測(cè)精度要高,通常是需要輸出高分辨率特征圖,同時(shí)不需要多尺度預(yù)測(cè)。其輸出預(yù)測(cè)頭包含3個(gè)分支,分別是
1. 分類分支h' x w' x (c+1),如果某個(gè)特定類的gt bbox的中心點(diǎn)落在某個(gè)位置上,那么該通道的對(duì)應(yīng)位置值設(shè)置為1,其余為0;
2. offset分支h' x w' x 2,用于學(xué)習(xí)量化偏差,圖像下采樣時(shí),gt bbox的中心點(diǎn)會(huì)因數(shù)據(jù)是離散的而產(chǎn)生偏差,例如gt bbox的中心點(diǎn)坐標(biāo)是101,而由于輸入和輸出相差4倍,導(dǎo)致gt bbox映射到特征圖上坐標(biāo)由25.25量化為了25,這就出現(xiàn)了101-25x4=1個(gè)pix的誤差,如果下采樣越大,那么量化誤差會(huì)越大,故可以使用offset分支來(lái)學(xué)習(xí)量化誤差,這樣可以提高預(yù)測(cè)精度。
3. 寬高分支h' x w' x 2,表示gt bbox的寬高。
其中1.2分支和cornetnet的做法完全相同。而由于objects as points的建模方式和FCOS的建模方式不一樣,故centernet的正負(fù)樣本定義就會(huì)產(chǎn)生很大區(qū)別。主要是寬高分支的通道數(shù)是2,而不是4,也就是說(shuō)其輸入到寬高分支的正樣本其實(shí)會(huì)非常少,必須是gt bbox的中心位置才是正樣本,左右偏移位置無(wú)法作為正樣本,也沒(méi)有啥忽略樣本的概念,這個(gè)是和FCOS的最大區(qū)別。
(2) 正負(fù)樣本定義
由于centernet特殊的建模方式,故其正負(fù)樣本定義特別簡(jiǎn)單,不需要考慮多尺度、不需要考慮忽略區(qū)域,也不用考慮iou,正樣本定義就是某個(gè)gt bbox中心落在哪個(gè)位置上,那么那個(gè)位置就是正樣本,其余位置全部是負(fù)樣本。
(3) 平衡Loss設(shè)計(jì)
前面說(shuō)過(guò)目標(biāo)檢測(cè)所有論文的樣本平衡策略都主要包括正負(fù)樣本定義、正負(fù)樣本采樣和平衡loss設(shè)計(jì),不管啥目標(biāo)檢測(cè)算法都省不了,對(duì)于centernet,其正負(fù)樣本定義非常簡(jiǎn)單,可以看出會(huì)造成極其嚴(yán)重的正負(fù)樣本不平衡問(wèn)題,然后也無(wú)法像two-stage算法一樣設(shè)計(jì)正負(fù)樣本采樣策略,那么平衡問(wèn)題就必須要在loss上面解決。對(duì)于offset和寬高預(yù)測(cè)分支,其只對(duì)正樣本位置進(jìn)行監(jiān)督,故核心設(shè)計(jì)就在平衡分類上面。對(duì)于分類平衡loss,首選肯定是focal loss了,但是還不夠,focal loss的核心是壓制大量易學(xué)習(xí)樣本的權(quán)重,但是由于我們沒(méi)有設(shè)置忽略區(qū)域,在正樣本附近的樣本,實(shí)際上非常靠近正樣本,如果強(qiáng)行設(shè)置為0背景來(lái)學(xué)習(xí),那其實(shí)相當(dāng)于難負(fù)樣本,focal loss會(huì)突出學(xué)這部分區(qū)域,導(dǎo)致loss難以下降、不穩(wěn)定,同時(shí)也是沒(méi)有必要的,因?yàn)槲覀兊膌abel雖然是0或者1的,但是在前向后處理時(shí)候是當(dāng)做高斯熱圖(0~1之間呈現(xiàn)2d高斯分布特點(diǎn))來(lái)處理的,我們學(xué)到最后的輸出只要滿足gt bbox中心值比附近區(qū)域大就行,不一定要學(xué)習(xí)出0或者1的圖。
基于上述設(shè)定,在不修改分類分支label的情況下,在使用focal loss的情況下,作者的做法是對(duì)正樣本附近增加懲罰,基于2d高斯分布來(lái)降低這部分權(quán)重,相當(dāng)于起到了類似于忽略區(qū)域的作用。可以簡(jiǎn)單認(rèn)為是focal focal loss。
其中
Y是label,0或者1,當(dāng)Y=1時(shí)候,也就是正樣本位置,就是標(biāo)準(zhǔn)的focal loss設(shè)定;其余區(qū)域,分為附近區(qū)域和外圍區(qū)域,附近的定義采用了自適應(yīng)寬高標(biāo)準(zhǔn)差的做法,在2d高斯分布內(nèi)部的屬于附近區(qū)域,外面的都稱為外圍背景區(qū)域,外圍區(qū)域也是標(biāo)準(zhǔn)的focal loss定義。故作者設(shè)計(jì)更改的就是附近區(qū)域,也就是,可以發(fā)現(xiàn)如果去掉,就是標(biāo)準(zhǔn)的focal loss。附近區(qū)域中越靠近中心點(diǎn)的懲罰Y越大,Loss權(quán)重越小,表示該位置對(duì)于正還是負(fù)的區(qū)分越模糊。
可能很多人有疑問(wèn):明明label是0-1的,為啥學(xué)出來(lái)的會(huì)是高斯熱圖,而不是0-1熱圖?我的分析是:如果不考慮附近區(qū)域,而是僅僅采用focal loss那么確實(shí)應(yīng)該學(xué)出來(lái)的最接近0-1熱圖,但是由于基于距離gt bbox中心遠(yuǎn)近不同,設(shè)置了不同的懲罰系數(shù),導(dǎo)致網(wǎng)絡(luò)學(xué)習(xí)時(shí)候?qū)τ谶@部分學(xué)習(xí)出來(lái)的值關(guān)注程度不一樣,可能就會(huì)產(chǎn)生這種現(xiàn)象,舉例來(lái)說(shuō):即使采用上述label,最完美的輸出應(yīng)該是0或1的,但是實(shí)際上很難,對(duì)于偏離gt bbox附近一點(diǎn)點(diǎn)的位置,假設(shè)其預(yù)測(cè)輸出為0,那么肯定是loss最低,但是可能訓(xùn)練不到那么好,那么由于其權(quán)重比較小,其學(xué)習(xí)出0.9,其實(shí)loss也不會(huì)太大,但是如果距離遠(yuǎn)一點(diǎn)的,其也學(xué)習(xí)出0.9,由于其loss權(quán)重比較大,就會(huì)迫使網(wǎng)絡(luò)預(yù)測(cè)要變小一點(diǎn)點(diǎn),例如變成0.8輸出?;谶@種權(quán)重分布,訓(xùn)練出來(lái)的熱圖可能就會(huì)按照1-loss權(quán)重的分布呈現(xiàn),出現(xiàn)高斯熱圖。學(xué)習(xí)關(guān)鍵點(diǎn)中心,作者采用的是分類loss,不清楚如果直接采用回歸loss,效果咋樣,我覺(jué)得效果應(yīng)該不會(huì)差。因?yàn)殛P(guān)鍵點(diǎn)檢測(cè)一般都是采用l2回歸loss直接監(jiān)督在高斯熱圖上。并且因?yàn)閷捀?、offset分支其實(shí)也都是回歸loss,三個(gè)分支都采用回歸Loss不好嗎?
還有一個(gè)問(wèn)題:寬高和offset的監(jiān)督僅僅在gt bbox中心位置,其余位置全部是忽略區(qū)域。這種做法其實(shí)很不魯棒,也就是說(shuō)bbox性能其實(shí)完全靠分類分支,如果分類分支學(xué)習(xí)的關(guān)鍵點(diǎn)有偏差,那么由于寬高的特殊監(jiān)督特性,可能會(huì)導(dǎo)致由于中心點(diǎn)定位不準(zhǔn)而帶來(lái)寬高不準(zhǔn)的情況(特別的如果中心點(diǎn)預(yù)測(cè)丟失了,那么寬高預(yù)測(cè)再準(zhǔn)也沒(méi)有用),后面有些論文有其他解決辦法,
2.3 atss
論文名稱:Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection
本文寫的非常好,作者試圖分析問(wèn)題:anchor-free和anchor-base算法的本質(zhì)區(qū)別是啥?性能為啥不一樣?最終結(jié)論是其本質(zhì)區(qū)別就在于正負(fù)樣本定義不同。只要我們能夠統(tǒng)一正負(fù)樣本定義方式,那么anchor-free和anchor-base就沒(méi)有啥實(shí)際區(qū)別了,性能也是非常一致的。正負(fù)樣本定義也是我寫這篇文章的一個(gè)最大要說(shuō)明的地方,因?yàn)槠浞浅jP(guān)鍵,要想徹底理解不同目標(biāo)檢測(cè)算法的區(qū)別,那么對(duì)于正負(fù)樣本定義必須要非常清楚。
(1) head部分
由于這篇論文細(xì)節(jié)比較多,為了論文完整性,我這里大概說(shuō)下,不重點(diǎn)描述。作者為了找出本質(zhì)區(qū)別,采用了anchor-base經(jīng)典算法retinanet以及anchor-free經(jīng)典算法FCOS來(lái)說(shuō)明,因?yàn)檫@兩篇論文非常相似,最好進(jìn)行對(duì)比。
由于FCOS是基于point進(jìn)行預(yù)測(cè),故可以認(rèn)為就是一個(gè)anchor,為了公平對(duì)比,將retinanet的anchor也設(shè)置為1個(gè)(#A=1),將FCOS的訓(xùn)練策略移動(dòng)到retinanet上面,可以發(fā)現(xiàn)性能依然retinanet低于fcos 0.8mAP。排除這個(gè)因素后,現(xiàn)在兩個(gè)算法的區(qū)別是1.正負(fù)樣本定義;2.回歸分支中從point回歸還是從anchor回歸。從point回歸就是指的每個(gè)點(diǎn)預(yù)測(cè)距離4條邊的距離模式,而從anchor回歸是指的retinanet那種基于anchor回歸的模式。
后面有實(shí)驗(yàn)分析可以知道回歸分支中從point回歸還是從anchor回歸對(duì)最終影響很小。ATSS的head部分結(jié)構(gòu)如下:
可以看出所有的參數(shù)其實(shí)就是retinanet和fcos參數(shù)的合并而已,沒(méi)有新增參數(shù)。
(2) 正負(fù)樣本定義
正負(fù)樣本定義是本文的討論重點(diǎn)。作者首先詳細(xì)分析了retinanet和fcos的正負(fù)樣本定義策略的不同,首先這兩個(gè)算法都是多尺度預(yù)測(cè)的,故其實(shí)都包括兩個(gè)步驟:gt分配給哪一層負(fù)責(zé)預(yù)測(cè);gt分配給哪一個(gè)位置anchor負(fù)責(zé)預(yù)測(cè)。retinanet完全依靠統(tǒng)一的iou來(lái)決定哪一層哪一個(gè)位置anchor負(fù)責(zé)預(yù)測(cè),而fcos顯式的分為兩步:先利用scale ratio來(lái)確定gt分配到哪一層,然后利用center sampling策略來(lái)確定哪些位置是正樣本。具體細(xì)節(jié)請(qǐng)參見(jiàn)的retinanet和fcos的正負(fù)樣本定義總結(jié)。這兩種操作的細(xì)微差別會(huì)導(dǎo)致如下情形:
對(duì)于1和2兩個(gè)輸出預(yù)測(cè)層,retinanet采用統(tǒng)一閾值iou,可以確定上圖藍(lán)色1位置是正樣本,而對(duì)于fcos來(lái)說(shuō),有2個(gè)藍(lán)色1,表明fcos的定義方式會(huì)產(chǎn)生更多的正樣本區(qū)域。這種細(xì)微差距就會(huì)導(dǎo)致retinanet的性能比f(wàn)cos低一些。
對(duì)于retinanet算法,正負(fù)樣本定義采用iou閾值,回歸分支采用原始的anchor變換回歸模式(box),mAP=37.0,采用fcos的point模式是36.9,說(shuō)明到底是point還是box不是關(guān)鍵因素。但是如果換成fcos的正負(fù)樣本定義模式,mAP就可以上升為37.8,和fcos一致了,說(shuō)明正負(fù)樣本定義的不同是決定anchor-base和anchor-free的本質(zhì)區(qū)別。
既然找到了本質(zhì)問(wèn)題,作者分析肯定是fcos的正負(fù)樣本定義策略比retinanet好,但是fcos算法需要定義超參scale constraint,比較麻煩,作者希望找到一種和fcos類似功能的正負(fù)樣本定義算法,主要特定是幾乎沒(méi)有超參,或者說(shuō)對(duì)超參不敏感,可以自適應(yīng),故作者提出ATSS算法。由于作者的設(shè)計(jì)可以認(rèn)為是fcos正負(fù)樣本定義策略的改進(jìn)版本,故mmdetection的代碼中也是針對(duì)fcos來(lái)說(shuō)的,具體就是除了正負(fù)樣本定義策略和fcos不一樣外,其余全部相同,所以我們也僅僅需要關(guān)注atss部分代碼就行。
其只有一個(gè)參數(shù)topk,實(shí)驗(yàn)表明參數(shù)適當(dāng)就行,不敏感。下面具體分析ATSS:
流程比較簡(jiǎn)單,但是需要注意,由于依然需要計(jì)算iou,故anchor的設(shè)置不能少,只不過(guò)anchor僅僅用于計(jì)算正負(fù)樣本區(qū)域而已,在計(jì)算loss時(shí)候還是anchor-free的,anchor默認(rèn)設(shè)置就1個(gè)。主要是理解思想:
對(duì)于每個(gè)gt bbox,在每一個(gè)預(yù)測(cè)層上采樣tokp個(gè)基于l2距離的位置,作為候選;
計(jì)算gt和每個(gè)候選anchor的iou;計(jì)算所有iou的均值和方差,相加變成iou閾值(每個(gè)gt都有一個(gè)自適應(yīng)的iou閾值);
遍歷每個(gè)候選anchor,如果該anchor大于iou閾值,并且anchor中心位置在gt bbox內(nèi)部,那么這個(gè)就是正樣本區(qū)域,其余全部是負(fù)樣本。
均值(所有層的候選樣本算出一個(gè)均值)代表了anchor對(duì)gt衡量的普遍合適度,其值越高,代表候選樣本質(zhì)量普遍越高,iou也就越大,而方差代表哪一層適合預(yù)測(cè)該gt bbox,方差越高越能區(qū)分層和層之間的anchor質(zhì)量差異。均值和方差相加就能夠很好的反應(yīng)出哪一層的哪些anchor適合作為正樣本。一個(gè)好的anchor設(shè)計(jì),應(yīng)該是滿足高均值、高方差的設(shè)定。
如上圖所示,(a)的閾值計(jì)算出來(lái)是0.612,采用該閾值就可以得到level3上面的才是正樣本,是高均值高方差的。同樣的如果anchor設(shè)置和gt不太匹配,計(jì)算出來(lái)的閾值為0.219,依然可以選擇出最合適的正樣本區(qū)域,雖然其屬于低均值、低方差的。采用自適應(yīng)策略依然可以得到相對(duì)好的正負(fù)樣本,實(shí)現(xiàn)了自適應(yīng)功能,至少可以保證每個(gè)GT一定有至少一個(gè)anchor負(fù)責(zé)對(duì)應(yīng)。從這個(gè)設(shè)定來(lái)看,應(yīng)該會(huì)出現(xiàn)某個(gè)gt在多個(gè)層上面都屬于正樣本區(qū)域,而沒(méi)有限制必須在其中某個(gè)層預(yù)測(cè),相當(dāng)于增加了些正樣本。K默認(rèn)是9。
(3) 平衡loss設(shè)定
其loss函數(shù)設(shè)計(jì)完全和fcos一樣,不再贅述。
2.4 spad
論文名稱:Soft Anchor-Point Object Detection
本文可以認(rèn)為是anchor-free論文的改進(jìn)。其首先指出目前anchor-free算法存在的問(wèn)題:1.attention bias,2.feature selection,并提出了相應(yīng)的soft策略。由于其主要是修改了正負(fù)樣本定義策略,故是本文分析的重點(diǎn)。
(1) head
本文屬于anchor point類算法,即每個(gè)點(diǎn)都學(xué)習(xí)距離4條邊的距離,這是標(biāo)準(zhǔn)的densebox算法流程,本質(zhì)上和FCOS一樣:
和FCOS的區(qū)別就在于 1. 沒(méi)有center-ness分支,2. 正樣本區(qū)域的定義采用4條邊向內(nèi)shrink做法,而不是center sampling。
1.Attention bias
作者采用上面的網(wǎng)絡(luò)進(jìn)行訓(xùn)練,發(fā)現(xiàn)一個(gè)問(wèn)題如下:
(b)是標(biāo)準(zhǔn)網(wǎng)絡(luò)訓(xùn)練的分類confidence圖,可以看出在靠近物體中心的四周會(huì)依然會(huì)產(chǎn)生大量confidence很高的輸出,即沒(méi)有清晰的邊界,在訓(xùn)練過(guò)程中可能會(huì)抑制掉周圍小的物體,導(dǎo)致小物體檢測(cè)不出來(lái)或者檢測(cè)效果很差。作者分析原因可能是在anchor-point方法在邊界地方point進(jìn)行回歸,會(huì)存在特征不對(duì)齊問(wèn)題或者說(shuō)很難對(duì)齊。這個(gè)現(xiàn)象在FCOS沒(méi)有加center-ness時(shí)候也出現(xiàn)了,F(xiàn)COS的解決辦法就是加入新的center-ness分支訓(xùn)練時(shí)候抑制掉,本文解決辦法不一樣,其通過(guò)加權(quán)方法。加權(quán)后效果如(c)。
2.Feature selection
特性選擇問(wèn)題其實(shí)是指的對(duì)于任何一個(gè)gt bbox,到底采用何種策略分配到不同的層級(jí)進(jìn)行預(yù)測(cè)?目前目標(biāo)檢測(cè)的做法是基于啟發(fā)式人工準(zhǔn)則將實(shí)例分配到金字塔層次(retinanet),或?qū)⒚總€(gè)實(shí)例嚴(yán)格限制為單個(gè)層次(fcos),從而可能會(huì)導(dǎo)致特征能力的不充分利用。
作者通過(guò)訓(xùn)練發(fā)現(xiàn):雖然每個(gè)GT只在特定層進(jìn)行回歸,但是其學(xué)出來(lái)的特征圖是相似的,如上圖所示,也就是說(shuō):一個(gè)以上金字塔等級(jí)的特征可以共同為特定實(shí)例的檢測(cè)做出貢獻(xiàn),但是來(lái)自不同等級(jí)的貢獻(xiàn)程度應(yīng)該有所不同。這就是本文的出發(fā)點(diǎn),不再?gòu)?qiáng)行判斷哪一層進(jìn)行回歸了,而是每一層都進(jìn)行回歸,但是讓網(wǎng)絡(luò)自行學(xué)習(xí)到金字塔層級(jí)的權(quán)重。說(shuō)了半天,作者仔細(xì)談到了這兩個(gè)問(wèn)題,但思考下可以發(fā)現(xiàn)說(shuō)的都是同一個(gè)問(wèn)題,都是正負(fù)樣本定義問(wèn)題。attention bias說(shuō)的是對(duì)于特定輸出層內(nèi)的正負(fù)樣本定義問(wèn)題,feature selection說(shuō)的則是不同輸出層間的正負(fù)樣本定義問(wèn)題,我們以前說(shuō)的正負(fù)樣本定義都是hard,這里解決辦法都是soft。
(2) 正負(fù)樣本定義
對(duì)于特定輸出層內(nèi)的soft正負(fù)樣本定義問(wèn)題,作者的解決辦法是引入類似center-ness一樣的權(quán)重,屬于Loss層面改進(jìn),我們放在(3) 平衡loss分析;對(duì)于不同輸出層間的soft正負(fù)樣本定義問(wèn)題,作者采用的是采用網(wǎng)絡(luò)自動(dòng)學(xué)習(xí)soft權(quán)重的做法。注意:輸出層內(nèi)hard正負(fù)樣本定義,作者采用的依然和FCOS相同的策略,只不過(guò)正樣本區(qū)域是通過(guò)4條邊shrink得到,而不是center sampling。輸出層間hard正負(fù)樣本定義,作者沒(méi)有用FCOS的分配策略,而是提出了新的soft代替hard。本文不再?gòu)?qiáng)行判斷哪一輸出層進(jìn)行g(shù)t bbox回歸了,而是每一層都進(jìn)行所有g(shù)t bbox回歸,但是讓網(wǎng)絡(luò)自行學(xué)習(xí)到金字塔層級(jí)的權(quán)重。
引入一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)來(lái)學(xué)習(xí)金字塔權(quán)重,具體做法是:利用gt bbox,映射到對(duì)應(yīng)的特征圖層,然后利用roialign層提出特征,在采用簡(jiǎn)單的分類器輸出每個(gè)層級(jí)的權(quán)重。由于金字塔層數(shù)是5,故fc的輸出是5。label設(shè)置上,這個(gè)思想的提出是參考FSAF(Feature Selective Anchor-Free Module for Single-Shot Object Detection)的做法,核心思想是不再人為定義具體是哪一層負(fù)責(zé)預(yù)測(cè)GT,而是根據(jù)loss最小的動(dòng)態(tài)選擇的那個(gè)層。本文借鑒上述思想,也是自動(dòng)選擇最適合的層。meta選擇網(wǎng)絡(luò)的獨(dú)熱碼label不是人為提前計(jì)算好的,而是根據(jù)輸出softmax層的值或者說(shuō)loss來(lái)選擇的,哪個(gè)輸出節(jié)點(diǎn)loss最小,那么Label就設(shè)置為1,其余為0。整個(gè)meta選擇網(wǎng)絡(luò)和目標(biāo)檢測(cè)網(wǎng)絡(luò)聯(lián)合訓(xùn)練。
(3) 平衡loss設(shè)計(jì)
對(duì)于特定輸出層內(nèi)的soft正負(fù)樣本定義問(wèn)題,作者的解決辦法是引入類似center-ness一樣的權(quán)重,來(lái)對(duì)距離gt bbbx中心點(diǎn)進(jìn)行懲罰。中心點(diǎn)權(quán)重最大,往外依次減少,其權(quán)重圖如fcos里面所示:
從本質(zhì)上來(lái)說(shuō)和centernet的解決辦法一模一樣。
看過(guò)前面centernet 平衡分類loss分析的人可能有疑問(wèn):在centernet里面,其對(duì)focal loss的權(quán)重設(shè)置是在半徑范圍內(nèi),除中心點(diǎn)外,離中心點(diǎn)越近,權(quán)重最小,往外依次增加;但是這里的設(shè)計(jì)是正好相反的,其是離中心點(diǎn)越近,權(quán)重越大,往外依次減少??雌饋?lái)是矛盾的?其實(shí)不是,千萬(wàn)不要忘記了label設(shè)計(jì)規(guī)則,centernet的分類label設(shè)置是除了中心點(diǎn)是1外,其余全部為0,而本文的label設(shè)置是不僅僅中心點(diǎn)是1,shrink附近區(qū)域的點(diǎn)也是1,其余全部是0,也就是說(shuō)模糊區(qū)域中,centernet出發(fā)點(diǎn)認(rèn)為是背景樣本,而本文出發(fā)點(diǎn)認(rèn)為是前景樣本,所以其權(quán)重設(shè)置規(guī)則是正好相反的。
看到上圖,就可以知道本文所有的操作了。對(duì)于特定層內(nèi)的正負(fù)樣本定義,原先是hard,現(xiàn)在通過(guò)引入權(quán)重變成了soft;對(duì)于層級(jí)間的正負(fù)樣本定義,原先只會(huì)分配到特定層,其余層都0,現(xiàn)在引入了soft操作,權(quán)重是自己學(xué)到的。
通過(guò)網(wǎng)絡(luò)學(xué)習(xí)到的層級(jí)間的權(quán)重,可以發(fā)現(xiàn)符合作者設(shè)定。
3 Guided Anchoring
論文名稱:Region Proposal by Guided Anchoring
3.1 核心思想
ga這篇論文我覺(jué)得做的蠻好,先不說(shuō)最終效果提升多少個(gè)mAP,他的出發(fā)點(diǎn)是非常不錯(cuò)的。anchor-base的做法都需要預(yù)設(shè)anchor,特別是對(duì)于one-stage而言,anchor設(shè)置的好壞對(duì)結(jié)果影響很大,因?yàn)閍nchor本身不會(huì)改變,所有的預(yù)測(cè)值都是基于anchor進(jìn)行回歸,一旦anchor設(shè)置不太好,那么效果肯定影響很大。而對(duì)于two-stage而言,好歹還有一個(gè)rcnn層,其可以對(duì)RPN的輸出roi(動(dòng)態(tài)anchor)進(jìn)行回歸,看起來(lái)影響稍微小一點(diǎn)。不管是one stage還是two-stage,不管咋預(yù)測(cè),肯定都是基于語(yǔ)義信息來(lái)預(yù)測(cè)的,在bbox內(nèi)部的區(qū)域激活值肯定較大,這種語(yǔ)義信息正好可以指導(dǎo)anchor的生成,也就是本文的出發(fā)點(diǎn):通過(guò)圖像特征來(lái)指導(dǎo) anchor 的生成。通過(guò)預(yù)測(cè) anchor 的位置和形狀,來(lái)生成稀疏而且形狀任意的 anchor??梢园l(fā)現(xiàn)此時(shí)的anchor就是動(dòng)態(tài)的了。如果將faster rcnn進(jìn)行改造,將RPN層替換為ga層,那肯定也是可以的,如果將retinanet或者yolo的預(yù)測(cè)層替換為ga,那其實(shí)就完全變成了anchor-free了。但是作者采用了一種更加優(yōu)雅的實(shí)現(xiàn)方式,其采用了一種可以直接插入當(dāng)前anchor-base網(wǎng)絡(luò)中進(jìn)行anchor動(dòng)態(tài)調(diào)整的做法,而不是替換掉原始網(wǎng)絡(luò)結(jié)構(gòu),屬于錦上添花,從此anchor-base就變成了anchor-base混合anchor-free了(取長(zhǎng)補(bǔ)短),我覺(jué)得這就是一個(gè)不錯(cuò)的進(jìn)步。
3.2 網(wǎng)絡(luò)設(shè)計(jì)
作者是以retinanet為例,但是可以應(yīng)用于所有anchor-base論文中。核心操作就是在預(yù)測(cè)xywh的同時(shí),新增兩條預(yù)測(cè)分支,一條分支是loc(batch,anchor_num * 1,h,w),用于區(qū)分前后景,目標(biāo)是預(yù)測(cè)哪些區(qū)域應(yīng)該作為中心點(diǎn)來(lái)生成 anchor,是二分類問(wèn)題,這個(gè)非常好理解,另一條分支是shape(batch,anchor_num * 2,h,w),用于預(yù)測(cè)anchor的形狀。一旦訓(xùn)練好了,那么應(yīng)該anchor會(huì)和語(yǔ)義特征緊密聯(lián)系,如下所示:
其測(cè)試流程為:
對(duì)于任何一層,都會(huì)輸出4條分支,分別是anchor的loc_preds,anchor的shape_preds,原始retinanet分支的cls_scores和bbox_preds
使用閾值將loc_preds預(yù)測(cè)值切分出前景區(qū)域,然后提取前景區(qū)域的shape_preds,然后結(jié)合特征圖位置,concat得到4維的guided_anchors(x,y,w,h)
此時(shí)的guided_anchors就相當(dāng)于retinanet里面的固定anchor了,然后和原始retinanet流程完全相同,基于guided_anchors和cls_scores、bbox_preds分支就可以得到最終的bbox預(yù)測(cè)值了。
可以發(fā)現(xiàn)和原始retinanet相比,就是多了anchor預(yù)測(cè)分支,得到動(dòng)態(tài)anchor后,那就是正常的retinanet預(yù)測(cè)流程了。
3.3 loss設(shè)計(jì)
主要就是anchor的loc_preds和shape_preds的loss設(shè)計(jì)。
(1) loc_preds
anchor的定位模塊非常簡(jiǎn)單,就是個(gè)二分類問(wèn)題,希望學(xué)習(xí)出前景區(qū)域。這個(gè)分支的設(shè)定和大部分anchor-free的做法是一樣的(例如fcos)。
首先對(duì)每個(gè)gt,利用FPN中提到的roi重映射規(guī)則,將gt映射到不同的特征圖層上
定義中心區(qū)域和忽略區(qū)域比例,將gt落在中心區(qū)域的位置認(rèn)為是正樣本,忽略區(qū)域是忽略樣本(模糊樣本),其余區(qū)域是背景負(fù)樣本,這種設(shè)定規(guī)則很常用,沒(méi)啥細(xì)說(shuō)的,如圖所示:
采用focal loss進(jìn)行訓(xùn)練
(2) loc_shape
loc_shape分支的目標(biāo)是給定 anchor 中心點(diǎn),預(yù)測(cè)最佳的長(zhǎng)和寬,這是一個(gè)回歸問(wèn)題。先不用管作者咋做的,我們可以先思考下可以如何做,首先預(yù)測(cè)寬高,那肯定是回歸問(wèn)題,采用l1或者smooth l1就行了,關(guān)鍵是label是啥?還有哪些位置計(jì)算Loss?我們知道retinanet計(jì)算bbox 分支的target算法就是利用MaxIoUAssigner來(lái)確定特征圖的哪些位置anchor是正樣本,然后將這些anchor進(jìn)行bbox回歸。現(xiàn)在要預(yù)測(cè)anchor的寬高,當(dāng)然也要確定這個(gè)問(wèn)題。
第一個(gè)問(wèn)題:如何確定特征圖的哪些位置是正樣本區(qū)域?,注意作者采用的anchor個(gè)數(shù)其實(shí)是1(作者覺(jué)得既然是動(dòng)態(tài)anchor,那么個(gè)數(shù)其實(shí)影響不會(huì)很大,設(shè)置為1是可以的錯(cuò)),也就是說(shuō)問(wèn)題被簡(jiǎn)化了,只要確定每個(gè)特征圖的每個(gè)位置是否是正樣本即可。要解決這個(gè)問(wèn)題其實(shí)非常容易,做法非常多,完全可以按照anchor-free的做法即可,例如FOCS,其實(shí)就是loc_preds分支如何確定正負(fù)樣本的做法即可,確定中心區(qū)域和忽略區(qū)域。將中心區(qū)域的特征位置作為正樣本,然后直接優(yōu)化預(yù)測(cè)輸出的anchor shape和對(duì)應(yīng)gt的iou即可。但是論文沒(méi)有這么做,我覺(jué)得直接按照f(shuō)cos的做法來(lái)確定正樣本區(qū)域,然后回歸shape,是完全可行。本文做法是采用了ApproxMaxIoUAssigner來(lái)確定的,ApproxMaxIoUAssigner和MaxIoUAssigner非常相似,僅僅多了一個(gè)Approx,其核心思想是:利用原始retinanet的每個(gè)位置9個(gè)anchor設(shè)定,計(jì)算9個(gè)anchor和gt的iou,然后在9個(gè)anchor中采用max操作,選出每個(gè)位置9個(gè)iou中最高的iou值,然后利用該iou值計(jì)算后續(xù)的MaxIoUAssigner,此時(shí)就可以得到每個(gè)特征圖位置上哪些位置是正樣本了。簡(jiǎn)單來(lái)說(shuō),ApproxMaxIoUAssigner和MaxIoUAssigner的區(qū)別就僅僅是ApproxMaxIoUAssigner多了一個(gè)將9個(gè)anchor對(duì)應(yīng)的iou中取最大iou的操作而已。
對(duì)于第二個(gè)問(wèn)題:正樣本位置對(duì)應(yīng)的shape target是啥,其實(shí)得到了每個(gè)位置匹配的gt,那么對(duì)應(yīng)的target肯定就是Gt值了。該分支的loss是bounded iou loss,公式如下:
上面寫的非常簡(jiǎn)陋,很多細(xì)節(jié)沒(méi)有寫,放在1.5節(jié)代碼分析中講解。
3.4 結(jié)果
可以看出非常符合預(yù)期。
3.5 代碼分析
(1) head
本文代碼分析以retinanet為主,網(wǎng)絡(luò)骨架和neck就沒(méi)啥說(shuō)的了,直接截圖:
就是ResNet+FPN結(jié)構(gòu),輸出5個(gè)分支進(jìn)行預(yù)測(cè)。stride為[8, 16, 32, 64, 128]。對(duì)于head部分,可以對(duì)比retinanet的head部分進(jìn)行查看:
左邊是GARetinaHead,右邊是RetinaHead,可以看出配置除了loss有區(qū)別外,都是一樣的。head部分的forward非常簡(jiǎn)單,和retinanet相比就是多了兩個(gè)shape_pred, loc_pred分支:
關(guān)于feature_adaption的作用作者在論文分享中:Guided Anchoring: 物體檢測(cè)器也能自己學(xué) Anchor(https://zhuanlan.zhihu.com/p/55854246)說(shuō)的很清楚了,我就不寫了。反正forward后就可以4個(gè)分支輸出。
(2) loss計(jì)算
(2-1) anchor的loc分支loss計(jì)算
loc輸出特征圖大小是(batch,1,h,w),本質(zhì)上是一個(gè)二分類器,用于找出語(yǔ)義前景區(qū)域。
核心參數(shù)是中心區(qū)域占據(jù)比例center_ratio=0.2,忽略區(qū)域占比ignore_ratio=0.5.首先需要計(jì)算loc分支的target,方便后面計(jì)算loss,對(duì)應(yīng)的函數(shù)是ga_loc_target,由于代碼比較多,不太好寫,我只能寫個(gè)大概流程出來(lái)。
有了每個(gè)特征圖上,每個(gè)位置是正負(fù)還是忽略樣本的結(jié)果,就可以針對(duì)預(yù)測(cè)的Loc特征圖計(jì)算focal loss了:
(2-2) anchor的shape分支loss計(jì)算
這個(gè)分支稍微復(fù)雜一點(diǎn)點(diǎn)。首先我們要先熟悉下train_cfg
對(duì)于GA分支,主要包括ApproxMaxIoUAssigner和RandomSampler,而原始的retinanet分類和回歸分支沒(méi)有任何改變,不再贅述。ApproxMaxIoUAssigner是用來(lái)近似計(jì)算shape特征圖分支上哪些位置負(fù)責(zé)預(yù)測(cè)gt bbox,而RandomSampler主要目的不是用來(lái)平衡正負(fù)樣本的,因?yàn)閟hape分支監(jiān)督的只有正樣本,沒(méi)有啥平衡問(wèn)題。上述兩個(gè)類非常關(guān)鍵,理解清楚了才能理解最核心的shape target計(jì)算過(guò)程。
(1) 計(jì)算5個(gè)特征圖上,每個(gè)位置9個(gè)anchor,組成anchor_list
這個(gè)函數(shù)和其他anchor-base的anchor生成過(guò)程完全相同,就是利用特征圖大小、anchor設(shè)置得到所有預(yù)設(shè)anchor的(x0,y0,x1,y1)坐標(biāo)
(2) 計(jì)算每個(gè)特征圖的每個(gè)位置上shape預(yù)測(cè)的基數(shù)
可能這個(gè)不好理解。其實(shí)在原文中作者指出shape分支直接預(yù)測(cè)gt bbox的寬高值不太穩(wěn)定,因?yàn)閿?shù)值波動(dòng)范圍比較大,為了穩(wěn)定,作者回歸的shape預(yù)測(cè)值實(shí)際上是在某個(gè)縮放系數(shù)下的值,具體是:
,s是每個(gè)特征圖的stride,w就是原始gt bbox寬,dw才是shape分支的預(yù)測(cè)值。上述的squares_list存儲(chǔ)的就是每層特征圖的每個(gè)位置的基數(shù),用于還原shape預(yù)測(cè)值到真實(shí)比例,由于anchor=1,且對(duì)于任意層而言是固定的,所以在代碼實(shí)現(xiàn)上作者也用了anchor_generate代碼來(lái)實(shí)現(xiàn)
可以明顯發(fā)現(xiàn)approx_generators是每個(gè)位置9個(gè)anchor,而square_generators每個(gè)位置是1個(gè)anchor,且是正方形。為了方便區(qū)分,你可以認(rèn)為squares_list存儲(chǔ)的就是每一層的還原基數(shù)而已,和anchor沒(méi)啥關(guān)系的,只不過(guò)可以等價(jià)實(shí)現(xiàn)而已。而guided_anchors_list其實(shí)就是在squares_list基礎(chǔ)上結(jié)合loc預(yù)測(cè)和shape預(yù)測(cè)得到的動(dòng)態(tài)anchor,用于訓(xùn)練原始的retinanet的分類和回歸分支。而如何利用squares_list、loc_pred和shape_pred得到最終的動(dòng)態(tài)anchor,做法非常簡(jiǎn)單,如下所示(測(cè)試階段也是這個(gè)流程):
(3) 計(jì)算shape target
在得到squares_list、approxs_list和gt_bboxes,下面核心就是計(jì)算shape target了。函數(shù)是:
計(jì)算shape target的流程包括2步:
1、確定哪些位置是正樣本,通過(guò)ApproxMaxIoUAssigner類實(shí)現(xiàn);
2. 每個(gè)正樣本位置的label,通過(guò)RandomSampler實(shí)現(xiàn)。
這兩個(gè)操作看起來(lái)和faster rcnn的rpn階段的loss計(jì)算相同,其實(shí)僅僅思想相同而已,但是實(shí)現(xiàn)差別還是很大的。
假設(shè)你已經(jīng)了解了MaxIoUAssigner的實(shí)現(xiàn)過(guò)程,而ApproxMaxIoUAssigner的實(shí)現(xiàn)是繼承自MaxIoUAssigner的,其核心差別是:
而MaxIoUAssigner僅僅有以下一行而已:
overlaps = bbox_overlaps(gt_bboxes, bboxes)
ApproxMaxIoUAssigner的做法是對(duì)于每個(gè)位置,先計(jì)算9個(gè)anchor和gt bbox的iou,然后max選擇最大iou,將anchor=9變成anchor=1(因?yàn)轭A(yù)測(cè)就是只有1個(gè)anchor),然后在這個(gè)overlaps基礎(chǔ)上再進(jìn)行MaxIoUAssigner分配機(jī)制,從而確定哪些位置是正樣本,同時(shí)會(huì)記錄每個(gè)位置負(fù)責(zé)的gt bbox索引,方便后面計(jì)算。下一步是RandomSampler函數(shù),但是要非常注意:retinanet的是RandomSampler調(diào)用過(guò)程:
assign_result = bbox_assigner.assign(anchors, gt_bboxes, gt_bboxes_ignore, gt_labels)
而ga分支的調(diào)用過(guò)程是:
# 確定了哪些位置是正樣本區(qū)域后,需要加入正樣本區(qū)域的squares值。注意這里加入的anchor不是近似anchor,而是squares sampling_result = bbox_sampler.sample(assign_result, squares, gt_bboxes)
函數(shù)內(nèi)部實(shí)現(xiàn)是一樣的,但是由于傳入的參數(shù)不一樣,所有解釋就不一樣了。第一行的輸入是anchor和gt bbox,意思是隨機(jī)采樣正負(fù)樣本,并且同時(shí)將gt bbox作為label,后面直接計(jì)算回歸loss,但是注意ga分支的輸入是assign_result和squares,而不是assign_result和gt bbox,也不是assign_result和approxs。也就是說(shuō)咱們暫時(shí)把每個(gè)正樣本位置shape預(yù)測(cè)值的target認(rèn)為是squares值,后面還會(huì)進(jìn)一步操作。
到這里為止,就已經(jīng)知道了shape_target返回的各個(gè)值含義了。bbox_anchors_list存儲(chǔ)的是所有正樣本位置的squares值,bbox_gts_list是對(duì)應(yīng)的gt bbox值,在得到所有需要的值后終于可以開(kāi)始計(jì)算shape target的loss了。
bbox_anchor其實(shí)就是bbox_anchors_list,將bbox_anchors_list和shape_pred經(jīng)過(guò)delta2bbox就還原得到真實(shí)的bbox預(yù)測(cè)值了,只不過(guò)由于本分支僅僅用于預(yù)測(cè)shape,故bbox_deltas的前兩個(gè)維度一直是0,loss_shape是BoundedIoULoss。
到此,核心代碼就分析完了。稍微難理解的就是shape target的計(jì)算過(guò)程了。
4 yolo-asff
論文名稱:Learning Spatial Fusion for Single-Shot Object Detection
源碼地址:https://github.com/ruinmessi/ASFF
簡(jiǎn)介
先貼性能:
首先可以看出是非常強(qiáng)的。雖然本文題目重點(diǎn)是說(shuō)ASFF層的牛逼地方,但是我覺(jué)得看本文,重點(diǎn)不在這里,而是yolov3的強(qiáng)baseline。
通過(guò)一些訓(xùn)練技巧,將yolov3從33.0mAP,提升到38.8mAP,我覺(jué)得這個(gè)才是重點(diǎn)需要學(xué)習(xí)的地方。這其實(shí)反映出一個(gè)明顯問(wèn)題:骨架的改進(jìn)固然重要,但是訓(xùn)練技巧絕對(duì)要引起重視,很多新提出的算法搞了半天提升了1個(gè)mAP點(diǎn),還不如從訓(xùn)練技巧上面想點(diǎn)辦法來(lái)的快(在人臉檢測(cè)領(lǐng)域就會(huì)針對(duì)人臉尺度問(wèn)題針對(duì)性的提出大量訓(xùn)練技巧,是非常高效的),畢竟訓(xùn)練技巧只會(huì)影響訓(xùn)練過(guò)程,對(duì)推理沒(méi)有任何額外負(fù)擔(dān),何樂(lè)不為。
ASFF
本文先分析不那么重要的部分,即本文最大改進(jìn)ASFF(Adaptively Spatial Feature Fusion)操作,其實(shí)熟悉BiFpn的人應(yīng)該馬上就能get到idea了,我覺(jué)得本質(zhì)上沒(méi)有啥區(qū)別。FPN操作是一個(gè)非常常用的用于對(duì)付大小尺寸物體檢測(cè)的辦法,作者指出FPN的缺點(diǎn)是不同尺度之間存在語(yǔ)義gap,舉例來(lái)說(shuō)基于iou準(zhǔn)則,某個(gè)gt bbox只會(huì)分配到某一個(gè)特定層,而其余層級(jí)對(duì)應(yīng)區(qū)域會(huì)認(rèn)為是背景(但是其余層學(xué)習(xí)出來(lái)的語(yǔ)義特征其實(shí)也是連續(xù)相似的,并不是完全不能用的),如果圖像中包含大小對(duì)象,則不同級(jí)別的特征之間的沖突往往會(huì)占據(jù)要素金字塔的主要部分,這種不一致會(huì)干擾訓(xùn)練期間的梯度計(jì)算,并降低特征金字塔的有效性。
一句話就是:目前這種concat或者add的融合方式不夠科學(xué)。本文覺(jué)得應(yīng)該自適應(yīng)融合,自動(dòng)找出最合適的融合特征,如下所示:
簡(jiǎn)要思想就是:原來(lái)的FPN add方式現(xiàn)在變成了add基礎(chǔ)上多了一個(gè)可學(xué)習(xí)系數(shù),該參數(shù)是自動(dòng)學(xué)習(xí)的,可以實(shí)現(xiàn)自適應(yīng)融合效果,類似于全連接參數(shù)。ASFF具體操作包括 identically rescaling和adaptively fusing。定義FPN層級(jí)為l,為了進(jìn)行融合,對(duì)于不同層級(jí)的特征都要進(jìn)行上采樣或者下采樣操作,用于得到同等空間大小的特征圖,上采樣操作是1x1卷積進(jìn)行通道壓縮,然后雙線性插值得到;下采樣操作是對(duì)于1/2特征圖是采樣3 × 3 convolution layer with a stride of 2,對(duì)于1/4特征圖是add a 2-stride max pooling layer然后引用stride 卷積。Adaptive Fusion
下面講解具體操作:
(1) 首先對(duì)于第l級(jí)特征圖輸出cxhxw,對(duì)其余特征圖進(jìn)行上下采樣操作,得到同樣大小和channel的特征圖,方便后續(xù)融合
(2) 對(duì)處理后的3個(gè)層級(jí)特征圖輸出,輸入到1x1xn的卷積中(n是預(yù)先設(shè)定的),得到3個(gè)空間權(quán)重向量,每個(gè)大小是nxhxw
(3) 然后通道方向拼接得到3nxhxw的權(quán)重融合圖
(4) 為了得到通道為3的權(quán)重圖,對(duì)上述特征圖采用1x1x3的卷積,得到3xhxw的權(quán)重向量
(5) 在通道方向softmax操作,進(jìn)行歸一化,將3個(gè)向量乘加到3個(gè)特征圖上面,得到融合后的cxhxw特征圖
(6) 采用3x3卷積得到輸出通道為256的預(yù)測(cè)輸出層
ASFF層學(xué)習(xí)得到的各種特征可視化效果如下:
強(qiáng)baseline
YOLOv3包括darknet53骨架網(wǎng)絡(luò)和3層特征金字塔網(wǎng)絡(luò)構(gòu)成的3個(gè)尺度輸出。
首先采用基于Bag of freebies for training object detection neural networks里面提出的訓(xùn)練策略來(lái)改進(jìn)性能,主要包括the mixup algorithm , the cosinelearning rate schedule和 the synchronized batch normalization。其次,由于最新論文表示iou loss對(duì)于邊界框回歸效果好,故作者也額外引入了一個(gè)iou loss來(lái)優(yōu)化bbox。最后,由于GA論文(Region proposal by guided anchoring)指出采用語(yǔ)義向?qū)降腶nchor策略可以得到更好的結(jié)果,故作者也引入了GA操作來(lái)提升性能??梢钥闯?,結(jié)合這些策略后,在coco上面可以得到38.8的mAP,速度僅僅慢了一點(diǎn)點(diǎn)(多了GA操作),可謂是非常強(qiáng)大,這也反應(yīng)出訓(xùn)練策略對(duì)最終性能的影響非常大。
the mixup algorithm , the cosinelearning rate schedule和 the synchronized batch normalization這三個(gè)策略非常常見(jiàn),沒(méi)啥好說(shuō)的。額外引入一個(gè)iou loss也是常規(guī)操作。我們重點(diǎn)分析GA的實(shí)現(xiàn)。為啥要重點(diǎn)分析GA操作呢?因?yàn)樽髡邔?shí)現(xiàn)的GA和原始論文的GA有點(diǎn)不同,很值得分析。
loss代碼分析
對(duì)應(yīng)的代碼是YOLOv3Head.py
首先和GA一樣,也是有FeatureAdaption,用于對(duì)動(dòng)態(tài)anchor特征進(jìn)行自適應(yīng)。
(1) 初始化函數(shù)
anchors里面存儲(chǔ)的就是原始yolov3的9組anchor,但是特別需要注意的是這里實(shí)現(xiàn)的anchor個(gè)數(shù)是4個(gè),而不是GA原文的1個(gè)anchor,這個(gè)小差別會(huì)導(dǎo)致后面代碼有些差別。按照GA論文做法,其實(shí)1個(gè)anchor就足夠了。而且需要注意這里的GA分支沒(méi)有輸出Loc,僅僅有shape預(yù)測(cè)。原因是loc分支的目的僅僅是用于進(jìn)行前后景提取,是個(gè)二分類問(wèn)題,但是由于yolo有confidence分支,其有前后景提取功能,故不再需要loc分支。loss函數(shù)方面,就是多了shape預(yù)測(cè)的IOUWH_loss函數(shù),以及bbox回歸額外引入的IOUloss,其余相同。
(2) forward函數(shù)
(2-1) 輸出預(yù)測(cè)值
對(duì)ASFF層輸出的每一層特征圖xin,進(jìn)行GA分支推理,并且經(jīng)過(guò)Feature_adaption,得到最終的bbox預(yù)測(cè)輸出output,由于wh預(yù)測(cè)肯定是大于0的,故作者采用了exp函數(shù)強(qiáng)制大于0.此時(shí)就得到了**wh_pred(batch,4,2,h,w)和output(batch,4,5+class,h,w)**。
(2-2) 將預(yù)測(cè)anchor變換到原圖尺度,得到guide anchor
(2-3) 前向模式下基于預(yù)測(cè)anchor直接進(jìn)行回歸即可得到最終bbox
(2-4) 訓(xùn)練模式下準(zhǔn)備target先準(zhǔn)備數(shù)據(jù):
計(jì)算匹配anchor和confidence mask
理解下面的操作才是理解了本文核心:
前面所有準(zhǔn)備都好了后,就是計(jì)算loss了:
可以看出前兩個(gè)loss是額外加入的。
GA的引入可以實(shí)現(xiàn):
(1) 在anchor設(shè)置不合理時(shí)候,動(dòng)態(tài)引導(dǎo)anchor預(yù)測(cè)分支得到更好的anchor
(2) 在anchor設(shè)置合理時(shí)候,可以加速收斂,且可以進(jìn)一步refine 默認(rèn)anchor
我覺(jué)得本文的GA實(shí)現(xiàn)過(guò)程非常好,思路清晰,很好理解,可以實(shí)現(xiàn)anchor-base混合anchor-free,發(fā)揮各自的優(yōu)勢(shì)。后續(xù)會(huì)進(jìn)行各種對(duì)比實(shí)驗(yàn),驗(yàn)證GA在yolo中的引導(dǎo)作用。
審核編輯 :李倩
-
代碼
+關(guān)注
關(guān)注
30文章
4807瀏覽量
68800 -
目標(biāo)檢測(cè)
+關(guān)注
關(guān)注
0文章
209瀏覽量
15638
原文標(biāo)題:目標(biāo)檢測(cè)正負(fù)樣本區(qū)分策略和平衡策略總結(jié)
文章出處:【微信號(hào):3D視覺(jué)工坊,微信公眾號(hào):3D視覺(jué)工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論