在計算機視覺中,目標檢測是一個難題。在大型項目中,首先須要先進行目標檢測,獲得對應類別和座標後,才進行以後的各類分析。如人臉識別,一般是首先人臉檢測,獲得人臉的目標框,再對此目標框進行人臉識別。若是該物體都不能檢測獲得,則後續的分析就無從入手。所以,目標檢測佔據着十分重要的地位。在目標檢測算法中,一般能夠分紅One-Stage單階段和Two-Stage雙階段。而在實際中,我常常接觸到的是One-Stage算法,如YOLO,SSD等。接下來,對常接觸到的這部分One-stage單階段目標檢測算法進行小結。本文one stage檢測算法包括有YOLO系列,SSD,FSSD,DSOD,Tiny DSOD,RefineNet,FCOS。html
YOLO能夠說是最先的One-stage目標檢測算法之一,通過做者的優化,存在3個版本。git
Yolo v1在《You Only Look Once: Unified, Real-Time Object Detection》中提出。在Yolo以前的目標檢測算法,如R-CNN系列,其網絡相對比較複雜,耗時大,難以優化(由於每一個單獨的部分是獨立訓練的)。所以,做者將目標檢測認爲是一個獨立的迴歸任務,迴歸每一個分離的預測框座標及其對應的類別機率,使其具備如下的優勢:github
介紹完Yolo的優勢後,咱們來看看其思想,以下圖所示。首先,Yolo將一張輸入圖片分紅S*S格。若是GT框的中心落在某格(grid cell)上,則該格負責預測這個目標。每格會預測B個預測框及B個置信度得分。該置信度得分反映的是該格包含物體的置信度和這個預測框有多準。所以,對於該置信度得分,其定義爲$Pr(Object)*IOU^{truth}_{pred}$。若是沒有物體的中心在該格上,則該置信度得分爲0;若是有物體的中心在該格上,則咱們但願置信度得分等於IOU。所以,對於每一個預測框而言,都會預測5個值,分別是中心點$(x,y)$,寬高$(w,h)$,和上述的置信度得分。算法
對於每格而言,除了預測B個預測框及其置信度外,還會預測C個類別的條件機率$Pr(Class_i|Object)$。以VOC0712爲例,就會預測$C=20$個類別的機率。這個機率是條件機率,在存在目標的前提下,其爲第i類的機率。每格會共用這樣的機率,與B個預測框無關。在測試階段,每格類別的置信度得分等於類別的條件機率乘以每格預測框的置信度得分:網絡
$$Pr(Class_i|Object)*Pr(Object)*IOU^{truth}_{pred}=Pr(Class_i)*IOU^{truth}_{pred}$$框架
能夠看出,每格類別的置信度不只表示了這個類別出現的機率,並且也反映了預測框是否擬合GT框。ide
在該論文中,$S=7,B=2$,因此最後輸出的是$7*7*30$的張量,能夠當作是49個30維的向量,這30維的向量包含了以下圖的信息。函數
值得留意的是,Yolo並無預設不一樣大小的anchor。網絡進行前向運算後,每格會輸出2個預測框,將該預測框與GT框進行匹對和計算IOU,此時才能肯定使用IOU大的那個預測框來負責預測該對象。所以,Yolo的損失函數是各項偏差平方和的一個加權:性能
其中,$1^{obj}_i$表示物體的中心是否位於第i格,$1^{obj}_{ij}$表示第i個格子的第j個預測框中存在對象,$1^{noobj}_{ij}$表示第i格子的第j個預測框中不存在對象。損失函數的第一項表示當第i個格子的第j個預測框中存在對象時,其中心點偏移的偏差;第二項表示當第i個格子的第j個預測框中存在對象時,寬高的偏差;第三項表示當第i個格子的第j個預測框中存在對象時,其置信度得分偏差,真實的$C_i$應該等於IOU;第四項表示當第i格子的第j個預測框中不存在對象時,其置信度得分偏差,真實的$C_i$應該等於0;第五項表示當物體中心在第i格時,其類別偏差。其中,還有$\lambda _{coord}$調整預測框位置偏差的權重,$\lambda _{noobject}$調整不存在目標的預測框的置信度權重,通常是調低不存在對象的預測框的置信度偏差的權重。學習
Yolo v1的不足:
參考資料:
Yolo v2在《YOLO9000: Better, Faster, Stronger》中提出。爲了解決Yolo v1的不足,做者使用了融合了多種思路來提升了網絡的性能,使得mAP獲得大幅度提高;爲了加快推理速度,使用新的模型結構;爲了能檢測出更多的對象,提出了新的聯合訓練機制,結合分類數據集(如ImageNet)和檢測數據集(如COCO和VOC),使得YOLO V2能檢測出更多的類別。
在提升網絡性能上,做者使用瞭如下的思路:
將上述的思想融合起來,最終的實驗效果以下圖所示。實驗效果的增幅仍是挺明顯的,將v2提升了近15個點的mAP。
做者不只想讓Yolo v2的mAP更高,並且還想讓其更快。在v1中,使用的網絡結構是基於Inception的,其速度比VGG快,但性能略遜色於VGG。所以,做者提出了新的分類網絡,Darknet-19,做爲Yolo v2的主幹網絡,以下圖所示。該網絡中含有19個卷積層和5個池化層。
YOLO v2的訓練主要包括三個階段。第一階段就是先在ImageNet分類數據集上預訓練Darknet-19,此時模型輸入爲224*224 ,共訓練160個epochs。而後第二階段將網絡的輸入調整爲448*448 ,繼續在ImageNet數據集上finetune分類模型,訓練10個epochs,此時分類模型的top-1準確度爲76.5%,而top-5準確度爲93.3%。第三個階段就是修改Darknet-19分類模型爲檢測模型,移除最後一個卷積層、global avgpooling層以及softmax層,而且新增了三個 3*3*1024卷積層,同時增長了一個pass through層,最後使用 1*1 卷積層輸出預測結果,輸出的channels數爲:num_anchors*(5+num_classes) ,和訓練採用的數據集有關係。因爲anchors數爲5,對於VOC數據集(20種分類對象)輸出的channels數就是125,最終的預測矩陣T的shape爲 (batch_size, 13, 13, 125),能夠先將其reshape爲 (batch_size, 13, 13, 5, 25) ,其中 T[:, :, :, :, 0:4] 爲邊界框的位置和大小$(t_x,t_y,t_w,t_y)$,T[:, :, :, :, 4] 爲邊界框的置信度,而 T[:, :, :, :, 5:] 爲類別預測值。
在VOC數據集中,只有20類物體能夠進行檢測。但實際生活中,物體的類別數是遠遠大於20種的。所以做者想結合分類數據集和檢測數據集來進行聯合訓練,使得檢測的類別數能大幅度提升。這種聯合訓練方式的基本思想是,若是是檢測樣本,其loss就包含分類偏差和定位偏差;若是是分類樣本,其loss就只包含分類偏差。
因爲我沒有對這一塊作過多研究,瞭解不深。但該方法最主要的是構建Word Tree。由於數據集的不一樣,致使每一個標籤之間不是互斥的,存在包含關係,例如在COCO數據集中的一個類別是「狗」,而在ImageNet中包含了多種狗的標籤。因此,經過構建word tree來將全部標籤信息串聯起來,相似於「樹」的結構,父節點包含了不一樣類別的子結構。
參考資料:
Yolo v3提出於《YOLOv3: An Incremental Improvement》中,在v2版本上,進一步進行了改進,整體來講,改進力度有限,下面來分別看看這些改進措施。
首先,在預測類別時,不使用softmax,而是使用logistic進行預測。由於這樣有利於多標籤預測。當使用複雜領域的數據集時,可能會出現標籤不互斥的狀況(如woman和person),使用多標籤的方法會更加有利於模型,即便用logistic
第二,使用了新的網絡Darknet-53,以下圖所示。在v2中,使用的backbone是Darknet-19,而在v3中,不只網絡層數增長了,並且還借鑑了ResNet的思想,使用多個連續的3*3和1*1卷積層,而且帶有shortcut鏈接。根據做者提供的實驗比較,在ImageNet中,Darknet-53具備與ResNet-152類似的準確率,但速度是其兩倍。
第三,利用多尺度信息來進行預測。這裏借用一下這位博主的圖,其總體的網絡結構,以下圖所示。在v3中,利用了不一樣尺度的信息進行預測,我認爲做者的這種方式,其應該是借鑑了FPN的思想。使用3個尺度的特徵圖進行預測,如圖上黃色方塊表示的同樣,在第79層後,進行上採樣,上採樣獲得的特徵圖與第61層的特徵圖進行融合,再進行上採樣,與第36層的特徵圖融合。
第四,使用K-means聚類獲得錨點框的尺寸。和v2版本採用方法一致,v3這裏使用了3個不一樣尺寸的特徵圖進行預測,在每層特徵圖中使用3種不一樣尺寸的錨點框,如下圖所示。爲小尺寸的特徵圖分配大尺寸的錨點框,適合檢測大目標;爲大尺寸的特徵圖分配小尺寸的錨點框,適合檢測小目標。
以COCO爲例,v3使用3個特徵圖來進行預測,每一個特徵圖會對應3種錨點框,所以,對於每層特徵圖,其輸出的tensor爲$N*N*[3*(4+1+80)]$,其中,$N$表示特徵圖的尺寸,$3$表示3個錨點框,$4$表示4個座標值,$1$表示是否包含物體的置信度(v3的置信度貌似與v1中的置信度不同),$80$表示COCO數據集的類別總數。
參考資料:
SSD算法提出於《SSD:Single Shot MultiBox Detector》 中,一樣是一篇很是經典的one stage目標檢測算法,其框架也衍生出了不少系列。以前,我曾經對SSD進行過總結和代碼復現,想仔細瞭解的能夠參考來閱讀如下,這裏主要是歸納性回顧如下。
以下圖所示,是SSD的框架網絡,其使用了6個不一樣尺寸的特徵圖來進行預測,分別是$(38*38),(19*19),(10*10),(5*5),(3*3),(1*1)$。這6個特徵層會分別通過3*3的卷積後分紅分類頭和檢測頭,分別用於預測座標誤差值和類別置信度(包含背景)。相比於YOLO V1和YOLO V2,SSD使用了多個特徵層,更適合檢測多種不一樣尺度的目標。
其次,在這6個不一樣尺寸的特徵圖中,還使用了不一樣大小和寬高比的錨點框。每一個特徵圖使用不一樣於其餘層的錨點框尺寸,而在該尺寸上又設置4種或者6種不一樣的寬高比。在大尺寸特徵圖是同小尺寸的錨點框,來檢測小目標;在小尺寸的特徵圖使用大尺寸的錨點框,來檢測大目標。這樣的設置方式,日後不少SSD系列都採起這種方式。所以,整個SSD中,會檢測8732個錨點框的座標誤差值和類別置信度。
第三,使用了OHEM進行難例挖掘,來緩解正負樣本的不平衡。在SSD中,並無使用全部的負樣本,而是將這些匹配上背景的樣本根據置信度損失進行降序排列,將損失較大的樣本認爲是難例(hard negative),須要模型重點學習。選取損失最大的前N個樣本做爲負樣本,正樣本與負樣本的比例控制在1:3左右,對於那些沒有選上的樣本,label設置成-1,不參與訓練當中。
做者還強調了數據加強對網絡性能有着明顯提高。能夠這麼理解,經過數據加強,間接提升了數據量和樣本之間的多樣性,從而提升了模型的魯棒性。另外,空洞卷積一樣能夠提升了SSD的mAP,經過空洞卷積,是能在參數量不變的前提下感覺野變大,使網絡能「看」到的東西更多。
FSSD提出於《FSSD: Feature Fusion Single Shot Multibox Detector》中,使用了輕量化的FPN結構,來提升SSD的小目標檢測效果。
在SSD中,對小目標的檢測效果不佳,召回率低。由於小目標一般是淺層網絡來進行預測的,特徵抽象能力不足,缺少語義信息;其次,小目標檢測一般嚴重依賴於上下文信息。所以,FPN的提出是爲了使淺層特徵和深層特徵進行融合,更好的輔助淺層特徵來進行目標檢測,進而提升小目標的檢測效果。FPN的結構以下圖的(c)所示。(b)是YOLO v1和v2系列的結構示意圖;(d)是SSD系列的結構示意圖。
在FPN結構中,右邊的特徵層是隻由上一層的右邊特徵層和同一層的左邊特徵層進行融合的,缺少不一樣層特徵層之間的融合;其次,上一層的右邊特徵層和同一層的左邊特徵層的融合是十分耗時的。所以,在FPN的基礎上,做者提出了一種輕量化的FPN結構,與SSD進行結合,構成了FSSD,如上圖的(e)所示。FSSD的主要思想是,以合適的方式一次性融合全部不一樣層級的特徵層,而後基於此特徵層來生成特徵金字塔。
FSSD的網絡結構以下圖所示。做者認爲當特徵圖的尺寸小於$10*10$時,信息特徵太少,對特徵融合增益不大,所以,使用了conv3_3,conv4_3,fc_7和conv7_2四個特徵層來進行融合(圖中只畫了3個)。首先對這4個特徵層進行$1*1$卷積來下降通道數,下降到256維。而後以conv4_3的特徵圖尺寸$38*38$爲基礎,其它特徵層進行下采樣或者上採樣來是特徵圖的尺寸變成$38*38$,至此,全部圖中黃色的特徵圖都有了相同的特徵圖空間尺寸了。
而後對這4個黃色特徵圖進行融合,融合方式有兩種:concat或者ele-sum。經過實驗發現,concat的效果更好。所以,將這4個黃色特徵圖進行concat起來,構成了$38*38*1024$的tensor。因爲不一樣層的特徵圖的分佈是不一致的,所以,對這$38*38*1024$的tensor進行BN操做。最後對融合後的特徵層進行下采樣(論文中使用bottlenet結構來進行下采樣),產生綠色的特徵層,使用這些不一樣尺寸的綠色特徵層來進行目標檢測。
最終實驗代表在犧牲少許速度的前提下,FSSD的mAP比原版的SSD要高,特別是對小目標的召回率提升了不少。
DSOD提出於《DSOD: Learning Deeply Supervised Object Detectors from Scratch》中。目前,大部分目標檢測算法都須要使用預訓練模型來提升檢測效果。可是因爲分類任務和檢測任務的損失函數的類別分佈不一樣,使用預訓練模型會引入學習誤差;同時當分類場景和檢測場景具備很大差別時,使用預訓練模型的效果也不佳。所以,最好的辦法是對檢測網絡進行從頭訓練,不使用預訓練模型。爲此,做者提出了DSOD模型來解決從頭開始訓練的問題。
DSOD的結構以下圖的右邊所示,左邊是SSD的網絡結構,右邊是DSOD的網絡結構。能夠看出,DSOD的結構與SSD十分相似,但其主幹網絡是DenseNet。前面兩個特徵層是DenseNet主幹網絡生成的,第1個特徵層一路直接送到預測中,另一路通過pool和conv層後,與第2個特徵成concat後再送入預測。隨後,會分紅2條支路,一路流經pool和conv來進行dowm-sample,另一路輸入到$1*1$和$3*3$的卷積中;兩路進行concat後再送入預測。
最後,做者總結了下,解決從頭訓練問題的幾條原則:
綜上所述,做者利用DenseNet做爲主幹網絡,提出了DSOD算法,解決了從頭訓練的問題。
Tiny DSOD提出於《Tiny-DSOD: Lightweight Object Detection for Resource-Restricted Usages》。目前不少目標檢測算法對計算資源有限的硬件設備都不太有友好,所以,做者在DSOD的基礎上,提出了輕量化的目標檢測網絡Tiny DSOD。該Tiny DSOD引入了兩個創新且高效的結構:depthwise dense block (DDB)和depthwise feature-pyramid-network (D-FPN)。
首先,在DSOD中,使用的主幹網絡是DenseNet,其結構以下圖所示。輸入分紅兩路,通過$1*1*C$和$3*3*C/4$的卷積後,輸出C/4個通道的tensor,而後與輸入進行concat。這樣作的計算成本大。
受到MobileNet的啓發,做者將深度可分離卷積融合進DenseNet中,並命名爲DDB結構。該DDB結構有兩種形式,以下圖所示。其中,DDB-a中含有倒殘差結構的思想,先將有n個通道的輸入擴大至$w*n$個通道,$w$表示人爲設置的超參,用於控制擴張倍數;而後進行$3*3$的卷積;接着進行$1*1$的卷積,但通道數降至$g$;最後將二者進行concat,造成$n+g$個通道的特徵圖。能夠認爲$g$表示DDB-a的增加率。可是,這種結構DDB-a的複雜度是$O(L^3g^2)$,隨着網絡層數$L$的增長,計算資源消耗也會快速增長,因此要控制增加率$g$,將$g$約束在較小的值。然而,增加率$g$較小,又會使模型的泛化能力變差。
基於上述的考慮,又提出了DDB-b這種結構。輸入首先會壓縮成$g$維,而後進行$3*3$的卷積,最後將二者進行concat起來,造成$n+g$維的輸出。所以,總體的複雜度爲$O(L^2g^2)$。在實驗中發現,DDB-b這種結構不只更加高效,並且在資源有限的狀況下準確率更高。所以,在Tiny DSOD中,使用了DDB-b這種結構。
所以,Tiny DSOD的網絡結構以下圖所示。對於增加率$g$值而言,做者採用了淺層網絡使用小$g$值、深層網絡採用大$g$值得策略。由於淺層網絡的特徵圖尺寸大,須要消耗更多的計算資源,而$g$值比較小時,能節省部分計算計算。
Tiny DSOD的另一個結構是D-FPN,以下圖所示。結合了FPN的思想,設計了一種輕量化的D-FPN結構,來使深層次的語義信息與淺層特徵進行融合。這裏的downsample結構與DSOD的結構相似,利用多分枝思想,融合不一樣感覺野的信息,可是與DSOD不一樣的是,輸出的通道維數變小了和使用了深度可分離卷積。
綜上所示,在DSOD基礎上,Tiny DSOD融合了DDB結構和FPN結構,下降計算資源的前提下,同時也提升檢測效果。
RefineDet提出於《Single-Shot Refinement Neural Network for Object Detection》中。總所周知,two stage目標檢測器能實現較高的精度,而FPS較慢;one stage目標檢測器的FPS很高,但卻犧牲必定精度。two stage能取得較高的精度,是由於:
所以,做者對one stage和two stage目標檢測器進行取長補短,提出了RefineDet,結構以下圖所示,能實現比two stage檢測器更高的精度,且能保持較好的運行效率。其中,主要由兩個模塊組成:anchor refiement module (ARM)和object detection module (ODM)。
ARM模塊主要負責:
ARM模塊會先對錨點框進行判斷,判斷錨點框內是否含有物體,屬於二分類;而後再粗調錨點框的位置,來傳遞給ODM來進一步二次迴歸。其實這ARM的做用,有點相似Faster R-CNN中的RPN模塊。若是ARM中預測出該錨點框屬於背景的置信度大於必定閾值時,就會忽略這個錨點框。也就是ARM模塊只會給ODM模塊傳遞粗調過的難負例錨點框和粗調過的正錨點框。
而ODM模塊主要負責將粗調過的錨點框來對其進行二次座標迴歸和類別預測。如圖中綠色帶星星的方塊圖,星星表示粗調後的錨點框,傳遞給ODM,ODM在這基礎上來進一步預測。
同時,做者還借鑑了FPN的思想,設計了transfer connection block (TCB)來將ARM中的特徵傳遞給ODM,能夠看到,其將深層語義與淺層語義進行融合,這樣應該會進一步提升模型的性能。
FCOS提出於《FCOS: Fully Convolutional One-Stage Object Detection》中,是一種anchor-free的檢測模型。目前,大部分檢測模型都是基於預設的錨點框,如SSD系列,做者就思考:目標檢測算法是否必定須要錨點框才能取得較好的性能?而基於錨點框的目標檢測算法,具備如下的不足:
所以,做者基於全卷積網絡,提出FOCS檢測模型。該FCOS會在每層特徵圖的每一個特徵點上預測四維向量和類別,以下圖的左邊所示。這四維向量是$(l,t,r,b)$,分別表示該點到檢測框四條邊的相對距離。同時,當該像素點遠離GT框的中心點位置時,會產生不少低質量的預測框。爲了抑制這些低質量的預測框,在網絡中引入了一個分支「center-ness」,來預測像素點到目標框中心的偏移程度,以此來下降低質量預測框的權重。
所以,FCOS的網絡結構,以下圖所示。FCOS結合了FPN模塊,並對FPN模塊進行了相應的修改,$(P6,P7)$是經過$P5$下采樣獲得的。而後會分紅分類頭和迴歸頭,分別是4組卷積。最後在分類頭處,還有一個Center-ness的分支。
對於特徵圖$F_i$的每一個位置$(x,y)$,會映射回原圖的$\left (\left \lfloor \frac{s}{2} \right \rfloor +xs,\left \lfloor \frac{s}{2} \right \rfloor +ys\right )$,其中$s$表示該特徵層的下采樣率。當映射回去後,若是該點位於GT框內,則認爲其是正樣本,與GT框的標籤一致,直接進行迴歸與預測。若是改變位於多個GT框的交集區域,就將該點指定給面積最小的那個GT框。因爲迴歸的值老是正值,所以在迴歸頭處採用了$e^x$對座標值進行映射。使用anchor-free這種方式,使負樣本的數量減小,有利於正負樣本之間的平衡。同時,對於anchor-based的方式,每一個特徵點有6個或者9個錨點框須要預測,而anchor-free則只需迴歸一次,總體輸出少了9倍左右。
在FCOS中的FPN起到了很重要的做用,主要解決了如下兩個大問題:
使用了FPN的FCOS,須要在不一樣特徵層處預測不一樣大小的物體。不像anchor-based那樣,爲每層特徵層指定不一樣大小的錨點框。FCOS則是首先爲每一個特徵圖的位置點計算須要迴歸的距離$(l^*,t^*,r^*,b^*)$。當$m_{i-1}<max(l^*,t^*,r^*,b^*)<m_i$時,纔會認爲該點是正樣本,送入迴歸。其中,$m_i$表示第$i$層特徵圖的最大回歸距離。即迴歸的4個值中的最大值須要位於兩個特徵層的最大回歸距離之間。也能夠理解成該特徵層只對大小爲$[m_{i-1},m_i]$的物體進行迴歸。當這個最大值超出最大回歸距離範圍之間時,就認爲是負樣本,不進行訓練。這樣作是由於應該對迴歸進行限制,不可能無限制的迴歸,進行大值迴歸可能效果很差,與錨點框的思想一致。
在最後進行預測和迴歸的時候,FPN中不一樣特徵層共享同一個head(即那4組卷積),這樣作不只節省了參數,並且還提升了檢測性能。可是,不一樣特徵層用來回歸不一樣尺寸的目標,讓全部特徵層共享一個head彷佛不太合理。所以,做者使用了一組能夠訓練的變量$s_i$來爲每層特徵層自動調整指數函數的底,因此,在迴歸頭處使用的指數函數再也不是$e^x$,而是$e^{s_ix}$。
即便使用了FPN,FCOS的性能依然與anchor-based的檢測器有差距,緣由是遠離目標中的爲位置會產生大量低質量的預測框,就是離目標中心越遠,預測框的效果反而更差。所以,做者想要在不引入超參的狀況下,抑制這些低質量的檢測框,其作法就是引入了一條分支Center-ness。這條Center-ness分支輸出一個$H\times W\times 1$的tensor,表示該點到目標中心點的「距離權重」,以下圖所示,「距離權重」的值在$[0,1]$之間。在測試的時候,最終輸出的分數應該是Center-ness與分類置信度的得分進行相乘。因此,Center-ness能起到下降遠離目標中心的得分權重的做用。而Center-ness的另外一種替代形式是隻使用真實框中心的附近點做爲正樣本,人爲引入一個超參來抑制遠距離的特徵點的影響。做者發現,將這兩種方式進行結合起來使用,能取得更佳的效果。
$$centerness^*=\sqrt{\frac{min(l^*,r^*)}{max(l^*,r^*)}\times \frac{min(t^*,b^*)}{max(t^*,b^*)}}$$
最終損失函數的組成應該有3部分,分別是置信度損失、迴歸損失和centerness損失(二值交叉熵損失)。其中,$\lambda $和$\alpha $分別平衡二者的權重。能夠看出,損失函數中都是隻是用正樣本參與計算。在源碼中計算損失函數時,centerness層的值除了計算二值交叉熵損失外,還會與迴歸損失進行結合,下降遠離中心點的特徵點的迴歸損失。而在測試時,centerness層的值直接與置信度相乘,使用相乘後的置信度來進行後處理。
$$Loss=\frac{1}{N_{pos}}\sum_{x,y}L_{cls}(p_{x,y},c^*_{x,y})+\frac{\lambda }{N_{pos}}\sum_{x,y}\mathbb{I}_{c^*_{x,y}}L_{reg}(t_{x,y},t^*_{x,y})+\alpha L_{center-ness}(d,d^*)$$
下圖是FCOS算法的性能,能夠看出,在不採起改進措施的前提下,FCOS已經能和RetinaNet媲美了。在使用了(a)center-ness層放在迴歸頭處、(b)只在目標框的中心附近採樣、(c)使用GIOU做爲迴歸損失函數、(d)標準化目標迴歸函數,等改進措施後,性能更是進一步提升。
參考資料:
以上我是在以爲在one stage目標檢測中比較經典的算法,爲此特地準備回顧了一下。歡迎批評指教。