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