檢測優(yōu)化的實用Trick示例分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
我們提供的服務有:網站設計、做網站、微信公眾號開發(fā)、網站優(yōu)化、網站認證、海陵ssl等。為上千家企事業(yè)單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的海陵網站制作公司
寫這篇文章就是因為up主的邀請,然后分享一下自己工作時候總結的一些經驗和技巧,不一定適用別的網絡,有的還可能會有反作用,所以也就是給大家提供一個思路,歡迎拍磚吧,因為都是公司數(shù)據(jù),分享試驗結果也比較麻煩,所以大家看個思路就好。
圖像預處理部分調參的主要目的是對輸入數(shù)據(jù)進行增強,使得網絡模型在訓練的過程中能更專注于目標特征部分的學習。常用的方式是圖像的隨機旋轉、裁剪以及翻轉等方式,這些方式的預處理其本質其實是為了讓你的數(shù)據(jù)集更豐富,讓網絡能夠學習到更多的分布情況,這個網上已經有很多博客了,筆者就不贅述了;另一種調整的trick是在圖像上疊加信息,例如在輸入數(shù)據(jù)上增加高斯噪聲,椒鹽噪聲,從而提升網絡對有干擾和成像較差情況下的目標檢測能力。本文將對圖像上疊加信息的調參技巧進行一定的擴展講解。
1、為什么在原始圖像上疊加信息會管用,不會破壞原有的圖像信息么?
在圖像上疊加信息分成兩類,一類是疊加噪聲,這種操作的目的是為了讓網絡能夠適應圖像質量不佳情況下的圖像檢測任務,在板端實測的結果,這種疊加噪聲的方式也可以一定程度提高網絡對輸入圖像中待檢測目標的仿射變換的適應能力。筆者通過在輸入圖像上疊加一定量的高斯噪聲,在Hi3516CV500上完成基于yolov3-tiny的車牌檢測任務時,提高了0.5%的精度。
另一類信息的疊加是對嘗試對圖像上某一特定特征進行增強,該增強的目的是突出該方面的圖像特征,使得網絡能夠首先注意到該種特征并更專注于此類特征的學習,因為這種方式只是對圖像中的指定特征或位置有變動,并不會整體上對圖像的結構有巨大的改變,所以并不會破壞圖像的信息可讀性。例如:利用canny算子對圖像中的邊緣特征進行增強。
2、上面說的兩種調參技巧是怎么想出來的?
我們都知道,網絡學習的是數(shù)據(jù)中的參數(shù)分布,何凱明大神也在retinanet的論文里提到過,數(shù)據(jù)的不平衡是影響檢測網絡性能的主要因素,而focal loss的提出就是讓網絡在學習時更專注于漏檢和誤分的樣本。那么我們接著這個思路想,如何使得網絡更專注于目標區(qū),從而獲得盡量多的價值更高的誤撿和漏檢樣本呢?花朵吸引蜜蜂靠的是自己的香味和更鮮艷的外表,所以我們也要讓目標區(qū)域更“顯眼”,而平時在訓練檢測網絡時,發(fā)現(xiàn)對數(shù)據(jù)集進行標注時,anchor base類算法,目標標注框比實際的物體緊縮框大大概幾個像素時得到的檢測結果統(tǒng)計精度和定位框的穩(wěn)定性都會好,那么我們是不是可以認為,對anchor base的檢測網絡來說,目標物體的邊緣也是很重要的,所以就想到了通過canny算子增強邊緣的方式來增強訓練數(shù)據(jù)。
3、如何在實際的網絡訓練中應用以上的技巧?
實際使用過程如下:
1)通過對輸入數(shù)據(jù)的手動查驗或自動化統(tǒng)計,確定較好的canny閾值
2)利用閾值對訓練樣本中10-20個batch的數(shù)據(jù)進行canny邊緣增強。
3)增強方式為:原圖轉灰度提取到的canny邊緣所對應的原圖像素位置進行對比度增強或直接涂黑。加深程度可以由自定義的超參數(shù)alpha來指定。
4)用這10-20個batch的數(shù)據(jù)進行幾個epoch的訓練后再換成普通數(shù)據(jù)進行訓練。
講了預訓練時候的數(shù)據(jù)增強,接下來是模型訓練參數(shù)部分。其實這部分網上講的trick很多了,大家平時注意搜集一下或者github上找一找,就有很多人的練手的倉庫可以跟著學。我也就不多講了,因為我也不敢說學全了。我講講我自己實際跑模型時候的一些想法。
1、BFEnet特征擦除網絡
這個網絡是reid方向的,先講這個是因為,這個特征擦除和上面講到的噪聲本質上有相似的地方,都是通過在訓練時遮蔽一部分特征值,來讓網絡習慣一定量的噪聲干擾,從而增強性能。這個技巧可以用在應對有遮擋的場景下的模型。
1、anchor的調整
在yolo的代碼里大家肯定都看了,作者是根據(jù)你給的數(shù)據(jù)集里面,標定的目標的長和寬進行k-means的聚類,然后確定在當前這個數(shù)據(jù)集上的anchor的。我這里的經驗就是,我發(fā)現(xiàn)有人問過我為啥我只訓練一類的檢測,然后重新計算的anchor6個或者9個anchor尺寸差的都不大,但是在實際檢測的時候,卻檢測不到東西。我的結論是:對anchor的設計應該是基于模型作者默認的anchor進行微調而不是完全的重新計算。
原因:大家都知道,yolov3來說,輸出是三個特征圖,分別對應小目標,中目標和大目標。比如我們要檢測的目標在圖像中占比我們人眼感覺應該是比較大的,然后我們統(tǒng)計的框也都是比較大的尺寸,但是在實際訓練的時候,并不是說大目標就一定由yolov3的最初設計的大目標輸出層輸出的。很可能就是由中間目標層輸出的,而因為anchor的設計過大,導致訓練的網絡不收斂的有之,明明收斂了,卻檢測不到目標的情況也有之。
解決辦法:在設計anchor的時候,首先統(tǒng)計目標框的分布,然后進行聚類,聚類后替換或修改原有的9個anchor中和你計算的anchor相近的幾個原有的anchor值。然后再訓練,如果框還是不夠緊縮,再對某幾個框進行精調就可以了,核心思路就是:anchor的分布也要滿足對全集的稀疏覆蓋而不僅僅是你的當前數(shù)據(jù)集。
2、后處理的優(yōu)化
后處理的優(yōu)化部分嚴格來說不算是網絡訓練的trick了,應該是部署的trick,比如海思的NPU部署的時候,會限制比較大的pool核,所以最好訓練的時候就把大的pooling切換為幾個小的連續(xù)pooling,實測雖然理念上兩者應該是差不多的,但是實際上還是差了0.3%的精度。(指的是直接多層的pooling轉換到板子和訓練時是一個大的pooling,到轉換時候再改結構成幾個小的pooling)
還有一個就是nms部分,這部分也有同學問過我說因為我的數(shù)據(jù)集有遮擋,可能兩個離的比較近的,nms就把有遮擋的那個小目標去掉了。這部分分享一個小技巧就是,你在算nms的時候,也關注一下兩個框的中心點距離,可以設置中心點距離超過多少的兩個框,不做nms。這樣就能避免nms的一部分武斷刪除檢測結果bbox。
3、大模型訓練時的一個訓練技巧
有一位同學問過我,就是為啥同樣的模型,用比較少的數(shù)據(jù)訓練的時候很快到了97%的MAP,但是換300w的大數(shù)據(jù)集的訓練以后,卡在93%上不去了。這里面有一個技巧叫warm up,也就是說在大數(shù)據(jù)下訓練模型的時候,可以先從大數(shù)據(jù)集上取一部分數(shù)據(jù)訓練模型,然后以這個訓練的模型為預訓練模型,在大數(shù)據(jù)集上,增大batch_size再進行訓練,至少沒卡在93%這個問題上了。
4、學習率手動修正策略
我們訓練的時候,一般都會設置學習率的衰減,有很多的方式,按已迭代步長的,按當前損失值的,按訓練集當前損失值和測試集計算的損失值的gap差值做修正項的。我這里提到的技巧就是比如以步長調整學習率為例,什么時候可以靠自動化的修正學習率,什么時候要手動調整一下。
我們在訓練模型的時候,一般都會關注損失函數(shù)變化曲線圖,在曲線圖中,數(shù)據(jù)集的稀疏程度能通過損失曲線的震蕩情況有一定的反映,如果有個別的跳點,多為數(shù)據(jù)集中的壞數(shù)據(jù)(標記錯誤數(shù)據(jù)),當我們的損失圖呈現(xiàn)為震蕩--階躍--在另一個損失值附近震蕩時,就要注意了,此時多半是因為你的數(shù)據(jù)集在做打亂的時候數(shù)據(jù)并沒有打的很散,可以在這個位置先停止訓練并記錄當前狀態(tài),再降低學習率,繼續(xù)訓練,等訓練數(shù)據(jù)再次開始恢復之前的震蕩位置時,再恢復學習率訓練。
這樣操作的原因是為了避免在參數(shù)中引入過大的噪聲,噪聲分兩種,一種就是錯誤的數(shù)據(jù),比如背景啊,像目標但是不是目標的東西,還有就是多類別訓練的時候,對每個類別來說,其余類別也算是噪聲的一種。所以采用要么把數(shù)據(jù)集弄好(這個很難,我也沒看過誰的文章里真的能說清把訓練集弄好是啥樣的),要么加大batch,要么就訓練時候注意。
關于檢測優(yōu)化的實用Trick示例分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關知識。