劉 博,李艷武
(重慶三峽學院電子與信息工程學院,重慶 404100)
近年來,隨著人工智能技術(shù)的發(fā)展,這項技術(shù)已被應(yīng)用到無人駕駛、智能家居、智能監(jiān)控、醫(yī)療系統(tǒng)等領(lǐng)域中。類似無人駕駛、智能監(jiān)控等技術(shù)一定需要通過計算機獲取圖像,再進行后續(xù)判斷。目標檢測技術(shù)作為人工智能領(lǐng)域中的重要分支,其目的是讓機器能夠獲取環(huán)境中重要的信息圖像。目前,目標檢測技術(shù)分為兩類:傳統(tǒng)目標檢測算法和基于深度學習的目標檢測算法。
傳統(tǒng)目標檢測算法主要包括Haar特征+Adaboost算法等。基于深度學習的目標檢測算法主要是利用卷積運算構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)對圖像進行特征提取,能夠提取到圖像更深層的特征和語義信息。基于深度學習的目標檢測算法又可分為一階目標檢測算法和二階目標檢測算法。其中一階目標檢測算法包括YOLOv1、SSD、YOLOv2、YOLOv3等。二階目標檢測算法有R-CNN、Fast R-CNN、SPP-Net等。這兩大類算法中,一階目標檢測算法速度快,但精度低;二階目標檢測算法則精度高、但速度慢。
為了進一步提升YOLOv3算法的性能,本文將網(wǎng)絡(luò)中的LeankyReLU函數(shù)改成Swish、Mish激活函數(shù),然后采用Giou、Ciou損失函數(shù)優(yōu)化算法的邊框回歸方式,采用Focal loss優(yōu)化算法的分類損失,利用K-means算法對數(shù)據(jù)集進行重新聚類得到新的錨框。訓(xùn)練時采用數(shù)據(jù)增強方法擴大訓(xùn)練的數(shù)據(jù)量,通過對圖片進行縮放及長和寬的扭曲、色域扭曲、翻轉(zhuǎn)圖片等操作,增強網(wǎng)絡(luò)的魯棒性。另外采用了凍結(jié)網(wǎng)絡(luò)參數(shù)的訓(xùn)練方法,此方法是在網(wǎng)絡(luò)訓(xùn)練的前一半時間對網(wǎng)絡(luò)中的特征提取網(wǎng)絡(luò)部分不進行參數(shù)更新,后一半時間才會對整個網(wǎng)絡(luò)進行參數(shù)更新。
YOLOv3算法是在YOLOv1和YOLOv2的基礎(chǔ)上進行改進的,同樣也是一階目標檢測算法,直接生成預(yù)測結(jié)果。YOLOv3的特征提取網(wǎng)絡(luò)是將YOLOv2中的Darknet-19與殘差結(jié)構(gòu)結(jié)合提出的Darknet-53,使得網(wǎng)絡(luò)能夠達到更深的層次。Darknet-53中沒有使用池化層而是由1×1和3×3的卷積層組成,通過1×1的卷積壓縮網(wǎng)絡(luò)。同時還加入了BN層,主要是為了緩解網(wǎng)絡(luò)的過擬合問題。網(wǎng)絡(luò)的頸部分,借鑒特征金字塔網(wǎng)絡(luò)結(jié)構(gòu)(FPN)實現(xiàn)三個不同尺度的預(yù)測。網(wǎng)絡(luò)的損失函數(shù)有四部分,矩形框中心點損失、預(yù)測框?qū)捀邠p失、置信度損失和類別損失。預(yù)測框中心點損失和寬高損失均采用了平方差損失,置信度損失和類別損失則是采用了交叉熵損失計算方式。
YOLOv3算法的激活函數(shù)為LeakyReLU激活函數(shù),其是在ReLU的基礎(chǔ)加入了一個很小的負值,無法為正負輸入值提供一致的關(guān)系預(yù)測。因此針對激活函數(shù),本文采用Swish、Mish激活函數(shù)分別對算法進行改進。Swish函數(shù)是一種自門控激活函數(shù),定義為:
式中,為一個正值,當很大時,()就接近于1。此時激活函數(shù)處于“開”狀態(tài),函數(shù)值近似于本身,克服了函數(shù)飽和的問題;當()接近0時,激活函數(shù)處于“關(guān)”狀態(tài),且函數(shù)值近似為0。Mish函數(shù)的表達式為:
當→∞時,函數(shù)值都不存在飽和的情況;<0時還有輕微的負值,不會導(dǎo)致神經(jīng)元失活,理論上有更好的梯度流。經(jīng)過學者們的實驗,Mish函數(shù)在訓(xùn)練穩(wěn)定性、平均準確率等方面都有了全面的提升。將上述兩個激活函數(shù)用在YOLOv3模型上,代替原有激活函數(shù)來研究算法的性能,以及三種激活函數(shù)的性能差異。
在YOLOv3算法中,對目標位置計算回歸損失是對中心位置偏移量和框的寬高分別計算損失,且都采用均方差損失。這種回歸方式?jīng)]有把anchor當成一個整體,忽略了其他的影響因素。2016年曠視科技提出了計算真實框和預(yù)測框的IOU值作為損失函數(shù),不再對坐標和寬高進行獨立預(yù)測,而是作為一個整體,使預(yù)測結(jié)果更加準確。但IOU Loss也有不足之處:一是預(yù)測框和真實框之間IOU值為0時,不但無法反映兩個框的距離,而且無法進行優(yōu)化;二是IOU無法精確反映兩個框的重合度大小。
2019年,斯坦福大學提出了Giou損失函數(shù),相比于IOU新加入了一個包含真實框和預(yù)測框的最小的矩形框C。Giou損失函數(shù)公式如下:
Giou同樣存在缺點,當真實框和預(yù)測框?qū)儆诎P(guān)系時,Giou就成了,依然無法區(qū)分兩個框的相對位置。對于垂直方向上的樣本,誤差很大,基本很難收斂。
針對上述問題,Ciou將Giou中引入的包含預(yù)測框和真實框的最小矩形框的面積懲罰項修改成直接計算兩個框中心的距離,以此來加速收斂,同時還考慮了Boundingbox的縱橫比,進一步提升了回歸精度。Ciou損失函數(shù)的公式為:
圖1 Ciou原理圖
針對YOLOv3定位不準確的問題,本文采用Giou、Ciou損失函數(shù)作為邊框回歸損失,研究三種損失計算方式的差異性,同時也研究算法的性能提升。
YOLOv3的分類損失是用交叉熵損失函數(shù)來計算的,現(xiàn)改用Focal loss計算分類損失。Focal loss的提出是為了解決一階目標檢測中類別不平衡的問題。主要包含兩個方面:一是正負樣本不平衡的問題;二是難分類樣本和易分類樣本不平衡的問題。一張圖片中,真實目標的數(shù)量遠遠大于負樣本數(shù)量,負樣本占總損失的大部分,同樣易分類樣本也占據(jù)了樣本的大部分,這些樣本容易主導(dǎo)模型的優(yōu)化方向,導(dǎo)致模型分類能力下降。
Focal loss是在交叉熵損失的基礎(chǔ)上通過引入和兩個參數(shù)來控制不同樣本的權(quán)重,公式如下:
式中α為權(quán)重系數(shù),主要用來平衡正負樣本的數(shù)量比例不均程度;(1-p)為調(diào)制系數(shù),通過減少易分類樣本的權(quán)重來使得模型更加關(guān)注于難分類的樣本。
在YOLOv3算法中,錨框的大小需要預(yù)先設(shè)定,而且錨框的設(shè)定會直接影響到檢測精度。為了能得到一組合理的錨框大小就需要用到K-means聚類算法,其是一種無監(jiān)督的聚類算法,目的是將相似的框分為一類。使用K-means時,首先獲取訓(xùn)練集的標簽真實框的大小,然后隨機選取個不重復(fù)的框,采用IOU指標來對錨框進行聚類。具體流程如下:
(1)在所有真實框中隨機挑選個作為簇心;
(2)計算每個真實框與每個簇之間的1-值;
(3)計算每個真實框距離最近的簇心,并分配到最近的簇中;
(4)重新計算每個簇中的簇心;
(5)重復(fù)上述操作,直到每個簇中的元素不再改變。
針對YOLOv3算法的多尺度檢測特性,需要設(shè)置9個錨框大小。首先按照上述步驟得到錨框,然后再引入遺傳算法對得到的錨框進行變異,并得到最終的結(jié)果為:[17,19],[22,52],[50,39],[47,97],[94,81],[95,164],[225,124],[163,230],[324,254]。
實驗是在Pascal VOC數(shù)據(jù)集上進行的,采用數(shù)據(jù)增強以及凍結(jié)參數(shù)訓(xùn)練,1到50輪凍結(jié)特征提取網(wǎng)絡(luò)參數(shù),不進行權(quán)值更新,學習率設(shè)置為1e-3,batch_size設(shè)置為16;50到100輪不凍結(jié)特征提取網(wǎng)絡(luò)的參數(shù),學習率設(shè)置為1e-4,batch_size設(shè)置為8。優(yōu)化器采用Adam,權(quán)重衰減設(shè)置為5e-4。學習率調(diào)整方式為StepLR,調(diào)節(jié)步長設(shè)置為1,調(diào)整倍數(shù)設(shè)置為0.94。實驗中首先將LeakyRelu激活函數(shù)和原損失函數(shù)的YOLOv3算法作為基礎(chǔ)實驗,研究激活函數(shù)Mish、Swish和損失函數(shù)Giou、Ciou對算法帶來的影響,根據(jù)對比實驗結(jié)果找出最優(yōu)的激活函數(shù)和損失函數(shù),再優(yōu)化算法中的分類損失以及引入經(jīng)過K-means聚類后的錨框,并得到最終的優(yōu)化結(jié)果。
對于樣本分類的情況一共有4種:一是正樣本,被分類到正樣本的為True Positive,簡稱TP;二是正樣本,被分類到負樣本的為False Positive,簡稱FN;三是負樣本,被分類到正樣本的為False Positive,簡稱FP;四是負樣本,被分類到負樣本的為True Positive,簡稱TN。評判模型的好壞有兩個常見的指標,精確率()和召回率()。利用精確率和召回率可以畫出Precision-Recall曲線。P-R曲線下的面積即為平均精確度(),簡稱AP。值越大,其分類效果越好。是對多個類別的求平均值。
表1為改變了激活函數(shù)和損失函數(shù)得到的優(yōu)化結(jié)果。在采用相同損失函數(shù)的情況下,激活函數(shù)為Swish和Mish時,算法的損失都下降了0.1左右,激活函數(shù)為Swish時,算法精度有小幅度的提升,當使用Mish函數(shù)時,算法的精度能提升0.6%左右,明顯優(yōu)于Swish函數(shù)。將Giou和Ciou作為邊框回歸函數(shù)可以降低平均2.76的損失,對于損失的優(yōu)化明顯,且Giou和Ciou對損失的優(yōu)化程度都是一樣的,對于精度而言,Giou能夠提升0.2%左右,Ciou能夠提升0.6%左右。最終在使用Ciou和Mish的情況下能夠達到78.67%,提升了1.2%。
表1 改變激活函數(shù)和損失函數(shù)的實驗結(jié)果
表2為采用經(jīng)過-means聚類后的錨框的結(jié)果,本文一共做了兩組對比實驗,從兩組數(shù)據(jù)可以看出,使用針對數(shù)據(jù)集合理的錨框會對算法的精度帶來一定的提升。
表2 使用K-means聚類錨框結(jié)果
表3為融入Focal loss之后的實驗結(jié)果,融入Focal loss能給算法帶來0.92%的精度提升,提升比較明顯,可見Focal loss對于解決樣本不平衡問題的有效性。
表3 使用Focal loss實驗結(jié)果
本文針對YOLOv3模型精度不夠的問題展開了研究,首先是研究激活函數(shù)和損失函數(shù),分別采用Swish和Mish函數(shù)對激活函數(shù)進行改進,模型的精度獲得了不錯的提升,同時也體現(xiàn)這兩種激活函數(shù)的性能差異。損失函數(shù)中的邊框損失函數(shù)采用了Giou和Ciou分別進行優(yōu)化,使得模型能夠?qū)δ繕诉M行更好的定位。為了解決訓(xùn)練過程中樣本的不平衡的問題,還使用了Focal loss函數(shù)來優(yōu)化分類損失,并采用K-means算法重新對訓(xùn)練集的錨框進行聚類。在訓(xùn)練時,采用數(shù)據(jù)增強和凍結(jié)特征提取網(wǎng)絡(luò)的方法,最終在Pascal VOC數(shù)據(jù)集上的測試結(jié)果最高能夠達到79.63%,相比于原來的精度提升了2.19%。