劉 博,李艷武
(重慶三峽學院電子與信息工程學院,重慶 404100)
近年來,隨著人工智能技術的發展,這項技術已被應用到無人駕駛、智能家居、智能監控、醫療系統等領域中。類似無人駕駛、智能監控等技術一定需要通過計算機獲取圖像,再進行后續判斷。目標檢測技術作為人工智能領域中的重要分支,其目的是讓機器能夠獲取環境中重要的信息圖像。目前,目標檢測技術分為兩類:傳統目標檢測算法和基于深度學習的目標檢測算法。
傳統目標檢測算法主要包括Haar特征+Adaboost算法等。基于深度學習的目標檢測算法主要是利用卷積運算構建卷積神經網絡對圖像進行特征提取,能夠提取到圖像更深層的特征和語義信息。基于深度學習的目標檢測算法又可分為一階目標檢測算法和二階目標檢測算法。其中一階目標檢測算法包括YOLOv1、SSD、YOLOv2、YOLOv3等。二階目標檢測算法有R-CNN、Fast R-CNN、SPP-Net等。這兩大類算法中,一階目標檢測算法速度快,但精度低;二階目標檢測算法則精度高、但速度慢。
為了進一步提升YOLOv3算法的性能,本文將網絡中的LeankyReLU函數改成Swish、Mish激活函數,然后采用Giou、Ciou損失函數優化算法的邊框回歸方式,采用Focal loss優化算法的分類損失,利用K-means算法對數據集進行重新聚類得到新的錨框。訓練時采用數據增強方法擴大訓練的數據量,通過對圖片進行縮放及長和寬的扭曲、色域扭曲、翻轉圖片等操作,增強網絡的魯棒性。另外采用了凍結網絡參數的訓練方法,此方法是在網絡訓練的前一半時間對網絡中的特征提取網絡部分不進行參數更新,后一半時間才會對整個網絡進行參數更新。
YOLOv3算法是在YOLOv1和YOLOv2的基礎上進行改進的,同樣也是一階目標檢測算法,直接生成預測結果。YOLOv3的特征提取網絡是將YOLOv2中的Darknet-19與殘差結構結合提出的Darknet-53,使得網絡能夠達到更深的層次。Darknet-53中沒有使用池化層而是由1×1和3×3的卷積層組成,通過1×1的卷積壓縮網絡。同時還加入了BN層,主要是為了緩解網絡的過擬合問題。網絡的頸部分,借鑒特征金字塔網絡結構(FPN)實現三個不同尺度的預測。網絡的損失函數有四部分,矩形框中心點損失、預測框寬高損失、置信度損失和類別損失。預測框中心點損失和寬高損失均采用了平方差損失,置信度損失和類別損失則是采用了交叉熵損失計算方式。
YOLOv3算法的激活函數為LeakyReLU激活函數,其是在ReLU的基礎加入了一個很小的負值,無法為正負輸入值提供一致的關系預測。因此針對激活函數,本文采用Swish、Mish激活函數分別對算法進行改進。Swish函數是一種自門控激活函數,定義為:

式中,為一個正值,當很大時,()就接近于1。此時激活函數處于“開”狀態,函數值近似于本身,克服了函數飽和的問題;當()接近0時,激活函數處于“關”狀態,且函數值近似為0。Mish函數的表達式為:

當→∞時,函數值都不存在飽和的情況;<0時還有輕微的負值,不會導致神經元失活,理論上有更好的梯度流。經過學者們的實驗,Mish函數在訓練穩定性、平均準確率等方面都有了全面的提升。將上述兩個激活函數用在YOLOv3模型上,代替原有激活函數來研究算法的性能,以及三種激活函數的性能差異。
在YOLOv3算法中,對目標位置計算回歸損失是對中心位置偏移量和框的寬高分別計算損失,且都采用均方差損失。這種回歸方式沒有把anchor當成一個整體,忽略了其他的影響因素。2016年曠視科技提出了計算真實框和預測框的IOU值作為損失函數,不再對坐標和寬高進行獨立預測,而是作為一個整體,使預測結果更加準確。但IOU Loss也有不足之處:一是預測框和真實框之間IOU值為0時,不但無法反映兩個框的距離,而且無法進行優化;二是IOU無法精確反映兩個框的重合度大小。
2019年,斯坦福大學提出了Giou損失函數,相比于IOU新加入了一個包含真實框和預測框的最小的矩形框C。Giou損失函數公式如下:

Giou同樣存在缺點,當真實框和預測框屬于包含關系時,Giou就成了,依然無法區分兩個框的相對位置。對于垂直方向上的樣本,誤差很大,基本很難收斂。
針對上述問題,Ciou將Giou中引入的包含預測框和真實框的最小矩形框的面積懲罰項修改成直接計算兩個框中心的距離,以此來加速收斂,同時還考慮了Boundingbox的縱橫比,進一步提升了回歸精度。Ciou損失函數的公式為:



圖1 Ciou原理圖
針對YOLOv3定位不準確的問題,本文采用Giou、Ciou損失函數作為邊框回歸損失,研究三種損失計算方式的差異性,同時也研究算法的性能提升。
YOLOv3的分類損失是用交叉熵損失函數來計算的,現改用Focal loss計算分類損失。Focal loss的提出是為了解決一階目標檢測中類別不平衡的問題。主要包含兩個方面:一是正負樣本不平衡的問題;二是難分類樣本和易分類樣本不平衡的問題。一張圖片中,真實目標的數量遠遠大于負樣本數量,負樣本占總損失的大部分,同樣易分類樣本也占據了樣本的大部分,這些樣本容易主導模型的優化方向,導致模型分類能力下降。
Focal loss是在交叉熵損失的基礎上通過引入和兩個參數來控制不同樣本的權重,公式如下:

式中α為權重系數,主要用來平衡正負樣本的數量比例不均程度;(1-p)為調制系數,通過減少易分類樣本的權重來使得模型更加關注于難分類的樣本。
在YOLOv3算法中,錨框的大小需要預先設定,而且錨框的設定會直接影響到檢測精度。為了能得到一組合理的錨框大小就需要用到K-means聚類算法,其是一種無監督的聚類算法,目的是將相似的框分為一類。使用K-means時,首先獲取訓練集的標簽真實框的大小,然后隨機選取個不重復的框,采用IOU指標來對錨框進行聚類。具體流程如下:
(1)在所有真實框中隨機挑選個作為簇心;
(2)計算每個真實框與每個簇之間的1-值;
(3)計算每個真實框距離最近的簇心,并分配到最近的簇中;
(4)重新計算每個簇中的簇心;
(5)重復上述操作,直到每個簇中的元素不再改變。
針對YOLOv3算法的多尺度檢測特性,需要設置9個錨框大小。首先按照上述步驟得到錨框,然后再引入遺傳算法對得到的錨框進行變異,并得到最終的結果為:[17,19],[22,52],[50,39],[47,97],[94,81],[95,164],[225,124],[163,230],[324,254]。
實驗是在Pascal VOC數據集上進行的,采用數據增強以及凍結參數訓練,1到50輪凍結特征提取網絡參數,不進行權值更新,學習率設置為1e-3,batch_size設置為16;50到100輪不凍結特征提取網絡的參數,學習率設置為1e-4,batch_size設置為8。優化器采用Adam,權重衰減設置為5e-4。學習率調整方式為StepLR,調節步長設置為1,調整倍數設置為0.94。實驗中首先將LeakyRelu激活函數和原損失函數的YOLOv3算法作為基礎實驗,研究激活函數Mish、Swish和損失函數Giou、Ciou對算法帶來的影響,根據對比實驗結果找出最優的激活函數和損失函數,再優化算法中的分類損失以及引入經過K-means聚類后的錨框,并得到最終的優化結果。
對于樣本分類的情況一共有4種:一是正樣本,被分類到正樣本的為True Positive,簡稱TP;二是正樣本,被分類到負樣本的為False Positive,簡稱FN;三是負樣本,被分類到正樣本的為False Positive,簡稱FP;四是負樣本,被分類到負樣本的為True Positive,簡稱TN。評判模型的好壞有兩個常見的指標,精確率()和召回率()。利用精確率和召回率可以畫出Precision-Recall曲線。P-R曲線下的面積即為平均精確度(),簡稱AP。值越大,其分類效果越好。是對多個類別的求平均值。
表1為改變了激活函數和損失函數得到的優化結果。在采用相同損失函數的情況下,激活函數為Swish和Mish時,算法的損失都下降了0.1左右,激活函數為Swish時,算法精度有小幅度的提升,當使用Mish函數時,算法的精度能提升0.6%左右,明顯優于Swish函數。將Giou和Ciou作為邊框回歸函數可以降低平均2.76的損失,對于損失的優化明顯,且Giou和Ciou對損失的優化程度都是一樣的,對于精度而言,Giou能夠提升0.2%左右,Ciou能夠提升0.6%左右。最終在使用Ciou和Mish的情況下能夠達到78.67%,提升了1.2%。

表1 改變激活函數和損失函數的實驗結果
表2為采用經過-means聚類后的錨框的結果,本文一共做了兩組對比實驗,從兩組數據可以看出,使用針對數據集合理的錨框會對算法的精度帶來一定的提升。

表2 使用K-means聚類錨框結果
表3為融入Focal loss之后的實驗結果,融入Focal loss能給算法帶來0.92%的精度提升,提升比較明顯,可見Focal loss對于解決樣本不平衡問題的有效性。

表3 使用Focal loss實驗結果
本文針對YOLOv3模型精度不夠的問題展開了研究,首先是研究激活函數和損失函數,分別采用Swish和Mish函數對激活函數進行改進,模型的精度獲得了不錯的提升,同時也體現這兩種激活函數的性能差異。損失函數中的邊框損失函數采用了Giou和Ciou分別進行優化,使得模型能夠對目標進行更好的定位。為了解決訓練過程中樣本的不平衡的問題,還使用了Focal loss函數來優化分類損失,并采用K-means算法重新對訓練集的錨框進行聚類。在訓練時,采用數據增強和凍結特征提取網絡的方法,最終在Pascal VOC數據集上的測試結果最高能夠達到79.63%,相比于原來的精度提升了2.19%。