基于深度學(xué)習(xí)的鳥(niǎo)類檢測(cè)識(shí)別系統(tǒng)(含UI界面,Python代碼)

摘要:鳥(niǎo)類識(shí)別是深度學(xué)習(xí)和機(jī)器視覺(jué)領(lǐng)域的一個(gè)熱門應(yīng)用,本文詳細(xì)介紹基于YOLOv5的鳥(niǎo)類檢測(cè)識(shí)別系統(tǒng),在介紹算法原理的同時(shí),給出Python的實(shí)現(xiàn)代碼以及PyQt的UI界面。在界面中可以選擇各種鳥(niǎo)類圖片、視頻以及開(kāi)啟攝像頭進(jìn)行檢測(cè)識(shí)別;可通過(guò)UI界面選擇文件,切換標(biāo)記識(shí)別目標(biāo),支持切換模型,支持用戶登錄注冊(cè)界面;基于YOLOv5模型訓(xùn)練實(shí)現(xiàn),提供訓(xùn)練數(shù)據(jù)集和訓(xùn)練代碼,檢測(cè)速度快、識(shí)別精度較高;另外,還提供了可訓(xùn)練代碼和數(shù)據(jù)集。博文給出了Python代碼介紹和使用教程,適合新入門的朋友參考,完整代碼資源文件請(qǐng)轉(zhuǎn)至文末的下載鏈接。視頻介紹如下:

完整代碼下載地址:https://mbd.pub/o/bread/ZJaUm5hv
離線依賴庫(kù)下載鏈接:https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n(提取碼:oy4n )

前言
? ? ? ? 作為一個(gè)地區(qū)生物多樣性與生態(tài)環(huán)境的重要指標(biāo),“鳥(niǎo)類數(shù)量及分布”越來(lái)越受到自然保護(hù)區(qū)、濕地公園、動(dòng)物保護(hù)監(jiān)管部門等機(jī)構(gòu)的重視,實(shí)時(shí)監(jiān)測(cè)鳥(niǎo)類品種、數(shù)量與分布,成為各地區(qū)的常態(tài)化工作。本文使用YOLOv5目標(biāo)檢測(cè)算法,可以為鳥(niǎo)類監(jiān)測(cè)識(shí)別提供AI技術(shù)支持,提升監(jiān)測(cè)識(shí)別效率,解決單純?nèi)斯けO(jiān)測(cè)造成的低效與誤差,為鳥(niǎo)類保護(hù)養(yǎng)育提供更好的數(shù)據(jù)支撐。
????????鳥(niǎo)類監(jiān)測(cè)識(shí)別具有較高復(fù)雜性,鳥(niǎo)類飛行路線不定、落點(diǎn)不定、時(shí)間不定,監(jiān)測(cè)區(qū)域多樣(森林、濕地、湖泊、草地等),部分鳥(niǎo)類習(xí)性、形體、顏色具有極高相似度,這些因素使得對(duì)鳥(niǎo)類監(jiān)測(cè)識(shí)別技術(shù)的要求極高。傳統(tǒng)的機(jī)器視覺(jué)算法難以實(shí)現(xiàn)準(zhǔn)確快速識(shí)別鳥(niǎo)類的品種和位置,近年來(lái),機(jī)器學(xué)習(xí)和深度學(xué)習(xí)取得了較大的發(fā)展,深度學(xué)習(xí)方法在檢測(cè)精度和速度方面與傳統(tǒng)方法相比表現(xiàn)出更良好的性能。YOLOv5是單階段目標(biāo)檢測(cè)算法YOLO的第五代,根據(jù)實(shí)驗(yàn)得出結(jié)論,其在速度與準(zhǔn)確性能方面都有了明顯提升,其論文可參考TPH-YOLOv5: Improved YOLOv5 Based on Transformer Prediction Head for Object Detection on Drone-captured Scenarios(https://ieeexplore.ieee.org/document/9607487/),開(kāi)源的代碼可見(jiàn)https://github.com/ultralytics/yolov5(官方源碼倉(cāng)庫(kù))。
????????自動(dòng)化的鳥(niǎo)類識(shí)別能夠幫助人們更方便地了解地理區(qū)域內(nèi)特定鳥(niǎo)類的數(shù)量和活動(dòng)情況,目前網(wǎng)上鳥(niǎo)類檢測(cè)和識(shí)別的應(yīng)用較少,能夠參考的例子不多,幾乎沒(méi)有人將其開(kāi)發(fā)成一個(gè)可以展示的完整軟件,并不方便選擇圖片、視頻文件和實(shí)時(shí)檢測(cè)。對(duì)此這里博主利用加州理工學(xué)院鳥(niǎo)類數(shù)據(jù)集(The Caltech-UCSD Birds-200-2011 Dataset,網(wǎng)址:http://www.vision.caltech.edu/datasets/cub_200_2011/),訓(xùn)練YOLOv5模型,并給出自行設(shè)計(jì)的UI界面,保持博主同款的簡(jiǎn)約風(fēng),功能也可以滿足圖片、視頻和攝像頭的識(shí)別檢測(cè),切換模型、保存結(jié)果等,希望大家可以喜歡,初始界面如下圖:

? ? ? ??檢測(cè)鳥(niǎo)的種類時(shí)的界面截圖(點(diǎn)擊圖片可放大)如下圖,可識(shí)別畫面中存在的多個(gè)鳥(niǎo)的類別,也可開(kāi)啟攝像頭或視頻檢測(cè):

? ? ? ??詳細(xì)的功能演示效果參見(jiàn)博主的B站視頻或下一節(jié)的動(dòng)圖演示,覺(jué)得不錯(cuò)的朋友敬請(qǐng)點(diǎn)贊、關(guān)注加收藏!系統(tǒng)UI界面的設(shè)計(jì)工作量較大,界面美化更需仔細(xì)雕琢,大家有任何建議或意見(jiàn)和可在下方評(píng)論交流。

1. 效果演示
? ? ? ??鳥(niǎo)類檢測(cè)識(shí)別系統(tǒng)主要用于野外或日常生活場(chǎng)景中鳥(niǎo)類圖像的識(shí)別,顯示鳥(niǎo)類目標(biāo)在圖像中的類別、位置、數(shù)目、置信度等;可對(duì)圖片、視頻文件讀取的圖像,或從攝像頭獲取的實(shí)時(shí)畫面中的鳥(niǎo)類進(jìn)行識(shí)別,算法模型可選擇替換;系統(tǒng)界面包含用戶注冊(cè)、登錄功能,方便用戶進(jìn)行管理和使用;識(shí)別結(jié)果可視化,結(jié)果實(shí)時(shí)顯示并能夠進(jìn)行目標(biāo)逐個(gè)標(biāo)注、顯示和數(shù)據(jù)展示;畫面顯示窗口可縮放、拖動(dòng)、自適應(yīng),結(jié)果可點(diǎn)擊按鈕保存,方便后續(xù)查閱使用。
軟件好不好用,顏值很重要,首先我們還是通過(guò)動(dòng)圖看一下鳥(niǎo)類識(shí)別的效果,系統(tǒng)主要實(shí)現(xiàn)的功能是對(duì)圖片、視頻和攝像頭畫面中的鳥(niǎo)類進(jìn)行識(shí)別,檢測(cè)的結(jié)果可視化顯示在界面和圖像中,提供模型切換、單個(gè)目標(biāo)選中等功能,其演示效果如下。
(一)用戶注冊(cè)登錄
? ? ? ??這里設(shè)計(jì)了一個(gè)登錄界面,可以注冊(cè)賬號(hào)和密碼,然后進(jìn)行登錄。界面還是參考了當(dāng)前流行的UI設(shè)計(jì),左側(cè)是一個(gè)動(dòng)圖,右側(cè)輸入賬號(hào)、密碼、驗(yàn)證碼等等。

(二)選擇鳥(niǎo)類圖片識(shí)別
? ? ? ??系統(tǒng)允許選擇圖片文件進(jìn)行識(shí)別,點(diǎn)擊圖片選擇按鈕圖標(biāo)選擇圖片后,顯示所有鳥(niǎo)類識(shí)別的結(jié)果,可通過(guò)下拉選框查看單個(gè)鳥(niǎo)類的結(jié)果。本功能的界面展示如下圖所示:

(四)攝像頭檢測(cè)效果展示
????????在真實(shí)場(chǎng)景中,我們往往利用設(shè)備攝像頭獲取實(shí)時(shí)畫面,同時(shí)需要對(duì)畫面中的鳥(niǎo)類進(jìn)行識(shí)別,因此本文考慮到此項(xiàng)功能。如下圖所示,點(diǎn)擊攝像頭按鈕后系統(tǒng)進(jìn)入準(zhǔn)備狀態(tài),系統(tǒng)顯示實(shí)時(shí)畫面并開(kāi)始檢測(cè)畫面中的鳥(niǎo),識(shí)別結(jié)果展示如下圖:

(五)切換鳥(niǎo)類檢測(cè)模型
????????可選擇訓(xùn)練得到的檢測(cè)模型,利用調(diào)優(yōu)后的模型進(jìn)行檢測(cè),對(duì)于YOLOv5的預(yù)訓(xùn)練模型通用適用。這里可以自由切換不同的模型,以比較不同的檢測(cè)效果。

2.?鳥(niǎo)類數(shù)據(jù)集及訓(xùn)練
????????這里我們使用的鳥(niǎo)類識(shí)別數(shù)據(jù)集,是加州理工學(xué)院鳥(niǎo)類數(shù)據(jù)集(The Caltech-UCSD Birds-200-2011 Dataset),CUB 數(shù)據(jù)集一共 200 個(gè)類別,共 11788 張圖片,每張圖片除包括類別標(biāo)簽外,還有一個(gè)標(biāo)注的物體邊框(Bounding Box)、關(guān)鍵點(diǎn)和一些其他屬性,屬于具有較高細(xì)粒度的鳥(niǎo)類圖像數(shù)據(jù)集。

? ? ? ? CUB數(shù)據(jù)集中每個(gè)物種都與Wikipedia文章相關(guān)聯(lián),并按科學(xué)分類(順序、科、屬、物種)進(jìn)行組織,包含200類鳥(niǎo)類子類,其中訓(xùn)練數(shù)據(jù)集有5994張圖像,測(cè)試集有5794張圖像。每張圖像均提供了圖像類標(biāo)記信息,圖像中鳥(niǎo)的bounding box,鳥(niǎo)的關(guān)鍵part信息,以及鳥(niǎo)類的屬性信息,下載CUB數(shù)據(jù)并解壓后得到如下的文件夾

? ? ? ??由于CUB數(shù)據(jù)集的標(biāo)注文件和YOLO的格式不一致,這里我們選取CUB數(shù)據(jù)集中的類別,轉(zhuǎn)換為YOLO格式。標(biāo)簽格式轉(zhuǎn)換的代碼可參考博客:CUB_200_2011數(shù)據(jù)集轉(zhuǎn)Yolo格式,最終我們得到Y(jié)OLO格式的數(shù)據(jù)集文件,并進(jìn)行模型訓(xùn)練。
????????在訓(xùn)練模型之前,為了讓我們的數(shù)據(jù)能夠被YOLO找到,我們需要寫一個(gè)data.yaml文件存儲(chǔ)在案例目錄下,在其中記錄下數(shù)據(jù)的路徑和模型要識(shí)別的標(biāo)記類別,文件內(nèi)容如下所示。YOLO通過(guò)讀取目錄下的data.yaml文件,進(jìn)而找到我們數(shù)據(jù)集存儲(chǔ)的位置才能讀取數(shù)據(jù)進(jìn)行訓(xùn)練驗(yàn)證。
? ? ? ? 訓(xùn)練模型通過(guò)調(diào)用模型文件夾下的train.py進(jìn)行,可以通過(guò)–batch參數(shù)和–epochs參數(shù)調(diào)整訓(xùn)練批次大小和訓(xùn)練輪數(shù)。YOLOv5提供了在COCO數(shù)據(jù)集上預(yù)訓(xùn)練后的參數(shù),我們可以通過(guò)參數(shù)–weights yolov5s.pt加載預(yù)訓(xùn)練參數(shù)進(jìn)行遷移學(xué)習(xí),或在訓(xùn)練大數(shù)據(jù)集(比如COCO)時(shí)用一個(gè)空的–weights ''參數(shù)從零開(kāi)始訓(xùn)練。然后設(shè)定各種參數(shù),代碼如下:
? ? ? ? 我們可以在終端輸入如下命令進(jìn)行訓(xùn)練,當(dāng)然也可以直接點(diǎn)擊train.py運(yùn)行。
? ? ? ?在深度學(xué)習(xí)中,我們通常通過(guò)損失函數(shù)下降的曲線來(lái)觀察模型訓(xùn)練的情況。而YOLOv5訓(xùn)練時(shí)主要包含三個(gè)方面的損失:矩形框損失(box_loss)、置信度損失(obj_loss)和分類損失(cls_loss),在訓(xùn)練結(jié)束后,我們也可以在logs目錄下找到生成對(duì)若干訓(xùn)練過(guò)程統(tǒng)計(jì)圖。下圖為博主訓(xùn)練鳥(niǎo)類識(shí)別的模型訓(xùn)練曲線圖。

? ? ? ? 在我們的訓(xùn)練過(guò)程中,mAP50作為一種常用的目標(biāo)檢測(cè)評(píng)估指標(biāo)很快達(dá)到了較高水平,而mAP50:95也在訓(xùn)練的過(guò)程中不斷提升,說(shuō)明我們模型從訓(xùn)練-驗(yàn)證的角度表現(xiàn)良好。讀入一個(gè)測(cè)試文件夾進(jìn)行預(yù)測(cè),通過(guò)訓(xùn)練得到的選取驗(yàn)證集上效果最好的權(quán)重best.pt進(jìn)行實(shí)驗(yàn),得到PR曲線如下圖所示。


3. 鳥(niǎo)類檢測(cè)識(shí)別
? ? ? ? 在訓(xùn)練完成后得到最佳模型,接下來(lái)我們將幀圖像輸入到這個(gè)網(wǎng)絡(luò)進(jìn)行預(yù)測(cè),從而得到預(yù)測(cè)結(jié)果,預(yù)測(cè)方法(predict.py)部分的代碼如下所示:
? ? ? ? 得到預(yù)測(cè)結(jié)果我們便可以將幀圖像中的鳥(niǎo)類框出,然后在圖片上用opencv繪圖操作,輸出鳥(niǎo)的類別及鳥(niǎo)的預(yù)測(cè)分?jǐn)?shù)。以下是讀取一個(gè)鳥(niǎo)類圖片并進(jìn)行檢測(cè)的腳本,首先將圖片數(shù)據(jù)進(jìn)行預(yù)處理后送predict進(jìn)行檢測(cè),然后計(jì)算標(biāo)記框的位置并在圖中標(biāo)注出來(lái)。
? ? ? ??執(zhí)行得到的結(jié)果如下圖所示,圖中鳥(niǎo)類的種類和置信度值都標(biāo)注出來(lái)了,預(yù)測(cè)速度較快?;诖四P臀覀兛梢詫⑵湓O(shè)計(jì)成一個(gè)帶有界面的系統(tǒng),在界面上選擇圖片、視頻或攝像頭然后調(diào)用模型進(jìn)行檢測(cè)。

? ? ? ? 博主對(duì)整個(gè)系統(tǒng)進(jìn)行了詳細(xì)測(cè)試,最終開(kāi)發(fā)出一版流暢得到清新界面,就是博文演示部分的展示,完整的UI界面、測(cè)試圖片視頻、代碼文件,以及Python離線依賴包(方便安裝運(yùn)行,也可自行配置環(huán)境),均已打包上傳,感興趣的朋友可以通過(guò)下載鏈接獲取。


下載鏈接
? ? ? ??若您想獲得博文中涉及的實(shí)現(xiàn)完整全部程序文件(包括測(cè)試圖片、視頻,py, UI文件等,如下圖),這里已打包上傳至博主的面包多平臺(tái),見(jiàn)可參考博客與視頻,已將所有涉及的文件同時(shí)打包到里面,點(diǎn)擊即可運(yùn)行,完整文件截圖如下:

? ? ? ??在文件夾下的資源顯示如下,其中包含了Python的離線依賴包,讀者可在正確安裝Anaconda和Pycharm軟件后,進(jìn)行安裝,詳細(xì)演示也可見(jiàn)本人B站視頻。

注意:該代碼采用Pycharm+Python3.8開(kāi)發(fā),經(jīng)過(guò)測(cè)試能成功運(yùn)行,運(yùn)行界面的主程序?yàn)閞unMain.py和LoginUI.py,測(cè)試圖片腳本可運(yùn)行testPicture.py,測(cè)試視頻腳本可運(yùn)行testVideo.py。為確保程序順利運(yùn)行,請(qǐng)按照requirements.txt配置Python依賴包的版本。Python版本:3.8,請(qǐng)勿使用其他版本,詳見(jiàn)requirements.txt文件;項(xiàng)目完整文件下載請(qǐng)見(jiàn)以下鏈接:???
完整代碼下載地址:https://mbd.pub/o/bread/ZJaUm5hv
參考視頻演示:https://www.bilibili.com/video/BV1QL411C783/
離線依賴庫(kù)下載鏈接:https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n?(提取碼:oy4n )

結(jié)束語(yǔ)
? ? ? ? 由于博主能力有限,博文中提及的方法即使經(jīng)過(guò)試驗(yàn),也難免會(huì)有疏漏之處。希望您能熱心指出其中的錯(cuò)誤,以便下次修改時(shí)能以一個(gè)更完美更嚴(yán)謹(jǐn)?shù)臉幼?,呈現(xiàn)在大家面前。同時(shí)如果有更好的實(shí)現(xiàn)方法也請(qǐng)您不吝賜教。