CV面試面經(jīng)寶典:目標(biāo)檢測共性問題總結(jié)與詳解(2)
我們可以將前景背景類不平衡的解決方案分為四類:(i)硬采樣方法,(ii)軟抽樣方法( Soft Sampling Methods),(iii)無抽樣方法和(iv)生成方法。
1. 軟抽樣方法
軟采樣調(diào)整每個(gè)樣本在訓(xùn)練過程中迭代的權(quán)重(wi),這與硬采樣不同,沒有樣本被丟棄,整個(gè)數(shù)據(jù)集用于更新參數(shù)中。該方法同樣也可以應(yīng)用在分類任務(wù)中。
1.1 Focal Loss
一般根據(jù)各類別數(shù)據(jù)占比,對 α 進(jìn)行取值,即當(dāng)class_1占比為30%時(shí), α = 0.3,但是這個(gè)并不能解決所有問題。因?yàn)楦鶕?jù)正負(fù)難易,樣本一共可以分為以下四類:
雖然 α 平衡了正負(fù)樣本,但對難易樣本的不平衡沒有任何幫助。其中易分樣本(即,置信度高的樣本)對模型的提升效果非常小,即模型無法從中學(xué)習(xí)大量的有效信息。所以模型應(yīng)該主要關(guān)注于那些難分樣本。(這個(gè)假設(shè)是有問題的,GHM對其進(jìn)行了改進(jìn))。
我們希望模型能更關(guān)注容易錯(cuò)分的數(shù)據(jù),反向思考,就是讓模型別那么關(guān)注容易分類的樣本。因此,F(xiàn)ocal Loss的思路就是,把高置信度的樣本損失降低
實(shí)驗(yàn)表明 γ 取2, α 取0.25的時(shí)候效果最佳。
1.2 Gradient Harmonizing Mechanism (GHM)
Focal Loss對容易分類的樣本進(jìn)行了損失衰減,讓模型更關(guān)注難分樣本,并通過 α \alpha α和 γ \gamma γ進(jìn)行調(diào)參。這樣相比CE loss 可以提高效果,但是也存在一些問題:
Focal loss有兩個(gè)超參數(shù)( α和 γ),調(diào)整起來十分費(fèi)力。
Focal loss 是個(gè)靜態(tài)loss,不會(huì)自適應(yīng)于數(shù)據(jù)的分布,在訓(xùn)練的過程中會(huì)一直的變化。
GHM認(rèn)為,類別不均衡可總結(jié)為難易分類樣本的不均衡,而這種難分樣本的不均衡又可視為梯度密度分布的不均衡。假設(shè)一個(gè)正樣本被正確分類,它就是正易樣本,損失不大,模型不能從中獲益。而一個(gè)錯(cuò)誤分類的樣本,更能促進(jìn)模型迭代。實(shí)際應(yīng)用中,大量的樣本都是屬于容易分類的類型,這種樣本一個(gè)起不了太大作用,但量級過大,在模型進(jìn)行梯度更新時(shí),起主要作用,使得模型朝這類數(shù)據(jù)更新
GHM中提到:有一部分難分樣本就是離群點(diǎn),不應(yīng)該給他太多關(guān)注;樣本不均衡的基本效果可以通過梯度密度直接統(tǒng)計(jì)得到,不需要調(diào)參。
簡而言之:Focal Loss是從置信度p來調(diào)整loss,GHM通過一定范圍置信度p的樣本數(shù)來調(diào)整loss。
g的值表示樣本的屬性(easy/hard), 意味著對全局梯度的影響。盡管梯度的嚴(yán)格定義應(yīng)該是在整個(gè)參數(shù)空間,但是g是樣本梯度的成比例的norm,在這片論文中g(shù)被稱作gradient norm。
不同屬性的樣本(hard/easy,pos/neg)可以由 gradient norm的分布來表示。在圖1左中可以看出變化非常大。具有 小 gradient norm 的樣本具有很大的密度,它們對應(yīng)于大量的負(fù)樣本(背景)。由于大量的簡單負(fù)樣本,我們使用log軸來顯示樣本的分?jǐn)?shù),以演示具有不同屬性的樣本的方差的細(xì)節(jié)。盡管一個(gè)easy樣本在全局梯度上相比hard樣本具有更小的貢獻(xiàn),但是大量的easy樣本的全部貢獻(xiàn)會(huì)壓倒少數(shù)hard樣本的貢獻(xiàn),所以訓(xùn)練過程變得無效。除此之外,論文還發(fā)現(xiàn)具有非常 大gradient norm的樣本(very hard examples)的密度微大于中間樣本的密度。并且發(fā)現(xiàn)這些very hard樣本大多數(shù)是outliers,因?yàn)榧词鼓P褪諗克鼈兪冀K穩(wěn)定存在。如果收斂模型被強(qiáng)制學(xué)習(xí)分類這些outliers,對其他樣本的分類可能不會(huì)那么的準(zhǔn)確
根據(jù)gradient norm分布的分析,GHM關(guān)注于不同樣本梯度貢獻(xiàn)的協(xié)調(diào)。大量由easy樣本產(chǎn)生的累積梯度可以被largely down-weighted并且outliers也可以被相對的down-weighted。最后,每種類型的樣本分布將會(huì)使平衡的訓(xùn)練會(huì)更加的穩(wěn)定和有效
1.3 PrIme Sample Attention (PISA)
PISA 方法和 Focal loss 和 GHM 出發(fā)點(diǎn)不一樣, Focal loss 和 GHM 是利用 loss 來度量樣本的難易分類程度,而本篇論文做者從 mAP 出發(fā)來度量樣本的難易程度。
多標(biāo)簽圖像分類任務(wù)中圖片的標(biāo)簽不止一個(gè),因此評價(jià)不能用普通單標(biāo)簽圖像分類的標(biāo)準(zhǔn),即mean accuracy,該任務(wù)采用的是和信息檢索中類似的方法—mAP(mean Average Precision),雖然其字面意思和mean accuracy看起來差不多,但是計(jì)算方法要繁瑣得多。
該作者提出改論文的方法考慮了兩個(gè)方面:
樣本之間不該是相互獨(dú)立的或同等對待?;趨^(qū)域的目標(biāo)檢測是從大量候選框中選取一小部分邊界框,以覆蓋圖像中的全部目標(biāo)。所以,不一樣樣本的選擇是相互競爭的,而不是獨(dú)立的。通常來講,檢測器更可取的作法是在確保全部感興趣的目標(biāo)都被充分覆蓋時(shí),在每一個(gè)目標(biāo)周圍的邊界框產(chǎn)生高分,而不是對全部正樣本產(chǎn)生高分。作者研究代表關(guān)注那些與gt目標(biāo)有最高IOU的樣本是實(shí)現(xiàn)這一目標(biāo)的有效方法。
目標(biāo)的分類和定位是有聯(lián)系的。定位目標(biāo)周圍的樣本很是重要,這一觀察具備深入的意義,即目標(biāo)的分類和定位密切相關(guān)。具體地,定位好的樣本須要具備高置信度好的分類。
PISA由兩個(gè)部分組成:
基于重要性的樣本重加權(quán)(ISR)
分類感知回歸損失(CARL)。
ISR(Importance-based Sample Reweighting)
ISR由正樣本重加權(quán)和負(fù)樣本重加權(quán)組成,分別表示為ISR-P和ISR-N。對于陽性樣本,我們采用IoU-HLR作為重要性度量;對于陰性樣本,我們采用Score-HLR。給定重要性度量,剩下的問題是如何將重要性映射到適當(dāng)?shù)膿p失權(quán)重。
oU-HLR:
為了計(jì)算IoU-HLR,首先將所有樣本根據(jù)其最近的gt目標(biāo)劃分為不同的組。接下來,使用與gt的IoU降序?qū)γ總€(gè)組中的樣本進(jìn)行排序,并獲得IoU局部排名(IoU-LR)。隨后,以相同的IoU-LR采樣并按降序?qū)ζ溥M(jìn)行排序。具體來說,收集并分類所有top1 IoU-LR樣本,其次是top2,top3,依此類推。這兩個(gè)步驟將對所有樣本進(jìn)行排序
Score-HLR:
以類似于IoU-HLR的方式計(jì)算負(fù)樣本的Score-HLR。與由每個(gè)gt目標(biāo)自然分組的正樣本不同,負(fù)樣本也可能出現(xiàn)在背景區(qū)域,因此我們首先使用NMS將它們分組到不同的群集中。將所有前景類別中的最高分?jǐn)?shù)用作負(fù)樣本的得分,然后執(zhí)行與計(jì)算IoU-HLR相同的步驟。
如何解決訓(xùn)練數(shù)據(jù)樣本過少的問題利用預(yù)訓(xùn)練模型進(jìn)行遷移微調(diào)(fine-tuning),預(yù)訓(xùn)練模型通常在特征上擁有很好的語義表達(dá)。此時(shí),只需將模型在小數(shù)據(jù)集上進(jìn)行微調(diào)就能取得不錯(cuò)的效果。這也是目前大部分小數(shù)據(jù)集常用的訓(xùn)練方式。視覺領(lǐng)域內(nèi),通常會(huì)ImageNet上訓(xùn)練完成的模型。自然語言處理領(lǐng)域,也有BERT模型等預(yù)訓(xùn)練模型可以使用。
單樣本或者少樣本學(xué)習(xí)(one-shot,few-shot learning),這種方式適用于樣本類別遠(yuǎn)遠(yuǎn)大于樣本數(shù)量的情況等極端數(shù)據(jù)集。例如有1000個(gè)類別,每個(gè)類別只提供1-5個(gè)樣本。少樣本學(xué)習(xí)同樣也需要借助預(yù)訓(xùn)練模型,但有別于微調(diào)的在于,微調(diào)通常仍然在學(xué)習(xí)不同類別的語義,而少樣本學(xué)習(xí)通常需要學(xué)習(xí)樣本之間的距離度量。例如孿生網(wǎng)絡(luò)(Siamese Neural Networks)就是通過訓(xùn)練兩個(gè)同種結(jié)構(gòu)的網(wǎng)絡(luò)來判別輸入的兩張圖片是否屬于同一類。3. 以上兩種是常用訓(xùn)練小樣本數(shù)據(jù)集的方式。此外,也有些常用的方式:數(shù)據(jù)集增強(qiáng)、正則或者半監(jiān)督學(xué)習(xí)等方式來解決小樣本數(shù)據(jù)集的訓(xùn)練問題。
如何解決類別不平衡的問題機(jī)器學(xué)習(xí)中,解決樣本不均衡問題主要有2種思路:數(shù)據(jù)角度和算法角度。從數(shù)據(jù)角度出發(fā),有擴(kuò)大數(shù)據(jù)集、數(shù)據(jù)類別均衡采樣等方法。在算法層面,目標(biāo)檢測方法使用的方法主要有:
Faster RCNN、SSD等算法在正負(fù)樣本的篩選時(shí),根據(jù)樣本與真實(shí)物體的IoU大小,設(shè)置了3∶1的正負(fù)樣本比例,這一點(diǎn)緩解了正負(fù)樣本的不均衡,同時(shí)也對難易樣本不均衡起到了作用。
Faster RCNN在RPN模塊中,通過前景得分排序篩選出了2000個(gè)左右的候選框,這也會(huì)將大量的負(fù)樣本與簡單樣本過濾掉,緩解了前兩個(gè)不均衡問題。
權(quán)重懲罰:對于難易樣本與類別間的不均衡,可以增大難樣本與少類別的損失權(quán)重,從而增大模型對這些樣本的懲罰,緩解不均衡問題。
數(shù)據(jù)增強(qiáng):從數(shù)據(jù)側(cè)入手,可以在當(dāng)前數(shù)據(jù)集上使用隨機(jī)生成和添加擾動(dòng)的方法,也可以利用網(wǎng)絡(luò)爬蟲數(shù)據(jù)等增加數(shù)據(jù)集的豐富性,從而緩解難易樣本和類別間樣本等不均衡問題,可以參考SSD的數(shù)據(jù)增強(qiáng)方法。
近年來,不少的研究者針對樣本不均衡問題進(jìn)行了深入研究,比較典型的有OHEM(在線困難樣本挖掘)、S-OHEM、Focal Loss、GHM(梯度均衡化)。
- OHEM:在線難例挖掘
OHEM算法(online hard example miniing,發(fā)表于2016年的CVPR)主要是針對訓(xùn)練過程中的困難樣本自動(dòng)選擇,其核心思想是根據(jù)輸入樣本的損失進(jìn)行篩選,篩選出困難樣本(即對分類和檢測影響較大的樣本),然后將篩選得到的這些樣本應(yīng)用在隨機(jī)梯度下降中訓(xùn)練。 - Focal loss:專注難樣本
為了解決一階網(wǎng)絡(luò)中樣本的不均衡問題,何凱明等人首先改善了分類過程中的交叉熵函數(shù),提出了可以動(dòng)態(tài)調(diào)整權(quán)重的Focal Loss。 - GHM:損失函數(shù)梯度均衡化機(jī)制
前面講到的OHEM算法和Focal loss各有利弊:
1、OHEM算法會(huì)丟棄loss比較低的樣本,使得這些樣本無法被學(xué)習(xí)到。
2、FocalLoss則是對正負(fù)樣本進(jìn)行加權(quán),使得全部的樣本可以得到學(xué)習(xí),容易分類的負(fù)樣本賦予低權(quán)值,hard examples賦予高權(quán)值。但是在所有的anchor examples中,出了大量的易分類的負(fù)樣本外,還存在很多的outlier,F(xiàn)ocalLoss對這些outlier并沒有相關(guān)策略處理。并且FocalLoss存在兩個(gè)超參,根據(jù)不同的數(shù)據(jù)集,調(diào)試兩個(gè)超參需要大量的實(shí)驗(yàn),一旦確定參數(shù)無法改變,不能根據(jù)數(shù)據(jù)的分布動(dòng)態(tài)的調(diào)整。
GHM主要思想:GHM做法則是從樣本的梯度范數(shù)出發(fā),通過梯度范數(shù)所占的樣本比例,對樣本進(jìn)行動(dòng)態(tài)的加權(quán),使得具有小梯度的容易分類的樣本降權(quán),具有中梯度的hard expamle升權(quán),具有大梯度的outlier降權(quán)。
手撕代碼IOUimport numpy as np手撕代碼NMS
def ComputeIOU(boxA, boxB):
## 計(jì)算相交框的坐標(biāo)
## bboxA[0][1] 左上角坐標(biāo) bboxA[2][3] 右下角坐標(biāo)
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]])
## 計(jì)算交區(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比較大小,如果是負(fù)數(shù)就說明壓根不相交
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)
對整個(gè)bboxes排序的寫法
import numpy as np
def nms(dets, iou_thred, cfd_thred):
if len(dets)==0: return []
bboxes = np.array(dets)
## 對整個(gè)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<iou_thred)
bboxes = bboxes[keep_indices] ## indices一定不包括自己
pick_bboxes.append(bbox)
return np.asarray(pick_bboxes)
dets = [[187, 82, 337, 317, 0.9], [150, 67, 305, 282, 0.75], [246, 121, 368, 304, 0.8]]
dets_nms = nms(dets, 0.5, 0.3)
print(dets_nms)
- 不改變bboxes,維護(hù)orders的寫法
始終維護(hù)orders,代表到原bboxes的映射(map) 優(yōu)化1:僅維護(hù)orders,不改變原bboxes 優(yōu)化2:提前計(jì)算好bboxes的面積,以免在循環(huán)中多次重復(fù)計(jì)算
import numpy as npNMS的改進(jìn)思路
def nms(dets, iou_thred, cfd_thred):
if len(dets)==0: return []
bboxes = np.array(dets)
## 維護(hù)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) ## 提前計(jì)算好bboxes面積,防止在循環(huán)中重復(fù)計(jì)算
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<iou_thred)
pick_bboxes.append(bbox)
orders = orders[keep_indices]
return np.asarray(pick_bboxes)
dets = [[187, 82, 337, 317, 0.9], [150, 67, 305, 282, 0.75], [246, 121, 368, 304, 0.8]]
dets_nms = nms(dets, 0.5, 0.3)
print(dets_nms)
- 根據(jù)手動(dòng)設(shè)置閾值的缺陷,通過自適應(yīng)的方法在目標(biāo)系數(shù)時(shí)使用小閾值,目標(biāo)稠密時(shí)使用大閾值。例如Adaptive NMS
- 將低于閾值的直接置為0的做法太hard,通過將其根據(jù)IoU大小來進(jìn)行懲罰衰減,則變得更加soft。例如Soft NMS,Softer NMS。
- 只能在CPU上運(yùn)行,速度太慢的改進(jìn)思路有三個(gè),一個(gè)是設(shè)計(jì)在GPU上的NMS,如CUDA NMS,一個(gè)是設(shè)計(jì)更快的NMS,如Fast NMS,最后一個(gè)是掀桌子,設(shè)計(jì)一個(gè)神經(jīng)網(wǎng)絡(luò)來實(shí)現(xiàn)NMS,如 ConvNMS。
- IoU的做法存在一定缺陷,改進(jìn)思路是將目標(biāo)尺度、距離引進(jìn)IoU的考慮中。如DIoU
GIOU
普通IOU是對兩個(gè)框的距離不敏感的,下面兩張圖中,左圖預(yù)測框的坐標(biāo)要比右圖預(yù)測框的坐標(biāo)更接近真實(shí)框。但兩者的IOU皆為0,如果直接把IOU當(dāng)作loss函數(shù)進(jìn)行優(yōu)化,則loss=0,沒有梯度回傳,所以無法進(jìn)行訓(xùn)練。
但是,GIOU也存在它的缺點(diǎn):當(dāng)兩個(gè)預(yù)測框高寬相同,且處于同一水平面時(shí),GIOU就退化為IOU。此外,GIOU和IOU還有兩個(gè)缺點(diǎn):收斂較慢、回歸不夠準(zhǔn)確。
DIOU
在介紹DIOU之前,先來介紹采用DIOU的效果:如圖,黑色代表anchor box, 藍(lán)色紅色代表default box,綠色代表真實(shí)目標(biāo)存在的框GT box的位置,期望紅藍(lán)框與綠框盡可能重合。第一行是使用GIOU訓(xùn)練網(wǎng)絡(luò),讓預(yù)測邊界框盡可能回歸到真實(shí)目標(biāo)邊界框中,迭代到400次后才勉強(qiáng)重合。第二行使用DIOU訓(xùn)練網(wǎng)絡(luò),到達(dá)120步時(shí),發(fā)現(xiàn)與目標(biāo)邊界框已經(jīng)完全重合。可以看出,相對于GIOU,DIOU的不僅收斂速度更快,準(zhǔn)確率也更高。
我們再看一組圖,圖中給出了3組目標(biāo)邊界框與目標(biāo)邊界框的重合關(guān)系,顯然他們的重合位置不相同的,我們期望第三種重合(兩個(gè)box中心位置盡可能重合。這三組計(jì)算的IOU loss和GIoU loss是一模一樣的,因此這兩種損失不能很好表達(dá)邊界框重合關(guān)系)。但是DIOU計(jì)算出的三種情況的損失是不一樣的,顯然DIOU更加合理。
從公式和示意圖中,我們可以看到,DIoU有幾個(gè)優(yōu)點(diǎn):
DIoU的懲罰項(xiàng)是基于中心點(diǎn)的距離和對角線距離的比值,避免了像GIoU在兩框距離較遠(yuǎn)時(shí),產(chǎn)生較大的外包框,Loss值較大難以優(yōu)化(因?yàn)樗膽土P項(xiàng)是 A ∪ B 比上最小外包框的面積)。所以DIoU Loss收斂速度會(huì)比GIoU Loss快。
即使在一個(gè)框包含另一個(gè)框的情況下,c值不變,但d值也可以進(jìn)行有效度量。
CIOU LOSS:
論文中,作者表示一個(gè)優(yōu)秀的回歸定位損失應(yīng)該考慮三種幾何參數(shù):重疊面積、中心點(diǎn)距離、長寬比。CIoU就是在DIoU的基礎(chǔ)上增加了檢測框尺度的loss,增加了長和寬的loss,這樣預(yù)測框就會(huì)更加的符合真實(shí)框。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。