【轉】小目標檢測相關技巧總結

小目標檢測文章總結:https://blog.csdn.net/wq604887956/article/details/83053927

Kaggle實戰目標檢測奇淫技巧合集:

https://mp.weixin.qq.com/s?__biz=MzIwMTE1NjQxMQ==&mid=2247487104&idx=1&sn=a41a6e37be1e169b316d67765d2d9eae&chksm=96f37cd4a184f5c2abb99b5e050642df5e82f172beb19a06c562b91b610f9ed624eb46a2ec81&mpshare=1&scene=23&srcid=#rd

 

 

轉自:https://www.cnblogs.com/E-Dreamer-Blogs/p/11442927.html

小目標難檢測原因

主要原因

(1)小目標在原圖中尺寸比較小,通用目標檢測模型中,一般的基礎骨幹神經網絡(VGG系列和Resnet系列)都有幾次下采樣處理,導致小目標在特徵圖的尺寸基本上只有個位數的像素大小,導致設計的目標檢測分類器對小目標的分類效果差。

(2)小目標在原圖中尺寸比較小,通用目標檢測模型中,一般的基礎骨幹神經網絡(VGG系列和Resnet系列)都有幾次下采樣處理,如果分類和迴歸操作在經過幾層下采樣處理的 特徵層進行,小目標特徵的感受野映射回原圖將可能大於小目標在原圖的尺寸,造成檢測效果差。

其他原因

(1)小目標在原圖中的數量較少,檢測器提取的特徵較少,導致小目標的檢測效果差。

(2)神經網絡在學習中被大目標主導,小目標在整個學習過程被忽視,導致導致小目標的檢測效果差。

Tricks

(1) data-augmentation.簡單粗暴,比如將圖像放大,利用 image pyramid多尺度檢測,最後將檢測結果融合.缺點是操作複雜,計算量大,實際情況中不實用;

(2) 特徵融合方法:FPN這些,多尺度feature map預測,feature stride可以從更小的開始;

(3)合適的訓練方法:CVPR2018的SNIP以及SNIPER;

(4)設置更小更稠密的anchor,設計anchor match strategy等,參考S3FD;

(5)利用GAN將小物體放大再檢測,CVPR2018有這樣的論文;

(6)利用context信息,簡歷object和context的聯繫,比如relation network;

(7)有密集遮擋,如何把location 和Classification 做的更好,參考IoU loss, repulsion loss等.

(8)卷積神經網絡設計時儘量度採用步長爲1,儘可能保留多的目標特徵。

 

感謝張俊怡,本文轉自:https://cloud.tencent.com/developer/article/1414911

摘要概述

小目標問題在物體檢測和語義分割等視覺任務中一直是存在的一個難點,小目標的檢測精度通常只有大目標的一半。

MS COCO instance segmentation challenge

CVPR2019論文: Augmentation for small object detection 提到了一些應對小目標檢測的方法,筆者結合這篇論文以及查閱其它資料,對小目標檢測相關技巧在本文進行了部分總結。

小目標的定義:在MS COCO數據集中,面積小於 32*32 的物體被認爲是小物體。

MS COCO Metrics

在COCO數據集中,小目標的數量更多,具體爲: 41% of objects are small (area < 322) 34% are medium (322 < area < 962) 24% are large (area > 962) area的計算方法:像素點的個數。 MS COCO Metrics 詳細介紹參考:https://blog.csdn.net/wangdongwei0/article/details/83033340

小目標難以檢測的原因:分辨率低,圖像模糊,攜帶的信息少。由此所導致特徵表達能力弱,也就是在提取特徵的過程中,能提取到的特徵非常少,這不利於我們對小目標的檢測。

現有的比較流行的方法是如何解決小目標檢測問題的?

1、由於小目標面積太小,可以放大圖片後再做檢測,也就是在尺度上做文章,如FPN(Feature Pyramid Networks for Object Detection),SNIP(An Analysis of Scale Invariance in Object Detection – SNIP)。

Feature-Fused SSD: Fast Detection for Small Objects, Detecting Small Objects Using a Channel-Aware Deconvolutional Network 也是在多尺度上做文章的論文。

FPN

2、在Anchor上做文章(Faster Rcnn,SSD, FPN都有各自的anchor設計),anchor在設置方面需要考慮三個因素:

anchor的密度:由檢測所用feature map的stride決定,這個值與前景閾值密切相關。

anchor的範圍:RetinaNet中是anchor範圍是32~512,這裏應根據任務檢測目標的範圍確定,按需調整anchor範圍,或目標變化範圍太大如MS COCO,這時候應採用多尺度測試。

anchor的形狀數量:RetinaNet每個位置預測三尺度三比例共9個形狀的anchor,這樣可以增加anchor的密度,但stride決定這些形狀都是同樣的滑窗步進,需考慮步進會不會太大,如RetinaNet框架前景閾值是0.5時,一般anchor大小是stride的4倍左右。

該部分anchor內容參考於:https://zhuanlan.zhihu.com/p/55824651

3、在ROI Pooling上做文章,文章SINet: A Scale-Insensitive Convolutional Neural Network for Fast Vehicle Detection 認爲小目標在pooling之後會導致物體結構失真,於是提出了新的Context-Aware RoI Pooling方法。

Context-Aware RoI Pooling

4、用生成對抗網絡(GAN)來做小目標檢測:Perceptual Generative Adversarial Networks for Small Object Detection。

Perceptual Generative Adversarial network

進一步從量化的角度來分析(參考CVPR2019論文:Augmentation for small object detection ):

COCO上的統計圖

1、從COCO上的統計圖可以發現,小目標的個數多,佔到了41.43%,但是含有小目標的圖片只有51.82%,大目標所佔比例爲24.24%,但是含有大目標的圖像卻有82.28%。這說明有一半的圖像是不含小目標的,大部分的小目標都集中在一些少量的圖片中。這就導致在訓練的過程中,模型有一半的時間是學習不到小目標的特性的。

此外,對於小目標,平均能夠匹配的anchor數量爲1個,平均最大的IoU爲0.29,這說明很多情況下,有些小目標是沒有對應的anchor或者對應的anchor非常少的,即使有對應的anchor,他們的IoU也比較小,平均最大的IoU也才0.29。

anchor示意圖

如上圖,左上角是一個anchor示意圖,右上角是一個小目標所對應的anchor,一共有隻有三個anchor能夠與小目標配對,且配對的IoU也不高。左下角是一個大目標對應的anchor,可以發現有非常多的anchor能夠與其匹配。匹配的anchor數量越多,則此目標被檢出的概率也就越大。

實現方法: 1、Oversampling :我們通過在訓練期間對這些圖像進行過採樣來解決包含小對象的相對較少圖像的問題(多用這類圖片)。在實驗中,我們改變了過採樣率和研究不僅對小物體檢測而且對檢測中大物體的過採樣效果

2、Copy-Pasting Strategies:將小物體在圖片中複製多分,在保證不影響其他物體的基礎上,增加小物體在圖片中出現的次數(把小目標扣下來貼到原圖中去),提升被anchor包含的概率。

如上圖右下角,本來只有一個小目標,對應的anchor數量爲3個,現在將其複製三份,則在圖中就出現了四個小目標,對應的anchor數量也就變成了12個,大大增加了這個小目標被檢出的概率。從而讓模型在訓練的過程中,也能夠有機會得到更多的小目標訓練樣本。

具體的實現方式如下圖:圖中網球和飛碟都是小物體,本來圖中只有一個網球,一個飛碟,通過人工複製的方式,在圖像中複製多份。同時要保證複製後的小物體不能夠覆蓋該原來存在的目標。

Copy pasting the small objects

參考代碼:https://github.com/zhpmatrix/VisDrone2018/tree/master/DataAug_Patching 該部分參考文章:https://zhuanlan.zhihu.com/p/57760020

網上有人說可以試一下lucid data dreaming Lucid Data Dreaming for Multiple Object Tracking,這是一種在視頻跟蹤/分割裏面比較有效的數據增強手段,據說對於小目標物體檢測也很有效。

Lucid Data Dreaming for Multiple Object Tracking

參考代碼:https://github.com/ankhoreva/LucidDataDreaming

其他

基於無人機拍攝圖片的檢測目前也是個熱門研究點(難點是目標小,密度大)。 相關論文: The Unmanned Aerial Vehicle Benchmark: Object Detection and Tracking(數據集) Drone-based Object Counting by Spatially Regularized Regional Proposal Network Simultaneously Detecting and Counting Dense Vehicles from Drone Images Vision Meets Drones: A Challenge(數據集)

參考文獻

1:https://zhuanlan.zhihu.com/p/55824651 2:https://zhuanlan.zhihu.com/p/57760020 3:https://www.zhihu.com/question/269877902/answer/548594081 4:https://zhuanlan.zhihu.com/p/60033229 5:https://arxiv.org/abs/1902.07296 6:http://openaccess.thecvf.com/content_cvpr_2017/papers/Li_Perceptual_Generative_Adversarial_CVPR_2017_paper.pdf 7:http://openaccess.thecvf.com/content_cvpr_2017/papers/Lin_Feature_Pyramid_Networks_CVPR_2017_paper.pdf

本文參與騰訊雲自媒體分享計劃,歡迎正在閱讀的你也加入,一起分享

 

 

欠採樣(undersampling)和過採樣(oversampling)會對模型帶來怎樣的影響?

轉自:https://www.zhihu.com/question/269698662

1. 爲什麼類別不平衡會影響模型輸出?

 大部分模型的默認閾值爲輸出值的中位數。比如邏輯迴歸的輸出範圍爲[0,1],當某個樣本的輸出大於0.5就會被劃分爲正例,反之爲反例。在數據的類別不平衡時,採用默認的分類閾值可能會導致輸出全部爲反例,產生虛假的高準確度,導致分類失敗。因此很多答主提到了幾點:1. 可以選擇調整閾值,使得模型對於較少的類別更爲敏感 2. 選擇合適的評估標準,比如ROC或者F1,而不是準確度(accuracy)。舉個簡單的例子,Sklearn的決策樹有一個參數是class_weight,就是用來調整分類閾值的,文檔中的公式:  # 權重與樣本數中每個類別的數量爲負相關,越少見的類別權重越大 n_samples / (n_classes * np.bincount(y))  所以遇到不平衡數據,用集成學習+閾值調整可以作爲第一步嘗試。

 2. 採樣法和類別不平衡有什麼關係?  

而通過採樣(sampling)來調整數據的不平衡,是另一種解決途徑,並且可以和閾值調整同時使用。但採樣法不是單純的從數據角度改變了模型閾值,還改變了模型優化收斂等一系列過程,在此不贅述。  而採樣法最受人詬病的就是可能會改變原始數據的分佈,從而帶來偏差。這個說法是否正確呢?讓我們帶着疑問來分析一下不同的採樣方法有什麼區別,該怎麼使用。有鑑於總被人批評答題公式太多,今天就以可視化和實驗爲主。  3. 如何直觀理解採樣法?  我們使用的第一個實驗數據是Cardio(Cardiotocogrpahy dataset),原始數據大小爲  :也就是1831條數據,每條數據有21個特徵。其中正例176個(9.6122%),反例1655個(90.3878%),屬於典型的類別不平衡問題。  先來看一張可視化圖,因爲原始數據是21維不易展示,所以我們使用T-SNE把數據嵌入到2維空間。圖中紅色代表正例,藍色代表反例(建議在電腦端閱讀)。數據重疊會加深顏色,甚至造成顏色混合。左上、左下、右上和右下依次是:  原始數據(Original):未經過任何採樣處理(  ) 欠採樣(Undersampling):從反例中隨機選擇176個數據,與正例合併(  ) 過採樣(Oversampling):從正例中反覆抽取並生成1655個數據(勢必會重複),並與反例合併(  ) SMOTE:也是一種過採樣方法。SMOTE通過找到正例中數據的近鄰,來合成新的1655-176=1479個“新正例”,並與原始數據合併(  )。此處應注意SMOTE並不是簡單的重複,而是一種基於原始數據的生成。另外一個相似的算法是ADASYN,此處省略。  不同採樣方法在2維空間上的展示(使用T-SNE進行嵌入到2維空間後) 所以可以很直觀地從圖中看出:  1. 過採樣(右上)只是單純的重複了正例,因此會過分強調已有的正例。如果其中部分點標記錯誤或者是噪音,那麼錯誤也容易被成倍的放大。因此最大的風險就是對正例過擬合。  2. 欠採樣(左下)拋棄了大部分反例數據,從而弱化了中間部分反例的影響,可能會造成偏差很大的模型。當然,如果數據不平衡但兩個類別基數都很大,或許影響不大。同時,數據總是寶貴的,拋棄數據是很奢侈的,因此另一種常見的做法是反覆做欠採樣,生成  個新的子樣本。其中每個樣本的正例都使用這176個數據,而反例則從1655個數據中不重複採樣。最終對這9個樣本分別訓練,並集成結果。這樣數據達到了有效利用,但也存在風險:  訓練多個模型造成了過大的開銷,合併模型結果需要額外步驟,有可能造成其他錯誤 正例被反覆使用,和過採樣一樣,很容易造成模型的過擬合 3. SMOTE(右下)可以看出和過採樣(右上)有了明顯的不同,因爲不單純是重複正例了,而是在局部區域通過K-近鄰生成了新的正例。相較於簡單的過採樣, SMOTE:  降低了過擬合風險。K近鄰在局部合成數據可以被理解爲一種集成學習,降低了方差。但或許也錯誤的加強了局部的偶然性,從而增加了過擬合風險。但一般來看,優點大於風險 也可以理解爲一種過採樣的soft version,對於噪音的抵抗性更強 缺點也有,比如運算開銷加大,同時可能會生成一些“可疑的點”,如下圖所示  4. 採樣法歸納總結  讓我們把實驗所中歸納出的經驗性性質總結一下,實驗細節和結果在文末:  採樣方法一般比直接調整閾值的效果要好。 使用採樣方法(過採樣和欠採樣)一般可以提升模型的泛化能力,但有一定的過擬合的風險,應搭配使用正則化模型 過採樣的結果較爲穩定,作爲一種升級版的過採樣,SMOTE也是不錯的處理方式,大部分時候和過採樣的效果相似 過採樣大部分時候比欠採樣的效果好,但很難一概而論哪種方法最好,還是需要根據數據的特性(如分佈)具體討論 實驗結果在(L2正則的邏輯迴歸、隨機森林、xgboost)一致,因此和採樣法搭配使用的模型最好可以很好的處理過擬合 但是不是過採樣就是萬能藥?未必。首先,它不可避免的帶來更大的運算開銷,其次當數據中噪音過大時,結果反而可能會更差因爲噪音也被重複使用。當然,除此以外還有更嚴謹的統計學理論說明採樣的力量,以及如何正確採樣,此處按下不表。我的一個不成熟的經驗是:使用過採樣(或SMOTE)+強正則模型(如XGBoost)可能比較適合不平衡的數據。拿到一個新的數據時,可以不妨直接先試試這個方法,作爲基準(Baseline)。  多說兩句的話,很多方法都可以結合起來,比如過採樣和欠採樣是可以結合起來的。一個比較成熟的算法就是用SMOTE過採樣,再利用Tomek's link再控制新的樣本空間。有興趣的朋友可以移步4. Combination of over- and under-sampling,這個例子的作者開發了imbalanced-learn(Welcome to imbalanced-learn documentation!),是一個Python上處理數據不平衡的工具庫,這個答案中的實驗代碼都是基於這個工具庫。  實驗細節:從實際的模型表現上進行一個對比  此處我們默認使用了邏輯迴歸(L2正則化),同時使用隨機森林進行了驗證,結果相似。因爲節省空間略去。 我們使用了10折交叉驗證,評估標準是F1(  )和ROC曲線下的面積 我們評估了 (1) 原始數據 (2) 閾值偏移 (3) 過採樣 (4) 欠採樣 (5) 構建多個欠採樣樣本集成 (6) SMOTE的結果。 共使用了5個數據集,具體結果如下: Cardio數據集:Cardiotocogrpahy dataset  Data: cardio | shape: (1831, 21) | F1 Threshold Moving:       0.829987896832 Original:               0.805920420913 Oversampling:           0.963759891658 Undersampling:          0.938725868726 Undersampling Ensemble: 0.821234363304 SMOTE:                  0.971714100029  Data: cardio | shape: (1831, 21) | ROC Threshold Moving:       0.992879432167 Original:               0.991171853188 Oversampling:           0.992246339935 Undersampling:          0.992405698663 Undersampling Ensemble: 0.992896183665 SMOTE:                  0.993895382919 Letter數據集:Letter Recognition dataset  Data: letter | shape: (1600, 32) | F1 Threshold Moving:       0.257964355223 Original:               0.2322000222 Oversampling:           0.80419404639 Undersampling:          0.762522610875 Undersampling Ensemble: 0.265496694535 SMOTE:                  0.94066718832  Data: letter | shape: (1600, 32) | ROC Threshold Moving:       0.778733333333 Original:               0.775133333333 Oversampling:           0.853071111111 Undersampling:          0.798 Undersampling Ensemble: 0.7762 SMOTE:                  0.961724444444 Mnist數據集:mnist dataset - ODDS  Data: mnist | shape: (7603, 100) | F1 Threshold Moving:       0.809942609314 Original:               0.843460421197 Oversampling:           0.963745254804 Undersampling:          0.939662842407 Undersampling Ensemble: 0.795183545913 SMOTE:                  0.972652248517  Data: mnist | shape: (7603, 100) | ROC Threshold Moving:       0.985425233631 Original:               0.985211857272 Oversampling:           0.991881775625 Undersampling:          0.976346938776 Undersampling Ensemble: 0.977791067047 SMOTE:                  0.99455044033 Ionosphere數據集:Ionosphere dataset  Data: ionosphere | shape: (351, 33) | F1 Threshold Moving:       0.755263843708 Original:               0.77205596336 Oversampling:           0.858191681928 Undersampling:          0.787040254432 Undersampling Ensemble: 0.757907605743 SMOTE:                  0.849245387823  Data: ionosphere | shape: (351, 33) | ROC Threshold Moving:       0.8816344887 Original:               0.88384133982 Oversampling:           0.946363011452 Undersampling:          0.881254109139 Undersampling Ensemble: 0.87103349549 SMOTE:                  0.953137058851 Pima數據集:Pima Indians Diabetes dataset  Data: pima | shape: (768, 8) | F1 Threshold Moving:       0.684815686152 Original:               0.614437063812 Oversampling:           0.744106797407 Undersampling:          0.762079698321 Undersampling Ensemble: 0.667769584397 SMOTE:                  0.749990784595  Data: pima | shape: (768, 8) | ROC Threshold Moving:       0.824891737892 Original:               0.824757834758 Oversampling:           0.83276 Undersampling:          0.825577308626 Undersampling Ensemble: 0.82011965812 SMOTE:                  0.84188

 對於樣本不平衡的監督學習,的確很頭疼,其實欠採樣和過採樣本身都沒有增加更多的信息。我自己之前踩過一些坑,分享如下:  嘗試半監督學習的方法; 無法一蹴而就讓模型或者算法達到理想結果的時候,注意積累樣本; 數據增強,尤其是處理圖片數據的時候。 嘗試一些無監督學習的方法; 欠採樣的時候可以訓練多個模型,最後嘗試模型投票的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章