Kaggle競(jìng)賽中使用YoloV5將物體檢測(cè)的性能翻倍的心路歷程
點(diǎn)擊上方“AI算法與圖像處理”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
作者:Mostafa Ibrahim
編譯:ronghuaiyang 來(lái)源:AI公園
作者在kaggle比賽中從建立基線到一步一步的優(yōu)化過(guò)程,最終將performance提升了一倍,非常好的競(jìng)賽經(jīng)驗(yàn)總結(jié)文章。

我花了三個(gè)月的時(shí)間深入研究物體檢測(cè)。我嘗試了很多方法,從實(shí)現(xiàn)最先進(jìn)的模型,如YoloV5、VFNets、DETR,到將目標(biāo)檢測(cè)模型與圖像分類(lèi)模型融合以提高性能。在比賽的早期階段,我努力提高基準(zhǔn)模型的分?jǐn)?shù),但我找不到有用的在線資源,這就是我寫(xiě)這篇文章的原因。我想帶你們踏上一段從頭到尾的旅程,簡(jiǎn)要地向你們展示我所走的每一步,我的成績(jī)幾乎翻了一倍。
官方的競(jìng)賽指標(biāo)是(mean) Average Precision,這是最常用的目標(biāo)檢測(cè)指標(biāo)之一。為了向你展示每一步的進(jìn)步,我將在旁邊加上它的分?jǐn)?shù)。
1、第一步是建立一個(gè)簡(jiǎn)單的基線,0.126 mAP
我敢肯定,這是大量數(shù)據(jù)科學(xué)家早前落入的陷阱。我們總是很興奮地用我們能想到的每一種技術(shù)來(lái)做最復(fù)雜的模型。這是一個(gè)巨大的錯(cuò)誤,你最終會(huì)感到沮喪并離開(kāi)ML項(xiàng)目,即使你不這樣做,你也很可能會(huì)過(guò)擬合。
我經(jīng)歷了慘痛的教訓(xùn),但最終還是用以下規(guī)范構(gòu)建了一個(gè)初始模型:
-
YoloV5-XL -
圖像的分辨率從3K調(diào)整為512
我知道這聽(tīng)起來(lái)很簡(jiǎn)單,一開(kāi)始我也是這么想的。但是,實(shí)際上,構(gòu)建基線可能是最煩人的步驟之一。因?yàn)橛泻芏嗖襟E,比如將輸出處理成競(jìng)賽的格式等等(我不想深入討論)。
另外,我實(shí)際的初始YoloV5-XL模型只有0.064(上面的一半),我花了2周的時(shí)間調(diào)試它,結(jié)果發(fā)現(xiàn)我沒(méi)有正確地歸一化輸入數(shù)據(jù)!
2、去掉一個(gè)輸入類(lèi)別!0.143 mAP (+13%)
這個(gè)trick當(dāng)時(shí)對(duì)我來(lái)說(shuō)沒(méi)有多大意義。14個(gè)輸入類(lèi)別,13種不同疾病,1個(gè)“No Finding”類(lèi)別。大約70%的數(shù)據(jù)集屬于“No Finding”類(lèi),只有30%屬于其他類(lèi)。有個(gè)參賽者發(fā)現(xiàn),你可以去掉這個(gè)類(lèi),并使用“2 class filter”技巧來(lái)預(yù)測(cè)它(見(jiàn)下文)。這使得數(shù)據(jù)集的傾斜度大大降低。此外,它允許訓(xùn)練明顯更快(因?yàn)槟銓⒂?xùn)練更少的圖像)。
3、增加訓(xùn)練和推理圖像的分辨率,0.169 mAP (+18%)
第二步是將圖像分辨率從512提高到1024。這是一個(gè)微不足道的改進(jìn),但我想在這里傳達(dá)的重點(diǎn)是,如果我以這個(gè)分辨率開(kāi)始,我可能不會(huì)進(jìn)一步提高我的分?jǐn)?shù)。原因很簡(jiǎn)單,因?yàn)樵谶@個(gè)更高的分辨率上進(jìn)行訓(xùn)練會(huì)導(dǎo)致批大小從16減少到4(為了不耗盡GPU內(nèi)存),這大大減慢了訓(xùn)練過(guò)程。這意味著更慢的實(shí)驗(yàn),你不會(huì)想用更慢的實(shí)驗(yàn)來(lái)比賽……
4、融合EfficientNet和YoloV5,0.196 mAP (+16%)
這不是我的主意,我是從一個(gè)public kernel中得到的想法。但是,這是我在Kaggle比賽中遇到的最好的主意之一。我想強(qiáng)調(diào)的是,在Kaggle上進(jìn)行比賽的一個(gè)主要好處是你可以從社區(qū)中學(xué)到很多東西。
這里的主要思想是訓(xùn)練一個(gè)圖像分類(lèi)模型(EfficientNet),它可以實(shí)現(xiàn)非常高的AUC(約0.99),并找到一種方法將其與目標(biāo)檢測(cè)模型融合。這被稱為“2 class filter”,比賽中的每個(gè)人都采用了這個(gè)方法,因?yàn)樗蟠筇岣吡朔謹(jǐn)?shù)。我會(huì)在下一篇文章中介紹。
5、加權(quán)框融合(WBF)后處理,0.226 mAP (+15%)
這對(duì)我來(lái)說(shuō)也是一個(gè)全新的想法,在網(wǎng)上很難找到。加權(quán)框融合是一種對(duì)目標(biāo)檢測(cè)模型產(chǎn)生的框進(jìn)行過(guò)濾,從而使結(jié)果更加準(zhǔn)確和正確的技術(shù)。它的性能超過(guò)了現(xiàn)有的類(lèi)似方法,如NMS和soft-NMS。具體內(nèi)容我會(huì)在另一篇文章介紹。
應(yīng)用WBF的結(jié)果是這樣的:

6、用5折交叉驗(yàn)證使用WBF融合,0.256 mAP (+13%)
我犯過(guò)的一個(gè)最大的錯(cuò)誤是我忘記做交叉驗(yàn)證,這也是我寫(xiě)這篇文章的主要原因之一,就是為了強(qiáng)調(diào)ML基礎(chǔ)知識(shí)的重要性。我太專注于應(yīng)用新技術(shù)和提高性能,以至于忘記了應(yīng)用這個(gè)基本的ML技術(shù)。
如果你想知道我是如何得到0.256的,那是因?yàn)槲易x了一些在競(jìng)賽結(jié)束后發(fā)布的解決方案,這是在類(lèi)似于我的模型的交叉驗(yàn)證后他們大多數(shù)能得到的結(jié)果。最終的pipeline可以在這里看到:

7、我嘗試過(guò)的其他的東西,但是沒(méi)有成功
-
DETR訓(xùn)練。DETR是一個(gè)了不起的目標(biāo)檢測(cè)transformer ,我想把它實(shí)踐,但是,我沒(méi)有發(fā)現(xiàn)他們提供的代碼文檔有什么幫助,我也找不到很多有用的資源。此外,我花了大約3周的時(shí)間(大約是比賽持續(xù)時(shí)間的四分之一)嘗試讓它工作。我這么說(shuō)的原因是,雖然離開(kāi)你一直在研究的解決方案可能很難,但在實(shí)驗(yàn)性ML的世界里,這有時(shí)不得不做,說(shuō)實(shí)話,我希望我可以早一點(diǎn)離開(kāi)。但是,好的一面是,我發(fā)現(xiàn)另一個(gè)名為MMDetection的庫(kù)提供了DETR,而且使用起來(lái)容易得多。 -
WBF預(yù)處理,雖然很多競(jìng)爭(zhēng)對(duì)手都說(shuō)這提高了他們的分?jǐn)?shù),但并沒(méi)有提高我的分?jǐn)?shù)。這就是ML的特點(diǎn),并不是所有的技術(shù)都能以同樣的方式使不同的模型受益。
我最終的代碼:https://github.com/mostafaibrahim17/VinBigData-Chest-Xrays-Object-detection-
英文原文:https://towardsdatascience.com/a-journey-of-building-an-advanced-object-detection-pipeline-doubling-yolov5s-performance-b3f1559463bf
個(gè)人微信(如果沒(méi)有備注不拉群!) 請(qǐng)注明:地區(qū)+學(xué)校/企業(yè)+研究方向+昵稱
下載1:何愷明頂會(huì)分享
在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結(jié)分析
下載2:終身受益的編程指南:Google編程風(fēng)格指南
在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):c++,即可下載。歷經(jīng)十年考驗(yàn),最權(quán)威的編程規(guī)范!
下載3 CVPR2021
在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):CVPR,即可下載1467篇CVPR 2020論文 和 CVPR 2021 最新論文
點(diǎn)亮
,告訴大家你也在看
