高 楊 楊魯江 高 平
(浙江中控技術(shù)股份有限公司)
目前,目標檢測算法有兩個研究方向:一是基于手工特征的傳統(tǒng)目標檢測算法[1],另一個是基于深度學習的目標檢測算法[2]。2012年之前,大多是通過先驗知識設計的人工特征進行目標檢測研究,隨后深度學習技術(shù)被應用到目標檢測算法中,算法性能較之前有了很大提升。
基于深度學習的目標檢測算法利用卷積神經(jīng)網(wǎng)絡提取圖像特征,能夠?qū)W習圖像更深層次的特征和語義信息,對圖像像素分布進行很好的描述。 因其對于圖像特征強大的學習能力,基于深度學習的目標檢測算法漸漸取代了傳統(tǒng)目標檢測算法成為目標檢測領(lǐng)域的主流方法。 基于深度學習的目標檢測算法主要分為兩個研究方向:一是先生成可能包含待檢測物體的候選框,然后進行細粒度物體檢測的兩步式目標檢測算法;另一個是直接在網(wǎng)絡中提取特征來預測物體分類和位置的一步式目標檢測算法。 實際場景的目標檢測對檢測速度有較高的要求,兩步式目標檢測算法可以保證不錯的檢測精度,但不能滿足實時需求,因此一般采用一步式目標檢測算法進行目標檢測。 一步式目標檢測算法就是運用回歸思想直接在網(wǎng)絡中提取特征來預測物體分類和位置,主要包括YOLO系列和SSD系列[3]。 YOLO的提出使得目標檢測在工業(yè)應用上有了很大的進步,包括巡檢機器人、工業(yè)零件計數(shù)、工業(yè)缺陷檢測及人臉識別等。
筆者基于YOLOv3[4]設計合適的網(wǎng)絡結(jié)構(gòu),比較Darknet-19和Darknet-53,提取各自的優(yōu)點組合成更好的特征提取網(wǎng)絡,加強目標提取能力。 采用合適的分類損失函數(shù)和回歸損失函數(shù)對損失函數(shù)進行提升,并采用效果較好的損失函數(shù)使整個目標檢測算法在保證檢測精度的前提下有更快的檢測速度。
YOLO將回歸思想運用到目標檢測算法上,是一個端到端的目標檢測模型[5],不 像R-CNN[6]系列目標檢測算法需要先生成目標候選區(qū)域,再進行目標分類。 對于輸入的圖像數(shù)據(jù),YOLO只需“看”一次就能得到圖像的目標類別和位置信息,加快了目標檢測速度。 YOLO也存在明顯不足,即檢測精度相較于兩步式目標檢測算法有一定的下降,物體的定位也不夠準確,對于小目標和密集目標檢測都不夠優(yōu)秀。
YOLOv2 在YOLO 的基礎(chǔ)上做了很大的改進[7]。 網(wǎng)絡結(jié)構(gòu)使用Darknet-19,精度比VGGNet[8]好, 浮點運算量減少約1/5, 進一步提升了速度。YOLOv2使用了批歸一化, 通過均衡輸入數(shù)據(jù)分布,標準化輸出層,有助于緩解梯度消失和梯度爆炸問題,使得mAP(mean Average Precision)明顯提升。 YOLOv2借鑒了RPN網(wǎng)絡錨框[9]的思想,在每個網(wǎng)格中設置錨框, 使得召回率明顯提升,運用聚類思想對訓練集中標注的邊框進行分析,可以獲得更好的錨框尺寸。 YOLOv2還增加了一個passthrough層來重組高層低分辨率特征圖與低層高分辨率特征圖。 雖然YOLOv2采取了一些手段來增強對小目標的檢測能力,整體效果有限提升, 但其在COCO數(shù)據(jù)集上的表現(xiàn)效果不如SSD512。
YOLOv3在YOLOv2的基礎(chǔ)上提出了一些改進策略, 主要包括新的網(wǎng)絡結(jié)構(gòu)和借鑒FPN的思路,增強了對小目標檢測的能力。
如圖1 所示,YOLOv3 使用的網(wǎng)絡結(jié)構(gòu)在Darknet-19的基礎(chǔ)上繼續(xù)改進, 提出了Darknet-53, 其中引入了殘差網(wǎng)絡中的跨層加和操作,使網(wǎng)絡達到更深的層次。 整個網(wǎng)絡結(jié)構(gòu)中只有卷積層,沒有了池化層和全連接層。
圖1 YOLOv3網(wǎng)絡結(jié)構(gòu)
YOLOv2引入passthrough層以增強模型對小目標的檢測能力,但效果并不明顯,經(jīng)分析該方法仍在一個尺度上檢測,對于小目標還是沒有合適的感受野。
YOLOv3則借鑒FPN的思想引入多尺度預測。從圖1可以看到Y(jié)OLOv3使用了32倍、16倍和8倍降采樣3個尺度預測, 極大地提升了對小目標的檢測能力, 使其總體檢測性能較YOLOv2有了較大的提升。
YOLO系列的損失函數(shù)大致分為回歸損失、置信度誤差損失和分類損失。 3個系列也存在一定的差異, 主要是具體損失函數(shù)選擇有所區(qū)別。YOLO是沒有錨框的, 對于回歸損失是非常粗暴的,3個部分都使用了平方差損失函數(shù),YOLO損失函數(shù)對于目標坐標的預測更加重視,賦予了較大的權(quán)重,對于沒有目標的邊框置信度預測賦予較小的權(quán)重。
YOLOv2總體的損失函數(shù)和YOLO的沒有太大的差異, 主要差別就在于坐標損失函數(shù)的計算, 坐標x,y的誤差由相對于輸入圖像的偏移坐標誤差的均方改為相對于網(wǎng)格的偏移坐標誤差的均方,YOLOv2的長寬放縮因子采用取對數(shù)的方法。
YOLOv3的損失函數(shù)是在YOLOv2的基礎(chǔ)上進行一些改變,運用Sigmoid[10]函數(shù)使得每個類別的分類更加獨立,減少類別之間的影響。 分類損失不再采用平方差損失函數(shù),而是采用了二分類的交叉熵損失函數(shù),可避免Sigmoid函數(shù)后損失函數(shù)學習率降低的問題,加快收斂速度。 YOLOv3的損失函數(shù)可以分為4個部分:中心坐標誤差、寬高坐標誤差、置信度誤差和分類誤差,這4個部分對整個網(wǎng)絡損失函數(shù)的影響不同,所以分配了不同的權(quán)重,λcoord是中心坐標誤差和寬高坐標誤差的權(quán)重,λobj是含目標的置信度的權(quán)重,λnoobj是不含目標的置信度的權(quán)重,λcls是分類誤差的權(quán)重,其計算式如下:
經(jīng)過不斷發(fā)展,YOLO系列對于目標檢測的效果越來越好, 工業(yè)應用越來越廣闊。 筆者以YOLOv3為基礎(chǔ)進行改進, 以滿足實際場景的目標檢測:采用合適的網(wǎng)絡結(jié)構(gòu)保證目標檢測精度且不犧牲檢測速度, 針對YOLOv3的召回率不足和定位精度不夠的問題,采用優(yōu)秀的損失函數(shù)提升召回率和定位精度。
YOLOv3 的 網(wǎng) 絡 結(jié) 構(gòu) 是Darknet-53,Darknet-53的精度比Darknet-19要高, 但同時也犧牲了目標檢測速度,這也是目標檢測算法中常見的問題之一,目標檢測精度的提升常常會犧牲掉檢測速度,反之亦然。 對于目標檢測的實際場景,目標檢測速度的要求是嚴格的,本項目中的目標種類相對較少, 所以選擇以網(wǎng)絡結(jié)構(gòu)Darkneto-19為基礎(chǔ),進行一些修改來適應實際場景的目標檢測。
Darknet-19網(wǎng)絡結(jié)構(gòu)的設計思路與VGGNet相似,主要由3×3、1×1的卷積層和2×2的最大池化層組成。 Darknet-19中用兩個卷積層和兩個最大池化層實現(xiàn)了4倍的降采樣, 筆者簡化了這一過程(圖2),將第1個卷積層的步長設為2用作降采樣,再加上1個最大池化層就實現(xiàn)了4倍的降采樣,相比于原來的網(wǎng)絡舍棄了1個卷積層和1個最大池化層,減少了一些參數(shù)量,用卷積層實現(xiàn)降采樣和最大池化沒有區(qū)別,而且可以讓網(wǎng)絡自己選擇拋棄掉一些信息,池化不能保證拋棄的點不包含所需要的信息,尤其是在網(wǎng)絡前幾層包含的信息量足夠多的情況下。 后面的網(wǎng)絡與原網(wǎng)絡相似,Darknet-19和Darknet-53最后得到的特征圖與輸入圖片相比都進行了32倍的降采樣, 因此放棄passthrough層的設計,參照Darknet-53的多尺度預測,在Darknet-19實現(xiàn)多尺度預測,增強模型的綜合檢測能力。
圖2 改進的網(wǎng)絡結(jié)構(gòu)
損失函數(shù)的設計主要有兩點: 一是針對YOLOv3的召回率不足;二是針對YOLOv3的定位不夠精確。 總的來說,就是對分類損失和回歸損失分別做一些改進,提升改進模型的性能。
2.2.1 分類損失
分類損失中,用Focalloss代替YOLOv3的二分類交叉熵損失函數(shù)。
Focalloss是2017年何凱明團隊提出的損失函數(shù),當時用于Retinanet的訓練[11]。 Focalloss的提出主要是為了提升一步式目標檢測算法的準確度,他們認為一步式目標檢測算法的準確度往往不如兩步式目標檢測算法的主要原因是樣本的類別不平衡。
樣本的類別不平衡主要可以分為兩個方面:一是正、負樣本不平衡;二是難分和易分樣本不平衡,負樣本數(shù)量多,占總損失中的大部分,而負樣本大多是容易分類的,使得模型的優(yōu)化方向不符合期待, 易分樣本會使模型收斂速度加快,但這不一定是好的模型,需要把難分樣本訓練好。
Focalloss的引入可以很好地緩解樣本類別不平衡,該損失函數(shù)是在交叉熵損失函數(shù)的基礎(chǔ)上進行改進的,引入兩個新參數(shù)γ和α,具體形式為:
其中,LFl是Focalloss損失函數(shù); 參數(shù)y′表示樣本屬于正確類別的概率; 參數(shù)γ對損失函數(shù)有縮放作用,可以減少易分類樣本的損失,使模型更關(guān)注困難的、錯分的樣本,保證模型不會因為太多易分類樣本而產(chǎn)生偏移; 參數(shù)α則是一個平衡因子,主要負責平衡正、負樣本本身的數(shù)量比例不均。
將Focalloss應用到一步式目標檢測算法,通過試驗使得一步式目標檢測算法的檢測精度可以和兩步式目標檢測算法相媲美,而且還保留了一步式目標檢測算法的檢測速度優(yōu)勢。
提出YOLOv3的學者也嘗試使用Focalloss,但試驗發(fā)現(xiàn)對于目標檢測精度的提升不明顯,甚至略有下降,對于召回率有一定的提升。 后來發(fā)現(xiàn)可能是沒有用對地方, 經(jīng)驗證,YOLOv3使用Focalloss后在Pascal VOC上的mAP可以增加一個點左右,效果已經(jīng)很明顯了。
而對于實際場景的目標檢測,由于一些目標會使前景與后景區(qū)分不明顯, 所以Focalloss對于這些目標檢測應用會有很好的效果。
2.2.2 回歸損失
目標檢測算法中用于邊框回歸的損失函數(shù)有很多, 從L1損失函數(shù)到Faster R-CNN的Smooth L1損失函數(shù),再到Y(jié)OLO的均方差損失函數(shù),它們對邊框回歸都有不錯的效果, 但是YOLO系列的定位精度一直不高。 YOLO系列采用的均方差損失函數(shù)主要有兩方面的不足:一是均方差損失函數(shù)對于邊界框4個點坐標的預測是獨立的, 與正常情況不符; 二是均方差損失函數(shù)對于4個坐標沒有實現(xiàn)正則化。 因此,有了很多對于邊框回歸損失函數(shù)的研究,不再將損失函數(shù)局限在“距離”的研究上,檢測框本身就是一個矩形框。 目標檢測任務試圖獲得更準確的預測框即較大的IoU值, 所以將IoU通過某種映射直接作為損失函數(shù)提出來。 2016年,曠視科技提出了IoUloss(LossIoU=-ln(IoU),不再將各個坐標做獨立預測,而是將其看成一個整體,使得到的預測框更加準確,訓練可以更快收斂。 但是IoUloss還是存在一定的局限性,該損失函數(shù)只能適應很少的目標,當時提出來主要運用在人臉檢測上。 如果兩個框不重疊,那么IoU=0,對應的損失函數(shù)值為0,沒有了梯度反傳,致使損失函數(shù)無法對其進一步優(yōu)化,而且無法反映出兩個框到底距離多遠。
2019年,斯坦福大學提出損失函數(shù)GIoUloss[12]解決IoUloss存在的問題(IoUloss無法辨別不同方式的對齊,如方向不一致等)。 檢測框和標定框的空間位置關(guān)系如圖3所示, 當兩個框是水平平移相交或是垂直方向相交,對應的重合度有著很好的效果,當存在第3種情況時,重合度效果不好導致最終的回歸效果不理想,GIoUloss可以很好地解決這類問題。
圖3 檢測框和標定框的空間位置關(guān)系
為了驗證GIoUloss的優(yōu)點,將其與L1、L2損失函數(shù)和IoUloss作對比,具體如圖4所示,圖4a表示兩個矩形框的兩個頂點坐標計算L2范數(shù)距離、IoU和GIoU的結(jié)果,可見3個L2范數(shù)在距離相同的情況下,第3個的IoU顯然比前兩個要高,從主觀上來說也是第3個的效果最好。 圖4b表示矩形框的中點坐標和長寬信息計算L1范數(shù)距離、IoU和GIoU的結(jié)果, 可見3個L1范數(shù)在距離相同的情況下,也是第3個的效果最好。 根據(jù)上述對比結(jié)果提出GIoUloss。
圖4 范數(shù)、IoU和GIoU結(jié)果對比
GIoU的計算比較容易理解,對于兩個矩形框A、B,可以算出其最小凸集C,計算最小凸集C去掉A、B并集后的面積與C自身面積的比值, 用IoU減去比值就可以得出GIoU:
這樣設計后,GIoU有很多不錯的性質(zhì),GIoU可以作為一個距離,具有非負性,用于損失函數(shù)就十分方便。 IoU的范圍是0~1,而GIoU的范圍則是-1~1,擁有了對稱的區(qū)間值。 GIoU中引入了最小凸集, 使得兩個框不重合時依然可以進行優(yōu)化。 總的來說,GIoUloss有著IoUloss的所有優(yōu)點,而且克服了IoUloss的缺點。
e. 計算最終的損失值,LGIoU=1-GIoU。
因此,GIoUloss作為邊框回歸損失函數(shù)可以取得良好的效果。 將YOLOv3中的均方差損失函數(shù)替換為GIoUloss, 有效提升了模型的邊框回歸性能。
訓練過程主要在PascalVOC數(shù)據(jù)集[13]進行訓練測試, 這一部分主要是獲得改進算法在PascalVOC數(shù)據(jù)集上的結(jié)果,將改進算法和YOLOv3、YOLOv2進行對比, 隨后在自己制作的煙火數(shù)據(jù)集上驗證改進算法在這種實際場景中的效果。
在PascalVOC數(shù)據(jù)集訓練前,要先獲得Darknet-19在ImageNet數(shù)據(jù)集上的預訓練模型的參數(shù),再用改進網(wǎng)絡結(jié)構(gòu)進行fine tuning,隨后進行PascalVOC數(shù)據(jù)集的訓練。
訓練參數(shù)設置為:輸入圖片像素為416×416;為了保證最后特征圖的尺寸, 圖像飽和度范圍saturation設為1.5,圖像曝光度exposure設為1.5,圖像色調(diào)范圍hue設為0.1,類別20,置信度閾值0.3;動量設為0.9,權(quán)重衰減0.000 5,將Batch Size設為16; 采用批量隨機梯度下降法進行模型優(yōu)化,設置初始學習率0.001,在迭代次數(shù)達到40 000次時學習率衰減10倍, 迭代次數(shù)達到45 000次時學習率再衰減10倍。
在煙火數(shù)據(jù)集上進行訓練階段, 將用PascalVOC數(shù)據(jù)集訓練得到的模型作為煙火預訓練模型,將輸入圖片的尺寸轉(zhuǎn)化為416×416;考慮內(nèi)存原因,Batch Size設為8;其余參數(shù)與上述訓練過程相似;學習率變化也進行修改,在迭代次數(shù)達到10 000次時學習率衰減10倍, 在迭代次數(shù)達到20 000次時學習率再衰減10倍。 學習率衰減主要是保證模型一開始在較大的學習率下可以進行快速的梯度下降,保證訓練速度,動態(tài)調(diào)整學習率可以使損失函數(shù)在小范圍內(nèi)周旋,獲得滿意的值。
2.4.1 PascalVOC數(shù)據(jù)集試驗結(jié)果
為了驗證改進算法的有效性, 用PascalVOC數(shù)據(jù)集對改進算法進行訓練和測試。 將改進算法與YOLOv3、YOLOv2比較, 評價指標采用mAP和FPS,mAP是各個類別AP的平均值,AP表示精確率和召回率曲線下的面積,F(xiàn)PS表示每秒傳輸幀數(shù)。 試驗結(jié)果見表1。 可以看出,改進算法在PascalVOC數(shù)據(jù)集上的檢測精度比YOLOv3的降低了1.4%, 主要原因是網(wǎng)絡結(jié)構(gòu)不同,Darknet-53比本項目網(wǎng)絡結(jié)構(gòu)在檢測精度上表現(xiàn)更好,但本項目網(wǎng)絡結(jié)構(gòu)模型內(nèi)存比Darknet-53更小且有更快的檢測速度, 可以用于實際場景的目標檢測。
表1 算法在PascalVOC數(shù)據(jù)集的試驗結(jié)果
2.4.2 煙火數(shù)據(jù)集試驗結(jié)果
對于煙火目標檢測的評價指標,主要采用精確率和召回率。 分別用YOLOv3和改進算法在數(shù)據(jù)集上進行訓練和測試, 評價指標采用精確率、召回率和FPS,試驗結(jié)果見表2。 可以看出,改進算法在針對煙火目標檢測時有更好的效果,精確率比YOLOv3提高了2.2%,召回率比YOLOv3提高了4.5%。 精確率提升是因為本項目只用于兩個目標的檢測,改進算法更適合兩個目標的檢測。 召回率的提升對于煙火實際場景的目標檢測更有意義。
表2 煙火目標試驗結(jié)果對比
2.4.3 試驗效果展示
在兩個數(shù)據(jù)集上驗證后,改進算法都取得了不錯的效果, 在PascalVOC數(shù)據(jù)集上的試驗效果如圖5所示, 自己制作的煙火數(shù)據(jù)集上的試驗效果如圖6所示。
圖5 改進算法在PascalVOC數(shù)據(jù)集的應用效果
圖6 改進算法在煙火數(shù)據(jù)集的應用效果
基于YOLOv3 改進的目標檢測算法,以YOLOv3為基礎(chǔ), 改進網(wǎng)絡結(jié)構(gòu)適應實際場景目標檢測,并且使浮點數(shù)運算更少,有效提升了檢測速度;選取更合適的分類損失函數(shù)和回歸損失函數(shù), 使得模型整體性能與YOLOv3相似且檢測速度更快;通過兩個數(shù)據(jù)集的試驗驗證了改進檢測算法在實際場景有著更好的檢出率,而且檢測的實時性也能夠滿足要求,在煙火這種實際場景檢測中有不錯的效果。
對于工作中遇到的目標檢測方面的問題,可以采用筆者方法改善,對于流程圖中的一些物體識別會起到很好的預研工作,為流程圖的轉(zhuǎn)化工作提供一種可行方法,未來對視頻分析也會有很好的引導作用。