顧 焱,楊 凱
(西京學(xué)院計(jì)算機(jī)學(xué)院,西安 710000)
科技的進(jìn)步讓人們發(fā)現(xiàn)蝴蝶的數(shù)量可以反映生態(tài)水平的變化,國外學(xué)者帕梅森發(fā)現(xiàn)蝴蝶數(shù)量的下降反映了全球變暖,因此,通過對蝴蝶的檢測可以體現(xiàn)一個地區(qū)的生態(tài)水平和變化。蝴蝶是人類日常生活環(huán)境中比較常見的物種,維護(hù)蝴蝶的多樣性,對蝴蝶的識別研究也逐漸成為人們關(guān)注的熱點(diǎn)[1]。蝴蝶是節(jié)肢動物門、昆蟲綱、鱗翅目、錘角亞目動物的統(tǒng)稱。蝴蝶一般色彩鮮艷,身上有較多條紋,色彩較豐富,所以蝴蝶是屬于昆蟲中種類比較繁多的一種,有很大的識別難度[1]。因此,針對蝴蝶種類繁多、難以識別的問題,如何利用先進(jìn)的計(jì)算機(jī)技術(shù)和深度學(xué)習(xí)技術(shù)提高對蝴蝶的識別性能具有重要意義和社會價值。
現(xiàn)今,國家大力發(fā)展高新技術(shù)產(chǎn)業(yè),計(jì)算機(jī)的相關(guān)算力、算法飛速提升,尤其是AI 技術(shù)的跨越式進(jìn)步,深度學(xué)習(xí)在生物信息、機(jī)器翻譯以及目標(biāo)檢測等領(lǐng)域獲得了巨大成功。當(dāng)前,基于深度學(xué)習(xí)的目標(biāo)檢測算法可以分為兩個類別。其一是把生成的anchor框映射到feature map然后將該區(qū)域重新輸入到全連接層進(jìn)行分類和回歸。這類檢測算法主要分為兩步,第一步產(chǎn)生region proposals,然后對其進(jìn)行分類,一般還需要對位置精修,這一類的典型代表是RCNN家族。它們的精確率和召回率比較高,但效率低,滿足不了一些比較復(fù)雜的場景。另一個類別中生成的anchor 框只是一個邏輯結(jié)構(gòu),只會對這個邏輯結(jié)構(gòu)進(jìn)行分類和回歸。這類算法直接產(chǎn)生物體的類別概率和位置坐標(biāo)值,因此有著更快的檢測速度,比較典型的算法如YOLOv5算法和SSD算法,其中YOLOv5算法很好地解決了兩階段算法中識別速度慢的問題,并且在識別速度和精度上都有著很不錯的效果。因此,本次設(shè)計(jì)將使用基于深度學(xué)習(xí)的YOLOv5 目標(biāo)檢測算法實(shí)現(xiàn)對生態(tài)照片中蝴蝶的識別[2]。
此外,蝴蝶圖像識別技術(shù)在農(nóng)業(yè)發(fā)展、病蟲害防治、保護(hù)物種多樣性等方面具有十分重要的意義[3]。且使用的基于深度學(xué)習(xí)的YOLO 檢測算法成本低,效率高、普適性強(qiáng),具有很大的發(fā)展?jié)摿?。因此,研究基于深度學(xué)習(xí)的蝴蝶圖像自動識別方法在許多場景中具有十分重要的應(yīng)用價值,有很廣闊的應(yīng)用前景。
PyTorch 是Facebook 人工智能研究院(FAIR)團(tuán)隊(duì)在GitHub 上開源的一種深度學(xué)習(xí)框架,是目前比較少有的高效率以及能在CPU 和GPU 運(yùn)行框架并解決各類深度學(xué)習(xí)問題的深度學(xué)習(xí)框架,PyTorch 的速度優(yōu)于一些比較常見的深度學(xué)習(xí)框架,有著令人滿意的效果。在使用方面,PyTorch 繼承了Torch 的衣缽,其設(shè)計(jì)最符合人們的思維,因此本設(shè)計(jì)將采用PyTorch 作為開發(fā)系統(tǒng)的深度學(xué)習(xí)框架。
YOLOv5 的網(wǎng)絡(luò)結(jié)構(gòu)如圖1 所示,由主干網(wǎng)絡(luò)Backbone、Neck、Head 組成。其中Backbone主要由CBL、Bottleneck CSP/C3 以及SPP/SPPF等組成。而在Backbone 和Head 之間,通常會添加一些用于收集不同階段特征圖的網(wǎng)絡(luò)層,這就是Neck,Neck 的網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)沿用了FPN+PAN 的結(jié)構(gòu),主要由CBS、Upsample、Concat和不帶shortcut 的CSP 組成[3]。而Head 主要用于最終檢測部分。
圖1 YOLOv5網(wǎng)絡(luò)結(jié)構(gòu)
首先對于輸入數(shù)據(jù),用Focus模塊將計(jì)算圖長寬變?yōu)樵鹊?/4,channel 數(shù)量乘4,再利用CSP 結(jié)構(gòu)將原輸入分成兩個分支,分別進(jìn)行卷積操作使得通道數(shù)減半,為了能夠更好地對網(wǎng)絡(luò)提取的特征進(jìn)行融合,然后用max pooling下采樣構(gòu)建特征金字塔,再對下采樣產(chǎn)生的feature map 上采樣,與backbone 相應(yīng)的層融合。繼而用detect 層預(yù)測anchors,接著計(jì)算bbox 和當(dāng)前層anchor 的寬高比,如果寬高比大于設(shè)定的閾值,則該anchor 與bbox 不匹配,丟棄該bbox,認(rèn)為其為負(fù)樣本。最后是計(jì)算損失函數(shù),總體還是分為兩部分:類別損失(見式(1)和式(2))和定位損失(見式(3)和式(4)),對于定位損失,即w、h、x、y的loss,采用了GIOU-loss。
式(2)中,N表示類別總個數(shù);xi為當(dāng)前類別預(yù)測值;yi為經(jīng)過激活函數(shù)后得到的當(dāng)前類別的概率;y*i則為當(dāng)前類別的真實(shí)值(0 或1);Lclass為分類損失。
式(3)和(4)中,LGIOU為定位損失;Bgt為預(yù)測框;B為真實(shí)框;C為能同時框住真實(shí)框和預(yù)測框的最小框。
GIOU中,真實(shí)框與預(yù)測框的距離越遠(yuǎn),C的值也越大,C減去預(yù)測框與真實(shí)框的面積值也越大,最后趨近于1。
基于YOLOv5 算法的蝴蝶檢測實(shí)現(xiàn)主要分為以下三步來完成:
第一步:采集不同場景的蝴蝶圖片樣本,使用labelme 標(biāo)注后作為本項(xiàng)目的訓(xùn)練集和測試集。
第二步:YOLOv5蝴蝶檢測模型的訓(xùn)練,主要流程是加載數(shù)據(jù)集、構(gòu)建模型、繪制模型、加載預(yù)訓(xùn)練模型、計(jì)算損失函數(shù),經(jīng)過幾百輪訓(xùn)練之后,得到最好的YOLOv5蝴蝶檢測模型。
第三步:進(jìn)行預(yù)測。加載提前收集好的測試數(shù)據(jù)集,驗(yàn)證YOLOv5 蝴蝶檢測模型的效果,對效果進(jìn)行評估。
為了本次項(xiàng)目的檢測結(jié)果能更加直觀地和原圖進(jìn)行比較,本項(xiàng)目為算法設(shè)計(jì)了一個展示場景,以突出本項(xiàng)目所使用算法的檢測效果和檢測速度,如圖2所示。
圖2 可視化場景
網(wǎng)上擁有現(xiàn)成的數(shù)據(jù)集,為了訓(xùn)練更加精確的模型,要求數(shù)據(jù)集的種類和數(shù)量盡量豐富,以達(dá)到項(xiàng)目要求,并且收集的數(shù)據(jù)范圍主要是在野外環(huán)境中的蝴蝶圖片,然后使用labelme 進(jìn)行數(shù)據(jù)集的標(biāo)注。首先點(diǎn)擊文件,選擇打開數(shù)據(jù)集。如圖3 所示。 接著單擊右鍵,選擇矩形框,框住圖像中的蝴蝶,再添加標(biāo)簽,點(diǎn)擊保存,形成一個json文件,完成標(biāo)注。
圖3 用labelme打開數(shù)據(jù)集
圖4 所示為算法工作的流程。主要分為兩個部分:模型訓(xùn)練和模型檢測,模型訓(xùn)練主要分為加載數(shù)據(jù)、構(gòu)建網(wǎng)絡(luò)模型、加載預(yù)訓(xùn)練模型、計(jì)算損失函數(shù);模型檢測則是使用訓(xùn)練好的模型進(jìn)行預(yù)測,主要步驟為加載數(shù)據(jù)、構(gòu)建網(wǎng)絡(luò)模型、加載訓(xùn)練好的模型,然后進(jìn)行預(yù)測。
圖4 算法工作流程圖
本項(xiàng)目使用的Python版本為3.9.7,PyCharm版本為2021.3,PyTorch 的版本為1.8.1,conda的版本為4.12.0,numpy的版本為1.24.1,pandas的版本為1.3.4,tensorflow 的版本為2.11.0,直接到相應(yīng)的官網(wǎng)下載安裝即可。本次測試使用的CPU為AMD的R7 5800H。
精確率、召回率是廣泛用于目標(biāo)檢測領(lǐng)域的度量值,用來評價結(jié)果的準(zhǔn)確性,其中精確率是針對預(yù)測結(jié)果而言的,它表示的是預(yù)測為正的樣本中有多少是真正的正樣本,衡量的是系統(tǒng)的查準(zhǔn)率;召回率是指提取的正確信息條數(shù)在總的樣本信息條數(shù)中所占的比例[4]。
由圖5 可知,該檢測算法在圖像背景較為簡單的情況下的準(zhǔn)確率為0.93,而如圖6所示的環(huán)境背景極為復(fù)雜的檢測場景,可以看到蝴蝶已經(jīng)融于環(huán)境中,在肉眼分辨不易的情況下達(dá)到0.87 的準(zhǔn)確率還是較為困難的,由這兩種不同場景的檢測效果可以得出,本項(xiàng)目的檢測效果比較令人滿意。
圖5 簡單場景下的原圖及檢測效果圖
圖6 復(fù)雜場景下的原圖及檢測效果圖
提前準(zhǔn)備標(biāo)注好的數(shù)據(jù)集,然后用PyTorch框架搭建的YOLOv5 模型根據(jù)數(shù)據(jù)集進(jìn)行訓(xùn)練和測試,接著根據(jù)結(jié)果去做評定。
從圖7(a)可知,當(dāng)置信度閾值到達(dá)0.65 左右時,精確率達(dá)到峰值且趨于穩(wěn)定;從圖7(b)中可以看出,當(dāng)召回率在0~0.89 時,精確率保持峰值為1,當(dāng)召回率超過0.93時,精確率驟降為0;從圖7(c)可知,置信度閾值在0.5 之前召回率穩(wěn)定在0.9 左右,置信度閾值超過0.5,召回率開始下降,在0.9 左右開始驟降至0。從上面的幾張圖可以發(fā)現(xiàn),置信度閾值和精確率是成正比的,召回率在0.9左右時精確度最高,而置信度閾值越高,召回率是逐漸降低的,因此,選擇合適的置信度閾值可以將模型總的精確率保持在0.93左右。
圖7 置信度-精確率-召回率曲線
為了比較本文所提方法與現(xiàn)有算法的性能,使用Mask RCNN、SSD 算法對同數(shù)據(jù)集下訓(xùn)練后的檢測結(jié)果進(jìn)行對比。對比結(jié)果如圖8所示。
圖8 實(shí)驗(yàn)結(jié)果對比
從圖8 可以看出,YOLOv5 算法的檢測準(zhǔn)確率明顯高于Mask RCNN 算法和SSD 算法的檢測準(zhǔn)確率,證明了本文方法的優(yōu)越性。
本文選擇了YOLOv5 算法對蝴蝶進(jìn)行定位檢測,并通過用labelme 標(biāo)注的數(shù)據(jù)集完成了模型的訓(xùn)練,再利用Qt Designer 和PyQt5 完成了功能可視化界面,然后使用訓(xùn)練好的模型進(jìn)行預(yù)測,最后對預(yù)測結(jié)果進(jìn)行了評估,完成了基于深度學(xué)習(xí)的蝴蝶識別研究與實(shí)現(xiàn)。在今后的研究中,我們將會把重點(diǎn)放在改進(jìn)數(shù)據(jù)集的采集工作,希望蝴蝶的種類更加豐富,以及對YOLOv5算法的改進(jìn)等。