飛槳AI識蟲“王者級”選手公開競賽寶典

 

本文主要從數據準備、數據增廣策略、檢測網絡、訓練技巧、方案改進五個方面對AI識蟲比賽進行了回顧,介紹了第二名的解決方案。該方案使用YoloV3作爲目標檢測器,並將檢測結果輸入到後置的SENet分類矯正網絡中作進一步優化,最後將結果通過一個改進的NMS方法進行過濾,得到最終結果,以此獲得了第二名的好成績。該方案目前已在Github開源,歡迎大家一起交流討論,地址是:

https://github.com/LKKlein/AI-Insects-Challenge

賽題背景

 

AI識蟲比賽來自於課程《百度架構師手把手教深度學習》,該課程主要包含深度學習基礎、計算機視覺、自然語言處理等各方面的內容。該比賽是計算機視覺階段的結業比賽,是一個典型的目標檢測任務,主要利用各種目標檢測算法對圖片中的七種林業病蟲類別和位置進行預測。

數據準備

比賽數據來自於百度飛槳與北京林業大學合作開發的AI識蟲項目,是一個偏向於產業實踐的項目。數據總共包含2183張圖片,且已經被劃分爲了訓練集、驗證集和測試集,分別包含1693張、245張和245張圖片,比例約爲78:11:11,分配比例合適。同時,經過簡單的統計,訓練集和驗證集一共包含12203個真實框,如此量級的數據已經足夠支撐一般的深度學習網絡,再配合相關的數據增廣策略,稍微更深的網絡也應該沒有問題。

爲了更深層次的瞭解一下數據,首先對數據集做了一個簡單的分析。數據一共包含7種類型的蟲子,大部分呈現褐色、黑色,少部分是淡色,如圖1所示,背景皆爲透明的圓形容器器皿,底色均爲白色。

圖1 AI識蟲示例數據

就數據的真實框而言,平均每張圖真實框的數量最大爲10,最少爲4,平均在6-7左右,這個數據對NMS後處理的參數設定相當重要。真實框的一些比例分析如圖2所示,真實框相對於原圖的面積大概在0.1%到2%左右,長寬相對於原圖的長寬也基本在2%到20%左右,而且相對於原圖比例更小的部分,其數量佔據絕大部分,中等比例的其次,比例最大的幾乎沒有,這說明該檢測任務是以中小目標爲主,在改進網絡和訓練時需要重點照顧這部分中小比例的目標。

  2(a) 真實框面積佔原圖比例              2(b) 真實框長寬佔原圖比例

除此之外,對於數據中各個類別的比例也需要關心,這裏統計了訓練集和驗證集中不同類別的真實框數量。可以看到在訓練集中,七個類別之間真實框的數量相差最大爲1:3,並沒有出現特別的類別不均衡現象。但是在驗證集中,可以發現最後一個類沒有數據,這可能導致驗證評估的時候,對最後一個類的結果不能正確評估,因此驗證集可能需要簡單處理一下,從訓練集抽取一部分包含最後一個類的真實框,隨機貼到驗證集的圖中,從而生成新的驗證集。

數據增廣策略

YoloV3作者的實現版本中使用了大量的數據增廣策略,這使得訓練的模型擁有了更佳的泛化性能。在AI識蟲比賽中,老師已經提供了多個數據增廣的策略,包括隨機色彩變換、隨機填充、隨機裁剪、隨機縮放、隨機翻轉、真實框隨機順序、隨機多尺度訓練共七種策略,其中隨機填充、隨機裁剪、隨機翻轉需要同時對真實框進行處理,保證真實框永遠與相應的物體對應。

 

除此之外,本方案中還加入了隨機旋轉和MixUp兩個數據增強策略。由於比賽中的圖像是圓形的器皿盤,而且蟲子也是相對於不同方向擺放,因此旋轉對於蟲子的檢測具有很強的現實意義,但目前利用旋轉矩陣計算旋轉的真實框結果相當不準確,旋轉角度越接近45度,旋轉後的框越大。因此,目前只能在0度和90度附近進行旋轉,保證真實框的質量。MixUp是指按一定的權重隨機混合兩張圖像,從而生成新的圖像,新圖像擁有兩張圖片的所有真實框。MixUp主要用於泛化被遮擋的物體,在AI識蟲數據集中,會有部分蟲子靠得很接近的情況,MixUp可以在一定程度上也能對這種數據進行泛化。

圖3 數據增廣與原始圖像對比

檢測網絡

本方案中使用一階段檢測方法中,高效又準確的YoloV3作爲目標檢測器。在YoloV3中,添加了SSD的特徵金字塔,極大地改善了對小目標的檢測效果,同時又使用route與上採樣機制改進了SSD特徵金字塔的特徵提取不充分的缺陷,使其對小目標有了極佳的魯棒性。而AI識蟲任務中,大多都是小目標,因此YoloV3具有很好的適應性。

 

YoloV3原論文中使用的特徵提取器是DarkNet53,這也是YoloV3中的特點。但在本方案中,使用了更好的特徵提取器ResNet50-vd替換了原始的DarkNet53作爲新的BackBone,同時在後面還添加了一層可變形卷積DCN,用於突出特徵圖中有物體的區域,可以保證更好的特徵提取。特徵提取器的更換爲最終的結果貢獻了1.5個mAP的提升。

訓練技巧

訓練技巧對於模型mAP的提升具有意想不到的效果。李沐大神的《Bag of Freebies for Training Object Detection Neural Networks》中,使用了6個訓練技巧分別在VOC數據集上訓練YoloV3和FasterRCNN,分別有了3.43和3.55個mAP的提升效果。本方案中也使用了6個訓練技巧中的部分,同時添加了一些自己精調網絡的技巧。這裏沒有記錄各個技巧的具體提升效果,但是親測這些方法都能有效提升最後的結果。

01

微調預訓練參數

卷積本身也就是一個特徵提取器,淺層卷積提取的基本是圖像的輪廓、邊緣、紋理等特徵,這對所有圖像而言是通用的。在大型數據集上充分訓練過的卷積具有更好的特徵提取能力,所以利用預訓練遷移可以大大減小訓練的時間,使損失下降得更快,同時還能更容易找到最優空間。

02

學習率調整策略

學習率的變化決定了網絡的優化時間和優化方向,初期網絡搜索空間較大,如果學習率過大會導致損失發散,無法收斂到好的極值點。根據李沐大神的建議,在優化初期使用WarmUp策略,可以使初期網絡訓練更加穩定;在後期使用餘弦衰減策略,不僅可以讓學習率變化更加平滑,還能提供週期性變化的學習率,使網絡跳出局部最優。

03

標籤平滑

標籤平滑其實是一種正則化策略,降低網絡對標籤置信度的依賴,這對有漏標、錯標數據具有很好地適應性,而AI識蟲數據集中似乎存在這種情況。

04

逐層精調,減少網絡搜索空間

網絡搜索空間越大,訓練時間越久,優化難度越高。因此,通過預訓練微調,然後再通過凍結網絡層進行精調,可以減小網絡的搜索空間,從而降低優化的難度。在YoloV3的優化中,主要分爲了四個部分,分別是BackBone的特徵提取器以及三個Yolo層分支,逐步訓練並凍結這四個部分再進行精調,可以讓網絡得到很好地提升。親測凍結第一個Yolo的route層之後,精調二三層的中等物體和小物體訓練,可以將網絡的mAP提升1.5~2左右。

05

數據增廣的配合

數據增廣效果是否具有實際意義對後期的網絡精調也有一定的影響,如之前隨機旋轉的真實框問題,對網絡精調會產生較大的負面影響;MixUp可能導致大量的重疊,同時減小了對應類別的置信度,後期可能會讓損失產生較大波動。因此,在精調的時候注意調整數據增廣的策略。

06

減小動量

目前深度學習的優化器大都具備動量自適應,但是在最後精調階段,動量過大也許會讓網絡又跳出了最優區域,適度的減小動量參數,可以讓後期網絡緩慢的朝着更優的方向優化。

07

不要忘記驗證集

深度學習,數據爲王,更多的數據往往會爲網絡優化帶來新的方向。當其他參數都已固定時,聯合訓練集和驗證集進一步訓練,讓網絡看見更多數據,進一步加強訓練。

改進提升

01

結果分析

檢測模型的處理基本結束,如果按照默認的NMS參數進行後處理,在測試集上能得到99.04的mAP,看上去效果已經非常不錯了,在AI識蟲比賽中也能拿到一個非常好的成績了。但是,這並不是最終的目標,還需要對檢測結果進一步分析,找到錯誤的原因。

 

默認的NMS主要包含三個參數——NMS的IOU閾值、置信度score_threshold閾值、最終保留預測框的個數。其中第一個參數在同類別靠得很近的時候也會產生較大的IOU,因此這個閾值並不能說明問題。第二個置信度分數默認值是0.01,但是在調大該值的時候,會出現mAP瞬間下降的情況,這表明結果中有出現分類錯誤的情況,調高score_threshold,導致正確的類別被過濾,相同的框只保留了錯誤的類別,mAP自然就降低了。第三個參數keep_topk默認值是100,通過查看結果可以發現,同一個框保留了多個類別的結果,這表明分類置信度不夠高,無法過濾掉得分稍低的類別;除此之外,通過顯示檢測結果,可以發現還存在一些冗餘和重複的候選框。

圖4 誤檢情況可視化分析

因此,主要是三個原因導致mAP沒有更高,分別是分類置信度低;存在分類錯誤;候選框冗餘、重複。

02

改進方案

針對上述存在的三個問題,本方案中主要從三個方面進行改進。

第一,提高NMS的score_threshold,減小keep_topk。提高置信度可以讓同一框附近只保留得分較高的類別,儘管存在分類錯誤,但是隻要預測框是對的就還能補救;減小keep_topk其實跟提高置信度效果一致,都可以刪除大量冗餘的候選框,根據之前的數據分析結果,平均每張圖的真實框個數在4-10個,平均爲6個,因此這裏保留兩倍的真實框數量,大概在12-20左右即可,可以在這個範圍內進行調整。這裏將score_threshold調整爲0.1,keep_topk調整爲18,儘管調整之後驗證集和測試集的mAP分別降低爲了95.36和95.30,但是冗餘框及一些置信度特別低的錯誤框都被剔除了,爲後續類別矯正奠定了基礎。

第二,添加分類矯正網絡,修正分類結果。Yolo中需要同時兼顧分類和檢測框,可能導致分類訓練不充分,或者受其他因素影響,使得分類結果不準確。因此通過重新訓練一個分類網絡,可以矯正分類效果,提升分類置信度。

第三,通過改進NMS處理,合併冗餘候選框,進一步過濾低置信度框。

 

03

分類矯正網絡

這裏選擇的分類方法是由Momenta公司在2017年提出的Squeeze-and-Excitation Networks(SENet),它通過對特徵通道間的相關性進行建模,把重要的特徵進行強化來提升準確率。這個結構是2017 ILSVR競賽的冠軍,top5的錯誤率只有2.251%,比2016年的第一名還要低25%,可謂提升巨大。因此,這裏選擇SE-ResNet50作爲分類的網絡架構,提升YoloV3檢測結果的分類準確率。

圖5 SENet中的SE模塊

這裏分類網絡的輸入是原始圖片中裁剪的檢測框小圖,輸出是對應蟲子的類別以及相應的置信度。在訓練階段,使用AI識蟲訓練集的真實框裁剪作爲輸入,同時增加隨機填充、隨機裁剪、隨機旋轉、隨機色彩等數據增廣方式,充分考慮YoloV3檢測框可能出現的結果,最終訓練的分類模型在驗證集上能達到99%左右的準確率

 

通過分類網絡對檢測結果進行分類矯正之後,驗證集的檢測結果從95.30增長到了97.41,上升了2.11個mAP;而測試集的mAP從95.36增長到了95.58,上升了0.22個mAP。在分類網絡處理完成之後,通過對結果的可視化,可以觀察到,分類以及置信度效果相當好,但同類別iou高的框也特別多,因而影響了結果的評估。

 

04

改進NMS處理

根據可視化的檢測結果,本方案對傳統NMS方法進行了改進,主要包含一下三個步驟:

1. 對於兩個同類別的檢測框:如果 iou > 閾值,則使用兩個檢測框的外接矩形作爲最終的框,同時使用得分高的置信度作爲最終置信度;如果 iou < 閾值,保留兩個檢測框。

2. 重複步驟1,但是將 iou 計算方式更換,替換爲兩個框交集面積佔兩個框各自面積的比例之中大的一個,主要用於過濾大框包含小框的情況,不過需要將閾值調得儘量高一些,避免相隔較近重疊較高的框被過濾。

3. 剔除得分過低的檢測框。將分類矯正的結果通過改進的NMS之後,驗證集提升了2.53個mAP,測試集提升了4.41個mAP,整體達到了非常好的檢測效果。

圖6 改進提升後的效果展示

後記

本次AI識蟲比賽前前後後經歷了一個月,這也是我第一次正式做 CV 的比賽,心裏非常緊張,總是怕自己做不好,所以幾乎每一天都在訓練,每一天都在改進。雖然最後只使用了簡單的YoloV3作爲檢測器,但是期間我嘗試過SSD、Faster-RCNN、RetinaNet、模型融合、多尺度測試等等各種方法,最後在考慮效率和優化難度上,選擇了YoloV3。

所幸最後也取得了很好地成績,證明了自己的實力。這一個月的各種專注、探索、腦洞,也讓我學習到了很多新的東西,這是課堂上老師教不會的,這是真正自己的東西。所以,很感謝AI識蟲比賽,也很感謝課程的所有老師,同時也要感謝百度的PaddlePaddle、PaddleDetection等框架,可以讓想法快速得到實現,也纔能有我現在的成績。另外,比賽方案的代碼已在GitHub開源,地址是:

https://github.com/LKKlein/AI-Insects-Challenge。如果大家有興趣,歡迎一起交流討論,點個Star也是可以的!

 

相關鏈接:

 

YOLOv3:

https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.2/docs/featured_model/YOLOv3_ENHANCEMENT.md

 

SENet:https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/image_classification/models/se_resnet_vd.py

 

如在使用過程中有問題,可加入飛槳官方QQ羣進行交流:703252161

 

END

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