作者:Mostafa Ibrahim
編譯:ronghuaiyang
導讀
使用EfficientNet和YoloV5的融合可以提升20%的performance。
在本文中,我將解釋上一篇文章中稱之為“2 class filter”的概念。這是一種用於目標檢測和分類模型的綜合技術,在過去幾周我一直在做的Kaggle比賽中被大量使用。幾乎所有參加比賽的人都使用了這種技術,它似乎可以提高大約5-25%的性能,這是非常有用的。
目標檢測:YoloV5
我們首先在我們的數據集上訓練YoloV5模型,同時使用加權框融合(WBF)進行後處理/預處理,如果你想了解更多,我建議查看這兩篇文章:
1、Kaggle競賽中使用YoloV5將物體檢測的性能翻倍的心路歷程
2、WBF:優化目標檢測,融合過濾預測框
我不想再深入討論使用WBF訓練YoloV5的細節。但是,你需要做的基本上就是使用WBF消除重複的框,然後對數據進行預處理,在其上運行YoloV5。YoloV5需要一個特定的層次結構來顯示數據集,以便開始訓練和評估。
分類:EfficientNet
接下來要做的是在數據集上訓練一個分類網絡。但是,有趣的一點是,雖然目標檢測模型在14個不同的類(13個不同類型的疾病和1個無疾病類)上訓練,但我們只在2個類(疾病和無疾病)上訓練分類網絡。你可以認為這是一種建模方法,簡化了我們的分類問題,因為2分類網絡比14分類容易得多,當我們融合這兩個網絡時,我們真的不需要每一個疾病的細節,我們將只需要一個2分類。當然,對於你的問題,這可能有點不同,因此你可能需要試驗不同的設置,但是希望你能從本文中獲得一些想法。
目前最先進的分類網絡之一是EfficientNet。對於這個數據集,我們將使用使用Keras (TensorFlow)訓練的B6 EfficientNet,以及這些擴展:
(
rescale=1.0 / 255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode="nearest",
)
集成
這就是使用2分類過濾器來提高性能的原因,也是本文真正要討論的內容。關於訓練YoloV5和EfficientNet,我不想説太多,因為有很多資源可以提供給他們。
我想強調的主要思想是,儘管Yolo的分類預測非常好,但如果你可以將它們與另一個更強大的網絡的分類混合在一起,你可以獲得相當不錯的性能提升。讓我們看看這是如何實現的。這裏使用的想法是設置一個高閾值和一個低閾值。然後我們要檢查每個分類預測。如果概率小於低閾值,我們將預測設置為“無疾病”。回想一下,我們最初的問題是對14種疾病中的一種進行分類,或者對“無疾病”進行分類。這個低閾值可以是0到1之間的任何值,但可能是0到0.1之間的某個值。此外,如果分類預測在低閾值和高閾值之間,我們得到一個“No Disease”的預測,該預測具有EfficientNet的置信度(不是Yolo)。最後,如果分類預測高於高閾值,我們什麼也不做,因為這意味着網絡是高度自信的。
可以這樣實現:
low_thr = 0.08
high_thr = 0.95
def filter_2cls(row, low_thr=low_thr, high_thr=high_thr):
prob = row['target']
if prob<low_thr:
## Less chance of having any disease
row['PredictionString'] = '14 1 0 0 1 1'
elif low_thr<=prob<high_thr:
## More chance of having any disease
row['PredictionString']+=f' 14 {prob} 0 0 1 1'
elif high_thr<=prob:
## Good chance of having any disease so believe in object detection model
row['PredictionString'] = row['PredictionString']
else:
raise ValueError('Prediction must be from [0-1]')
return row
最後的思考
在比賽期間,我已經在各種不同的場景和模型上試驗了這2分類過濾器,它似乎總能提高25%的性能,這是令人驚訝的。我認為如果你想把它應用到你的自定義場景中,你需要考慮在哪些情況下分類網絡預測可以幫助你的目標檢測模型。這並不完全是交換預測的執行度,而是用一種聰明的方式“融合”它們。
—END—
英文原文:https://towardsdatascience.com/fusing-efficientnet-yolov5-advanced-object-detection-2-stage-pipeline-tutorial-da3a77b118d1