導讀
本文對目標檢測領域的一些共性問題進行了總結,并給出了詳細的解答。
目標檢測兩階段和一階段的核心區(qū)別
目標檢測技術從階段上分為兩種,一階段和二階段。二階段的核心思想是首先提出proposal框,通過第一階段的網絡回歸出目標框的大概位置、大小及是前景的概率,第二階段是通過另一個網絡回歸出目標框的位置、大小及類別;而一階段網絡的核心是,對于輸入圖像,通過網絡直接回歸出目標大小、位置和類別。
目標檢測兩階段比一階段的算法精度高的原因
1.正負樣本的不均衡性
當某一類別的樣本數特別多的時候,訓練出來的網絡對該類的檢測精度往往會比較高。而當某一類的訓練樣本數較少的時候,模型對該類目標的檢測精度就會有所下降,這就是所謂樣本的不均衡性導致的檢測精度的差異。
對于一階段的目標檢測來說,它既要做定位又要做分類,最后幾層中1×1的卷積層的loss都混合在一起,沒有明確的分工哪部分專門做分類,哪部分專門做預測框的回歸,這樣的話對于每個參數來說,學習的難度就增加了。
對于二階段的目標檢測來說(Faster RCNN),在RPN網絡結構中進行了前景和背景的分類和檢測,這個過程與一階段的目標檢測直接一上來就進行分類和檢測要簡單的很多,有了前景和背景的區(qū)分,就可以選擇性的挑選樣本,是的正負樣本變得更加的均衡,然后重點對一些參數進行分類訓練。訓練的分類難度會比一階段目標檢測直接做混合分類和預測框回歸要來的簡單很多。
2.樣本的不一致性
怎么理解樣本不一致性呢?首先我們都知道在RPN獲得多個anchors的時候,會使用一個NMS。在進行回歸操作的時候,預測框和gt的IoU同回歸后預測框和gt的IOU相比,一般會有較大的變化,但是NMS使用的時候用的是回歸前的置信度,這樣就會導致一些回歸后高IoU的預測框被刪除。這就使得回歸前的置信度并不能完全表征回歸后的IoU大小。這樣子也會導致算法精度的下降。在第一次使用NMS時候這種情況會比較明顯,第二次使用的時候就會好很多,因此一階段只使用一次NMS是會對精度有影響的,而二階段目標檢測中會在RPN之后進行一個更為精細的回歸,在該處也會用到NMS,此時檢測的精度就會好很多。
如何解決目標檢測中密集遮擋問題
遮擋本身也可以分為兩種類型,一種是由于非目標造成的遮擋,一種是由于也是需要檢測的目標造成的遮擋。這兩種遮擋分別被叫做occlusion和crowded。
對于前一種類型遮擋,很難有針對性的辦法去解決,最好的辦法也就是使用更多的數據和更強的feature。可以從訓練數據入手。加掩膜,加擾動,提高算法對遮擋的應對能力。
對于第二種遮擋,提出了兩個針對這個問題的loss,
通過設置損失函數的方式,即Repulsion Loss,使預測框和所負責的真實目標框的距離縮小,而使得其與周圍非負責目標框(包含真實目標框和預測框)的距離加大 。如下式,如果與周圍目標的距離越大,損失值會越小。
除了常用的smooth L1使回歸目標與GT接近之外,這兩個loss一個的目標是使proposal和要盡量遠離和它overlap的第二大的GT,另一個目標是要上被assign到不同GT的proposal之間盡量遠離。通過這兩個loss,不僅僅使得proposal可以向正確的目標靠近,也可以使其遠離錯誤的目標,從而減少NMS時候的誤檢。
“狹長形狀”目標檢測有什么合適方法
使用可旋轉bonding box進行標注
手工設計anchors
如何解決動態(tài)目標檢測
1.光流法
光流是空間運動物體被觀測面上的像素點運動產生的瞬時速度場,包含了物體表面結構和動態(tài)行為的重要信息。光流計算法大致可分為三類:
(1)基于匹配的光流計算方法,包括基于特征和基于區(qū)域的兩種?;谔卣鞯姆椒ㄊ遣粩嗟貙δ繕酥饕卣鬟M行定位和跟蹤,對大目標的運動和亮度變化具有魯棒性,存在的問題是光流通常很稀疏,而且特征提取和精確匹配也十分困難;基于區(qū)域的方法先對類似的區(qū)域進行定位,然后通過相似區(qū)域的位移計算光流,這種方法在視頻編碼中得到了廣泛的應用,但它計算的光流仍不稠密。
(2)基于頻域的方法利用速度可調的濾波組輸出頻率或相位信息,雖然能獲得很高精度的初始光流估計,但往往涉及復雜的計算,而且可靠性評價也十分困難。
(3)基于梯度的方法利用圖像序列的時空微分計算2D速度場(光流)。由于計算簡單和較好的實驗結果,基于梯度的方法得到了廣泛應用。
2.相鄰幀差法
相鄰幀差法是在運動目標檢測中使用的最多的一類算法。原理就是將前后兩幀圖像對應的像素值相減,在環(huán)境亮度變化不大的情況下,如果對應像素值相差值很小,可認為此處景物是靜止的,反之,則是運動物體。
相鄰幀差法對于動態(tài)環(huán)境具有較強的自適應性,魯棒性較好,能夠適應各種動態(tài)環(huán)境,但一般不能完全提取出所有相關的特征像素點,這樣在運動實體內部容易產生空洞現象。
3.背景差法
背景差法是常用的運動目標檢測方法之一。它的基本思想是將輸入圖像與背景模型進行比較,通過判定灰度等特征的變化,或用直方圖等統(tǒng)計信息的變化來判斷異常情況的發(fā)生和分割運動目標。
與幀間差法比較,背景差法可以檢測視頻中停止運動的物體,其缺點是背景的更新導致算法的復雜性增加,實時性變差。
4. 基于事件相機來做
事件相機是具有微秒反應時間的仿生傳感器,可記錄每像素亮度變化的異步流,稱為“事件”。事件相機通過檢測每個像素的亮度變化來生成一個事件,相比于傳統(tǒng)相機,更適合在高動態(tài)和高速度的環(huán)境下使用,具有高動態(tài)范圍 (HDR)、高時間分辨率和無運動模糊的優(yōu)勢。
- 高動態(tài)范圍:對于傳統(tǒng)相機來說,在黑暗的情況下,傳統(tǒng)的相機幾乎沒有辦法使用,但對于事件相機來說,只檢測正在運動的物體,所以無論是黑暗情況還是有光亮的情況,事件相機都可以發(fā)揮作用。
- 低延時:相鄰事件之間的時間可以小于1毫秒
- 無運動模糊:即使是高速運動的物體,事件相機也可以捕獲到
FPN的作用
FPN是在卷積神經網絡中圖像金字塔的應用。圖像金字塔在多尺度識別中有重要的作用,尤其是小目標檢測。頂層特征上采樣后和底層特征融合,每層獨立預測。
fpn設計動機:
1.高層特征向低層特征融合,增加低層特征表達能力,提升性能
2.不同尺度的目標可以分配到不同層預測,達到分而治之。
FPN每層做特征融合的特征圖有兩個,首先是前向傳播,然后取了每個特征圖做上采樣(最近鄰插值),對應前向傳播的特征圖做融合。融合的方式是:通過1x1卷積調整通道數,然后直接add。之后進行3x3卷積操作,目的是消除上采樣的混疊效應。
其實,fpn真正起作用的是分而治之的策略,特征融合的作用其實很有限,此外fpn存在消耗大量顯存,降低推理速度。
為什么FPN采用融合以后效果要比使用pyramidal feature hierarchy這種方式要好?
卷積雖然能夠高效地向上提取語義,但是也存在像素錯位問題,通過上采樣還原特征圖很好地緩解了像素不準的問題。
backbone可以分為淺層網絡和深層網絡,淺層網絡負責提取目標邊緣等底層特征,而深層網絡可以構建高級的語義信息,通過使用FPN這種方式,讓深層網絡更高級語義的部分的信息能夠融合到稍淺層的網絡,指導淺層網絡進行識別。
從感受野的角度思考,淺層特征的感受野比較小,深層網絡的感受野比較大,淺層網絡主要負責小目標的檢測,深層的網絡負責大目標的檢測(比如人臉檢測中的SSH就使用到了這個特點)。
FPN在RPN中的應用
rpn在faster rcnn中用于生成proposals,原版rpn生成在每個image的最后一張?zhí)卣鲌D上生成3x3個proposal。但實際上,小目標下采樣到最后一個特征圖,已經很小了。fpn可以在之前的多個特征圖上獲得proposal,具體做法是:在每個feature map上獲得1:1、1:2、2:1長寬比的框,尺寸是{32^2、64^2、128^2、256^2、512^2}分別對應{P2、P3、P4、P5、P6}這五個特征層上。P6是專門為了RPN網絡而設計的,用來處理512大小的候選框。它由P5經過下采樣得到。
如何解決小目標識別問題
通用的定義來自 COCO 數據集(https://so.csdn.net/so/search%3Fq%3D%25E6%2595%25B0%25E6%258D%25AE%25E9%259B%2586%26spm%3D1001.2101.3001.7020),定義小于 32x32 pix 的為小目標。
小目標檢測的難點:可利用特征少,現有數據集中小目標占比少,小目標聚集問題
首先小目標本身分辨率低,圖像模糊,攜帶的信息少。由此所導致特征表達能力弱,也就是在提取特征的過程中,能提取到的特征非常少,這不利于我們對小目標的檢測。
另外通常網絡為了減少計算量,都使用到了下采樣,而下采樣過多,會導致小目標的信息在最后的特征圖上只有幾個像素(甚至更少),信息損失較多。
-
數據。
提高圖像采集的分辨率:基于 GAN 的方法解決的也是小目標本身判別性特征少的問題,其想法非常簡單但有效:利用 GAN 生成高分辨率圖片或者高分辨率特征。 - Data Augmentation。一些特別有用的小物體檢測增強包括隨機裁剪、隨機旋轉和馬賽克增強。copy pasting, 增加小目標數量??s放與拼接,增加中小目標數量
- 修改模型輸入尺寸。提高模型的輸入分辨率,也就是減少或者不壓縮原圖像。tiling,將圖像切割后形成batch,可以在保持小輸入分辨率的同時提升小目標檢測,但是推理時也需要 tiling,然后把目標還原到原圖,整體做一次 NMS。
- 修改 Anchor。適合小目標的 Anchor
- Anchor Free。錨框設計難以獲得平衡小目標召回率與計算成本之間的矛盾,而且這種方式導致了小目標的正樣本與大目標的正樣本極度不均衡,使得模型更加關注于大目標的檢測性能,從而忽視了小目標的檢測。
- 多尺度學習。FPN, 空洞卷積,通過多尺度可以將下采樣前的特征保留,盡量保留小目標
- 減小下采樣率。比如對于 YOLOv5 的 stride 為 32, 可以調整其 stride 來減小下采樣率,從而保留某些比較小的特征。
- SPP 模塊。增加感受野,對小目標有效果,SPP size 的設置解決輸入 feature map 的size 可能效果更好。
- 損失函數。小目標大權重,此外也可以嘗試 Focal Loss。
介紹目標檢測RCNN系列和Yolo系列的區(qū)別
YOLO所屬類別為one-stage,Fast-Rcnn所屬類別為two-stage
two stage:
先進行區(qū)域生成,該區(qū)域稱為region proposal(RP,一個有可能包含物體的預選框);再通過卷積神經網絡進行樣本分類,精度高,適合做高檢測精度的任務
任務流程:特征提取—生成RP—分類/定位回歸
one stage:
不用RP,直接在網絡中提取特征來預測物體的分類和位置,速度非常快,適合做實時檢測任務,但是效果不會太好
任務流程:特征提取—分類/定位回歸
YOLO和SSD區(qū)別
YOLO將物體檢測這個問題定義為bounding box和分類置信度的回歸問題。
將整張圖像作為輸入,劃分成SxS grid,每個cell預測B個bounding box(x, y, w, h)及對應的分類置信度(class-specific confidence score)。分類置信度是bounding box是物體的概率及其與真實值IOU相乘的結果。
SSD將物體檢測這個問題的解空間,抽象為一組預先設定好(尺度,長寬比,1,2,3,1/2,1/3)的bounding box。在每個bounding box,預測分類label,以及box offset來更好的框出物體。對一張圖片,結合多個大小不同的feature map的預測結果,能夠處理大小不同的物體。
區(qū)別:
YOLO在卷積層后接全連接層,即檢測時只利用了最高層Feature maps。而SSD采用金字塔結構,即利用了conv4-3/fc7/conv6-2/conv7-2/conv8_2/conv9_2這些大小不同的feature maps,在多個feature maps上同時進行softmax分類和位置回歸
SSD還加入了Prior box(先驗框)
前景背景樣本不均衡解決方案:Focal Loss,GHM與PISA
我們可以將前景背景類不平衡的解決方案分為四類:(i)硬采樣方法,(ii)軟抽樣方法( Soft Sampling Methods),(iii)無抽樣方法和(iv)生成方法。
1. 軟抽樣方法
軟采樣調整每個樣本在訓練過程中迭代的權重(wi),這與硬采樣不同,沒有樣本被丟棄,整個數據集用于更新參數中。該方法同樣也可以應用在分類任務中。
1.1 Focal Loss
一般根據各類別數據占比,對 α 進行取值,即當class_1占比為30%時, α = 0.3,但是這個并不能解決所有問題。因為根據正負難易,樣本一共可以分為以下四類:
雖然 α 平衡了正負樣本,但對難易樣本的不平衡沒有任何幫助。其中易分樣本(即,置信度高的樣本)對模型的提升效果非常小,即模型無法從中學習大量的有效信息。所以模型應該主要關注于那些難分樣本。(這個假設是有問題的,GHM對其進行了改進)。
我們希望模型能更關注容易錯分的數據,反向思考,就是讓模型別那么關注容易分類的樣本。因此,Focal Loss的思路就是,把高置信度的樣本損失降低
實驗表明 γ 取2, α 取0.25的時候效果最佳。
1.2 Gradient Harmonizing Mechanism (GHM)
Focal Loss對容易分類的樣本進行了損失衰減,讓模型更關注難分樣本,并通過 α alpha α和 γ gamma γ進行調參。這樣相比CE loss 可以提高效果,但是也存在一些問題:
Focal loss有兩個超參數( α和 γ),調整起來十分費力。
Focal loss 是個靜態(tài)loss,不會自適應于數據的分布,在訓練的過程中會一直的變化。
GHM認為,類別不均衡可總結為難易分類樣本的不均衡,而這種難分樣本的不均衡又可視為梯度密度分布的不均衡。假設一個正樣本被正確分類,它就是正易樣本,損失不大,模型不能從中獲益。而一個錯誤分類的樣本,更能促進模型迭代。實際應用中,大量的樣本都是屬于容易分類的類型,這種樣本一個起不了太大作用,但量級過大,在模型進行梯度更新時,起主要作用,使得模型朝這類數據更新
GHM中提到:有一部分難分樣本就是離群點,不應該給他太多關注;樣本不均衡的基本效果可以通過梯度密度直接統(tǒng)計得到,不需要調參。
簡而言之:Focal Loss是從置信度p來調整loss,GHM通過一定范圍置信度p的樣本數來調整loss。
g的值表示樣本的屬性(easy/hard), 意味著對全局梯度的影響。盡管梯度的嚴格定義應該是在整個參數空間,但是g是樣本梯度的成比例的norm,在這片論文中g被稱作gradient norm。
不同屬性的樣本(hard/easy,pos/neg)可以由 gradient norm的分布來表示。在圖1左中可以看出變化非常大。具有 小 gradient norm 的樣本具有很大的密度,它們對應于大量的負樣本(背景)。由于大量的簡單負樣本,我們使用log軸來顯示樣本的分數,以演示具有不同屬性的樣本的方差的細節(jié)。盡管一個easy樣本在全局梯度上相比hard樣本具有更小的貢獻,但是大量的easy樣本的全部貢獻會壓倒少數hard樣本的貢獻,所以訓練過程變得無效。除此之外,論文還發(fā)現具有非常 大gradient norm的樣本(very hard examples)的密度微大于中間樣本的密度。并且發(fā)現這些very hard樣本大多數是outliers,因為即使模型收斂它們始終穩(wěn)定存在。如果收斂模型被強制學習分類這些outliers,對其他樣本的分類可能不會那么的準確
根據gradient norm分布的分析,GHM關注于不同樣本梯度貢獻的協(xié)調。大量由easy樣本產生的累積梯度可以被largely down-weighted并且outliers也可以被相對的down-weighted。最后,每種類型的樣本分布將會使平衡的訓練會更加的穩(wěn)定和有效
1.3 PrIme Sample Attention (PISA)
PISA 方法和 Focal loss 和 GHM 出發(fā)點不一樣, Focal loss 和 GHM 是利用 loss 來度量樣本的難易分類程度,而本篇論文做者從mAP 出發(fā)來度量樣本的難易程度。
多標簽圖像分類任務中圖片的標簽不止一個,因此評價不能用普通單標簽圖像分類的標準,即mean accuracy,該任務采用的是和信息檢索中類似的方法—mAP(mean Average Precision),雖然其字面意思和mean accuracy看起來差不多,但是計算方法要繁瑣得多。
該作者提出改論文的方法考慮了兩個方面:
樣本之間不該是相互獨立的或同等對待?;趨^(qū)域的目標檢測是從大量候選框中選取一小部分邊界框,以覆蓋圖像中的全部目標。所以,不一樣樣本的選擇是相互競爭的,而不是獨立的。通常來講,檢測器更可取的作法是在確保全部感興趣的目標都被充分覆蓋時,在每一個目標周圍的邊界框產生高分,而不是對全部正樣本產生高分。作者研究代表關注那些與gt目標有最高IOU的樣本是實現這一目標的有效方法。
目標的分類和定位是有聯系的。定位目標周圍的樣本很是重要,這一觀察具備深入的意義,即目標的分類和定位密切相關。具體地,定位好的樣本須要具備高置信度好的分類。
PISA由兩個部分組成:
基于重要性的樣本重加權(ISR)
分類感知回歸損失(CARL)。
ISR(Importance-based Sample Reweighting)
ISR由正樣本重加權和負樣本重加權組成,分別表示為ISR-P和ISR-N。對于陽性樣本,我們采用IoU-HLR作為重要性度量;對于陰性樣本,我們采用Score-HLR。給定重要性度量,剩下的問題是如何將重要性映射到適當的損失權重。
oU-HLR:
為了計算IoU-HLR,首先將所有樣本根據其最近的gt目標劃分為不同的組。接下來,使用與gt的IoU降序對每個組中的樣本進行排序,并獲得IoU局部排名(IoU-LR)。隨后,以相同的IoU-LR采樣并按降序對其進行排序。具體來說,收集并分類所有top1 IoU-LR樣本,其次是top2,top3,依此類推。這兩個步驟將對所有樣本進行排序
Score-HLR:
以類似于IoU-HLR的方式計算負樣本的Score-HLR。與由每個gt目標自然分組的正樣本不同,負樣本也可能出現在背景區(qū)域,因此我們首先使用NMS將它們分組到不同的群集中。將所有前景類別中的最高分數用作負樣本的得分,然后執(zhí)行與計算IoU-HLR相同的步驟。
如何解決訓練數據樣本過少的問題
利用預訓練模型進行遷移微調(fine-tuning),預訓練模型通常在特征上擁有很好的語義表達。此時,只需將模型在小數據集上進行微調就能取得不錯的效果。這也是目前大部分小數據集常用的訓練方式。視覺領域內,通常會ImageNet上訓練完成的模型。自然語言處理領域,也有BERT模型等預訓練模型可以使用。
單樣本或者少樣本學習(one-shot,few-shot learning),這種方式適用于樣本類別遠遠大于樣本數量的情況等極端數據集。例如有1000個類別,每個類別只提供1-5個樣本。少樣本學習同樣也需要借助預訓練模型,但有別于微調的在于,微調通常仍然在學習不同類別的語義,而少樣本學習通常需要學習樣本之間的距離度量。例如孿生網絡(Siamese Neural Networks)就是通過訓練兩個同種結構的網絡來判別輸入的兩張圖片是否屬于同一類。3. 以上兩種是常用訓練小樣本數據集的方式。此外,也有些常用的方式:數據集增強、正則或者半監(jiān)督學習等方式來解決小樣本數據集的訓練問題。
如何解決類別不平衡的問題
機器學習中,解決樣本不均衡問題主要有2種思路:數據角度和算法角度。從數據角度出發(fā),有擴大數據集、數據類別均衡采樣等方法。在算法層面,目標檢測方法使用的方法主要有:
Faster RCNN、SSD等算法在正負樣本的篩選時,根據樣本與真實物體的IoU大小,設置了3∶1的正負樣本比例,這一點緩解了正負樣本的不均衡,同時也對難易樣本不均衡起到了作用。
Faster RCNN在RPN模塊中,通過前景得分排序篩選出了2000個左右的候選框,這也會將大量的負樣本與簡單樣本過濾掉,緩解了前兩個不均衡問題。
權重懲罰:對于難易樣本與類別間的不均衡,可以增大難樣本與少類別的損失權重,從而增大模型對這些樣本的懲罰,緩解不均衡問題。
數據增強:從數據側入手,可以在當前數據集上使用隨機生成和添加擾動的方法,也可以利用網絡爬蟲數據等增加數據集的豐富性,從而緩解難易樣本和類別間樣本等不均衡問題,可以參考SSD的數據增強方法。
近年來,不少的研究者針對樣本不均衡問題進行了深入研究,比較典型的有OHEM(在線困難樣本挖掘)、S-OHEM、Focal Loss、GHM(梯度均衡化)。
-
OHEM:在線難例挖掘
OHEM算法(online hard example miniing,發(fā)表于2016年的CVPR)主要是針對訓練過程中的困難樣本自動選擇,其核心思想是根據輸入樣本的損失進行篩選,篩選出困難樣本(即對分類和檢測影響較大的樣本),然后將篩選得到的這些樣本應用在隨機梯度下降中訓練。 -
Focal loss:專注難樣本
為了解決一階網絡中樣本的不均衡問題,何凱明等人首先改善了分類過程中的交叉熵函數,提出了可以動態(tài)調整權重的Focal Loss。 - GHM:損失函數梯度均衡化機制
前面講到的OHEM算法和Focal loss各有利弊:
1、OHEM算法會丟棄loss比較低的樣本,使得這些樣本無法被學習到。
2、FocalLoss則是對正負樣本進行加權,使得全部的樣本可以得到學習,容易分類的負樣本賦予低權值,hard examples賦予高權值。但是在所有的anchor examples中,出了大量的易分類的負樣本外,還存在很多的outlier,FocalLoss對這些outlier并沒有相關策略處理。并且FocalLoss存在兩個超參,根據不同的數據集,調試兩個超參需要大量的實驗,一旦確定參數無法改變,不能根據數據的分布動態(tài)的調整。
GHM主要思想:GHM做法則是從樣本的梯度范數出發(fā),通過梯度范數所占的樣本比例,對樣本進行動態(tài)的加權,使得具有小梯度的容易分類的樣本降權,具有中梯度的hard expamle升權,具有大梯度的outlier降權。
手撕代碼IOU
import numpy as np
def ComputeIOU(boxA, boxB):
## 計算相交框的坐標
## bboxA[0][1] 左上角坐標 bboxA[2][3] 右下角坐標
x1 = np.max([boxA[0], boxB[0]])
y1 = np.max([boxA[1], boxB[1]])
x2 = np.min([boxA[2], boxB[2]])
y2 = np.min([boxA[3], boxB[3]])
## 計算交區(qū)域,并區(qū)域,及IOU
S_A = (boxA[2]-boxA[0]+1)*(boxA[3]-boxA[1]+1)
S_B = (boxB[2]-boxB[0]+1)*(boxB[3]-boxB[1]+1)
interArea = np.max([x2-x1+1, 0])*np.max([y2-y1+1,0])##一定要和0比較大小,如果是負數就說明壓根不相交
unionArea = S_A + S_B - interArea
iou = interArea/unionArea
return iou
boxA = [1,1,3,3]
boxB = [2,2,4,4]
IOU = ComputeIOU(boxA, boxB)
手撕代碼NMS
對整個bboxes排序的寫法
import numpy as np
def nms(dets, iou_thred, cfd_thred):
if len(dets)==0: return []
bboxes = np.array(dets)
## 對整個bboxes排序
bboxes = bboxes[np.argsort(bboxes[:,4])]
pick_bboxes = []
# print(bboxes)
while bboxes.shape[0] and bboxes[-1,-1] >= cfd_thred:
bbox = bboxes[-1]
x1 = np.maximum(bbox[0], bboxes[:-1,0])
y1 = np.maximum(bbox[1], bboxes[:-1,1])
x2 = np.minimum(bbox[2], bboxes[:-1,2])
y2 = np.minimum(bbox[3], bboxes[:-1,3])
inters = np.maximum(x2-x1+1, 0) * np.maximum(y2-y1+1, 0)
unions = (bbox[2]-bbox[0]+1)*(bbox[3]-bbox[1]+1) + (bboxes[:-1,2]-bboxes[:-1,0]+1)*(bboxes[:-1,3]-bboxes[:-1,1]+1) - inters
ious = inters/unions
keep_indices = np.where(ious
- 不改變bboxes,維護orders的寫法
始終維護orders,代表到原bboxes的映射(map) 優(yōu)化1:僅維護orders,不改變原bboxes 優(yōu)化2:提前計算好bboxes的面積,以免在循環(huán)中多次重復計算
import numpy as np
def nms(dets, iou_thred, cfd_thred):
if len(dets)==0: return []
bboxes = np.array(dets)
## 維護orders
orders = np.argsort(bboxes[:,4])
pick_bboxes = []
x1 = bboxes[:,0]
y1 = bboxes[:,1]
x2 = bboxes[:,2]
y2 = bboxes[:,3]
areas = (x2-x1+1)*(y2-y1+1) ## 提前計算好bboxes面積,防止在循環(huán)中重復計算
while orders.shape[0] and bboxes[orders[-1],-1] >= cfd_thred:
bbox = bboxes[orders[-1]]
xx1 = np.maximum(bbox[0], x1[orders[:-1]])
yy1 = np.maximum(bbox[1], y1[orders[:-1]])
xx2 = np.minimum(bbox[2], x2[orders[:-1]])
yy2 = np.minimum(bbox[3], y2[orders[:-1]])
inters = np.maximum(xx2-xx1+1, 0) * np.maximum(yy2-yy1+1, 0)
unions = areas[orders[-1]] + areas[orders[:-1]] - inters
ious = inters/unions
keep_indices = np.where(ious
NMS的改進思路
- 根據手動設置閾值的缺陷,通過自適應的方法在目標系數時使用小閾值,目標稠密時使用大閾值。例如Adaptive NMS
- 將低于閾值的直接置為0的做法太hard,通過將其根據IoU大小來進行懲罰衰減,則變得更加soft。例如Soft NMS,Softer NMS。
- 只能在CPU上運行,速度太慢的改進思路有三個,一個是設計在GPU上的NMS,如CUDA NMS,一個是設計更快的NMS,如Fast NMS,最后一個是掀桌子,設計一個神經網絡來實現NMS,如 ConvNMS。
- IoU的做法存在一定缺陷,改進思路是將目標尺度、距離引進IoU的考慮中。如DIoU
IOU相關優(yōu)化(giou,diou,ciou)
GIOU
普通IOU是對兩個框的距離不敏感的,下面兩張圖中,左圖預測框的坐標要比右圖預測框的坐標更接近真實框。但兩者的IOU皆為0,如果直接把IOU當作loss函數進行優(yōu)化,則loss=0,沒有梯度回傳,所以無法進行訓練。
但是,GIOU也存在它的缺點:當兩個預測框高寬相同,且處于同一水平面時,GIOU就退化為IOU。此外,GIOU和IOU還有兩個缺點:收斂較慢、回歸不夠準確。
DIOU
在介紹DIOU之前,先來介紹采用DIOU的效果:如圖,黑色代表anchor box, 藍色紅色代表default box,綠色代表真實目標存在的框GT box的位置,期望紅藍框與綠框盡可能重合。第一行是使用GIOU訓練網絡,讓預測邊界框盡可能回歸到真實目標邊界框中,迭代到400次后才勉強重合。第二行使用DIOU訓練網絡,到達120步時,發(fā)現與目標邊界框已經完全重合??梢钥闯?,相對于GIOU,DIOU的不僅收斂速度更快,準確率也更高。
我們再看一組圖,圖中給出了3組目標邊界框與目標邊界框的重合關系,顯然他們的重合位置不相同的,我們期望第三種重合(兩個box中心位置盡可能重合。這三組計算的IOU loss和GIoU loss是一模一樣的,因此這兩種損失不能很好表達邊界框重合關系)。但是DIOU計算出的三種情況的損失是不一樣的,顯然DIOU更加合理。
從公式和示意圖中,我們可以看到,DIoU有幾個優(yōu)點:
DIoU的懲罰項是基于中心點的距離和對角線距離的比值,避免了像GIoU在兩框距離較遠時,產生較大的外包框,Loss值較大難以優(yōu)化(因為它的懲罰項是 A ∪ B 比上最小外包框的面積)。所以DIoU Loss收斂速度會比GIoU Loss快。
即使在一個框包含另一個框的情況下,c值不變,但d值也可以進行有效度量。
CIOU LOSS:
論文中,作者表示一個優(yōu)秀的回歸定位損失應該考慮三種幾何參數:重疊面積、中心點距離、長寬比。CIoU就是在DIoU的基礎上增加了檢測框尺度的loss,增加了長和寬的loss,這樣預測框就會更加的符合真實框。
審核編輯 :李倩
-
算法
+關注
關注
23文章
4587瀏覽量
92501 -
檢測技術
+關注
關注
2文章
351瀏覽量
29048 -
目標檢測
+關注
關注
0文章
200瀏覽量
15578
原文標題:目錄
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論